mac80211: Track auth frame registrations on IBSS ifaces
authorWill Hawkins <hawkinsw@opentechinstitute.org>
Wed, 20 Jun 2012 15:51:14 +0000 (11:51 -0400)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 20 Jun 2012 18:03:41 +0000 (20:03 +0200)
Track userspace registrations for authentication
frames received on an IBSS interface. This field
will be used to decide whether or not to send
"open system" authentication frames when a new
station joins an adhoc network.

Signed-off-by: Will Hawkins <hawkinsw@opentechinstitute.org>
[redesign the code flow a bit]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/cfg.c
net/mac80211/ieee80211_i.h

index 17162fcc24bc1b5faaf3248238af52062f41adec..a6abcd473434289f6c258eb0331efa8a386406d2 100644 (file)
@@ -2516,16 +2516,30 @@ static void ieee80211_mgmt_frame_register(struct wiphy *wiphy,
                                          u16 frame_type, bool reg)
 {
        struct ieee80211_local *local = wiphy_priv(wiphy);
+       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
-       if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ))
-               return;
+       switch (frame_type) {
+       case IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH:
+               if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
+                       struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
 
-       if (reg)
-               local->probe_req_reg++;
-       else
-               local->probe_req_reg--;
+                       if (reg)
+                               ifibss->auth_frame_registrations++;
+                       else
+                               ifibss->auth_frame_registrations--;
+               }
+               break;
+       case IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ:
+               if (reg)
+                       local->probe_req_reg++;
+               else
+                       local->probe_req_reg--;
 
-       ieee80211_queue_work(&local->hw, &local->reconfig_filter);
+               ieee80211_queue_work(&local->hw, &local->reconfig_filter);
+               break;
+       default:
+               break;
+       }
 }
 
 static int ieee80211_set_antenna(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant)
index 0024c32d7bc4436329850f8f0061dde163da4f80..36ce2bb066bf985bc178f666382c487a5bf69b34 100644 (file)
@@ -511,6 +511,7 @@ struct ieee80211_if_ibss {
        bool privacy;
 
        bool control_port;
+       unsigned int auth_frame_registrations;
 
        u8 bssid[ETH_ALEN] __aligned(2);
        u8 ssid[IEEE80211_MAX_SSID_LEN];