TDLS: Add channel-switch capability flag
Propagate a driver TDLS channel-switch support bit from nl80211 to TDLS code. Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com>
This commit is contained in:
parent
ca16586afe
commit
4daa572925
6 changed files with 24 additions and 5 deletions
|
@ -1160,6 +1160,8 @@ struct wpa_driver_capa {
|
||||||
#define WPA_DRIVER_FLAGS_ACS_OFFLOAD 0x0000000200000000ULL
|
#define WPA_DRIVER_FLAGS_ACS_OFFLOAD 0x0000000200000000ULL
|
||||||
/** Driver supports key management offload */
|
/** Driver supports key management offload */
|
||||||
#define WPA_DRIVER_FLAGS_KEY_MGMT_OFFLOAD 0x0000000400000000ULL
|
#define WPA_DRIVER_FLAGS_KEY_MGMT_OFFLOAD 0x0000000400000000ULL
|
||||||
|
/** Driver supports TDLS channel switching */
|
||||||
|
#define WPA_DRIVER_FLAGS_TDLS_CHANNEL_SWITCH 0x0000000800000000ULL
|
||||||
u64 flags;
|
u64 flags;
|
||||||
|
|
||||||
#define WPA_DRIVER_SMPS_MODE_STATIC 0x00000001
|
#define WPA_DRIVER_SMPS_MODE_STATIC 0x00000001
|
||||||
|
|
|
@ -358,6 +358,11 @@ static void wiphy_info_feature_flags(struct wiphy_info_data *info,
|
||||||
if (flags & NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)
|
if (flags & NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)
|
||||||
capa->flags |= WPA_DRIVER_FLAGS_HT_2040_COEX;
|
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)
|
if (flags & NL80211_FEATURE_LOW_PRIORITY_SCAN)
|
||||||
info->have_low_prio_scan = 1;
|
info->have_low_prio_scan = 1;
|
||||||
|
|
||||||
|
|
|
@ -2742,7 +2742,8 @@ int wpa_tdls_init(struct wpa_sm *sm)
|
||||||
* are assumed to perform everything internally
|
* are assumed to perform everything internally
|
||||||
*/
|
*/
|
||||||
if (wpa_sm_tdls_get_capa(sm, &sm->tdls_supported,
|
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_supported = 1;
|
||||||
sm->tdls_external_setup = 0;
|
sm->tdls_external_setup = 0;
|
||||||
}
|
}
|
||||||
|
@ -2751,6 +2752,8 @@ int wpa_tdls_init(struct wpa_sm *sm)
|
||||||
"driver", sm->tdls_supported ? "" : " not");
|
"driver", sm->tdls_supported ? "" : " not");
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: Driver uses %s link setup",
|
wpa_printf(MSG_DEBUG, "TDLS: Driver uses %s link setup",
|
||||||
sm->tdls_external_setup ? "external" : "internal");
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ struct wpa_sm_ctx {
|
||||||
int (*mark_authenticated)(void *ctx, const u8 *target_ap);
|
int (*mark_authenticated)(void *ctx, const u8 *target_ap);
|
||||||
#ifdef CONFIG_TDLS
|
#ifdef CONFIG_TDLS
|
||||||
int (*tdls_get_capa)(void *ctx, int *tdls_supported,
|
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,
|
int (*send_tdls_mgmt)(void *ctx, const u8 *dst,
|
||||||
u8 action_code, u8 dialog_token,
|
u8 action_code, u8 dialog_token,
|
||||||
u16 status_code, u32 peer_capab,
|
u16 status_code, u32 peer_capab,
|
||||||
|
|
|
@ -102,6 +102,9 @@ struct wpa_sm {
|
||||||
* to it via tdls_mgmt.
|
* to it via tdls_mgmt.
|
||||||
*/
|
*/
|
||||||
int tdls_external_setup;
|
int tdls_external_setup;
|
||||||
|
|
||||||
|
/* The driver supports TDLS channel switching */
|
||||||
|
int tdls_chan_switch;
|
||||||
#endif /* CONFIG_TDLS */
|
#endif /* CONFIG_TDLS */
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211R
|
#ifdef CONFIG_IEEE80211R
|
||||||
|
@ -257,11 +260,12 @@ static inline void wpa_sm_set_rekey_offload(struct wpa_sm *sm)
|
||||||
#ifdef CONFIG_TDLS
|
#ifdef CONFIG_TDLS
|
||||||
static inline int wpa_sm_tdls_get_capa(struct wpa_sm *sm,
|
static inline int wpa_sm_tdls_get_capa(struct wpa_sm *sm,
|
||||||
int *tdls_supported,
|
int *tdls_supported,
|
||||||
int *tdls_ext_setup)
|
int *tdls_ext_setup,
|
||||||
|
int *tdls_chan_switch)
|
||||||
{
|
{
|
||||||
if (sm->ctx->tdls_get_capa)
|
if (sm->ctx->tdls_get_capa)
|
||||||
return sm->ctx->tdls_get_capa(sm->ctx->ctx, tdls_supported,
|
return sm->ctx->tdls_get_capa(sm->ctx->ctx, tdls_supported,
|
||||||
tdls_ext_setup);
|
tdls_ext_setup, tdls_chan_switch);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -609,12 +609,14 @@ static int wpa_supplicant_mark_authenticated(void *ctx, const u8 *target_ap)
|
||||||
#ifdef CONFIG_TDLS
|
#ifdef CONFIG_TDLS
|
||||||
|
|
||||||
static int wpa_supplicant_tdls_get_capa(void *ctx, int *tdls_supported,
|
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;
|
struct wpa_supplicant *wpa_s = ctx;
|
||||||
|
|
||||||
*tdls_supported = 0;
|
*tdls_supported = 0;
|
||||||
*tdls_ext_setup = 0;
|
*tdls_ext_setup = 0;
|
||||||
|
*tdls_chan_switch = 0;
|
||||||
|
|
||||||
if (!wpa_s->drv_capa_known)
|
if (!wpa_s->drv_capa_known)
|
||||||
return -1;
|
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)
|
if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_TDLS_EXTERNAL_SETUP)
|
||||||
*tdls_ext_setup = 1;
|
*tdls_ext_setup = 1;
|
||||||
|
|
||||||
|
if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_TDLS_CHANNEL_SWITCH)
|
||||||
|
*tdls_chan_switch = 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue