[RFC 3/8] introduce common allowed_ht40_channel_pair()
Janusz Dziedzic
janusz.dziedzic
Thu Jan 8 03:48:31 PST 2015
This can be used from hostapd/wpa_supplicant.
Signed-off-by: Janusz Dziedzic <janusz.dziedzic at tieto.com>
---
src/ap/hw_features.c | 59 +++--------------------------------------
src/common/hw_features_common.c | 59 +++++++++++++++++++++++++++++++++++++++++
src/common/hw_features_common.h | 1 +
3 files changed, 64 insertions(+), 55 deletions(-)
diff --git a/src/ap/hw_features.c b/src/ap/hw_features.c
index f17891b..2f969c6 100644
--- a/src/ap/hw_features.c
+++ b/src/ap/hw_features.c
@@ -224,66 +224,15 @@ int hostapd_prepare_rates(struct hostapd_iface *iface,
#ifdef CONFIG_IEEE80211N
static int ieee80211n_allowed_ht40_channel_pair(struct hostapd_iface *iface)
{
- int sec_chan, ok, j, first;
- int allowed[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,
- 184, 192 };
- size_t k;
+ int pri_chan, sec_chan;
if (!iface->conf->secondary_channel)
return 1; /* HT40 not used */
- sec_chan = iface->conf->channel + iface->conf->secondary_channel * 4;
- wpa_printf(MSG_DEBUG, "HT40: control channel: %d "
- "secondary channel: %d",
- iface->conf->channel, sec_chan);
-
- /* Verify that HT40 secondary channel is an allowed 20 MHz
- * channel */
- ok = 0;
- for (j = 0; j < iface->current_mode->num_channels; j++) {
- struct hostapd_channel_data *chan =
- &iface->current_mode->channels[j];
- if (!(chan->flag & HOSTAPD_CHAN_DISABLED) &&
- chan->chan == sec_chan) {
- ok = 1;
- break;
- }
- }
- if (!ok) {
- wpa_printf(MSG_ERROR, "HT40 secondary channel %d not allowed",
- sec_chan);
- return 0;
- }
-
- /*
- * Verify that HT40 primary,secondary channel pair is allowed per
- * IEEE 802.11n Annex J. This is only needed for 5 GHz band since
- * 2.4 GHz rules allow all cases where the secondary channel fits into
- * the list of allowed channels (already checked above).
- */
- if (iface->current_mode->mode != HOSTAPD_MODE_IEEE80211A)
- return 1;
-
- if (iface->conf->secondary_channel > 0)
- first = iface->conf->channel;
- else
- first = sec_chan;
-
- ok = 0;
- for (k = 0; k < ARRAY_SIZE(allowed); k++) {
- if (first == allowed[k]) {
- ok = 1;
- break;
- }
- }
- if (!ok) {
- wpa_printf(MSG_ERROR, "HT40 channel pair (%d, %d) not allowed",
- iface->conf->channel,
- iface->conf->secondary_channel);
- return 0;
- }
+ pri_chan = iface->conf->channel;
+ sec_chan = pri_chan + iface->conf->secondary_channel * 4;
- return 1;
+ return allowed_ht40_channel_pair(iface->current_mode, pri_chan, sec_chan);
}
diff --git a/src/common/hw_features_common.c b/src/common/hw_features_common.c
index 96c191c..2b9e914 100644
--- a/src/common/hw_features_common.c
+++ b/src/common/hw_features_common.c
@@ -74,3 +74,62 @@ int hw_get_chan(struct hostapd_hw_modes *mode, int freq)
return chan;
}
+
+
+int allowed_ht40_channel_pair(struct hostapd_hw_modes *mode, int pri_chan, int sec_chan)
+{
+ int ok, j, first;
+ int allowed[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,
+ 184, 192 };
+ size_t k;
+
+ if (pri_chan == sec_chan || !sec_chan)
+ return 1; /* HT40 not used */
+
+ wpa_printf(MSG_DEBUG, "HT40: control channel: %d "
+ "secondary channel: %d",
+ pri_chan, sec_chan);
+
+ /* Verify that HT40 secondary channel is an allowed 20 MHz
+ * channel */
+ ok = 0;
+ for (j = 0; j < mode->num_channels; j++) {
+ struct hostapd_channel_data *chan = &mode->channels[j];
+ if (!(chan->flag & HOSTAPD_CHAN_DISABLED) &&
+ chan->chan == sec_chan) {
+ ok = 1;
+ break;
+ }
+ }
+ if (!ok) {
+ wpa_printf(MSG_ERROR, "HT40 secondary channel %d not allowed",
+ sec_chan);
+ return 0;
+ }
+
+ /*
+ * Verify that HT40 primary,secondary channel pair is allowed per
+ * IEEE 802.11n Annex J. This is only needed for 5 GHz band since
+ * 2.4 GHz rules allow all cases where the secondary channel fits into
+ * the list of allowed channels (already checked above).
+ */
+ if (mode->mode != HOSTAPD_MODE_IEEE80211A)
+ return 1;
+
+ first = pri_chan < sec_chan ? pri_chan : sec_chan;
+
+ ok = 0;
+ for (k = 0; k < ARRAY_SIZE(allowed); k++) {
+ if (first == allowed[k]) {
+ ok = 1;
+ break;
+ }
+ }
+ if (!ok) {
+ wpa_printf(MSG_ERROR, "HT40 channel pair (%d, %d) not allowed",
+ pri_chan, sec_chan);
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/src/common/hw_features_common.h b/src/common/hw_features_common.h
index abcfe73..bb52fb5 100644
--- a/src/common/hw_features_common.h
+++ b/src/common/hw_features_common.h
@@ -18,4 +18,5 @@ struct hostapd_channel_data *hw_get_channel_freq(struct hostapd_hw_modes *mode,
int hw_get_freq(struct hostapd_hw_modes *mode, int chan);
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);
#endif /* HW_FEATURES_COMMON_H */
--
1.9.1
More information about the Hostap
mailing list