From ba72b4b126a5768a15bf6be5870f323cd7981fcc Mon Sep 17 00:00:00 2001 From: bhagavathi perumal s Date: Fri, 6 Oct 2017 20:33:25 +0530 Subject: [PATCH] hostapd: Add Min/Max Transmit Power Capability into STA command This provides access to the Minimum/Maximum Transmit Power Capabilitie fileds (the nominal minimum/maximum transmit power with which the STA is capable of transmitting in the current channel; signed integer in units of decibels relative to 1 mW). Signed-off-by: bhagavathi perumal s --- src/ap/ctrl_iface_ap.c | 9 +++++++++ src/ap/ieee802_11.c | 8 ++++++++ src/ap/sta_info.h | 4 ++++ src/common/ieee802_11_common.c | 4 ++++ src/common/ieee802_11_common.h | 2 ++ 5 files changed, 27 insertions(+) diff --git a/src/ap/ctrl_iface_ap.c b/src/ap/ctrl_iface_ap.c index 1a2b4e587..80a86312f 100644 --- a/src/ap/ctrl_iface_ap.c +++ b/src/ap/ctrl_iface_ap.c @@ -245,6 +245,15 @@ static int hostapd_ctrl_iface_sta_mib(struct hostapd_data *hapd, len += os_snprintf(buf + len, buflen - len, "\n"); } + if (sta->power_capab) { + ret = os_snprintf(buf + len, buflen - len, + "min_txpower=%d\n" + "max_txpower=%d\n", + sta->min_tx_power, sta->max_tx_power); + if (!os_snprintf_error(buflen - len, ret)) + len += ret; + } + return len; } diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index 72ff50f03..dbecbfa07 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -2599,6 +2599,14 @@ static u16 check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta, os_memcpy(sta->rrm_enabled_capa, elems.rrm_enabled, sizeof(sta->rrm_enabled_capa)); + if (elems.power_capab) { + sta->min_tx_power = elems.power_capab[0]; + sta->max_tx_power = elems.power_capab[1]; + sta->power_capab = 1; + } else { + sta->power_capab = 0; + } + return WLAN_STATUS_SUCCESS; } diff --git a/src/ap/sta_info.h b/src/ap/sta_info.h index 3809766a6..eeb721c5b 100644 --- a/src/ap/sta_info.h +++ b/src/ap/sta_info.h @@ -113,6 +113,7 @@ struct sta_info { unsigned int ecsa_supported:1; unsigned int added_unassoc:1; unsigned int pending_wds_enable:1; + unsigned int power_capab:1; u16 auth_alg; @@ -214,6 +215,9 @@ struct sta_info { u8 rrm_enabled_capa[5]; + s8 min_tx_power; + s8 max_tx_power; + #ifdef CONFIG_TAXONOMY struct wpabuf *probe_ie_taxonomy; struct wpabuf *assoc_ie_taxonomy; diff --git a/src/common/ieee802_11_common.c b/src/common/ieee802_11_common.c index 120d4e883..f04e77fa5 100644 --- a/src/common/ieee802_11_common.c +++ b/src/common/ieee802_11_common.c @@ -352,6 +352,10 @@ ParseRes ieee802_11_parse_elems(const u8 *start, size_t len, elems->rsn_ie_len = elen; break; case WLAN_EID_PWR_CAPABILITY: + if (elen < 2) + break; + elems->power_capab = pos; + elems->power_capab_len = elen; break; case WLAN_EID_SUPPORTED_CHANNELS: elems->supp_channels = pos; diff --git a/src/common/ieee802_11_common.h b/src/common/ieee802_11_common.h index 927615851..89ca92b70 100644 --- a/src/common/ieee802_11_common.h +++ b/src/common/ieee802_11_common.h @@ -79,6 +79,7 @@ struct ieee802_11_elems { const u8 *fils_pk; const u8 *fils_nonce; const u8 *owe_dh; + const u8 *power_capab; u8 ssid_len; u8 supp_rates_len; @@ -122,6 +123,7 @@ struct ieee802_11_elems { u8 fils_wrapped_data_len; u8 fils_pk_len; u8 owe_dh_len; + u8 power_capab_len; struct mb_ies_info mb_ies; };