From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from s3.sipsolutions.net ([5.9.151.49]:39232 "EHLO sipsolutions.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751080AbbKJIwg (ORCPT ); Tue, 10 Nov 2015 03:52:36 -0500 From: Johannes Berg To: linux-wireless@vger.kernel.org Cc: Jason Baron , Peter Zijlstra , Steven Rostedt , Johannes Berg Subject: [RFC v2 4/4] mac80211: test the static key code Date: Tue, 10 Nov 2015 09:52:29 +0100 Message-Id: <1447145549-27376-5-git-send-email-johannes@sipsolutions.net> (sfid-20151110_095321_472241_168A7918) In-Reply-To: <1447145549-27376-1-git-send-email-johannes@sipsolutions.net> References: <1447145549-27376-1-git-send-email-johannes@sipsolutions.net> Sender: linux-wireless-owner@vger.kernel.org List-ID: From: Johannes Berg Make hwsim select a few on/off symbols and check that the result is as expected: * before 'registering' a device the branches are according to the Kconfig default only * 'registering' a device fixes that up to actually check the hardware flags * 'unregistering' again goes back to the default Test this with a fake flags field that contains the *inverse* of the Kconfig selections. Signed-off-by: Johannes Berg --- drivers/net/wireless/Kconfig | 11 +++++++++++ net/mac80211/hwflags.c | 36 ++++++++++++++++++++++++++++++++++++ net/mac80211/hwflags.h | 2 ++ net/mac80211/main.c | 2 ++ 4 files changed, 51 insertions(+) diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig index f9f94229bf1b..f2a8fdca5ede 100644 --- a/drivers/net/wireless/Kconfig +++ b/drivers/net/wireless/Kconfig @@ -246,6 +246,17 @@ source "drivers/net/wireless/realtek/rtl818x/Kconfig" config MAC80211_HWSIM tristate "Simulated radio testing tool for mac80211" depends on MAC80211 + select MAC80211_HW_SUPPORT_FAST_XMIT_ON + select MAC80211_HW_CHANCTX_STA_CSA_ON + select MAC80211_HW_SUPPORTS_HT_CCK_RATES_ON + select MAC80211_HW_QUEUE_CONTROL_ON + select MAC80211_HW_WANT_MONITOR_VIF_ON + select MAC80211_HW_AMPDU_AGGREGATION_ON + select MAC80211_HW_MFP_CAPABLE_ON + select MAC80211_HW_SIGNAL_DBM_ON + select MAC80211_HW_TDLS_WIDER_BW_ON + select MAC80211_HW_HAS_RATE_CONTROL_OFF + select MAC80211_HW_RX_INCLUDES_FCS_OFF ---help--- This driver is a developer testing tool that can be used to test IEEE 802.11 networking stack (mac80211) functionality. This is not diff --git a/net/mac80211/hwflags.c b/net/mac80211/hwflags.c index 3beeee512f91..eca0e3ee6818 100644 --- a/net/mac80211/hwflags.c +++ b/net/mac80211/hwflags.c @@ -127,3 +127,39 @@ void ieee80211_hwflags_sync_del(unsigned long *flags) static_branch_dec(&hwflags_keys[flg]); } } + +void ieee80211_test_hwflags(void) +{ + struct { + struct { + unsigned long flags[2]; + } hw; + } _local = {}; + + __set_bit(IEEE80211_HW_HAS_RATE_CONTROL, _local.hw.flags); + __clear_bit(IEEE80211_HW_SUPPORT_FAST_XMIT, _local.hw.flags); + + /* before the sync_add(), we expect only as per Kconfig */ + if (ieee80211_local_check(&_local, HAS_RATE_CONTROL)) + printk(KERN_DEBUG "BAD: HW rate control\n"); + if (!ieee80211_local_check(&_local, SUPPORT_FAST_XMIT)) + printk(KERN_DEBUG "BAD: !SUPPORT_FAST_XMIT\n"); + + ieee80211_hwflags_sync_add(_local.hw.flags); + printk(KERN_DEBUG "added\n"); + + /* now it should be like as per flags */ + if (!ieee80211_local_check(&_local, HAS_RATE_CONTROL)) + printk(KERN_DEBUG "BAD: !HW rate control\n"); + if (ieee80211_local_check(&_local, SUPPORT_FAST_XMIT)) + printk(KERN_DEBUG "BAD: SUPPORT_FAST_XMIT\n"); + + ieee80211_hwflags_sync_del(_local.hw.flags); + printk(KERN_DEBUG "removed\n"); + + /* after remove it should be as before */ + if (ieee80211_local_check(&_local, HAS_RATE_CONTROL)) + printk(KERN_DEBUG "BAD: HW rate control\n"); + if (!ieee80211_local_check(&_local, SUPPORT_FAST_XMIT)) + printk(KERN_DEBUG "BAD: !SUPPORT_FAST_XMIT\n"); +} diff --git a/net/mac80211/hwflags.h b/net/mac80211/hwflags.h index 49b38050c446..86a3deeaaf47 100644 --- a/net/mac80211/hwflags.h +++ b/net/mac80211/hwflags.h @@ -146,4 +146,6 @@ static inline void ieee80211_hwflags_sync_add(unsigned long *flags) {} static inline void ieee80211_hwflags_sync_del(unsigned long *flags) {} #endif /* CONFIG_JUMP_LABEL */ +void ieee80211_test_hwflags(void); + #endif /* __mac80211_hwflags_h */ diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 03ad36ba4945..d64aae164d7a 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -1228,6 +1228,8 @@ static int __init ieee80211_init(void) if (ret) goto err_netdev; + ieee80211_test_hwflags(); + return 0; err_netdev: rc80211_minstrel_ht_exit(); -- 2.6.2