]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Add support for mgmt_tx with random TA
authorVamsi Krishna <vamsin@qti.qualcomm.com>
Thu, 8 Dec 2016 16:21:25 +0000 (21:51 +0530)
committerJouni Malinen <j@w1.fi>
Tue, 7 Feb 2017 17:35:34 +0000 (19:35 +0200)
This adds support for specifying a random TA for management frame
transmission commands and driver capability flags for indicating whether
this is supported in not-connected and connected states.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/drivers/driver.h
src/drivers/driver_nl80211.c
src/drivers/driver_nl80211.h
src/drivers/driver_nl80211_capa.c
src/drivers/driver_nl80211_event.c

index 92688a35d57a777a42ef4bf0f9880e7d213ccfc9..4fcfaa6545a1e8a9335e95c776c5205967775c5d 100644 (file)
@@ -1393,6 +1393,10 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS_BEACON_RATE_HT                0x0000100000000000ULL
 /** Driver supports Beacon frame TX rate configuration (VHT rates) */
 #define WPA_DRIVER_FLAGS_BEACON_RATE_VHT       0x0000200000000000ULL
+/** Driver supports mgmt_tx with random TX address in non-connected state */
+#define WPA_DRIVER_FLAGS_MGMT_TX_RANDOM_TA     0x0000400000000000ULL
+/** Driver supports mgmt_tx with random TX addr in connected state */
+#define WPA_DRIVER_FLAGS_MGMT_TX_RANDOM_TA_CONNECTED   0x0000800000000000ULL
        u64 flags;
 
 #define FULL_AP_CLIENT_STATE_SUPP(drv_flags) \
@@ -2785,6 +2789,9 @@ struct wpa_driver_ops {
         * transmitted on that channel; alternatively the frame may be sent on
         * the current operational channel (if in associated state in station
         * mode or while operating as an AP.)
+        *
+        * If @src differs from the device MAC address, use of a random
+        * transmitter address is requested for this message exchange.
         */
        int (*send_action)(void *priv, unsigned int freq, unsigned int wait,
                           const u8 *dst, const u8 *src, const u8 *bssid,
index 27e22c6d33dab86838afc93dfb7b5a66f1d7334d..e9107b3bba8e9ef9e9bbae95a18ff748332b2fc2 100644 (file)
@@ -6881,6 +6881,14 @@ static int wpa_driver_nl80211_send_action(struct i802_bss *bss,
        os_memcpy(hdr->addr2, src, ETH_ALEN);
        os_memcpy(hdr->addr3, bssid, ETH_ALEN);
 
+       if (os_memcmp(bss->addr, src, ETH_ALEN) != 0) {
+               wpa_printf(MSG_DEBUG, "nl80211: Use random TA " MACSTR,
+                          MAC2STR(src));
+               os_memcpy(bss->rand_addr, src, ETH_ALEN);
+       } else {
+               os_memset(bss->rand_addr, 0, ETH_ALEN);
+       }
+
        if (is_ap_interface(drv->nlmode) &&
            (!(drv->capa.flags & WPA_DRIVER_FLAGS_OFFCHANNEL_TX) ||
             (int) freq == bss->freq || drv->device_ap_sme ||
index 94b8bdf19327474195824c3fb5f5267f99e48c4b..c73895c6a11a713d20ae551bf7638ee4802cc43a 100644 (file)
@@ -78,6 +78,7 @@ struct i802_bss {
 
        struct nl80211_wiphy_data *wiphy_data;
        struct dl_list wiphy_list;
+       u8 rand_addr[ETH_ALEN];
 };
 
 struct wpa_driver_nl80211_data {
index 3d8531684e411f2e435e05519476aca549a21b1f..bc8c94e3fe849d3206929cc0a6969b821b07f6ad 100644 (file)
@@ -389,6 +389,12 @@ static void wiphy_info_ext_feature_flags(struct wiphy_info_data *info,
            ext_feature_isset(ext_features, len,
                              NL80211_EXT_FEATURE_SET_SCAN_DWELL))
                capa->rrm_flags |= WPA_DRIVER_FLAGS_SUPPORT_BEACON_REPORT;
+       if (ext_feature_isset(ext_features, len,
+                             NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA))
+               capa->flags |= WPA_DRIVER_FLAGS_MGMT_TX_RANDOM_TA;
+       if (ext_feature_isset(ext_features, len,
+                             NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA_CONNECTED))
+               capa->flags |= WPA_DRIVER_FLAGS_MGMT_TX_RANDOM_TA_CONNECTED;
 }
 
 
index c18fc223fa950ba9e736273299d693c9ebc7e0b3..f6014aaec0567daf362305818e0ba3b1c44d3c7c 100644 (file)
@@ -860,6 +860,8 @@ static void mlme_event(struct i802_bss *bss,
                   MAC2STR(data + 4 + ETH_ALEN));
        if (cmd != NL80211_CMD_FRAME_TX_STATUS && !(data[4] & 0x01) &&
            os_memcmp(bss->addr, data + 4, ETH_ALEN) != 0 &&
+           (is_zero_ether_addr(bss->rand_addr) ||
+            os_memcmp(bss->rand_addr, data + 4, ETH_ALEN) != 0) &&
            os_memcmp(bss->addr, data + 4 + ETH_ALEN, ETH_ALEN) != 0) {
                wpa_printf(MSG_MSGDUMP, "nl80211: %s: Ignore MLME frame event "
                           "for foreign address", bss->ifname);