[PATCH RESEND] hostapd: add VHT tx power envelope IE
Rajkumar Manoharan
rmanohar at qti.qualcomm.com
Fri Oct 23 05:52:14 PDT 2015
Add VHT transmit power envelope element defined in IEEE std
802.11ac-2013 8.4.2.164 for VHT bandwidth channel switch.
Signed-off-by: Rajkumar Manoharan <rmanohar at qti.qualcomm.com>
---
src/ap/beacon.c | 3 ++-
src/ap/ieee802_11.h | 1 +
src/ap/ieee802_11_vht.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 52 insertions(+), 1 deletion(-)
diff --git a/src/ap/beacon.c b/src/ap/beacon.c
index 5f1fc3e..9e40dc2 100644
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -330,7 +330,6 @@ static u8 * hostapd_eid_ecsa(struct hostapd_data *hapd, u8 *eid)
return eid;
}
-
static u8 * hostapd_eid_supported_op_classes(struct hostapd_data *hapd, u8 *eid)
{
u8 op_class, channel;
@@ -482,6 +481,7 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
pos = hostapd_eid_vht_capabilities(hapd, pos);
pos = hostapd_eid_vht_operation(hapd, pos);
pos = hostapd_eid_wb_chsw_wrapper(hapd, pos);
+ pos = hostapd_eid_vht_txpwr_env(hapd, pos);
}
if (hapd->conf->vendor_vht)
pos = hostapd_eid_vendor_vht(hapd, pos);
@@ -1086,6 +1086,7 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
tailpos = hostapd_eid_vht_capabilities(hapd, tailpos);
tailpos = hostapd_eid_vht_operation(hapd, tailpos);
tailpos = hostapd_eid_wb_chsw_wrapper(hapd, tailpos);
+ tailpos = hostapd_eid_vht_txpwr_env(hapd, tailpos);
}
if (hapd->conf->vendor_vht)
tailpos = hostapd_eid_vendor_vht(hapd, tailpos);
diff --git a/src/ap/ieee802_11.h b/src/ap/ieee802_11.h
index a2dd132..4788e6b 100644
--- a/src/ap/ieee802_11.h
+++ b/src/ap/ieee802_11.h
@@ -54,6 +54,7 @@ u8 * hostapd_eid_vht_capabilities(struct hostapd_data *hapd, u8 *eid);
u8 * hostapd_eid_vht_operation(struct hostapd_data *hapd, u8 *eid);
u8 * hostapd_eid_vendor_vht(struct hostapd_data *hapd, u8 *eid);
u8 * hostapd_eid_wb_chsw_wrapper(struct hostapd_data *hapd, u8 *eid);
+u8 * hostapd_eid_vht_txpwr_env(struct hostapd_data *hapd, u8 *eid);
int hostapd_ht_operation_update(struct hostapd_iface *iface);
void ieee802_11_send_sa_query_req(struct hostapd_data *hapd,
diff --git a/src/ap/ieee802_11_vht.c b/src/ap/ieee802_11_vht.c
index 8d2c428..91c04c8 100644
--- a/src/ap/ieee802_11_vht.c
+++ b/src/ap/ieee802_11_vht.c
@@ -184,6 +184,55 @@ u8 * hostapd_eid_wb_chsw_wrapper(struct hostapd_data *hapd, u8 *eid)
}
+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, max_tx_power;
+
+ if (hapd->cs_freq_params.bandwidth > 80 ||
+ !hapd->cs_freq_params.vht_enabled)
+ return eid;
+
+ 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++ = 4;
+ /*
+ * Max Transmit Power count = 2( 20,40 and 80MHz) and
+ * Max Transmit Power units = 0 (EIRP)
+ */
+ *eid++ = 2;
+
+ /*
+ * Local Maximum Transmit power is encoded as 2's complement
+ * with a 0.5 dB step
+ */
+ max_tx_power = ~(chan->max_tx_power * 2) + 1;
+ *eid++ = max_tx_power;
+ *eid++ = max_tx_power;
+ *eid++ = max_tx_power;
+
+ return eid;
+}
+
+
u16 copy_sta_vht_capab(struct hostapd_data *hapd, struct sta_info *sta,
const u8 *vht_capab)
{
--
2.6.1
More information about the Hostap
mailing list