nl80211: add authorized flag to ROAM event
authorAvraham Stern <avraham.stern@intel.com>
Fri, 9 Jun 2017 12:08:45 +0000 (13:08 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 13 Jun 2017 09:04:37 +0000 (11:04 +0200)
Drivers that initiate roaming while being connected to a network that
uses 802.1X authentication need to inform user space if 802.1X
authentication is further required after roaming.
For example, when using the Fast transition protocol, roaming within
the mobility domain does not require new 802.1X authentication, but
roaming to another mobility domain does.
In addition, some drivers may not support 802.1X authentication
(so it has to be done in user space), while other drivers do.

Add a flag to the roaming notification to indicate if user space is
required to do 802.1X authentication after the roaming or not.
This flag will only be used for networks that use 802.1X
authentication. For networks that do not use 802.1X authentication it
is assumed that no further action is required from user space after
the roaming notification.

Signed-off-by: Avraham Stern <avraham.stern@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
[arend.vanspriel@broadcom.com reuse NL80211_ATTR_PORT_AUTHORIZED]
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
[rebase to apply w/o the flag in CONNECT]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/wireless/nl80211.c
net/wireless/sme.c

index 2174e51c6595ea357896284675199a99b10af59c..f12fa5245a453144d07a1fead15b92d144621f38 100644 (file)
@@ -5441,6 +5441,9 @@ cfg80211_connect_timeout(struct net_device *dev, const u8 *bssid,
  * @req_ie_len: association request IEs length
  * @resp_ie: association response IEs (may be %NULL)
  * @resp_ie_len: assoc response IEs length
+ * @authorized: true if the 802.1X authentication was done by the driver or is
+ *     not needed (e.g., when Fast Transition protocol was used), false
+ *     otherwise. Ignored for networks that don't use 802.1X authentication.
  */
 struct cfg80211_roam_info {
        struct ieee80211_channel *channel;
@@ -5450,6 +5453,7 @@ struct cfg80211_roam_info {
        size_t req_ie_len;
        const u8 *resp_ie;
        size_t resp_ie_len;
+       bool authorized;
 };
 
 /**
index 073e26850195fbc037bb4fa30633a1e557f51b4e..72f15c3fc5a6163310cec7d26b02c73924d934e9 100644 (file)
  *     well to remain backwards compatible.
  * @NL80211_CMD_ROAM: request that the card roam (currently not implemented),
  *     sent as an event when the card/driver roamed by itself.
+ *     When used as an event, and the driver roamed in a network that requires
+ *     802.1X authentication, %NL80211_ATTR_PORT_AUTHORIZED should be set
+ *     if the 802.1X authentication was done by the driver or if roaming was
+ *     done using Fast Transition protocol (in which case 802.1X authentication
+ *     is not needed). If %NL80211_ATTR_PORT_AUTHORIZED is not set, user space
+ *     is responsible for the 802.1X authentication.
  * @NL80211_CMD_DISCONNECT: drop a given connection; also used to notify
  *     userspace that a connection was dropped by the AP or due to other
  *     reasons, for this the %NL80211_ATTR_DISCONNECTED_BY_AP and
@@ -2130,6 +2136,10 @@ enum nl80211_commands {
  *     in %NL80211_CMD_CONNECT to indicate that for 802.1X authentication it
  *     wants to use the supported offload of the 4-way handshake.
  * @NL80211_ATTR_PMKR0_NAME: PMK-R0 Name for offloaded FT.
+ * @NL80211_ATTR_PORT_AUTHORIZED: flag attribute used in %NL80211_CMD_ROAMED
+ *     notification indicating that that 802.1X authentication was done by
+ *     the driver or is not needed (because roaming used the Fast Transition
+ *     protocol).
  *
  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
  * @NL80211_ATTR_MAX: highest attribute number currently defined
@@ -2555,6 +2565,7 @@ enum nl80211_attrs {
 
        NL80211_ATTR_WANT_1X_4WAY_HS,
        NL80211_ATTR_PMKR0_NAME,
+       NL80211_ATTR_PORT_AUTHORIZED,
 
        /* add attributes here, update the policy in nl80211.c */
 
index 8148b01bcdd25631da9bd73fff4bcbb6025d25c7..5487cd775b6fd9bc7c167bb1d5aea08393181983 100644 (file)
@@ -13800,7 +13800,9 @@ void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
                     info->req_ie)) ||
            (info->resp_ie &&
             nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len,
-                    info->resp_ie)))
+                    info->resp_ie)) ||
+           (info->authorized &&
+            nla_put_flag(msg, NL80211_ATTR_PORT_AUTHORIZED)))
                goto nla_put_failure;
 
        genlmsg_end(msg, hdr);
index 532a0007ce82a7380536e32d5be3749e58bb4fc7..0a49b88070d0b2d6a6fbcafe6e8816fded775261 100644 (file)
@@ -960,6 +960,7 @@ void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info,
        ev->rm.resp_ie_len = info->resp_ie_len;
        memcpy((void *)ev->rm.resp_ie, info->resp_ie, info->resp_ie_len);
        ev->rm.bss = info->bss;
+       ev->rm.authorized = info->authorized;
 
        spin_lock_irqsave(&wdev->event_lock, flags);
        list_add_tail(&ev->list, &wdev->event_list);