From 6d5d098f77b0d6a54cd7700651ff7cd05d310bcf Mon Sep 17 00:00:00 2001 From: Janusz Dziedzic Date: Thu, 8 Jan 2015 12:48:32 +0100 Subject: [PATCH] Make get_pri_sec_chan() common Signed-off-by: Janusz Dziedzic --- src/ap/hw_features.c | 20 +------------------- src/common/hw_features_common.c | 26 ++++++++++++++++++++++++++ src/common/hw_features_common.h | 1 + 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/ap/hw_features.c b/src/ap/hw_features.c index a76e63767..72f919e28 100644 --- a/src/ap/hw_features.c +++ b/src/ap/hw_features.c @@ -252,25 +252,7 @@ static void ieee80211n_switch_pri_sec(struct hostapd_iface *iface) static void ieee80211n_get_pri_sec_chan(struct wpa_scan_res *bss, int *pri_chan, int *sec_chan) { - struct ieee80211_ht_operation *oper; - struct ieee802_11_elems elems; - - *pri_chan = *sec_chan = 0; - - ieee802_11_parse_elems((u8 *) (bss + 1), bss->ie_len, &elems, 0); - if (elems.ht_operation && - elems.ht_operation_len >= sizeof(*oper)) { - oper = (struct ieee80211_ht_operation *) elems.ht_operation; - *pri_chan = oper->primary_chan; - if (oper->ht_param & HT_INFO_HT_PARAM_STA_CHNL_WIDTH) { - int sec = oper->ht_param & - HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK; - if (sec == HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE) - *sec_chan = *pri_chan + 4; - else if (sec == HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW) - *sec_chan = *pri_chan - 4; - } - } + return get_pri_sec_chan(bss, pri_chan, sec_chan); } diff --git a/src/common/hw_features_common.c b/src/common/hw_features_common.c index 28ee16472..2343d1fb4 100644 --- a/src/common/hw_features_common.c +++ b/src/common/hw_features_common.c @@ -11,6 +11,8 @@ #include "common.h" #include "defs.h" +#include "ieee802_11_defs.h" +#include "ieee802_11_common.h" #include "hw_features_common.h" @@ -140,3 +142,27 @@ int allowed_ht40_channel_pair(struct hostapd_hw_modes *mode, int pri_chan, return 1; } + + +void get_pri_sec_chan(struct wpa_scan_res *bss, int *pri_chan, int *sec_chan) +{ + struct ieee80211_ht_operation *oper; + struct ieee802_11_elems elems; + + *pri_chan = *sec_chan = 0; + + ieee802_11_parse_elems((u8 *) (bss + 1), bss->ie_len, &elems, 0); + if (elems.ht_operation && + elems.ht_operation_len >= sizeof(*oper)) { + oper = (struct ieee80211_ht_operation *) elems.ht_operation; + *pri_chan = oper->primary_chan; + if (oper->ht_param & HT_INFO_HT_PARAM_STA_CHNL_WIDTH) { + int sec = oper->ht_param & + HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK; + if (sec == HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE) + *sec_chan = *pri_chan + 4; + else if (sec == HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW) + *sec_chan = *pri_chan - 4; + } + } +} diff --git a/src/common/hw_features_common.h b/src/common/hw_features_common.h index f4e86323e..adba7d85b 100644 --- a/src/common/hw_features_common.h +++ b/src/common/hw_features_common.h @@ -22,5 +22,6 @@ int hw_get_chan(struct hostapd_hw_modes *mode, int freq); int allowed_ht40_channel_pair(struct hostapd_hw_modes *mode, int pri_chan, int sec_chan); +void get_pri_sec_chan(struct wpa_scan_res *bss, int *pri_chan, int *sec_chan); #endif /* HW_FEATURES_COMMON_H */