qtnfmac: support WPA3 SAE in AP mode
authorSergey Matyukevich <sergey.matyukevich.os@quantenna.com>
Thu, 13 Feb 2020 11:45:28 +0000 (11:45 +0000)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 12 Mar 2020 13:38:55 +0000 (15:38 +0200)
Enable WPA3 SAE support in AP mode. Driver currently supports cards
that offload SAE authentication to userspace. So allow userspace
software to subscribe and to send AUTH frames. Besides, enable
AP mode support in external_auth cfg80211 callback.

Signed-off-by: Sergey Matyukevich <sergey.matyukevich.os@quantenna.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/quantenna/qtnfmac/cfg80211.c
drivers/net/wireless/quantenna/qtnfmac/commands.c
drivers/net/wireless/quantenna/qtnfmac/event.c
drivers/net/wireless/quantenna/qtnfmac/qlink.h

index 73d5014a42342b7c62f3171b8e57500045509e1f..a5ab1270add13b6a7a56b0f98a80bda930751863 100644 (file)
@@ -60,7 +60,8 @@ qtnf_mgmt_stypes[NUM_NL80211_IFTYPES] = {
                      BIT(IEEE80211_STYPE_AUTH >> 4),
        },
        [NL80211_IFTYPE_AP] = {
-               .tx = BIT(IEEE80211_STYPE_ACTION >> 4),
+               .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
+                     BIT(IEEE80211_STYPE_AUTH >> 4),
                .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
                      BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
                      BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
@@ -679,10 +680,8 @@ qtnf_external_auth(struct wiphy *wiphy, struct net_device *dev,
        struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
        int ret;
 
-       if (vif->wdev.iftype != NL80211_IFTYPE_STATION)
-               return -EOPNOTSUPP;
-
-       if (!ether_addr_equal(vif->bssid, auth->bssid))
+       if (vif->wdev.iftype == NL80211_IFTYPE_STATION &&
+           !ether_addr_equal(vif->bssid, auth->bssid))
                pr_warn("unexpected bssid: %pM", auth->bssid);
 
        ret = qtnf_cmd_send_external_auth(vif, auth);
index ccc1e06dfcf68961666cc1b14b3a5750ad7f70b1..4a4c213fe9f17d9e2d5dac9a97360b4d17a65c60 100644 (file)
@@ -2211,7 +2211,7 @@ int qtnf_cmd_send_external_auth(struct qtnf_vif *vif,
 
        cmd = (struct qlink_cmd_external_auth *)cmd_skb->data;
 
-       ether_addr_copy(cmd->bssid, auth->bssid);
+       ether_addr_copy(cmd->peer, auth->bssid);
        cmd->status = cpu_to_le16(auth->status);
 
        qtnf_bus_lock(vif->mac->bus);
index 7e408b5c55498200404f2506100b2d09dc9e5a2d..cb610a7864eab9d609a078b5033cc95313656729 100644 (file)
@@ -578,9 +578,9 @@ qtnf_event_handle_external_auth(struct qtnf_vif *vif,
        ether_addr_copy(auth.bssid, ev->bssid);
        auth.action = ev->action;
 
-       pr_info("%s: external auth bss=%pM action=%u akm=%u\n",
-               vif->netdev->name, auth.bssid, auth.action,
-               auth.key_mgmt_suite);
+       pr_debug("%s: external SAE processing: bss=%pM action=%u akm=%u\n",
+                vif->netdev->name, auth.bssid, auth.action,
+                auth.key_mgmt_suite);
 
        ret = cfg80211_external_auth_request(vif->netdev, &auth, GFP_KERNEL);
        if (ret)
index 7ee1070f985fe23bbb17386d8ae7c67740622ae3..5e9254f8fa8aa574db5eafca0ddb5f443da75c45 100644 (file)
@@ -589,7 +589,7 @@ struct qlink_cmd_connect {
  */
 struct qlink_cmd_external_auth {
        struct qlink_cmd chdr;
-       u8 bssid[ETH_ALEN];
+       u8 peer[ETH_ALEN];
        __le16 status;
        u8 payload[0];
 } __packed;