Home | History | Annotate | Download | only in rsn_supp

Lines Matching refs:peer

85 static void wpa_tdls_peer_free(struct wpa_sm *sm, struct wpa_tdls_peer *peer);
87 struct wpa_tdls_peer *peer);
104 u8 rsnie_p[TDLS_MAX_IE_LEN]; /* Peer RSN IE */
177 static int wpa_tdls_del_key(struct wpa_sm *sm, struct wpa_tdls_peer *peer)
179 if (wpa_sm_set_key(sm, WPA_ALG_NONE, peer->addr,
190 static int wpa_tdls_set_key(struct wpa_sm *sm, struct wpa_tdls_peer *peer)
196 if (peer->tk_set) {
204 wpa_printf(MSG_INFO, "TDLS: TPK-TK for the peer " MACSTR
206 MAC2STR(peer->addr));
212 switch (peer->cipher) {
227 wpa_printf(MSG_DEBUG, "TDLS: Configure pairwise key for peer " MACSTR,
228 MAC2STR(peer->addr));
229 if (wpa_sm_set_key(sm, alg, peer->addr, -1, 1,
230 rsc, sizeof(rsc), peer->tpk.tk, key_len) < 0) {
235 peer->tk_set = 1;
255 struct wpa_tdls_peer *peer;
277 for (peer = sm->tdls; peer; peer = peer->next) {
278 if (os_memcmp(peer->addr, dest, ETH_ALEN) == 0)
282 if (peer == NULL) {
288 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer);
291 peer->sm_tmr.count = TPK_M2_RETRY_COUNT;
292 peer->sm_tmr.timer = TPK_M2_TIMEOUT;
294 peer->sm_tmr.count = TPK_M1_RETRY_COUNT;
295 peer->sm_tmr.timer = TPK_M1_TIMEOUT;
299 os_memcpy(peer->sm_tmr.dest, dest, ETH_ALEN);
300 peer->sm_tmr.action_code = action_code;
301 peer->sm_tmr.dialog_token = dialog_token;
302 peer->sm_tmr.status_code = status_code;
303 peer->sm_tmr.peer_capab = peer_capab;
304 peer->sm_tmr.buf_len = msg_len;
305 os_free(peer->sm_tmr.buf);
306 peer->sm_tmr.buf = os_memdup(msg, msg_len);
307 if (peer->sm_tmr.buf == NULL)
312 eloop_register_timeout(peer->sm_tmr.timer / 1000,
313 (peer->sm_tmr.timer % 1000) * 1000,
314 wpa_tdls_tpk_retry_timeout, sm, peer);
319 static int wpa_tdls_do_teardown(struct wpa_sm *sm, struct wpa_tdls_peer *peer,
324 ret = wpa_tdls_send_teardown(sm, peer->addr, reason_code);
326 wpa_tdls_disable_peer_link(sm, peer);
336 struct wpa_tdls_peer *peer = timeout_ctx;
338 if (peer->sm_tmr.count) {
339 peer->sm_tmr.count--;
343 peer->sm_tmr.action_code);
345 if (peer->sm_tmr.buf == NULL) {
348 peer->sm_tmr.action_code);
350 peer);
354 /* resend TPK Handshake Message to Peer */
355 if (wpa_tdls_send_tpk_msg(sm, peer->sm_tmr.dest,
356 peer->sm_tmr.action_code,
357 peer->sm_tmr.dialog_token,
358 peer->sm_tmr.status_code,
359 peer->sm_tmr.peer_capab,
360 peer->initiator,
361 peer->sm_tmr.buf,
362 peer->sm_tmr.buf_len)) {
367 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer);
368 eloop_register_timeout(peer->sm_tmr.timer / 1000,
369 (peer->sm_tmr.timer % 1000) * 1000,
370 wpa_tdls_tpk_retry_timeout, sm, peer);
372 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer);
375 wpa_tdls_do_teardown(sm, peer,
382 struct wpa_tdls_peer *peer,
385 if (action_code == peer->sm_tmr.action_code) {
390 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer);
393 os_free(peer->sm_tmr.buf);
394 peer->sm_tmr.buf = NULL;
396 peer->sm_tmr.count = 0;
397 peer->sm_tmr.timer = 0;
398 peer->sm_tmr.buf_len = 0;
399 peer->sm_tmr.action_code = 0xff;
407 static void wpa_tdls_generate_tpk(struct wpa_tdls_peer *peer,
421 if (os_memcmp(peer->inonce, peer->rnonce, WPA_NONCE_LEN) < 0) {
422 nonce[0] = peer->inonce;
423 nonce[1] = peer->rnonce;
425 nonce[0] = peer->rnonce;
426 nonce[1] = peer->inonce;
439 if (os_memcmp(own_addr, peer->addr, ETH_ALEN) < 0) {
441 os_memcpy(data + ETH_ALEN, peer->addr, ETH_ALEN);
443 os_memcpy(data, peer->addr, ETH_ALEN);
450 (u8 *) &peer->tpk, sizeof(peer->tpk));
452 peer->tpk.kck, sizeof(peer->tpk.kck));
454 peer->tpk.tk, sizeof(peer->tpk.tk));
455 peer->tpk_set = 1;
580 struct wpa_tdls_peer *peer,
586 if (peer->tpk_set) {
587 wpa_tdls_ftie_mic(peer->tpk.kck, trans_seq, lnkid,
588 peer->rsnie_p, timeoutie, (u8 *) ftie,
609 u8 trans_seq, u16 rcode, u8 dtoken, struct wpa_tdls_peer *peer,
614 if (peer->tpk_set) {
615 wpa_tdls_key_mic_teardown(peer->tpk.kck, trans_seq, rcode,
634 struct wpa_tdls_peer *peer = timeout_ctx;
644 if (peer->initiator) {
648 " - try to renew", MAC2STR(peer->addr));
649 /* cache the peer address before do_teardown */
650 os_memcpy(addr, peer->addr, ETH_ALEN);
651 wpa_tdls_do_teardown(sm, peer,
656 " - tear down", MAC2STR(peer->addr));
657 wpa_tdls_do_teardown(sm, peer,
664 struct wpa_tdls_peer *peer)
670 while (cur && cur != peer) {
675 if (cur != peer) {
676 wpa_printf(MSG_ERROR, "TDLS: Could not find peer " MACSTR
678 MAC2STR(peer->addr));
683 prev->next = peer->next;
685 sm->tdls = peer->next;
689 static void wpa_tdls_peer_clear(struct wpa_sm *sm, struct wpa_tdls_peer *peer)
691 wpa_printf(MSG_DEBUG, "TDLS: Clear state for peer " MACSTR,
692 MAC2STR(peer->addr));
693 eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer);
694 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer);
695 peer->reconfig_key = 0;
696 peer->initiator = 0;
697 peer->tpk_in_progress = 0;
698 os_free(peer->sm_tmr.buf);
699 peer->sm_tmr.buf = NULL;
700 os_free(peer->ht_capabilities);
701 peer->ht_capabilities = NULL;
702 os_free(peer->vht_capabilities);
703 peer->vht_capabilities = NULL;
704 os_free(peer->ext_capab);
705 peer->ext_capab = NULL;
706 os_free(peer->supp_channels);
707 peer->supp_channels = NULL;
708 os_free(peer->supp_oper_classes);
709 peer->supp_oper_classes = NULL;
710 peer->rsnie_i_len = peer->rsnie_p_len = 0;
711 peer->cipher = 0;
712 peer->qos_info = 0;
713 peer->wmm_capable = 0;
714 peer->tk_set = peer->tpk_set = peer->tpk_success = 0;
715 peer->chan_switch_enabled = 0;
716 os_memset(&peer->tpk, 0, sizeof(peer->tpk));
717 os_memset(peer->inonce, 0, WPA_NONCE_LEN);
718 os_memset(peer->rnonce, 0, WPA_NONCE_LEN);
722 static void wpa_tdls_peer_free(struct wpa_sm *sm, struct wpa_tdls_peer *peer)
724 wpa_tdls_peer_clear(sm, peer);
725 wpa_tdls_peer_remove_from_list(sm, peer);
726 os_free(peer);
730 static void wpa_tdls_linkid(struct wpa_sm *sm, struct wpa_tdls_peer *peer,
736 if (peer->initiator) {
738 os_memcpy(lnkid->resp_sta, peer->addr, ETH_ALEN);
740 os_memcpy(lnkid->init_sta, peer->addr, ETH_ALEN);
749 struct wpa_tdls_peer *peer;
760 for (peer = sm->tdls; peer; peer = peer->next) {
761 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
765 if (peer == NULL) {
772 if (peer->chan_switch_enabled) {
775 wpa_sm_tdls_disable_channel_switch(sm, peer->addr);
778 dialog_token = peer->dtoken;
784 if (wpa_tdls_get_privacy(sm) && peer->tpk_set && peer->tpk_success) {
798 if (!wpa_tdls_get_privacy(sm) || !peer->tpk_set || !peer->tpk_success)
804 os_memcpy(ftie->Anonce, peer->rnonce, WPA_NONCE_LEN);
805 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN);
822 wpa_tdls_linkid(sm, peer, &lnkid);
823 wpa_tdls_key_mic_teardown(peer->tpk.kck, 4, reason_code,
833 reason_code, 0, peer->initiator, rbuf, pos - rbuf);
842 struct wpa_tdls_peer *peer;
847 for (peer = sm->tdls; peer; peer = peer->next) {
848 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
852 if (peer == NULL) {
853 wpa_printf(MSG_DEBUG, "TDLS: Could not find peer " MACSTR
858 if (!peer->tpk_success) {
859 wpa_printf(MSG_DEBUG, "TDLS: Peer " MACSTR
864 return wpa_tdls_do_teardown(sm, peer, reason_code);
869 struct wpa_tdls_peer *peer)
871 wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr);
872 wpa_tdls_peer_free(sm, peer);
878 struct wpa_tdls_peer *peer;
880 for (peer = sm->tdls; peer; peer = peer->next) {
881 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
885 if (!peer || !peer->tpk_success) {
886 wpa_printf(MSG_DEBUG, "TDLS: Peer " MACSTR
897 if (peer->chan_switch_enabled)
898 wpa_sm_tdls_disable_channel_switch(sm, peer->addr);
902 wpa_tdls_peer_free(sm, peer);
904 wpa_tdls_disable_peer_link(sm, peer);
911 struct wpa_tdls_peer *peer;
916 for (peer = sm->tdls; peer; peer = peer->next) {
917 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
921 if (peer == NULL)
922 return "peer does not exist";
924 if (!peer->tpk_success)
925 return "peer not connected";
934 struct wpa_tdls_peer *peer = NULL;
943 for (peer = sm->tdls; peer; peer = peer->next) {
944 if (os_memcmp(peer->addr, src_addr, ETH_ALEN) == 0)
948 if (peer == NULL) {
981 if (!wpa_tdls_get_privacy(sm) || !peer->tpk_set || !peer->tpk_success)
993 peer->dtoken, peer,
1005 wpa_tdls_disable_peer_link(sm, peer);
1013 * @dst - MAC addr of Peer station
1034 struct wpa_tdls_peer *peer;
1038 for (peer = sm->tdls; peer; peer = peer->next) {
1039 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) {
1042 return peer; /* re-use existing entry */
1046 wpa_printf(MSG_INFO, "TDLS: Creating peer entry for " MACSTR,
1049 peer = os_zalloc(sizeof(*peer));
1050 if (peer == NULL)
1053 os_memcpy(peer->addr, addr, ETH_ALEN);
1054 peer->next = sm->tdls;
1055 sm->tdls = peer;
1057 return peer;
1062 struct wpa_tdls_peer *peer)
1075 peer->rsnie_i_len = 0;
1086 hdr = (struct rsn_ie_hdr *) peer->rsnie_i;
1136 hdr->len = (pos - peer->rsnie_i) - 2;
1137 peer->rsnie_i_len = pos - peer->rsnie_i;
1139 peer->rsnie_i, peer->rsnie_i_len);
1144 buf_len += peer->rsnie_i_len + sizeof(struct wpa_tdls_ftie) +
1155 wpa_tdls_peer_free(sm, peer);
1164 pos = wpa_add_ie(pos, peer->rsnie_i, peer->rsnie_i_len);
1170 if (os_get_random(peer->inonce, WPA_NONCE_LEN)) {
1174 wpa_tdls_peer_free(sm, peer);
1177 peer->tk_set = 0; /* A new nonce results in a new TK */
1179 peer->inonce, WPA_NONCE_LEN);
1180 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN);
1199 peer->lifetime = TPK_LIFETIME;
1204 peer->lifetime = 301;
1209 peer->lifetime = 0xffffffff;
1213 sizeof(timeoutie), peer->lifetime);
1214 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime %u seconds", peer->lifetime);
1224 wpa_tdls_linkid(sm, peer, l);
1231 "Handshake Message 1 (peer " MACSTR ")",
1232 MAC2STR(peer->addr));
1234 status = wpa_tdls_tpk_send(sm, peer->addr, WLAN_TDLS_SETUP_REQUEST,
1235 1, 0, 0, peer->initiator, rbuf, pos - rbuf);
1245 const struct wpa_tdls_peer *peer)
1256 /* Peer RSN IE, FTIE(Initiator Nonce, Responder Nonce),
1258 buf_len += peer->rsnie_i_len + sizeof(struct wpa_tdls_ftie) +
1274 /* Peer RSN IE */
1275 pos = wpa_add_ie(pos, peer->rsnie_p, peer->rsnie_p_len);
1280 os_memcpy(ftie->Anonce, peer->rnonce, WPA_NONCE_LEN);
1281 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN);
1300 lifetime = peer->lifetime;
1314 wpa_tdls_ftie_mic(peer->tpk.kck, 2, (u8 *) lnkid, peer->rsnie_p,
1325 dtoken, 0, 0, peer->initiator, rbuf,
1336 const struct wpa_tdls_peer *peer)
1348 /* Peer RSN IE, FTIE(Initiator Nonce, Responder Nonce),
1350 buf_len += peer->rsnie_i_len + sizeof(struct wpa_tdls_ftie) +
1366 /* Peer RSN IE */
1367 pos = wpa_add_ie(pos, peer->rsnie_p, peer->rsnie_p_len);
1372 os_memcpy(ftie->Anonce, peer->rnonce, WPA_NONCE_LEN);
1373 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN);
1390 lifetime = peer->lifetime;
1404 wpa_tdls_ftie_mic(peer->tpk.kck, 3, (u8 *) lnkid, peer->rsnie_p,
1415 if (peer->vht_capabilities)
1417 if (peer->ht_capabilities)
1419 if (peer->wmm_capable)
1423 dtoken, 0, peer_capab, peer->initiator,
1432 struct wpa_tdls_peer *peer,
1444 "(peer " MACSTR ")", MAC2STR(peer->addr));
1449 hdr = (struct rsn_ie_hdr *) peer->rsnie_i;
1481 peer->rsnie_i_len = pos - peer->rsnie_i;
1488 /* Peer RSN IE, Lifetime */
1489 buf_len += peer->rsnie_i_len +
1494 wpa_tdls_peer_free(sm, peer);
1502 pos = wpa_add_ie(pos, peer->rsnie_i, peer->rsnie_i_len);
1504 peer->lifetime = TPK_LIFETIME;
1506 sizeof(timeoutie), peer->lifetime);
1507 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime %u seconds", peer->lifetime);
1509 status = wpa_tdls_tpk_send(sm, peer->addr, WLAN_TDLS_DISCOVERY_RESPONSE,
1523 struct wpa_tdls_peer *peer;
1565 peer = wpa_tdls_add_peer(sm, addr, NULL);
1566 if (peer == NULL)
1569 return wpa_tdls_send_discovery_response(sm, peer, dialog_token);
1578 wpa_printf(MSG_DEBUG, "TDLS: Sending Discovery Request to peer "
1586 struct wpa_tdls_peer *peer)
1592 peer->supp_rates_len = merge_byte_arrays(
1593 peer->supp_rates, sizeof(peer->supp_rates),
1602 struct wpa_tdls_peer *peer)
1610 if (!peer->ht_capabilities) {
1611 peer->ht_capabilities =
1613 if (peer->ht_capabilities == NULL)
1617 os_memcpy(peer->ht_capabilities, kde->ht_capabilities,
1619 wpa_hexdump(MSG_DEBUG, "TDLS: Peer HT capabilities",
1620 (u8 *) peer->ht_capabilities,
1628 struct wpa_tdls_peer *peer)
1636 if (!peer->vht_capabilities) {
1637 peer->vht_capabilities =
1639 if (peer->vht_capabilities == NULL)
1643 os_memcpy(peer->vht_capabilities, kde->vht_capabilities,
1645 wpa_hexdump(MSG_DEBUG, "TDLS: Peer VHT capabilities",
1646 (u8 *) peer->vht_capabilities,
1654 struct wpa_tdls_peer *peer)
1662 if (!peer->ext_capab || peer->ext_capab_len < kde->ext_capab_len - 2) {
1664 os_free(peer->ext_capab);
1665 peer->ext_capab = os_zalloc(kde->ext_capab_len - 2);
1666 if (peer->ext_capab == NULL)
1670 peer->ext_capab_len = kde->ext_capab_len - 2;
1671 os_memcpy(peer->ext_capab, kde->ext_capab + 2, peer->ext_capab_len);
1678 struct wpa_tdls_peer *peer)
1693 peer->qos_info = wmm->qos_info;
1695 peer->wmm_capable = 1;
1697 wpa_printf(MSG_DEBUG, "TDLS: Peer WMM QOS Info 0x%x", peer->qos_info);
1703 struct wpa_tdls_peer *peer)
1710 if (!peer->supp_channels ||
1711 peer->supp_channels_len < kde->supp_channels_len) {
1712 os_free(peer->supp_channels);
1713 peer->supp_channels = os_zalloc(kde->supp_channels_len);
1714 if (peer->supp_channels == NULL)
1718 peer->supp_channels_len = kde->supp_channels_len;
1720 os_memcpy(peer->supp_channels, kde->supp_channels,
1721 peer->supp_channels_len);
1722 wpa_hexdump(MSG_DEBUG, "TDLS: Peer Supported Channels",
1723 (u8 *) peer->supp_channels, peer->supp_channels_len);
1729 struct wpa_tdls_peer *peer)
1736 if (!peer->supp_oper_classes ||
1737 peer->supp_oper_classes_len < kde->supp_oper_classes_len) {
1738 os_free(peer->supp_oper_classes);
1739 peer->supp_oper_classes = os_zalloc(kde->supp_oper_classes_len);
1740 if (peer->supp_oper_classes == NULL)
1744 peer->supp_oper_classes_len = kde->supp_oper_classes_len;
1745 os_memcpy(peer->supp_oper_classes, kde->supp_oper_classes,
1746 peer->supp_oper_classes_len);
1747 wpa_hexdump(MSG_DEBUG, "TDLS: Peer Supported Operating Classes",
1748 (u8 *) peer->supp_oper_classes,
1749 peer->supp_oper_classes_len);
1754 static int wpa_tdls_addset_peer(struct wpa_sm *sm, struct wpa_tdls_peer *peer,
1757 return wpa_sm_tdls_peer_addset(sm, peer->addr, add, peer->aid,
1758 peer->capability,
1759 peer->supp_rates, peer->supp_rates_len,
1760 peer->ht_capabilities,
1761 peer->vht_capabilities,
1762 peer->qos_info, peer->wmm_capable,
1763 peer->ext_capab, peer->ext_capab_len,
1764 peer->supp_channels,
1765 peer->supp_channels_len,
1766 peer->supp_oper_classes,
1767 peer->supp_oper_classes_len);
1787 struct wpa_tdls_peer *peer;
1819 peer = wpa_tdls_add_peer(sm, src_addr, &existing_peer);
1820 if (peer == NULL)
1827 if (peer->tpk_success) {
1831 wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr);
1832 wpa_tdls_peer_clear(sm, peer);
1833 } else if (peer->initiator) {
1843 "from peer with higher address "
1848 "from peer with lower address "
1853 peer->addr);
1854 wpa_tdls_peer_clear(sm, peer);
1860 peer->capability = WPA_GET_LE16(cpos);
1891 if (copy_supp_rates(&kde, peer) < 0)
1894 if (copy_peer_ht_capab(&kde, peer) < 0)
1897 if (copy_peer_vht_capab(&kde, peer) < 0)
1900 if (copy_peer_ext_capab(&kde, peer) < 0)
1903 if (copy_peer_supp_channels(&kde, peer) < 0)
1906 if (copy_peer_supp_oper_classes(&kde, peer) < 0)
1909 peer->qos_info = kde.qosinfo;
1912 if (copy_peer_wmm_capab(&kde, peer) < 0)
1915 peer->aid = kde.aid;
1919 peer = wpa_tdls_add_peer(sm, src_addr, NULL);
1920 if (peer == NULL)
1924 peer->initiator = 1;
1925 wpa_sm_tdls_peer_addset(sm, peer->addr, 1, 0, 0, NULL, 0, NULL,
1927 wpa_tdls_send_tpk_m1(sm, peer);
2011 if (os_memcmp(sm->own_addr, peer->addr, ETH_ALEN) < 0) {
2015 * the peer.
2022 peer->initiator = 0; /* Need to check */
2023 peer->dtoken = dtoken;
2026 peer->rsnie_i_len = 0;
2027 peer->rsnie_p_len = 0;
2028 peer->cipher = WPA_CIPHER_NONE;
2033 os_memcpy(peer->rsnie_i, kde.rsn_ie, kde.rsn_ie_len);
2034 peer->rsnie_i_len = kde.rsn_ie_len;
2035 peer->cipher = cipher;
2037 if (os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) != 0 ||
2038 !tdls_nonce_set(peer->inonce)) {
2048 os_memcpy(peer->inonce, ftie->Snonce, WPA_NONCE_LEN);
2049 if (os_get_random(peer->rnonce, WPA_NONCE_LEN)) {
2054 peer->tk_set = 0; /* A new nonce results in a new TK */
2058 /* get version info from RSNIE received from Peer */
2062 /* use min(peer's version, out version) */
2066 hdr = (struct rsn_ie_hdr *) peer->rsnie_p;
2091 hdr->len = (pos - peer->rsnie_p) - 2;
2092 peer->rsnie_p_len = pos - peer->rsnie_p;
2096 os_memcpy(peer->rsnie_p, peer->rsnie_i, peer->rsnie_i_len);
2097 peer->rsnie_p_len = peer->rsnie_i_len;
2100 peer->rsnie_p, peer->rsnie_p_len);
2102 peer->lifetime = lifetime;
2104 wpa_tdls_generate_tpk(peer, sm->own_addr, sm->bssid);
2112 /* add supported rates, capabilities, and qos_info to the TDLS peer */
2113 if (wpa_tdls_addset_peer(sm, peer, 1) < 0)
2119 peer->tpk_in_progress = 1;
2122 if (wpa_tdls_send_tpk_m2(sm, src_addr, dtoken, lnkid, peer) < 0) {
2123 wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr);
2132 if (peer)
2133 wpa_tdls_peer_free(sm, peer);
2138 static int wpa_tdls_enable_link(struct wpa_sm *sm, struct wpa_tdls_peer *peer)
2140 peer->tpk_success = 1;
2141 peer->tpk_in_progress = 0;
2142 eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer);
2144 u32 lifetime = peer->lifetime;
2149 if (lifetime > 3 && peer->initiator)
2152 sm, peer);
2157 eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer);
2162 if (peer->reconfig_key && wpa_tdls_set_key(sm, peer) < 0) {
2167 peer->reconfig_key = 0;
2169 return wpa_sm_tdls_oper(sm, TDLS_ENABLE_LINK, peer->addr);
2176 struct wpa_tdls_peer *peer;
2191 "(Peer " MACSTR ")", MAC2STR(src_addr));
2192 for (peer = sm->tdls; peer; peer = peer->next) {
2193 if (os_memcmp(peer->addr, src_addr, ETH_ALEN) == 0)
2196 if (peer == NULL) {
2197 wpa_printf(MSG_INFO, "TDLS: No matching peer found for "
2201 if (!peer->initiator) {
2204 * same time and we accept the TPK M1 from the peer in
2212 if (peer->tpk_success) {
2219 wpa_tdls_tpk_retry_timeout_cancel(sm, peer, WLAN_TDLS_SETUP_REQUEST);
2222 wpa_tdls_disable_peer_link(sm, peer);
2234 wpa_tdls_disable_peer_link(sm, peer);
2246 wpa_tdls_disable_peer_link(sm, peer);
2251 peer->capability = WPA_GET_LE16(pos);
2288 if (copy_supp_rates(&kde, peer) < 0)
2291 if (copy_peer_ht_capab(&kde, peer) < 0)
2294 if (copy_peer_vht_capab(&kde, peer) < 0)
2297 if (copy_peer_ext_capab(&kde, peer) < 0)
2300 if (copy_peer_supp_channels(&kde, peer) < 0)
2303 if (copy_peer_supp_oper_classes(&kde, peer) < 0)
2306 peer->qos_info = kde.qosinfo;
2309 if (copy_peer_wmm_capab(&kde, peer) < 0)
2312 peer->aid = kde.aid;
2315 peer->rsnie_p_len = 0;
2316 peer->cipher = WPA_CIPHER_NONE;
2342 if (kde.rsn_ie_len != peer->rsnie_i_len ||
2343 os_memcmp(peer->rsnie_i, kde.rsn_ie, peer->rsnie_i_len) != 0) {
2347 peer->rsnie_i, peer->rsnie_i_len);
2374 if (os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) != 0) {
2382 os_memcpy(peer->rnonce, ftie->Anonce, WPA_NONCE_LEN);
2383 os_memcpy(peer->rsnie_p, kde.rsn_ie, kde.rsn_ie_len);
2384 peer->rsnie_p_len = kde.rsn_ie_len;
2385 peer->cipher = cipher;
2397 if (lifetime != peer->lifetime) {
2399 "TPK M2 (expected %u)", lifetime, peer->lifetime);
2404 wpa_tdls_generate_tpk(peer, sm->own_addr, sm->bssid);
2407 if (wpa_supplicant_verify_tdls_mic(2, peer, (u8 *) lnkid,
2410 wpa_tdls_del_key(sm, peer);
2411 wpa_tdls_disable_peer_link(sm, peer);
2415 if (wpa_tdls_set_key(sm, peer) < 0) {
2422 peer->reconfig_key = 1;
2426 peer->dtoken = dtoken;
2428 /* add supported rates, capabilities, and qos_info to the TDLS peer */
2429 if (wpa_tdls_addset_peer(sm, peer, 0) < 0)
2434 if (wpa_tdls_send_tpk_m3(sm, src_addr, dtoken, lnkid, peer) < 0)
2437 if (!peer->tpk_success) {
2443 ret = wpa_tdls_enable_link(sm, peer);
2447 sm, peer,
2457 wpa_tdls_disable_peer_link(sm, peer);
2465 struct wpa_tdls_peer *peer;
2477 "(Peer " MACSTR ")", MAC2STR(src_addr));
2478 for (peer = sm->tdls; peer; peer = peer->next) {
2479 if (os_memcmp(peer->addr, src_addr, ETH_ALEN) == 0)
2482 if (peer == NULL) {
2483 wpa_printf(MSG_INFO, "TDLS: No matching peer found for "
2487 wpa_tdls_tpk_retry_timeout_cancel(sm, peer, WLAN_TDLS_SETUP_RESPONSE);
2546 if (kde.rsn_ie_len != peer->rsnie_p_len ||
2547 os_memcmp(kde.rsn_ie, peer->rsnie_p, peer->rsnie_p_len) != 0) {
2553 if (os_memcmp(peer->rnonce, ftie->Anonce, WPA_NONCE_LEN) != 0) {
2559 if (os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) != 0) {
2575 if (lifetime != peer->lifetime) {
2577 "TPK M3 (expected %u)", lifetime, peer->lifetime);
2581 if (wpa_supplicant_verify_tdls_mic(3, peer, (u8 *) lnkid,
2583 wpa_tdls_del_key(sm, peer);
2587 if (wpa_tdls_set_key(sm, peer) < 0) {
2594 peer->reconfig_key = 1;
2598 /* add supported rates, capabilities, and qos_info to the TDLS peer */
2599 if (wpa_tdls_addset_peer(sm, peer, 0) < 0)
2602 if (!peer->tpk_success) {
2608 ret = wpa_tdls_enable_link(sm, peer);
2616 wpa_tdls_do_teardown(sm, peer, WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
2638 * @peer: MAC address of the peer STA
2642 * handshake with the peer.
2646 struct wpa_tdls_peer *peer;
2667 peer = wpa_tdls_add_peer(sm, addr, NULL);
2668 if (peer == NULL)
2671 if (peer->tpk_in_progress) {
2672 wpa_printf(MSG_DEBUG, "TDLS: Setup is already in progress with the peer");
2676 peer->initiator = 1;
2678 /* add the peer to the driver as a "setup in progress" peer */
2679 if (wpa_sm_tdls_peer_addset(sm, peer->addr, 1, 0, 0, NULL, 0, NULL,
2681 wpa_tdls_disable_peer_link(sm, peer);
2685 peer->tpk_in_progress = 1;
2687 if (wpa_tdls_send_tpk_m1(sm, peer) < 0) {
2688 wpa_tdls_disable_peer_link(sm, peer);
2698 struct wpa_tdls_peer *peer;
2703 for (peer = sm->tdls; peer; peer = peer->next) {
2704 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
2708 if (peer == NULL || !peer->tpk_success)
2716 wpa_tdls_do_teardown(sm, peer,
2836 struct wpa_tdls_peer *peer, *tmp;
2840 peer = sm->tdls;
2844 while (peer) {
2845 tmp = peer->next;
2846 wpa_printf(MSG_DEBUG, "TDLS: Tear down peer " MACSTR,
2847 MAC2STR(peer->addr));
2849 wpa_tdls_do_teardown(sm, peer,
2852 wpa_sm_tdls_oper(sm, TDLS_TEARDOWN, peer->addr);
2854 peer = tmp;
2861 struct wpa_tdls_peer *peer, *tmp;
2863 peer = sm->tdls;
2865 while (peer) {
2867 tmp = peer->next;
2868 res = wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr);
2869 wpa_printf(MSG_DEBUG, "TDLS: Remove peer " MACSTR " (res=%d)",
2870 MAC2STR(peer->addr), res);
2871 wpa_tdls_peer_free(sm, peer);
2872 peer = tmp;
2987 struct wpa_tdls_peer *peer;
3005 for (peer = sm->tdls; peer; peer = peer->next) {
3006 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
3010 if (peer == NULL || !peer->tpk_success) {
3011 wpa_printf(MSG_ERROR, "TDLS: Peer " MACSTR
3016 if (peer->chan_switch_enabled) {
3017 wpa_printf(MSG_DEBUG, "TDLS: Peer " MACSTR
3023 ret = wpa_sm_tdls_enable_channel_switch(sm, peer->addr,
3026 peer->chan_switch_enabled = 1;
3034 struct wpa_tdls_peer *peer;
3039 for (peer = sm->tdls; peer; peer = peer->next) {
3040 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
3044 if (!peer || !peer->chan_switch_enabled) {
3051 wpa_sm_tdls_disable_channel_switch(sm, peer->addr);
3053 peer->chan_switch_enabled = 0;