• Home
  • Raw
  • Download

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);
176 static int wpa_tdls_del_key(struct wpa_sm *sm, struct wpa_tdls_peer *peer) in wpa_tdls_del_key() argument
178 if (wpa_sm_set_key(sm, WPA_ALG_NONE, peer->addr, in wpa_tdls_del_key()
189 static int wpa_tdls_set_key(struct wpa_sm *sm, struct wpa_tdls_peer *peer) in wpa_tdls_set_key() argument
197 switch (peer->cipher) { in wpa_tdls_set_key()
212 if (wpa_sm_set_key(sm, alg, peer->addr, -1, 1, in wpa_tdls_set_key()
213 rsc, sizeof(rsc), peer->tpk.tk, key_len) < 0) { in wpa_tdls_set_key()
237 struct wpa_tdls_peer *peer; in wpa_tdls_tpk_send() local
259 for (peer = sm->tdls; peer; peer = peer->next) { in wpa_tdls_tpk_send()
260 if (os_memcmp(peer->addr, dest, ETH_ALEN) == 0) in wpa_tdls_tpk_send()
264 if (peer == NULL) { in wpa_tdls_tpk_send()
270 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer); in wpa_tdls_tpk_send()
273 peer->sm_tmr.count = TPK_M2_RETRY_COUNT; in wpa_tdls_tpk_send()
274 peer->sm_tmr.timer = TPK_M2_TIMEOUT; in wpa_tdls_tpk_send()
276 peer->sm_tmr.count = TPK_M1_RETRY_COUNT; in wpa_tdls_tpk_send()
277 peer->sm_tmr.timer = TPK_M1_TIMEOUT; in wpa_tdls_tpk_send()
281 os_memcpy(peer->sm_tmr.dest, dest, ETH_ALEN); in wpa_tdls_tpk_send()
282 peer->sm_tmr.action_code = action_code; in wpa_tdls_tpk_send()
283 peer->sm_tmr.dialog_token = dialog_token; in wpa_tdls_tpk_send()
284 peer->sm_tmr.status_code = status_code; in wpa_tdls_tpk_send()
285 peer->sm_tmr.peer_capab = peer_capab; in wpa_tdls_tpk_send()
286 peer->sm_tmr.buf_len = msg_len; in wpa_tdls_tpk_send()
287 os_free(peer->sm_tmr.buf); in wpa_tdls_tpk_send()
288 peer->sm_tmr.buf = os_malloc(msg_len); in wpa_tdls_tpk_send()
289 if (peer->sm_tmr.buf == NULL) in wpa_tdls_tpk_send()
291 os_memcpy(peer->sm_tmr.buf, msg, msg_len); in wpa_tdls_tpk_send()
295 eloop_register_timeout(peer->sm_tmr.timer / 1000, in wpa_tdls_tpk_send()
296 (peer->sm_tmr.timer % 1000) * 1000, in wpa_tdls_tpk_send()
297 wpa_tdls_tpk_retry_timeout, sm, peer); in wpa_tdls_tpk_send()
302 static int wpa_tdls_do_teardown(struct wpa_sm *sm, struct wpa_tdls_peer *peer, in wpa_tdls_do_teardown() argument
307 ret = wpa_tdls_send_teardown(sm, peer->addr, reason_code); in wpa_tdls_do_teardown()
309 wpa_tdls_disable_peer_link(sm, peer); in wpa_tdls_do_teardown()
319 struct wpa_tdls_peer *peer = timeout_ctx; in wpa_tdls_tpk_retry_timeout() local
321 if (peer->sm_tmr.count) { in wpa_tdls_tpk_retry_timeout()
322 peer->sm_tmr.count--; in wpa_tdls_tpk_retry_timeout()
326 peer->sm_tmr.action_code); in wpa_tdls_tpk_retry_timeout()
328 if (peer->sm_tmr.buf == NULL) { in wpa_tdls_tpk_retry_timeout()
331 peer->sm_tmr.action_code); in wpa_tdls_tpk_retry_timeout()
333 peer); in wpa_tdls_tpk_retry_timeout()
338 if (wpa_tdls_send_tpk_msg(sm, peer->sm_tmr.dest, in wpa_tdls_tpk_retry_timeout()
339 peer->sm_tmr.action_code, in wpa_tdls_tpk_retry_timeout()
340 peer->sm_tmr.dialog_token, in wpa_tdls_tpk_retry_timeout()
341 peer->sm_tmr.status_code, in wpa_tdls_tpk_retry_timeout()
342 peer->sm_tmr.peer_capab, in wpa_tdls_tpk_retry_timeout()
343 peer->initiator, in wpa_tdls_tpk_retry_timeout()
344 peer->sm_tmr.buf, in wpa_tdls_tpk_retry_timeout()
345 peer->sm_tmr.buf_len)) { in wpa_tdls_tpk_retry_timeout()
350 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer); in wpa_tdls_tpk_retry_timeout()
351 eloop_register_timeout(peer->sm_tmr.timer / 1000, in wpa_tdls_tpk_retry_timeout()
352 (peer->sm_tmr.timer % 1000) * 1000, in wpa_tdls_tpk_retry_timeout()
353 wpa_tdls_tpk_retry_timeout, sm, peer); in wpa_tdls_tpk_retry_timeout()
355 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer); in wpa_tdls_tpk_retry_timeout()
358 wpa_tdls_do_teardown(sm, peer, in wpa_tdls_tpk_retry_timeout()
365 struct wpa_tdls_peer *peer, in wpa_tdls_tpk_retry_timeout_cancel() argument
368 if (action_code == peer->sm_tmr.action_code) { in wpa_tdls_tpk_retry_timeout_cancel()
373 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer); in wpa_tdls_tpk_retry_timeout_cancel()
376 os_free(peer->sm_tmr.buf); in wpa_tdls_tpk_retry_timeout_cancel()
377 peer->sm_tmr.buf = NULL; in wpa_tdls_tpk_retry_timeout_cancel()
379 peer->sm_tmr.count = 0; in wpa_tdls_tpk_retry_timeout_cancel()
380 peer->sm_tmr.timer = 0; in wpa_tdls_tpk_retry_timeout_cancel()
381 peer->sm_tmr.buf_len = 0; in wpa_tdls_tpk_retry_timeout_cancel()
382 peer->sm_tmr.action_code = 0xff; in wpa_tdls_tpk_retry_timeout_cancel()
390 static void wpa_tdls_generate_tpk(struct wpa_tdls_peer *peer, in wpa_tdls_generate_tpk() argument
403 if (os_memcmp(peer->inonce, peer->rnonce, WPA_NONCE_LEN) < 0) { in wpa_tdls_generate_tpk()
404 nonce[0] = peer->inonce; in wpa_tdls_generate_tpk()
405 nonce[1] = peer->rnonce; in wpa_tdls_generate_tpk()
407 nonce[0] = peer->rnonce; in wpa_tdls_generate_tpk()
408 nonce[1] = peer->inonce; in wpa_tdls_generate_tpk()
424 if (os_memcmp(own_addr, peer->addr, ETH_ALEN) < 0) { in wpa_tdls_generate_tpk()
426 os_memcpy(data + ETH_ALEN, peer->addr, ETH_ALEN); in wpa_tdls_generate_tpk()
428 os_memcpy(data, peer->addr, ETH_ALEN); in wpa_tdls_generate_tpk()
435 (u8 *) &peer->tpk, sizeof(peer->tpk)); in wpa_tdls_generate_tpk()
437 peer->tpk.kck, sizeof(peer->tpk.kck)); in wpa_tdls_generate_tpk()
439 peer->tpk.tk, sizeof(peer->tpk.tk)); in wpa_tdls_generate_tpk()
440 peer->tpk_set = 1; in wpa_tdls_generate_tpk()
565 struct wpa_tdls_peer *peer, in wpa_supplicant_verify_tdls_mic() argument
571 if (peer->tpk_set) { in wpa_supplicant_verify_tdls_mic()
572 wpa_tdls_ftie_mic(peer->tpk.kck, trans_seq, lnkid, in wpa_supplicant_verify_tdls_mic()
573 peer->rsnie_p, timeoutie, (u8 *) ftie, in wpa_supplicant_verify_tdls_mic()
594 u8 trans_seq, u16 rcode, u8 dtoken, struct wpa_tdls_peer *peer, in wpa_supplicant_verify_tdls_mic_teardown() argument
599 if (peer->tpk_set) { in wpa_supplicant_verify_tdls_mic_teardown()
600 wpa_tdls_key_mic_teardown(peer->tpk.kck, trans_seq, rcode, in wpa_supplicant_verify_tdls_mic_teardown()
619 struct wpa_tdls_peer *peer = timeout_ctx; in wpa_tdls_tpk_timeout() local
629 if (peer->initiator) { in wpa_tdls_tpk_timeout()
633 " - try to renew", MAC2STR(peer->addr)); in wpa_tdls_tpk_timeout()
635 os_memcpy(addr, peer->addr, ETH_ALEN); in wpa_tdls_tpk_timeout()
636 wpa_tdls_do_teardown(sm, peer, in wpa_tdls_tpk_timeout()
641 " - tear down", MAC2STR(peer->addr)); in wpa_tdls_tpk_timeout()
642 wpa_tdls_do_teardown(sm, peer, in wpa_tdls_tpk_timeout()
649 struct wpa_tdls_peer *peer) in wpa_tdls_peer_remove_from_list() argument
655 while (cur && cur != peer) { in wpa_tdls_peer_remove_from_list()
660 if (cur != peer) { in wpa_tdls_peer_remove_from_list()
663 MAC2STR(peer->addr)); in wpa_tdls_peer_remove_from_list()
668 prev->next = peer->next; in wpa_tdls_peer_remove_from_list()
670 sm->tdls = peer->next; in wpa_tdls_peer_remove_from_list()
674 static void wpa_tdls_peer_clear(struct wpa_sm *sm, struct wpa_tdls_peer *peer) in wpa_tdls_peer_clear() argument
677 MAC2STR(peer->addr)); in wpa_tdls_peer_clear()
678 eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer); in wpa_tdls_peer_clear()
679 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer); in wpa_tdls_peer_clear()
680 peer->reconfig_key = 0; in wpa_tdls_peer_clear()
681 peer->initiator = 0; in wpa_tdls_peer_clear()
682 peer->tpk_in_progress = 0; in wpa_tdls_peer_clear()
683 os_free(peer->sm_tmr.buf); in wpa_tdls_peer_clear()
684 peer->sm_tmr.buf = NULL; in wpa_tdls_peer_clear()
685 os_free(peer->ht_capabilities); in wpa_tdls_peer_clear()
686 peer->ht_capabilities = NULL; in wpa_tdls_peer_clear()
687 os_free(peer->vht_capabilities); in wpa_tdls_peer_clear()
688 peer->vht_capabilities = NULL; in wpa_tdls_peer_clear()
689 os_free(peer->ext_capab); in wpa_tdls_peer_clear()
690 peer->ext_capab = NULL; in wpa_tdls_peer_clear()
691 os_free(peer->supp_channels); in wpa_tdls_peer_clear()
692 peer->supp_channels = NULL; in wpa_tdls_peer_clear()
693 os_free(peer->supp_oper_classes); in wpa_tdls_peer_clear()
694 peer->supp_oper_classes = NULL; in wpa_tdls_peer_clear()
695 peer->rsnie_i_len = peer->rsnie_p_len = 0; in wpa_tdls_peer_clear()
696 peer->cipher = 0; in wpa_tdls_peer_clear()
697 peer->qos_info = 0; in wpa_tdls_peer_clear()
698 peer->wmm_capable = 0; in wpa_tdls_peer_clear()
699 peer->tpk_set = peer->tpk_success = 0; in wpa_tdls_peer_clear()
700 peer->chan_switch_enabled = 0; in wpa_tdls_peer_clear()
701 os_memset(&peer->tpk, 0, sizeof(peer->tpk)); in wpa_tdls_peer_clear()
702 os_memset(peer->inonce, 0, WPA_NONCE_LEN); in wpa_tdls_peer_clear()
703 os_memset(peer->rnonce, 0, WPA_NONCE_LEN); in wpa_tdls_peer_clear()
707 static void wpa_tdls_peer_free(struct wpa_sm *sm, struct wpa_tdls_peer *peer) in wpa_tdls_peer_free() argument
709 wpa_tdls_peer_clear(sm, peer); in wpa_tdls_peer_free()
710 wpa_tdls_peer_remove_from_list(sm, peer); in wpa_tdls_peer_free()
711 os_free(peer); in wpa_tdls_peer_free()
715 static void wpa_tdls_linkid(struct wpa_sm *sm, struct wpa_tdls_peer *peer, in wpa_tdls_linkid() argument
721 if (peer->initiator) { in wpa_tdls_linkid()
723 os_memcpy(lnkid->resp_sta, peer->addr, ETH_ALEN); in wpa_tdls_linkid()
725 os_memcpy(lnkid->init_sta, peer->addr, ETH_ALEN); in wpa_tdls_linkid()
734 struct wpa_tdls_peer *peer; in wpa_tdls_send_teardown() local
745 for (peer = sm->tdls; peer; peer = peer->next) { in wpa_tdls_send_teardown()
746 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) in wpa_tdls_send_teardown()
750 if (peer == NULL) { in wpa_tdls_send_teardown()
757 if (peer->chan_switch_enabled) { in wpa_tdls_send_teardown()
760 wpa_sm_tdls_disable_channel_switch(sm, peer->addr); in wpa_tdls_send_teardown()
763 dialog_token = peer->dtoken; in wpa_tdls_send_teardown()
769 if (wpa_tdls_get_privacy(sm) && peer->tpk_set && peer->tpk_success) { in wpa_tdls_send_teardown()
783 if (!wpa_tdls_get_privacy(sm) || !peer->tpk_set || !peer->tpk_success) in wpa_tdls_send_teardown()
789 os_memcpy(ftie->Anonce, peer->rnonce, WPA_NONCE_LEN); in wpa_tdls_send_teardown()
790 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN); in wpa_tdls_send_teardown()
807 wpa_tdls_linkid(sm, peer, &lnkid); in wpa_tdls_send_teardown()
808 wpa_tdls_key_mic_teardown(peer->tpk.kck, 4, reason_code, in wpa_tdls_send_teardown()
818 reason_code, 0, peer->initiator, rbuf, pos - rbuf); in wpa_tdls_send_teardown()
827 struct wpa_tdls_peer *peer; in wpa_tdls_teardown_link() local
832 for (peer = sm->tdls; peer; peer = peer->next) { in wpa_tdls_teardown_link()
833 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) in wpa_tdls_teardown_link()
837 if (peer == NULL) { in wpa_tdls_teardown_link()
843 if (!peer->tpk_success) { in wpa_tdls_teardown_link()
849 return wpa_tdls_do_teardown(sm, peer, reason_code); in wpa_tdls_teardown_link()
854 struct wpa_tdls_peer *peer) in wpa_tdls_disable_peer_link() argument
856 wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr); in wpa_tdls_disable_peer_link()
857 wpa_tdls_peer_free(sm, peer); in wpa_tdls_disable_peer_link()
863 struct wpa_tdls_peer *peer; in wpa_tdls_disable_unreachable_link() local
865 for (peer = sm->tdls; peer; peer = peer->next) { in wpa_tdls_disable_unreachable_link()
866 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) in wpa_tdls_disable_unreachable_link()
870 if (!peer || !peer->tpk_success) { in wpa_tdls_disable_unreachable_link()
882 if (peer->chan_switch_enabled) in wpa_tdls_disable_unreachable_link()
883 wpa_sm_tdls_disable_channel_switch(sm, peer->addr); in wpa_tdls_disable_unreachable_link()
887 wpa_tdls_peer_free(sm, peer); in wpa_tdls_disable_unreachable_link()
889 wpa_tdls_disable_peer_link(sm, peer); in wpa_tdls_disable_unreachable_link()
896 struct wpa_tdls_peer *peer; in wpa_tdls_get_link_status() local
901 for (peer = sm->tdls; peer; peer = peer->next) { in wpa_tdls_get_link_status()
902 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) in wpa_tdls_get_link_status()
906 if (peer == NULL) in wpa_tdls_get_link_status()
909 if (!peer->tpk_success) in wpa_tdls_get_link_status()
919 struct wpa_tdls_peer *peer = NULL; in wpa_tdls_recv_teardown() local
928 for (peer = sm->tdls; peer; peer = peer->next) { in wpa_tdls_recv_teardown()
929 if (os_memcmp(peer->addr, src_addr, ETH_ALEN) == 0) in wpa_tdls_recv_teardown()
933 if (peer == NULL) { in wpa_tdls_recv_teardown()
966 if (!wpa_tdls_get_privacy(sm) || !peer->tpk_set || !peer->tpk_success) in wpa_tdls_recv_teardown()
978 peer->dtoken, peer, in wpa_tdls_recv_teardown()
990 wpa_tdls_disable_peer_link(sm, peer); in wpa_tdls_recv_teardown()
1019 struct wpa_tdls_peer *peer; in wpa_tdls_add_peer() local
1023 for (peer = sm->tdls; peer; peer = peer->next) { in wpa_tdls_add_peer()
1024 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) { in wpa_tdls_add_peer()
1027 return peer; /* re-use existing entry */ in wpa_tdls_add_peer()
1034 peer = os_zalloc(sizeof(*peer)); in wpa_tdls_add_peer()
1035 if (peer == NULL) in wpa_tdls_add_peer()
1038 os_memcpy(peer->addr, addr, ETH_ALEN); in wpa_tdls_add_peer()
1039 peer->next = sm->tdls; in wpa_tdls_add_peer()
1040 sm->tdls = peer; in wpa_tdls_add_peer()
1042 return peer; in wpa_tdls_add_peer()
1047 struct wpa_tdls_peer *peer) in wpa_tdls_send_tpk_m1() argument
1060 peer->rsnie_i_len = 0; in wpa_tdls_send_tpk_m1()
1071 hdr = (struct rsn_ie_hdr *) peer->rsnie_i; in wpa_tdls_send_tpk_m1()
1121 hdr->len = (pos - peer->rsnie_i) - 2; in wpa_tdls_send_tpk_m1()
1122 peer->rsnie_i_len = pos - peer->rsnie_i; in wpa_tdls_send_tpk_m1()
1124 peer->rsnie_i, peer->rsnie_i_len); in wpa_tdls_send_tpk_m1()
1129 buf_len += peer->rsnie_i_len + sizeof(struct wpa_tdls_ftie) + in wpa_tdls_send_tpk_m1()
1140 wpa_tdls_peer_free(sm, peer); in wpa_tdls_send_tpk_m1()
1149 pos = wpa_add_ie(pos, peer->rsnie_i, peer->rsnie_i_len); in wpa_tdls_send_tpk_m1()
1155 if (os_get_random(peer->inonce, WPA_NONCE_LEN)) { in wpa_tdls_send_tpk_m1()
1159 wpa_tdls_peer_free(sm, peer); in wpa_tdls_send_tpk_m1()
1163 peer->inonce, WPA_NONCE_LEN); in wpa_tdls_send_tpk_m1()
1164 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN); in wpa_tdls_send_tpk_m1()
1183 peer->lifetime = TPK_LIFETIME; in wpa_tdls_send_tpk_m1()
1188 peer->lifetime = 301; in wpa_tdls_send_tpk_m1()
1193 peer->lifetime = 0xffffffff; in wpa_tdls_send_tpk_m1()
1197 sizeof(timeoutie), peer->lifetime); in wpa_tdls_send_tpk_m1()
1198 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime %u seconds", peer->lifetime); in wpa_tdls_send_tpk_m1()
1207 wpa_tdls_linkid(sm, peer, l); in wpa_tdls_send_tpk_m1()
1215 MAC2STR(peer->addr)); in wpa_tdls_send_tpk_m1()
1217 status = wpa_tdls_tpk_send(sm, peer->addr, WLAN_TDLS_SETUP_REQUEST, in wpa_tdls_send_tpk_m1()
1218 1, 0, 0, peer->initiator, rbuf, pos - rbuf); in wpa_tdls_send_tpk_m1()
1228 const struct wpa_tdls_peer *peer) in wpa_tdls_send_tpk_m2() argument
1241 buf_len += peer->rsnie_i_len + sizeof(struct wpa_tdls_ftie) + in wpa_tdls_send_tpk_m2()
1258 pos = wpa_add_ie(pos, peer->rsnie_p, peer->rsnie_p_len); in wpa_tdls_send_tpk_m2()
1263 os_memcpy(ftie->Anonce, peer->rnonce, WPA_NONCE_LEN); in wpa_tdls_send_tpk_m2()
1264 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN); in wpa_tdls_send_tpk_m2()
1283 lifetime = peer->lifetime; in wpa_tdls_send_tpk_m2()
1297 wpa_tdls_ftie_mic(peer->tpk.kck, 2, (u8 *) lnkid, peer->rsnie_p, in wpa_tdls_send_tpk_m2()
1308 dtoken, 0, 0, peer->initiator, rbuf, in wpa_tdls_send_tpk_m2()
1319 const struct wpa_tdls_peer *peer) in wpa_tdls_send_tpk_m3() argument
1333 buf_len += peer->rsnie_i_len + sizeof(struct wpa_tdls_ftie) + in wpa_tdls_send_tpk_m3()
1350 pos = wpa_add_ie(pos, peer->rsnie_p, peer->rsnie_p_len); in wpa_tdls_send_tpk_m3()
1355 os_memcpy(ftie->Anonce, peer->rnonce, WPA_NONCE_LEN); in wpa_tdls_send_tpk_m3()
1356 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN); in wpa_tdls_send_tpk_m3()
1373 lifetime = peer->lifetime; in wpa_tdls_send_tpk_m3()
1387 wpa_tdls_ftie_mic(peer->tpk.kck, 3, (u8 *) lnkid, peer->rsnie_p, in wpa_tdls_send_tpk_m3()
1398 if (peer->vht_capabilities) in wpa_tdls_send_tpk_m3()
1400 if (peer->ht_capabilities) in wpa_tdls_send_tpk_m3()
1402 if (peer->wmm_capable) in wpa_tdls_send_tpk_m3()
1406 dtoken, 0, peer_capab, peer->initiator, in wpa_tdls_send_tpk_m3()
1415 struct wpa_tdls_peer *peer, in wpa_tdls_send_discovery_response() argument
1427 "(peer " MACSTR ")", MAC2STR(peer->addr)); in wpa_tdls_send_discovery_response()
1432 hdr = (struct rsn_ie_hdr *) peer->rsnie_i; in wpa_tdls_send_discovery_response()
1464 peer->rsnie_i_len = pos - peer->rsnie_i; in wpa_tdls_send_discovery_response()
1472 buf_len += peer->rsnie_i_len + in wpa_tdls_send_discovery_response()
1477 wpa_tdls_peer_free(sm, peer); in wpa_tdls_send_discovery_response()
1485 pos = wpa_add_ie(pos, peer->rsnie_i, peer->rsnie_i_len); in wpa_tdls_send_discovery_response()
1487 peer->lifetime = TPK_LIFETIME; in wpa_tdls_send_discovery_response()
1489 sizeof(timeoutie), peer->lifetime); in wpa_tdls_send_discovery_response()
1490 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime %u seconds", peer->lifetime); in wpa_tdls_send_discovery_response()
1492 status = wpa_tdls_tpk_send(sm, peer->addr, WLAN_TDLS_DISCOVERY_RESPONSE, in wpa_tdls_send_discovery_response()
1506 struct wpa_tdls_peer *peer; in wpa_tdls_process_discovery_request() local
1548 peer = wpa_tdls_add_peer(sm, addr, NULL); in wpa_tdls_process_discovery_request()
1549 if (peer == NULL) in wpa_tdls_process_discovery_request()
1552 return wpa_tdls_send_discovery_response(sm, peer, dialog_token); in wpa_tdls_process_discovery_request()
1569 struct wpa_tdls_peer *peer) in copy_supp_rates() argument
1575 peer->supp_rates_len = merge_byte_arrays( in copy_supp_rates()
1576 peer->supp_rates, sizeof(peer->supp_rates), in copy_supp_rates()
1585 struct wpa_tdls_peer *peer) in copy_peer_ht_capab() argument
1593 if (!peer->ht_capabilities) { in copy_peer_ht_capab()
1594 peer->ht_capabilities = in copy_peer_ht_capab()
1596 if (peer->ht_capabilities == NULL) in copy_peer_ht_capab()
1600 os_memcpy(peer->ht_capabilities, kde->ht_capabilities, in copy_peer_ht_capab()
1603 (u8 *) peer->ht_capabilities, in copy_peer_ht_capab()
1611 struct wpa_tdls_peer *peer) in copy_peer_vht_capab() argument
1619 if (!peer->vht_capabilities) { in copy_peer_vht_capab()
1620 peer->vht_capabilities = in copy_peer_vht_capab()
1622 if (peer->vht_capabilities == NULL) in copy_peer_vht_capab()
1626 os_memcpy(peer->vht_capabilities, kde->vht_capabilities, in copy_peer_vht_capab()
1629 (u8 *) peer->vht_capabilities, in copy_peer_vht_capab()
1637 struct wpa_tdls_peer *peer) in copy_peer_ext_capab() argument
1645 if (!peer->ext_capab || peer->ext_capab_len < kde->ext_capab_len - 2) { in copy_peer_ext_capab()
1647 os_free(peer->ext_capab); in copy_peer_ext_capab()
1648 peer->ext_capab = os_zalloc(kde->ext_capab_len - 2); in copy_peer_ext_capab()
1649 if (peer->ext_capab == NULL) in copy_peer_ext_capab()
1653 peer->ext_capab_len = kde->ext_capab_len - 2; in copy_peer_ext_capab()
1654 os_memcpy(peer->ext_capab, kde->ext_capab + 2, peer->ext_capab_len); in copy_peer_ext_capab()
1661 struct wpa_tdls_peer *peer) in copy_peer_wmm_capab() argument
1676 peer->qos_info = wmm->qos_info; in copy_peer_wmm_capab()
1678 peer->wmm_capable = 1; in copy_peer_wmm_capab()
1680 wpa_printf(MSG_DEBUG, "TDLS: Peer WMM QOS Info 0x%x", peer->qos_info); in copy_peer_wmm_capab()
1686 struct wpa_tdls_peer *peer) in copy_peer_supp_channels() argument
1693 if (!peer->supp_channels || in copy_peer_supp_channels()
1694 peer->supp_channels_len < kde->supp_channels_len) { in copy_peer_supp_channels()
1695 os_free(peer->supp_channels); in copy_peer_supp_channels()
1696 peer->supp_channels = os_zalloc(kde->supp_channels_len); in copy_peer_supp_channels()
1697 if (peer->supp_channels == NULL) in copy_peer_supp_channels()
1701 peer->supp_channels_len = kde->supp_channels_len; in copy_peer_supp_channels()
1703 os_memcpy(peer->supp_channels, kde->supp_channels, in copy_peer_supp_channels()
1704 peer->supp_channels_len); in copy_peer_supp_channels()
1706 (u8 *) peer->supp_channels, peer->supp_channels_len); in copy_peer_supp_channels()
1712 struct wpa_tdls_peer *peer) in copy_peer_supp_oper_classes() argument
1719 if (!peer->supp_oper_classes || in copy_peer_supp_oper_classes()
1720 peer->supp_oper_classes_len < kde->supp_oper_classes_len) { in copy_peer_supp_oper_classes()
1721 os_free(peer->supp_oper_classes); in copy_peer_supp_oper_classes()
1722 peer->supp_oper_classes = os_zalloc(kde->supp_oper_classes_len); in copy_peer_supp_oper_classes()
1723 if (peer->supp_oper_classes == NULL) in copy_peer_supp_oper_classes()
1727 peer->supp_oper_classes_len = kde->supp_oper_classes_len; in copy_peer_supp_oper_classes()
1728 os_memcpy(peer->supp_oper_classes, kde->supp_oper_classes, in copy_peer_supp_oper_classes()
1729 peer->supp_oper_classes_len); in copy_peer_supp_oper_classes()
1731 (u8 *) peer->supp_oper_classes, in copy_peer_supp_oper_classes()
1732 peer->supp_oper_classes_len); in copy_peer_supp_oper_classes()
1737 static int wpa_tdls_addset_peer(struct wpa_sm *sm, struct wpa_tdls_peer *peer, in wpa_tdls_addset_peer() argument
1740 return wpa_sm_tdls_peer_addset(sm, peer->addr, add, peer->aid, in wpa_tdls_addset_peer()
1741 peer->capability, in wpa_tdls_addset_peer()
1742 peer->supp_rates, peer->supp_rates_len, in wpa_tdls_addset_peer()
1743 peer->ht_capabilities, in wpa_tdls_addset_peer()
1744 peer->vht_capabilities, in wpa_tdls_addset_peer()
1745 peer->qos_info, peer->wmm_capable, in wpa_tdls_addset_peer()
1746 peer->ext_capab, peer->ext_capab_len, in wpa_tdls_addset_peer()
1747 peer->supp_channels, in wpa_tdls_addset_peer()
1748 peer->supp_channels_len, in wpa_tdls_addset_peer()
1749 peer->supp_oper_classes, in wpa_tdls_addset_peer()
1750 peer->supp_oper_classes_len); in wpa_tdls_addset_peer()
1757 struct wpa_tdls_peer *peer; in wpa_tdls_process_tpk_m1() local
1789 peer = wpa_tdls_add_peer(sm, src_addr, &existing_peer); in wpa_tdls_process_tpk_m1()
1790 if (peer == NULL) in wpa_tdls_process_tpk_m1()
1797 if (peer->tpk_success) { in wpa_tdls_process_tpk_m1()
1801 wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr); in wpa_tdls_process_tpk_m1()
1802 wpa_tdls_peer_clear(sm, peer); in wpa_tdls_process_tpk_m1()
1803 } else if (peer->initiator) { in wpa_tdls_process_tpk_m1()
1823 peer->addr); in wpa_tdls_process_tpk_m1()
1824 wpa_tdls_peer_clear(sm, peer); in wpa_tdls_process_tpk_m1()
1830 peer->capability = WPA_GET_LE16(cpos); in wpa_tdls_process_tpk_m1()
1861 if (copy_supp_rates(&kde, peer) < 0) in wpa_tdls_process_tpk_m1()
1864 if (copy_peer_ht_capab(&kde, peer) < 0) in wpa_tdls_process_tpk_m1()
1867 if (copy_peer_vht_capab(&kde, peer) < 0) in wpa_tdls_process_tpk_m1()
1870 if (copy_peer_ext_capab(&kde, peer) < 0) in wpa_tdls_process_tpk_m1()
1873 if (copy_peer_supp_channels(&kde, peer) < 0) in wpa_tdls_process_tpk_m1()
1876 if (copy_peer_supp_oper_classes(&kde, peer) < 0) in wpa_tdls_process_tpk_m1()
1879 peer->qos_info = kde.qosinfo; in wpa_tdls_process_tpk_m1()
1882 if (copy_peer_wmm_capab(&kde, peer) < 0) in wpa_tdls_process_tpk_m1()
1885 peer->aid = kde.aid; in wpa_tdls_process_tpk_m1()
1889 peer = wpa_tdls_add_peer(sm, src_addr, NULL); in wpa_tdls_process_tpk_m1()
1890 if (peer == NULL) in wpa_tdls_process_tpk_m1()
1894 peer->initiator = 1; in wpa_tdls_process_tpk_m1()
1895 wpa_sm_tdls_peer_addset(sm, peer->addr, 1, 0, 0, NULL, 0, NULL, in wpa_tdls_process_tpk_m1()
1897 wpa_tdls_send_tpk_m1(sm, peer); in wpa_tdls_process_tpk_m1()
1981 if (os_memcmp(sm->own_addr, peer->addr, ETH_ALEN) < 0) { in wpa_tdls_process_tpk_m1()
1992 peer->initiator = 0; /* Need to check */ in wpa_tdls_process_tpk_m1()
1993 peer->dtoken = dtoken; in wpa_tdls_process_tpk_m1()
1996 peer->rsnie_i_len = 0; in wpa_tdls_process_tpk_m1()
1997 peer->rsnie_p_len = 0; in wpa_tdls_process_tpk_m1()
1998 peer->cipher = WPA_CIPHER_NONE; in wpa_tdls_process_tpk_m1()
2003 os_memcpy(peer->rsnie_i, kde.rsn_ie, kde.rsn_ie_len); in wpa_tdls_process_tpk_m1()
2004 peer->rsnie_i_len = kde.rsn_ie_len; in wpa_tdls_process_tpk_m1()
2005 peer->cipher = cipher; in wpa_tdls_process_tpk_m1()
2007 if (os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) != 0) { in wpa_tdls_process_tpk_m1()
2017 os_memcpy(peer->inonce, ftie->Snonce, WPA_NONCE_LEN); in wpa_tdls_process_tpk_m1()
2018 if (os_get_random(peer->rnonce, WPA_NONCE_LEN)) { in wpa_tdls_process_tpk_m1()
2034 hdr = (struct rsn_ie_hdr *) peer->rsnie_p; in wpa_tdls_process_tpk_m1()
2059 hdr->len = (pos - peer->rsnie_p) - 2; in wpa_tdls_process_tpk_m1()
2060 peer->rsnie_p_len = pos - peer->rsnie_p; in wpa_tdls_process_tpk_m1()
2064 os_memcpy(peer->rsnie_p, peer->rsnie_i, peer->rsnie_i_len); in wpa_tdls_process_tpk_m1()
2065 peer->rsnie_p_len = peer->rsnie_i_len; in wpa_tdls_process_tpk_m1()
2068 peer->rsnie_p, peer->rsnie_p_len); in wpa_tdls_process_tpk_m1()
2070 peer->lifetime = lifetime; in wpa_tdls_process_tpk_m1()
2072 wpa_tdls_generate_tpk(peer, sm->own_addr, sm->bssid); in wpa_tdls_process_tpk_m1()
2081 if (wpa_tdls_addset_peer(sm, peer, 1) < 0) in wpa_tdls_process_tpk_m1()
2087 peer->tpk_in_progress = 1; in wpa_tdls_process_tpk_m1()
2090 if (wpa_tdls_send_tpk_m2(sm, src_addr, dtoken, lnkid, peer) < 0) { in wpa_tdls_process_tpk_m1()
2091 wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr); in wpa_tdls_process_tpk_m1()
2100 if (peer) in wpa_tdls_process_tpk_m1()
2101 wpa_tdls_peer_free(sm, peer); in wpa_tdls_process_tpk_m1()
2106 static int wpa_tdls_enable_link(struct wpa_sm *sm, struct wpa_tdls_peer *peer) in wpa_tdls_enable_link() argument
2108 peer->tpk_success = 1; in wpa_tdls_enable_link()
2109 peer->tpk_in_progress = 0; in wpa_tdls_enable_link()
2110 eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer); in wpa_tdls_enable_link()
2112 u32 lifetime = peer->lifetime; in wpa_tdls_enable_link()
2117 if (lifetime > 3 && peer->initiator) in wpa_tdls_enable_link()
2120 sm, peer); in wpa_tdls_enable_link()
2125 eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer); in wpa_tdls_enable_link()
2130 if (peer->reconfig_key && wpa_tdls_set_key(sm, peer) < 0) { in wpa_tdls_enable_link()
2135 peer->reconfig_key = 0; in wpa_tdls_enable_link()
2137 return wpa_sm_tdls_oper(sm, TDLS_ENABLE_LINK, peer->addr); in wpa_tdls_enable_link()
2144 struct wpa_tdls_peer *peer; in wpa_tdls_process_tpk_m2() local
2160 for (peer = sm->tdls; peer; peer = peer->next) { in wpa_tdls_process_tpk_m2()
2161 if (os_memcmp(peer->addr, src_addr, ETH_ALEN) == 0) in wpa_tdls_process_tpk_m2()
2164 if (peer == NULL) { in wpa_tdls_process_tpk_m2()
2169 if (!peer->initiator) { in wpa_tdls_process_tpk_m2()
2180 if (peer->tpk_success) { in wpa_tdls_process_tpk_m2()
2187 wpa_tdls_tpk_retry_timeout_cancel(sm, peer, WLAN_TDLS_SETUP_REQUEST); in wpa_tdls_process_tpk_m2()
2190 wpa_tdls_disable_peer_link(sm, peer); in wpa_tdls_process_tpk_m2()
2202 wpa_tdls_disable_peer_link(sm, peer); in wpa_tdls_process_tpk_m2()
2214 wpa_tdls_disable_peer_link(sm, peer); in wpa_tdls_process_tpk_m2()
2219 peer->capability = WPA_GET_LE16(pos); in wpa_tdls_process_tpk_m2()
2256 if (copy_supp_rates(&kde, peer) < 0) in wpa_tdls_process_tpk_m2()
2259 if (copy_peer_ht_capab(&kde, peer) < 0) in wpa_tdls_process_tpk_m2()
2262 if (copy_peer_vht_capab(&kde, peer) < 0) in wpa_tdls_process_tpk_m2()
2265 if (copy_peer_ext_capab(&kde, peer) < 0) in wpa_tdls_process_tpk_m2()
2268 if (copy_peer_supp_channels(&kde, peer) < 0) in wpa_tdls_process_tpk_m2()
2271 if (copy_peer_supp_oper_classes(&kde, peer) < 0) in wpa_tdls_process_tpk_m2()
2274 peer->qos_info = kde.qosinfo; in wpa_tdls_process_tpk_m2()
2277 if (copy_peer_wmm_capab(&kde, peer) < 0) in wpa_tdls_process_tpk_m2()
2280 peer->aid = kde.aid; in wpa_tdls_process_tpk_m2()
2283 peer->rsnie_p_len = 0; in wpa_tdls_process_tpk_m2()
2284 peer->cipher = WPA_CIPHER_NONE; in wpa_tdls_process_tpk_m2()
2310 if (kde.rsn_ie_len != peer->rsnie_i_len || in wpa_tdls_process_tpk_m2()
2311 os_memcmp(peer->rsnie_i, kde.rsn_ie, peer->rsnie_i_len) != 0) { in wpa_tdls_process_tpk_m2()
2315 peer->rsnie_i, peer->rsnie_i_len); in wpa_tdls_process_tpk_m2()
2342 if (os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) != 0) { in wpa_tdls_process_tpk_m2()
2350 os_memcpy(peer->rnonce, ftie->Anonce, WPA_NONCE_LEN); in wpa_tdls_process_tpk_m2()
2351 os_memcpy(peer->rsnie_p, kde.rsn_ie, kde.rsn_ie_len); in wpa_tdls_process_tpk_m2()
2352 peer->rsnie_p_len = kde.rsn_ie_len; in wpa_tdls_process_tpk_m2()
2353 peer->cipher = cipher; in wpa_tdls_process_tpk_m2()
2365 if (lifetime != peer->lifetime) { in wpa_tdls_process_tpk_m2()
2367 "TPK M2 (expected %u)", lifetime, peer->lifetime); in wpa_tdls_process_tpk_m2()
2372 wpa_tdls_generate_tpk(peer, sm->own_addr, sm->bssid); in wpa_tdls_process_tpk_m2()
2375 if (wpa_supplicant_verify_tdls_mic(2, peer, (u8 *) lnkid, in wpa_tdls_process_tpk_m2()
2378 wpa_tdls_del_key(sm, peer); in wpa_tdls_process_tpk_m2()
2379 wpa_tdls_disable_peer_link(sm, peer); in wpa_tdls_process_tpk_m2()
2383 if (wpa_tdls_set_key(sm, peer) < 0) { in wpa_tdls_process_tpk_m2()
2390 peer->reconfig_key = 1; in wpa_tdls_process_tpk_m2()
2394 peer->dtoken = dtoken; in wpa_tdls_process_tpk_m2()
2397 if (wpa_tdls_addset_peer(sm, peer, 0) < 0) in wpa_tdls_process_tpk_m2()
2402 if (wpa_tdls_send_tpk_m3(sm, src_addr, dtoken, lnkid, peer) < 0) in wpa_tdls_process_tpk_m2()
2405 if (!peer->tpk_success) { in wpa_tdls_process_tpk_m2()
2411 ret = wpa_tdls_enable_link(sm, peer); in wpa_tdls_process_tpk_m2()
2415 sm, peer, in wpa_tdls_process_tpk_m2()
2425 wpa_tdls_disable_peer_link(sm, peer); in wpa_tdls_process_tpk_m2()
2433 struct wpa_tdls_peer *peer; in wpa_tdls_process_tpk_m3() local
2446 for (peer = sm->tdls; peer; peer = peer->next) { in wpa_tdls_process_tpk_m3()
2447 if (os_memcmp(peer->addr, src_addr, ETH_ALEN) == 0) in wpa_tdls_process_tpk_m3()
2450 if (peer == NULL) { in wpa_tdls_process_tpk_m3()
2455 wpa_tdls_tpk_retry_timeout_cancel(sm, peer, WLAN_TDLS_SETUP_RESPONSE); in wpa_tdls_process_tpk_m3()
2514 if (kde.rsn_ie_len != peer->rsnie_p_len || in wpa_tdls_process_tpk_m3()
2515 os_memcmp(kde.rsn_ie, peer->rsnie_p, peer->rsnie_p_len) != 0) { in wpa_tdls_process_tpk_m3()
2521 if (os_memcmp(peer->rnonce, ftie->Anonce, WPA_NONCE_LEN) != 0) { in wpa_tdls_process_tpk_m3()
2527 if (os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) != 0) { in wpa_tdls_process_tpk_m3()
2543 if (lifetime != peer->lifetime) { in wpa_tdls_process_tpk_m3()
2545 "TPK M3 (expected %u)", lifetime, peer->lifetime); in wpa_tdls_process_tpk_m3()
2549 if (wpa_supplicant_verify_tdls_mic(3, peer, (u8 *) lnkid, in wpa_tdls_process_tpk_m3()
2551 wpa_tdls_del_key(sm, peer); in wpa_tdls_process_tpk_m3()
2555 if (wpa_tdls_set_key(sm, peer) < 0) { in wpa_tdls_process_tpk_m3()
2562 peer->reconfig_key = 1; in wpa_tdls_process_tpk_m3()
2567 if (wpa_tdls_addset_peer(sm, peer, 0) < 0) in wpa_tdls_process_tpk_m3()
2570 if (!peer->tpk_success) { in wpa_tdls_process_tpk_m3()
2576 ret = wpa_tdls_enable_link(sm, peer); in wpa_tdls_process_tpk_m3()
2584 wpa_tdls_do_teardown(sm, peer, WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); in wpa_tdls_process_tpk_m3()
2614 struct wpa_tdls_peer *peer; in wpa_tdls_start() local
2635 peer = wpa_tdls_add_peer(sm, addr, NULL); in wpa_tdls_start()
2636 if (peer == NULL) in wpa_tdls_start()
2639 if (peer->tpk_in_progress) { in wpa_tdls_start()
2644 peer->initiator = 1; in wpa_tdls_start()
2647 if (wpa_sm_tdls_peer_addset(sm, peer->addr, 1, 0, 0, NULL, 0, NULL, in wpa_tdls_start()
2649 wpa_tdls_disable_peer_link(sm, peer); in wpa_tdls_start()
2653 peer->tpk_in_progress = 1; in wpa_tdls_start()
2655 if (wpa_tdls_send_tpk_m1(sm, peer) < 0) { in wpa_tdls_start()
2656 wpa_tdls_disable_peer_link(sm, peer); in wpa_tdls_start()
2666 struct wpa_tdls_peer *peer; in wpa_tdls_remove() local
2671 for (peer = sm->tdls; peer; peer = peer->next) { in wpa_tdls_remove()
2672 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) in wpa_tdls_remove()
2676 if (peer == NULL || !peer->tpk_success) in wpa_tdls_remove()
2684 wpa_tdls_do_teardown(sm, peer, in wpa_tdls_remove()
2804 struct wpa_tdls_peer *peer, *tmp; in wpa_tdls_teardown_peers() local
2808 peer = sm->tdls; in wpa_tdls_teardown_peers()
2812 while (peer) { in wpa_tdls_teardown_peers()
2813 tmp = peer->next; in wpa_tdls_teardown_peers()
2815 MAC2STR(peer->addr)); in wpa_tdls_teardown_peers()
2817 wpa_tdls_do_teardown(sm, peer, in wpa_tdls_teardown_peers()
2820 wpa_sm_tdls_oper(sm, TDLS_TEARDOWN, peer->addr); in wpa_tdls_teardown_peers()
2822 peer = tmp; in wpa_tdls_teardown_peers()
2829 struct wpa_tdls_peer *peer, *tmp; in wpa_tdls_remove_peers() local
2831 peer = sm->tdls; in wpa_tdls_remove_peers()
2833 while (peer) { in wpa_tdls_remove_peers()
2835 tmp = peer->next; in wpa_tdls_remove_peers()
2836 res = wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr); in wpa_tdls_remove_peers()
2838 MAC2STR(peer->addr), res); in wpa_tdls_remove_peers()
2839 wpa_tdls_peer_free(sm, peer); in wpa_tdls_remove_peers()
2840 peer = tmp; in wpa_tdls_remove_peers()
2955 struct wpa_tdls_peer *peer; in wpa_tdls_enable_chan_switch() local
2973 for (peer = sm->tdls; peer; peer = peer->next) { in wpa_tdls_enable_chan_switch()
2974 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) in wpa_tdls_enable_chan_switch()
2978 if (peer == NULL || !peer->tpk_success) { in wpa_tdls_enable_chan_switch()
2984 if (peer->chan_switch_enabled) { in wpa_tdls_enable_chan_switch()
2991 ret = wpa_sm_tdls_enable_channel_switch(sm, peer->addr, in wpa_tdls_enable_chan_switch()
2994 peer->chan_switch_enabled = 1; in wpa_tdls_enable_chan_switch()
3002 struct wpa_tdls_peer *peer; in wpa_tdls_disable_chan_switch() local
3007 for (peer = sm->tdls; peer; peer = peer->next) { in wpa_tdls_disable_chan_switch()
3008 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) in wpa_tdls_disable_chan_switch()
3012 if (!peer || !peer->chan_switch_enabled) { in wpa_tdls_disable_chan_switch()
3019 wpa_sm_tdls_disable_channel_switch(sm, peer->addr); in wpa_tdls_disable_chan_switch()
3021 peer->chan_switch_enabled = 0; in wpa_tdls_disable_chan_switch()