Lines Matching refs:peer
81 static void wpa_tdls_peer_free(struct wpa_sm *sm, struct wpa_tdls_peer *peer);
95 u8 rsnie_p[TDLS_MAX_IE_LEN]; /* Peer RSN IE */
152 static int wpa_tdls_del_key(struct wpa_sm *sm, struct wpa_tdls_peer *peer)
154 if (wpa_sm_set_key(sm, WPA_ALG_NONE, peer->addr,
165 static int wpa_tdls_set_key(struct wpa_sm *sm, struct wpa_tdls_peer *peer)
173 switch (peer->cipher) {
188 if (wpa_sm_set_key(sm, alg, peer->addr, -1, 1,
189 rsc, sizeof(rsc), peer->tpk.tk, key_len) < 0) {
211 struct wpa_tdls_peer *peer;
231 for (peer = sm->tdls; peer; peer = peer->next) {
232 if (os_memcmp(peer->addr, dest, ETH_ALEN) == 0)
236 if (peer == NULL) {
242 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer);
244 peer->sm_tmr.count = TPK_RETRY_COUNT;
245 peer->sm_tmr.timer = TPK_TIMEOUT;
248 os_memcpy(peer->sm_tmr.dest, dest, ETH_ALEN);
249 peer->sm_tmr.action_code = action_code;
250 peer->sm_tmr.dialog_token = dialog_token;
251 peer->sm_tmr.status_code = status_code;
252 peer->sm_tmr.buf_len = msg_len;
253 os_free(peer->sm_tmr.buf);
254 peer->sm_tmr.buf = os_malloc(msg_len);
255 if (peer->sm_tmr.buf == NULL)
257 os_memcpy(peer->sm_tmr.buf, msg, msg_len);
261 eloop_register_timeout(peer->sm_tmr.timer / 1000, 0,
262 wpa_tdls_tpk_retry_timeout, sm, peer);
267 static int wpa_tdls_do_teardown(struct wpa_sm *sm, struct wpa_tdls_peer *peer,
273 ret = wpa_tdls_send_teardown(sm, peer->addr, reason_code);
276 wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr);
278 ret = wpa_sm_tdls_oper(sm, TDLS_TEARDOWN, peer->addr);
282 wpa_tdls_peer_free(sm, peer);
292 struct wpa_tdls_peer *peer = timeout_ctx;
294 if (peer->sm_tmr.count) {
295 peer->sm_tmr.count--;
296 peer->sm_tmr.timer = TPK_TIMEOUT;
300 peer->sm_tmr.action_code);
302 if (peer->sm_tmr.buf == NULL) {
305 peer->sm_tmr.action_code);
307 peer);
311 /* resend TPK Handshake Message to Peer */
312 if (wpa_tdls_send_tpk_msg(sm, peer->sm_tmr.dest,
313 peer->sm_tmr.action_code,
314 peer->sm_tmr.dialog_token,
315 peer->sm_tmr.status_code,
316 peer->sm_tmr.buf,
317 peer->sm_tmr.buf_len)) {
322 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer);
323 eloop_register_timeout(peer->sm_tmr.timer / 1000, 0,
324 wpa_tdls_tpk_retry_timeout, sm, peer);
326 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer);
329 wpa_tdls_do_teardown(sm, peer,
336 struct wpa_tdls_peer *peer,
339 if (action_code == peer->sm_tmr.action_code) {
344 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer);
347 os_free(peer->sm_tmr.buf);
348 peer->sm_tmr.buf = NULL;
350 peer->sm_tmr.count = 0;
351 peer->sm_tmr.timer = 0;
352 peer->sm_tmr.buf_len = 0;
353 peer->sm_tmr.action_code = 0xff;
361 static void wpa_tdls_generate_tpk(struct wpa_tdls_peer *peer,
374 if (os_memcmp(peer->inonce, peer->rnonce, WPA_NONCE_LEN) < 0) {
375 nonce[0] = peer->inonce;
376 nonce[1] = peer->rnonce;
378 nonce[0] = peer->rnonce;
379 nonce[1] = peer->inonce;
395 if (os_memcmp(own_addr, peer->addr, ETH_ALEN) < 0) {
397 os_memcpy(data + ETH_ALEN, peer->addr, ETH_ALEN);
399 os_memcpy(data, peer->addr, ETH_ALEN);
406 (u8 *) &peer->tpk, sizeof(peer->tpk));
408 peer->tpk.kck, sizeof(peer->tpk.kck));
410 peer->tpk.tk, sizeof(peer->tpk.tk));
411 peer->tpk_set = 1;
536 struct wpa_tdls_peer *peer,
542 if (peer->tpk_set) {
543 wpa_tdls_ftie_mic(peer->tpk.kck, trans_seq, lnkid,
544 peer->rsnie_p, timeoutie, (u8 *) ftie,
565 u8 trans_seq, u16 rcode, u8 dtoken, struct wpa_tdls_peer *peer,
570 if (peer->tpk_set) {
571 wpa_tdls_key_mic_teardown(peer->tpk.kck, trans_seq, rcode,
590 peer = timeout_ctx;
600 if (peer->initiator) {
602 " - try to renew", MAC2STR(peer->addr));
603 wpa_tdls_start(sm, peer->addr);
606 " - tear down", MAC2STR(peer->addr));
607 wpa_tdls_do_teardown(sm, peer,
613 static void wpa_tdls_peer_free(struct wpa_sm *sm, struct wpa_tdls_peer *peer)
615 wpa_printf(MSG_DEBUG, "TDLS: Clear state for peer " MACSTR,
616 MAC2STR(peer->addr));
617 eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer);
618 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer);
619 peer->initiator = 0;
620 os_free(peer->sm_tmr.buf);
621 peer->sm_tmr.buf = NULL;
622 os_free(peer->ht_capabilities);
623 peer->ht_capabilities = NULL;
624 os_free(peer->vht_capabilities);
625 peer->vht_capabilities = NULL;
626 os_free(peer->ext_capab);
627 peer->ext_capab = NULL;
628 peer->rsnie_i_len = peer->rsnie_p_len = 0;
629 peer->cipher = 0;
630 peer->tpk_set = peer->tpk_success = 0;
631 os_memset(&peer->tpk, 0, sizeof(peer->tpk));
632 os_memset(peer->inonce, 0, WPA_NONCE_LEN);
633 os_memset(peer->rnonce, 0, WPA_NONCE_LEN);
637 static void wpa_tdls_linkid(struct wpa_sm *sm, struct wpa_tdls_peer *peer,
643 if (peer->initiator) {
645 os_memcpy(lnkid->resp_sta, peer->addr, ETH_ALEN);
647 os_memcpy(lnkid->init_sta, peer->addr, ETH_ALEN);
655 struct wpa_tdls_peer *peer;
666 for (peer = sm->tdls; peer; peer = peer->next) {
667 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
671 if (peer == NULL) {
677 dialog_token = peer->dtoken;
683 if (wpa_tdls_get_privacy(sm) && peer->tpk_set && peer->tpk_success) {
697 if (!wpa_tdls_get_privacy(sm) || !peer->tpk_set || !peer->tpk_success) {
708 os_memcpy(ftie->Anonce, peer->rnonce, WPA_NONCE_LEN);
709 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN);
726 wpa_tdls_linkid(sm, peer, &lnkid);
727 wpa_tdls_key_mic_teardown(peer->tpk.kck, 4, reason_code,
741 wpa_tdls_peer_free(sm, peer);
749 struct wpa_tdls_peer *peer;
754 for (peer = sm->tdls; peer; peer = peer->next) {
755 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
759 if (peer == NULL) {
760 wpa_printf(MSG_DEBUG, "TDLS: Could not find peer " MACSTR
765 if (!peer->tpk_success) {
766 wpa_printf(MSG_DEBUG, "TDLS: Peer " MACSTR
771 return wpa_tdls_do_teardown(sm, peer, reason_code, 0);
777 struct wpa_tdls_peer *peer;
779 for (peer = sm->tdls; peer; peer = peer->next) {
780 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
784 if (peer) {
786 wpa_tdls_peer_free(sm, peer);
794 struct wpa_tdls_peer *peer = NULL;
803 for (peer = sm->tdls; peer; peer = peer->next) {
804 if (os_memcmp(peer->addr, src_addr, ETH_ALEN) == 0)
808 if (peer == NULL) {
836 if (!wpa_tdls_get_privacy(sm) || !peer->tpk_set || !peer->tpk_success)
848 peer->dtoken, peer,
863 wpa_tdls_peer_free(sm, peer);
872 * @dst - MAC addr of Peer station
891 struct wpa_tdls_peer *peer;
895 for (peer = sm->tdls; peer; peer = peer->next) {
896 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) {
899 return peer; /* re-use existing entry */
903 wpa_printf(MSG_INFO, "TDLS: Creating peer entry for " MACSTR,
906 peer = os_zalloc(sizeof(*peer));
907 if (peer == NULL)
910 os_memcpy(peer->addr, addr, ETH_ALEN);
911 peer->next = sm->tdls;
912 sm->tdls = peer;
914 return peer;
919 struct wpa_tdls_peer *peer)
931 peer->rsnie_i_len = 0;
942 hdr = (struct rsn_ie_hdr *) peer->rsnie_i;
992 hdr->len = (pos - peer->rsnie_i) - 2;
993 peer->rsnie_i_len = pos - peer->rsnie_i;
995 peer->rsnie_i, peer->rsnie_i_len);
1000 buf_len += peer->rsnie_i_len + sizeof(struct wpa_tdls_ftie) +
1011 wpa_tdls_peer_free(sm, peer);
1020 pos = wpa_add_ie(pos, peer->rsnie_i, peer->rsnie_i_len);
1026 if (os_get_random(peer->inonce, WPA_NONCE_LEN)) {
1030 wpa_tdls_peer_free(sm, peer);
1034 peer->inonce, WPA_NONCE_LEN);
1035 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN);
1054 peer->lifetime = TPK_LIFETIME;
1059 peer->lifetime = 301;
1064 peer->lifetime = 0xffffffff;
1068 sizeof(timeoutie), peer->lifetime);
1069 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime %u seconds", peer->lifetime);
1078 wpa_tdls_linkid(sm, peer, l);
1085 "Handshake Message 1 (peer " MACSTR ")",
1086 MAC2STR(peer->addr));
1088 wpa_tdls_tpk_send(sm, peer->addr, WLAN_TDLS_SETUP_REQUEST, 1, 0,
1099 const struct wpa_tdls_peer *peer)
1109 /* Peer RSN IE, FTIE(Initiator Nonce, Responder Nonce),
1111 buf_len += peer->rsnie_i_len + sizeof(struct wpa_tdls_ftie) +
1127 /* Peer RSN IE */
1128 pos = wpa_add_ie(pos, peer->rsnie_p, peer->rsnie_p_len);
1133 os_memcpy(ftie->Anonce, peer->rnonce, WPA_NONCE_LEN);
1134 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN);
1153 lifetime = peer->lifetime;
1167 wpa_tdls_ftie_mic(peer->tpk.kck, 2, (u8 *) lnkid, peer->rsnie_p,
1182 const struct wpa_tdls_peer *peer)
1192 /* Peer RSN IE, FTIE(Initiator Nonce, Responder Nonce),
1194 buf_len += peer->rsnie_i_len + sizeof(struct wpa_tdls_ftie) +
1210 /* Peer RSN IE */
1211 pos = wpa_add_ie(pos, peer->rsnie_p, peer->rsnie_p_len);
1216 os_memcpy(ftie->Anonce, peer->rnonce, WPA_NONCE_LEN);
1217 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN);
1234 lifetime = peer->lifetime;
1248 wpa_tdls_ftie_mic(peer->tpk.kck, 3, (u8 *) lnkid, peer->rsnie_p,
1261 struct wpa_tdls_peer *peer,
1265 "(peer " MACSTR ")", MAC2STR(peer->addr));
1267 return wpa_tdls_tpk_send(sm, peer->addr, WLAN_TDLS_DISCOVERY_RESPONSE,
1278 struct wpa_tdls_peer *peer;
1313 peer = wpa_tdls_add_peer(sm, addr, NULL);
1314 if (peer == NULL)
1317 return wpa_tdls_send_discovery_response(sm, peer, dialog_token);
1326 wpa_printf(MSG_DEBUG, "TDLS: Sending Discovery Request to peer "
1334 struct wpa_tdls_peer *peer)
1340 peer->supp_rates_len = merge_byte_arrays(
1341 peer->supp_rates, sizeof(peer->supp_rates),
1349 struct wpa_tdls_peer *peer)
1359 if (!peer->ht_capabilities) {
1360 peer->ht_capabilities =
1362 if (peer->ht_capabilities == NULL)
1366 os_memcpy(peer->ht_capabilities, kde->ht_capabilities,
1368 wpa_hexdump(MSG_DEBUG, "TDLS: Peer HT capabilities",
1369 (u8 *) peer->ht_capabilities,
1377 struct wpa_tdls_peer *peer)
1387 if (!peer->vht_capabilities) {
1388 peer->vht_capabilities =
1390 if (peer->vht_capabilities == NULL)
1394 os_memcpy(peer->vht_capabilities, kde->vht_capabilities,
1396 wpa_hexdump(MSG_DEBUG, "TDLS: Peer VHT capabilities",
1397 (u8 *) peer->vht_capabilities,
1405 struct wpa_tdls_peer *peer)
1413 if (!peer->ext_capab || peer->ext_capab_len < kde->ext_capab_len - 2) {
1415 os_free(peer->ext_capab);
1416 peer->ext_capab = os_zalloc(kde->ext_capab_len - 2);
1417 if (peer->ext_capab == NULL)
1421 peer->ext_capab_len = kde->ext_capab_len - 2;
1422 os_memcpy(peer->ext_capab, kde->ext_capab + 2, peer->ext_capab_len);
1431 struct wpa_tdls_peer *peer;
1463 peer = wpa_tdls_add_peer(sm, src_addr, &existing_peer);
1464 if (peer == NULL)
1471 if (peer->tpk_success) {
1485 wpa_tdls_del_key(sm, peer);
1487 wpa_tdls_peer_free(sm, peer);
1496 if (peer->initiator) {
1499 "from peer with higher address "
1504 "from peer with lower address "
1512 wpa_tdls_del_key(sm, peer);
1513 wpa_tdls_peer_free(sm, peer);
1519 peer->capability = WPA_GET_LE16(cpos);
1545 if (copy_supp_rates(&kde, peer) < 0)
1548 if (copy_peer_ht_capab(&kde, peer) < 0)
1551 if (copy_peer_vht_capab(&kde, peer) < 0)
1554 if (copy_peer_ext_capab(&kde, peer) < 0)
1557 peer->qos_info = kde.qosinfo;
1561 peer = wpa_tdls_add_peer(sm, src_addr, NULL);
1562 if (peer == NULL)
1566 peer->initiator = 1;
1567 wpa_tdls_send_tpk_m1(sm, peer);
1651 if (os_memcmp(sm->own_addr, peer->addr, ETH_ALEN) < 0) {
1655 * the peer.
1662 peer->initiator = 0; /* Need to check */
1663 peer->dtoken = dtoken;
1666 peer->rsnie_i_len = 0;
1667 peer->rsnie_p_len = 0;
1668 peer->cipher = WPA_CIPHER_NONE;
1673 os_memcpy(peer->inonce, ftie->Snonce, WPA_NONCE_LEN);
1674 os_memcpy(peer->rsnie_i, kde.rsn_ie, kde.rsn_ie_len);
1675 peer->rsnie_i_len = kde.rsn_ie_len;
1676 peer->cipher = cipher;
1678 if (os_get_random(peer->rnonce, WPA_NONCE_LEN)) {
1681 wpa_tdls_peer_free(sm, peer);
1686 /* get version info from RSNIE received from Peer */
1690 /* use min(peer's version, out version) */
1694 hdr = (struct rsn_ie_hdr *) peer->rsnie_p;
1719 hdr->len = (pos - peer->rsnie_p) - 2;
1720 peer->rsnie_p_len = pos - peer->rsnie_p;
1724 os_memcpy(peer->rsnie_p, peer->rsnie_i, peer->rsnie_i_len);
1725 peer->rsnie_p_len = peer->rsnie_i_len;
1728 peer->rsnie_p, peer->rsnie_p_len);
1730 peer->lifetime = lifetime;
1732 wpa_tdls_generate_tpk(peer, sm->own_addr, sm->bssid);
1735 /* add the peer to the driver as a "setup in progress" peer */
1736 wpa_sm_tdls_peer_addset(sm, peer->addr, 1, 0, NULL, 0, NULL, NULL, 0,
1740 if (wpa_tdls_send_tpk_m2(sm, src_addr, dtoken, lnkid, peer) < 0) {
1741 wpa_tdls_disable_link(sm, peer->addr);
1754 static void wpa_tdls_enable_link(struct wpa_sm *sm, struct wpa_tdls_peer *peer)
1756 peer->tpk_success = 1;
1757 eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer);
1759 u32 lifetime = peer->lifetime;
1764 if (lifetime > 3 && peer->initiator)
1767 sm, peer);
1772 eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer);
1777 /* add supported rates, capabilities, and qos_info to the TDLS peer */
1778 wpa_sm_tdls_peer_addset(sm, peer->addr, 0, peer->capability,
1779 peer->supp_rates, peer->supp_rates_len,
1780 peer->ht_capabilities, peer->vht_capabilities,
1781 peer->qos_info, peer->ext_capab,
1782 peer->ext_capab_len);
1784 peer->addr);
1791 struct wpa_tdls_peer *peer;
1805 "(Peer " MACSTR ")", MAC2STR(src_addr));
1806 for (peer = sm->tdls; peer; peer = peer->next) {
1807 if (os_memcmp(peer->addr, src_addr, ETH_ALEN) == 0)
1810 if (peer == NULL) {
1811 wpa_printf(MSG_INFO, "TDLS: No matching peer found for "
1815 if (!peer->initiator) {
1818 * same time and we accept the TPK M1 from the peer in
1825 wpa_tdls_tpk_retry_timeout_cancel(sm, peer, WLAN_TDLS_SETUP_REQUEST);
1853 peer->capability = WPA_GET_LE16(pos);
1885 if (copy_supp_rates(&kde, peer) < 0)
1888 if (copy_peer_ht_capab(&kde, peer) < 0)
1891 if (copy_peer_vht_capab(&kde, peer) < 0)
1894 if (copy_peer_ext_capab(&kde, peer) < 0)
1897 peer->qos_info = kde.qosinfo;
1900 peer->rsnie_p_len = 0;
1901 peer->cipher = WPA_CIPHER_NONE;
1920 if (kde.rsn_ie_len != peer->rsnie_i_len ||
1921 os_memcmp(peer->rsnie_i, kde.rsn_ie, peer->rsnie_i_len) != 0) {
1925 peer->rsnie_i, peer->rsnie_i_len);
1952 if (!os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) == 0) {
1960 os_memcpy(peer->rnonce, ftie->Anonce, WPA_NONCE_LEN);
1961 os_memcpy(peer->rsnie_p, kde.rsn_ie, kde.rsn_ie_len);
1962 peer->rsnie_p_len = kde.rsn_ie_len;
1963 peer->cipher = cipher;
1975 if (lifetime != peer->lifetime) {
1977 "TPK M2 (expected %u)", lifetime, peer->lifetime);
1982 wpa_tdls_generate_tpk(peer, sm->own_addr, sm->bssid);
1985 if (wpa_supplicant_verify_tdls_mic(2, peer, (u8 *) lnkid,
1988 wpa_tdls_del_key(sm, peer);
1989 wpa_tdls_peer_free(sm, peer);
1995 wpa_tdls_set_key(sm, peer);
1998 peer->dtoken = dtoken;
2002 wpa_tdls_send_tpk_m3(sm, src_addr, dtoken, lnkid, peer);
2004 wpa_tdls_enable_link(sm, peer);
2020 struct wpa_tdls_peer *peer;
2031 "(Peer " MACSTR ")", MAC2STR(src_addr));
2032 for (peer = sm->tdls; peer; peer = peer->next) {
2033 if (os_memcmp(peer->addr, src_addr, ETH_ALEN) == 0)
2036 if (peer == NULL) {
2037 wpa_printf(MSG_INFO, "TDLS: No matching peer found for "
2041 wpa_tdls_tpk_retry_timeout_cancel(sm, peer, WLAN_TDLS_SETUP_RESPONSE);
2095 if (kde.rsn_ie_len != peer->rsnie_p_len ||
2096 os_memcmp(kde.rsn_ie, peer->rsnie_p, peer->rsnie_p_len) != 0) {
2102 if (!os_memcmp(peer->rnonce, ftie->Anonce, WPA_NONCE_LEN) == 0) {
2108 if (!os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) == 0) {
2124 if (lifetime != peer->lifetime) {
2126 "TPK M3 (expected %u)", lifetime, peer->lifetime);
2132 if (wpa_supplicant_verify_tdls_mic(3, peer, (u8 *) lnkid,
2134 wpa_tdls_del_key(sm, peer);
2135 wpa_tdls_peer_free(sm, peer);
2139 if (wpa_tdls_set_key(sm, peer) < 0)
2143 wpa_tdls_enable_link(sm, peer);
2166 * @peer: MAC address of the peer STA
2170 * handshake with the peer.
2174 struct wpa_tdls_peer *peer;
2195 peer = wpa_tdls_add_peer(sm, addr, NULL);
2196 if (peer == NULL)
2199 peer->initiator = 1;
2201 /* add the peer to the driver as a "setup in progress" peer */
2202 wpa_sm_tdls_peer_addset(sm, peer->addr, 1, 0, NULL, 0, NULL, NULL, 0,
2205 if (wpa_tdls_send_tpk_m1(sm, peer) < 0) {
2206 wpa_tdls_disable_link(sm, peer->addr);
2216 struct wpa_tdls_peer *peer;
2221 for (peer = sm->tdls; peer; peer = peer->next) {
2222 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0)
2226 if (peer == NULL || !peer->tpk_success)
2234 wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr);
2350 struct wpa_tdls_peer *peer;
2352 peer = sm->tdls;
2356 while (peer) {
2357 wpa_printf(MSG_DEBUG, "TDLS: Tear down peer " MACSTR,
2358 MAC2STR(peer->addr));
2360 wpa_tdls_send_teardown(sm, peer->addr,
2363 wpa_sm_tdls_oper(sm, TDLS_TEARDOWN, peer->addr);
2365 peer = peer->next;
2372 struct wpa_tdls_peer *peer, *tmp;
2374 peer = sm->tdls;
2377 while (peer) {
2379 tmp = peer->next;
2380 res = wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr);
2381 wpa_printf(MSG_DEBUG, "TDLS: Remove peer " MACSTR " (res=%d)",
2382 MAC2STR(peer->addr), res);
2383 wpa_tdls_peer_free(sm, peer);
2384 os_free(peer);
2385 peer = tmp;