}
+int wpa_tdls_reneg(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 == NULL || !peer->tpk_success)
+ return -1;
+
+ return wpa_tdls_start(sm, addr);
+}
+
+
/**
* wpa_supplicant_rx_tdls - Receive TDLS data frame
*
/* tdls.c */
int wpa_tdls_start(struct wpa_sm *sm, const u8 *addr);
+int wpa_tdls_reneg(struct wpa_sm *sm, const u8 *addr);
int wpa_tdls_recv_teardown_notify(struct wpa_sm *sm, const u8 *addr,
u16 reason_code);
int wpa_tdls_init(struct wpa_sm *sm);
struct wpa_supplicant *wpa_s, char *addr)
{
u8 peer[ETH_ALEN];
+ int ret;
if (hwaddr_aton(addr, peer)) {
wpa_printf(MSG_DEBUG, "CTRL_IFACE TDLS_SETUP: invalid "
wpa_printf(MSG_DEBUG, "CTRL_IFACE TDLS_SETUP " MACSTR,
MAC2STR(peer));
- return wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer);
+ ret = wpa_tdls_reneg(wpa_s->wpa, peer);
+ if (ret)
+ ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer);
+ return ret;
}