nl80211/mac80211: let userspace authenticate stations
Javier Cardona [Thu, 7 Apr 2011 22:08:30 +0000 (15:08 -0700)]
Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

include/linux/nl80211.h
net/mac80211/cfg.c
net/wireless/nl80211.c

index 0e652d8..5ec4ac3 100644 (file)
@@ -1174,6 +1174,7 @@ enum nl80211_iftype {
  *     with short barker preamble
  * @NL80211_STA_FLAG_WME: station is WME/QoS capable
  * @NL80211_STA_FLAG_MFP: station uses management frame protection
+ * @NL80211_STA_FLAG_AUTHENTICATED: station is authenticated
  * @NL80211_STA_FLAG_MAX: highest station flag number currently defined
  * @__NL80211_STA_FLAG_AFTER_LAST: internal use
  */
@@ -1183,6 +1184,7 @@ enum nl80211_sta_flags {
        NL80211_STA_FLAG_SHORT_PREAMBLE,
        NL80211_STA_FLAG_WME,
        NL80211_STA_FLAG_MFP,
+       NL80211_STA_FLAG_AUTHENTICATED,
 
        /* keep last */
        __NL80211_STA_FLAG_AFTER_LAST,
index dc623d8..1c25723 100644 (file)
@@ -686,6 +686,12 @@ static void sta_apply_parameters(struct ieee80211_local *local,
                if (set & BIT(NL80211_STA_FLAG_MFP))
                        sta->flags |= WLAN_STA_MFP;
        }
+
+       if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED)) {
+               sta->flags &= ~WLAN_STA_AUTH;
+               if (set & BIT(NL80211_STA_FLAG_AUTHENTICATED))
+                       sta->flags |= WLAN_STA_AUTH;
+       }
        spin_unlock_irqrestore(&sta->flaglock, flags);
 
        /*
index cbedfc2..ce29a0d 100644 (file)
@@ -1925,6 +1925,7 @@ static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = {
        [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG },
        [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG },
        [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG },
+       [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG },
 };
 
 static int parse_station_flags(struct genl_info *info,
@@ -2284,7 +2285,9 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
                        err = -EINVAL;
                if (params.supported_rates)
                        err = -EINVAL;
-               if (params.sta_flags_mask)
+               if (params.sta_flags_mask &
+                               ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) |
+                                 BIT(NL80211_STA_FLAG_AUTHORIZED)))
                        err = -EINVAL;
                break;
        default: