[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