From: Arik Nemtsov Date: Mon, 26 Sep 2011 10:55:30 +0000 (+0300) Subject: TDLS: Implement low-ack event for lost TDLS peers X-Git-Tag: hostap-1-bp~54 X-Git-Url: http://www.project-moonshot.org/gitweb/?p=mech_eap.git;a=commitdiff_plain;h=8f15f711c5177420c1991a8db75d18ee05552624 TDLS: Implement low-ack event for lost TDLS peers Disable the direct connection when a TDLS peer stops responding to packets, as indicated by the "LOW ACK" event coming from a driver. Signed-off-by: Arik Nemtsov Cc: Kalyan C Gaddam --- diff --git a/src/rsn_supp/tdls.c b/src/rsn_supp/tdls.c index 0c5335f..9fe247c 100644 --- a/src/rsn_supp/tdls.c +++ b/src/rsn_supp/tdls.c @@ -751,6 +751,22 @@ int wpa_tdls_teardown_link(struct wpa_sm *sm, const u8 *addr, u16 reason_code) } +void wpa_tdls_disable_link(struct wpa_sm *sm, const u8 *addr) +{ + struct wpa_tdls_peer *peer; + + for (peer = sm->tdls; peer; peer = peer->next) { + if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) + break; + } + + if (peer) { + wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, addr); + wpa_tdls_peer_free(sm, peer); + } +} + + static int wpa_tdls_recv_teardown(struct wpa_sm *sm, const u8 *src_addr, const u8 *buf, size_t len) { diff --git a/src/rsn_supp/wpa.h b/src/rsn_supp/wpa.h index 20a3e4f..492fd34 100644 --- a/src/rsn_supp/wpa.h +++ b/src/rsn_supp/wpa.h @@ -366,5 +366,6 @@ int wpa_tdls_send_discovery_request(struct wpa_sm *sm, const u8 *addr); int wpa_tdls_init(struct wpa_sm *sm); void wpa_tdls_deinit(struct wpa_sm *sm); void wpa_tdls_enable(struct wpa_sm *sm, int enabled); +void wpa_tdls_disable_link(struct wpa_sm *sm, const u8 *addr); #endif /* WPA_H */ diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index 4d9219e..8bf0ee3 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -2410,6 +2410,10 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, hostapd_event_sta_low_ack(wpa_s->ap_iface->bss[0], data->low_ack.addr); #endif /* CONFIG_AP */ +#ifdef CONFIG_TDLS + if (data) + wpa_tdls_disable_link(wpa_s->wpa, data->low_ack.addr); +#endif /* CONFIG_TDLS */ break; case EVENT_IBSS_PEER_LOST: #ifdef CONFIG_IBSS_RSN