TDLS: Allow TDLS to be disabled at runtime for testing purposes
Control interface command 'SET tdls_disabled <1/0>' can now be used to disable/enable TDLS at runtime. This is mainly for testing purposes.
This commit is contained in:
parent
78177a000e
commit
b8f64582e3
5 changed files with 37 additions and 1 deletions
|
@ -699,7 +699,9 @@ enum tdls_oper {
|
||||||
TDLS_SETUP,
|
TDLS_SETUP,
|
||||||
TDLS_TEARDOWN,
|
TDLS_TEARDOWN,
|
||||||
TDLS_ENABLE_LINK,
|
TDLS_ENABLE_LINK,
|
||||||
TDLS_DISABLE_LINK
|
TDLS_DISABLE_LINK,
|
||||||
|
TDLS_ENABLE,
|
||||||
|
TDLS_DISABLE
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -625,6 +625,9 @@ int wpa_tdls_recv_teardown_notify(struct wpa_sm *sm, const u8 *addr,
|
||||||
u8 *rbuf, *pos;
|
u8 *rbuf, *pos;
|
||||||
int ielen;
|
int ielen;
|
||||||
|
|
||||||
|
if (sm->tdls_disabled)
|
||||||
|
return -1;
|
||||||
|
|
||||||
/* Find the node and free from the list */
|
/* Find the node and free from the list */
|
||||||
for (peer = sm->tdls; peer; peer = peer->next) {
|
for (peer = sm->tdls; peer; peer = peer->next) {
|
||||||
if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
|
if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
|
||||||
|
@ -1825,6 +1828,9 @@ int wpa_tdls_start(struct wpa_sm *sm, const u8 *addr)
|
||||||
struct wpa_tdls_peer *peer;
|
struct wpa_tdls_peer *peer;
|
||||||
int tdls_prohibited = sm->tdls_prohibited;
|
int tdls_prohibited = sm->tdls_prohibited;
|
||||||
|
|
||||||
|
if (sm->tdls_disabled)
|
||||||
|
return -1;
|
||||||
|
|
||||||
#ifdef CONFIG_TDLS_TESTING
|
#ifdef CONFIG_TDLS_TESTING
|
||||||
if ((tdls_testing & TDLS_TESTING_IGNORE_AP_PROHIBIT) &&
|
if ((tdls_testing & TDLS_TESTING_IGNORE_AP_PROHIBIT) &&
|
||||||
tdls_prohibited) {
|
tdls_prohibited) {
|
||||||
|
@ -1869,6 +1875,9 @@ int wpa_tdls_reneg(struct wpa_sm *sm, const u8 *addr)
|
||||||
{
|
{
|
||||||
struct wpa_tdls_peer *peer;
|
struct wpa_tdls_peer *peer;
|
||||||
|
|
||||||
|
if (sm->tdls_disabled)
|
||||||
|
return -1;
|
||||||
|
|
||||||
for (peer = sm->tdls; peer; peer = peer->next) {
|
for (peer = sm->tdls; peer; peer = peer->next) {
|
||||||
if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
|
if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
|
||||||
break;
|
break;
|
||||||
|
@ -1895,6 +1904,11 @@ static void wpa_supplicant_rx_tdls(void *ctx, const u8 *src_addr,
|
||||||
wpa_hexdump(MSG_DEBUG, "TDLS: Received Data frame encapsulation",
|
wpa_hexdump(MSG_DEBUG, "TDLS: Received Data frame encapsulation",
|
||||||
buf, len);
|
buf, len);
|
||||||
|
|
||||||
|
if (sm->tdls_disabled) {
|
||||||
|
wpa_printf(MSG_DEBUG, "TDLS: Discard message - TDLS disabled");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (os_memcmp(src_addr, sm->own_addr, ETH_ALEN) == 0) {
|
if (os_memcmp(src_addr, sm->own_addr, ETH_ALEN) == 0) {
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: Discard copy of own message");
|
wpa_printf(MSG_DEBUG, "TDLS: Discard copy of own message");
|
||||||
return;
|
return;
|
||||||
|
@ -2051,3 +2065,10 @@ void wpa_tdls_assoc_resp_ies(struct wpa_sm *sm, const u8 *ies, size_t len)
|
||||||
sm->tdls_prohibited = 1;
|
sm->tdls_prohibited = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wpa_tdls_enable(struct wpa_sm *sm, int enabled)
|
||||||
|
{
|
||||||
|
wpa_printf(MSG_DEBUG, "TDLS: %s", enabled ? "enabled" : "disabled");
|
||||||
|
sm->tdls_disabled = !enabled;
|
||||||
|
}
|
||||||
|
|
|
@ -346,5 +346,6 @@ int wpa_tdls_recv_teardown_notify(struct wpa_sm *sm, const u8 *addr,
|
||||||
u16 reason_code);
|
u16 reason_code);
|
||||||
int wpa_tdls_init(struct wpa_sm *sm);
|
int wpa_tdls_init(struct wpa_sm *sm);
|
||||||
void wpa_tdls_deinit(struct wpa_sm *sm);
|
void wpa_tdls_deinit(struct wpa_sm *sm);
|
||||||
|
void wpa_tdls_enable(struct wpa_sm *sm, int enabled);
|
||||||
|
|
||||||
#endif /* WPA_H */
|
#endif /* WPA_H */
|
||||||
|
|
|
@ -97,6 +97,7 @@ struct wpa_sm {
|
||||||
#ifdef CONFIG_TDLS
|
#ifdef CONFIG_TDLS
|
||||||
struct wpa_tdls_peer *tdls;
|
struct wpa_tdls_peer *tdls;
|
||||||
int tdls_prohibited;
|
int tdls_prohibited;
|
||||||
|
int tdls_disabled;
|
||||||
#endif /* CONFIG_TDLS */
|
#endif /* CONFIG_TDLS */
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211R
|
#ifdef CONFIG_IEEE80211R
|
||||||
|
|
|
@ -114,6 +114,17 @@ static int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s,
|
||||||
tdls_testing = strtol(value, NULL, 0);
|
tdls_testing = strtol(value, NULL, 0);
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: tdls_testing=0x%x", tdls_testing);
|
wpa_printf(MSG_DEBUG, "TDLS: tdls_testing=0x%x", tdls_testing);
|
||||||
#endif /* CONFIG_TDLS_TESTING */
|
#endif /* CONFIG_TDLS_TESTING */
|
||||||
|
#ifdef CONFIG_TDLS
|
||||||
|
} else if (os_strcasecmp(cmd, "tdls_disabled") == 0) {
|
||||||
|
int disabled = atoi(value);
|
||||||
|
wpa_printf(MSG_DEBUG, "TDLS: tdls_disabled=%d", disabled);
|
||||||
|
if (disabled) {
|
||||||
|
if (wpa_drv_tdls_oper(wpa_s, TDLS_DISABLE, NULL) < 0)
|
||||||
|
ret = -1;
|
||||||
|
} else if (wpa_drv_tdls_oper(wpa_s, TDLS_ENABLE, NULL) < 0)
|
||||||
|
ret = -1;
|
||||||
|
wpa_tdls_enable(wpa_s->wpa, !disabled);
|
||||||
|
#endif /* CONFIG_TDLS */
|
||||||
} else {
|
} else {
|
||||||
value[-1] = '=';
|
value[-1] = '=';
|
||||||
ret = wpa_config_process_global(wpa_s->conf, cmd, -1);
|
ret = wpa_config_process_global(wpa_s->conf, cmd, -1);
|
||||||
|
|
Loading…
Reference in a new issue