[PATCH] hostapd: add VHT channel switch IEs
Rajkumar Manoharan
rmanohar
Tue May 5 00:55:50 PDT 2015
Add wide band channel switch and VHT tx power envelope IEs for
VHT bandwidth channel switch.
Signed-off-by: Rajkumar Manoharan <rmanohar at qti.qualcomm.com>
---
src/ap/beacon.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 72 insertions(+), 1 deletion(-)
diff --git a/src/ap/beacon.c b/src/ap/beacon.c
index 7009855..d01361b 100644
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -316,7 +316,7 @@ static u8 * hostapd_eid_csa(struct hostapd_data *hapd, u8 *eid)
}
-static u8 * hostapd_eid_secondary_channel(struct hostapd_data *hapd, u8 *eid)
+static u8 *hostapd_eid_secondary_channel(struct hostapd_data *hapd, u8 *eid)
{
u8 sec_ch;
@@ -337,6 +337,72 @@ static u8 * hostapd_eid_secondary_channel(struct hostapd_data *hapd, u8 *eid)
return eid;
}
+static u8 *hostapd_eid_wide_bw_chansw(struct hostapd_data *hapd, u8 *eid)
+{
+ struct hostapd_freq_params *params = &hapd->cs_freq_params;
+ u8 chan;
+
+ if (!params->freq)
+ return eid;
+
+ if (ieee80211_freq_to_chan(params->freq, &chan) ==
+ NUM_HOSTAPD_MODES)
+ return eid;
+
+ *eid++ = WLAN_EID_VHT_WIDE_BW_CHSWITCH;
+ *eid++ = 3;
+
+ switch (params->bandwidth) {
+ case 40:
+ *eid++ = VHT_CHANWIDTH_USE_HT;
+ break;
+ case 80:
+ *eid++ = VHT_CHANWIDTH_80MHZ;
+ break;
+ case 160:
+ *eid++ = VHT_CHANWIDTH_160MHZ;
+ break;
+ }
+ *eid++ = params->freq + params->sec_channel_offset * 10;
+ *eid++ = params->center_freq2;
+
+ return eid;
+}
+
+static u8 *hostapd_eid_vht_txpwr_env(struct hostapd_data *hapd, u8 *eid)
+{
+ struct hostapd_freq_params *params = &hapd->cs_freq_params;
+ struct hostapd_hw_modes *mode = hapd->iface->current_mode;
+ struct hostapd_channel_data *chan;
+ int i;
+ u8 channel;
+
+ if (!params->freq)
+ return eid;
+
+ if (ieee80211_freq_to_chan(params->freq, &channel) ==
+ NUM_HOSTAPD_MODES)
+ return eid;
+
+ for (i = 0; i < mode->num_channels; i++) {
+ if (mode->channels[i].freq == params->freq)
+ break;
+ }
+ if (i == mode->num_channels)
+ return eid;
+
+ chan = &mode->channels[i];
+
+ *eid++ = WLAN_EID_VHT_TRANSMIT_POWER_ENVELOPE;
+ *eid++ = 5;
+ *eid++ = 2;
+ *eid++ = chan->max_tx_power;
+ *eid++ = chan->max_tx_power;
+ *eid++ = chan->max_tx_power;
+ *eid++ = chan->max_tx_power;
+
+ return eid;
+}
static u8 * hostapd_add_csa_elems(struct hostapd_data *hapd, u8 *pos,
u8 *start, unsigned int *csa_counter_off)
@@ -354,6 +420,11 @@ static u8 * hostapd_add_csa_elems(struct hostapd_data *hapd, u8 *pos,
*csa_counter_off = pos - start - 1;
pos = hostapd_eid_secondary_channel(hapd, pos);
}
+ if (hapd->cs_freq_params.bandwidth > 20 &&
+ hapd->cs_freq_params.vht_enabled) {
+ pos = hostapd_eid_wide_bw_chansw(hapd, pos);
+ pos = hostapd_eid_vht_txpwr_env(hapd, pos);
+ }
return pos;
}
--
2.3.7
More information about the Hostap
mailing list