wil6210: basic PBSS/PCP support
authorLior David <qca_liord@qca.qualcomm.com>
Tue, 1 Mar 2016 17:18:10 +0000 (19:18 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Mon, 7 Mar 2016 09:43:20 +0000 (11:43 +0200)
PBSS (Personal Basic Service Set) is a new BSS type for DMG
networks. It is similar to infrastructure BSS, having an AP-like
entity called PCP (PBSS Control Point), but it has few differences.
For example, stations inside a PBSS can communicate directly, and
the PCP role can be transferred between stations.

This change adds PBSS support, and has 2 main parts:
1. When starting an AP, add an option to start as a PCP instead.
This is implemented by a new PBSS flag which is passed as part of
the cfg80211_ap_settings structure.
2. When connecting to a BSS, add an option to connect to a PCP
instead of an AP. This is again implemented by a new PBSS flag,
added to the cfg80211_connect_params structure.

Signed-off-by: Lior David <qca_liord@qca.qualcomm.com>
Signed-off-by: Maya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/wil6210/cfg80211.c
drivers/net/wireless/ath/wil6210/wil6210.h

index 0c25e8beec3cec17d3c8fd53b26dc523306491a5..4a95e1c8bc2287f784d0db8f678f62c7741b8cb3 100644 (file)
@@ -402,6 +402,7 @@ static void wil_print_connect_params(struct wil6210_priv *wil,
                print_hex_dump(KERN_INFO, "  SSID: ", DUMP_PREFIX_OFFSET,
                               16, 1, sme->ssid, sme->ssid_len, true);
        wil_info(wil, "  Privacy: %s\n", sme->privacy ? "secure" : "open");
+       wil_info(wil, "  PBSS: %d\n", sme->pbss);
        wil_print_crypto(wil, &sme->crypto);
 }
 
@@ -416,6 +417,7 @@ static int wil_cfg80211_connect(struct wiphy *wiphy,
        const u8 *rsn_eid;
        int ch;
        int rc = 0;
+       enum ieee80211_bss_type bss_type = IEEE80211_BSS_TYPE_ESS;
 
        wil_print_connect_params(wil, sme);
 
@@ -434,14 +436,12 @@ static int wil_cfg80211_connect(struct wiphy *wiphy,
        if (sme->privacy && !rsn_eid)
                wil_info(wil, "WSC connection\n");
 
-       if (sme->pbss) {
-               wil_err(wil, "connect - PBSS not yet supported\n");
-               return -EOPNOTSUPP;
-       }
+       if (sme->pbss)
+               bss_type = IEEE80211_BSS_TYPE_PBSS;
 
        bss = cfg80211_get_bss(wiphy, sme->channel, sme->bssid,
                               sme->ssid, sme->ssid_len,
-                              IEEE80211_BSS_TYPE_ESS, IEEE80211_PRIVACY_ANY);
+                              bss_type, IEEE80211_PRIVACY_ANY);
        if (!bss) {
                wil_err(wil, "Unable to find BSS\n");
                return -ENOENT;
@@ -936,13 +936,16 @@ static int _wil_cfg80211_start_ap(struct wiphy *wiphy,
                                  const u8 *ssid, size_t ssid_len, u32 privacy,
                                  int bi, u8 chan,
                                  struct cfg80211_beacon_data *bcon,
-                                 u8 hidden_ssid)
+                                 u8 hidden_ssid, u32 pbss)
 {
        struct wil6210_priv *wil = wiphy_to_wil(wiphy);
        int rc;
        struct wireless_dev *wdev = ndev->ieee80211_ptr;
        u8 wmi_nettype = wil_iftype_nl2wmi(wdev->iftype);
 
+       if (pbss)
+               wmi_nettype = WMI_NETTYPE_P2P;
+
        wil_set_recovery_state(wil, fw_recovery_idle);
 
        mutex_lock(&wil->mutex);
@@ -963,6 +966,7 @@ static int _wil_cfg80211_start_ap(struct wiphy *wiphy,
        wil->privacy = privacy;
        wil->channel = chan;
        wil->hidden_ssid = hidden_ssid;
+       wil->pbss = pbss;
 
        netif_carrier_on(ndev);
 
@@ -1012,7 +1016,8 @@ static int wil_cfg80211_change_beacon(struct wiphy *wiphy,
                                            wdev->ssid_len, privacy,
                                            wdev->beacon_interval,
                                            wil->channel, bcon,
-                                           wil->hidden_ssid);
+                                           wil->hidden_ssid,
+                                           wil->pbss);
        } else {
                rc = _wil_cfg80211_set_ies(wiphy, bcon);
        }
@@ -1038,11 +1043,6 @@ static int wil_cfg80211_start_ap(struct wiphy *wiphy,
                return -EINVAL;
        }
 
-       if (info->pbss) {
-               wil_err(wil, "AP: PBSS not yet supported\n");
-               return -EOPNOTSUPP;
-       }
-
        switch (info->hidden_ssid) {
        case NL80211_HIDDEN_SSID_NOT_IN_USE:
                hidden_ssid = WMI_HIDDEN_SSID_DISABLED;
@@ -1068,6 +1068,7 @@ static int wil_cfg80211_start_ap(struct wiphy *wiphy,
                     info->hidden_ssid);
        wil_dbg_misc(wil, "BI %d DTIM %d\n", info->beacon_interval,
                     info->dtim_period);
+       wil_dbg_misc(wil, "PBSS %d\n", info->pbss);
        print_hex_dump_bytes("SSID ", DUMP_PREFIX_OFFSET,
                             info->ssid, info->ssid_len);
        wil_print_bcon_data(bcon);
@@ -1076,7 +1077,7 @@ static int wil_cfg80211_start_ap(struct wiphy *wiphy,
        rc = _wil_cfg80211_start_ap(wiphy, ndev,
                                    info->ssid, info->ssid_len, info->privacy,
                                    info->beacon_interval, channel->hw_value,
-                                   bcon, hidden_ssid);
+                                   bcon, hidden_ssid, info->pbss);
 
        return rc;
 }
index e69df0c1a125c016be59149954a5be919028e62e..69d970a74aae494c5304307c9741c30c2ea98428 100644 (file)
@@ -604,6 +604,8 @@ struct wil6210_priv {
        struct wil_platform_ops platform_ops;
 
        struct pmc_ctx pmc;
+
+       bool pbss;
 };
 
 #define wil_to_wiphy(i) (i->wdev->wiphy)
This page took 0.027699 seconds and 5 git commands to generate.