TDLS: Add channel-switch capability flag
authorArik Nemtsov <arik@wizery.com>
Mon, 29 Dec 2014 03:44:37 +0000 (22:44 -0500)
committerJouni Malinen <j@w1.fi>
Sun, 4 Jan 2015 16:59:31 +0000 (18:59 +0200)
Propagate a driver TDLS channel-switch support bit from nl80211 to
TDLS code.

Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com>
src/drivers/driver.h
src/drivers/driver_nl80211_capa.c
src/rsn_supp/tdls.c
src/rsn_supp/wpa.h
src/rsn_supp/wpa_i.h
wpa_supplicant/wpas_glue.c

index 8d1d1da..e58ea6c 100644 (file)
@@ -1160,6 +1160,8 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS_ACS_OFFLOAD           0x0000000200000000ULL
 /** Driver supports key management offload */
 #define WPA_DRIVER_FLAGS_KEY_MGMT_OFFLOAD      0x0000000400000000ULL
+/** Driver supports TDLS channel switching */
+#define WPA_DRIVER_FLAGS_TDLS_CHANNEL_SWITCH   0x0000000800000000ULL
        u64 flags;
 
 #define WPA_DRIVER_SMPS_MODE_STATIC                    0x00000001
index 330ebdf..c38d75d 100644 (file)
@@ -358,6 +358,11 @@ static void wiphy_info_feature_flags(struct wiphy_info_data *info,
        if (flags & NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)
                capa->flags |= WPA_DRIVER_FLAGS_HT_2040_COEX;
 
+       if (flags & NL80211_FEATURE_TDLS_CHANNEL_SWITCH) {
+               wpa_printf(MSG_DEBUG, "nl80211: TDLS channel switch");
+               capa->flags |= WPA_DRIVER_FLAGS_TDLS_CHANNEL_SWITCH;
+       }
+
        if (flags & NL80211_FEATURE_LOW_PRIORITY_SCAN)
                info->have_low_prio_scan = 1;
 
index 8cb19a2..918440c 100644 (file)
@@ -2742,7 +2742,8 @@ int wpa_tdls_init(struct wpa_sm *sm)
         * are assumed to perform everything internally
         */
        if (wpa_sm_tdls_get_capa(sm, &sm->tdls_supported,
-                                &sm->tdls_external_setup) < 0) {
+                                &sm->tdls_external_setup,
+                                &sm->tdls_chan_switch) < 0) {
                sm->tdls_supported = 1;
                sm->tdls_external_setup = 0;
        }
@@ -2751,6 +2752,8 @@ int wpa_tdls_init(struct wpa_sm *sm)
                   "driver", sm->tdls_supported ? "" : " not");
        wpa_printf(MSG_DEBUG, "TDLS: Driver uses %s link setup",
                   sm->tdls_external_setup ? "external" : "internal");
+       wpa_printf(MSG_DEBUG, "TDLS: Driver %s TDLS channel switching",
+                  sm->tdls_chan_switch ? "supports" : "does not support");
 
        return 0;
 }
index 355ed13..110677f 100644 (file)
@@ -51,7 +51,7 @@ struct wpa_sm_ctx {
        int (*mark_authenticated)(void *ctx, const u8 *target_ap);
 #ifdef CONFIG_TDLS
        int (*tdls_get_capa)(void *ctx, int *tdls_supported,
-                            int *tdls_ext_setup);
+                            int *tdls_ext_setup, int *tdls_chan_switch);
        int (*send_tdls_mgmt)(void *ctx, const u8 *dst,
                              u8 action_code, u8 dialog_token,
                              u16 status_code, u32 peer_capab,
index dd5ddfb..ad4ccae 100644 (file)
@@ -102,6 +102,9 @@ struct wpa_sm {
         * to it via tdls_mgmt.
         */
        int tdls_external_setup;
+
+       /* The driver supports TDLS channel switching */
+       int tdls_chan_switch;
 #endif /* CONFIG_TDLS */
 
 #ifdef CONFIG_IEEE80211R
@@ -257,11 +260,12 @@ static inline void wpa_sm_set_rekey_offload(struct wpa_sm *sm)
 #ifdef CONFIG_TDLS
 static inline int wpa_sm_tdls_get_capa(struct wpa_sm *sm,
                                       int *tdls_supported,
-                                      int *tdls_ext_setup)
+                                      int *tdls_ext_setup,
+                                      int *tdls_chan_switch)
 {
        if (sm->ctx->tdls_get_capa)
                return sm->ctx->tdls_get_capa(sm->ctx->ctx, tdls_supported,
-                                             tdls_ext_setup);
+                                             tdls_ext_setup, tdls_chan_switch);
        return -1;
 }
 
index 70ece22..3f45e08 100644 (file)
@@ -609,12 +609,14 @@ static int wpa_supplicant_mark_authenticated(void *ctx, const u8 *target_ap)
 #ifdef CONFIG_TDLS
 
 static int wpa_supplicant_tdls_get_capa(void *ctx, int *tdls_supported,
-                                       int *tdls_ext_setup)
+                                       int *tdls_ext_setup,
+                                       int *tdls_chan_switch)
 {
        struct wpa_supplicant *wpa_s = ctx;
 
        *tdls_supported = 0;
        *tdls_ext_setup = 0;
+       *tdls_chan_switch = 0;
 
        if (!wpa_s->drv_capa_known)
                return -1;
@@ -625,6 +627,9 @@ static int wpa_supplicant_tdls_get_capa(void *ctx, int *tdls_supported,
        if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_TDLS_EXTERNAL_SETUP)
                *tdls_ext_setup = 1;
 
+       if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_TDLS_CHANNEL_SWITCH)
+               *tdls_chan_switch = 1;
+
        return 0;
 }