1 /* 2 * wpa_supplicant - TDLS 3 * Copyright (c) 2010-2011, Atheros Communications 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 */ 8 9 #include "utils/includes.h" 10 11 #include "utils/common.h" 12 #include "utils/eloop.h" 13 #include "utils/os.h" 14 #include "common/ieee802_11_defs.h" 15 #include "common/ieee802_11_common.h" 16 #include "crypto/sha256.h" 17 #include "crypto/crypto.h" 18 #include "crypto/aes_wrap.h" 19 #include "rsn_supp/wpa.h" 20 #include "rsn_supp/wpa_ie.h" 21 #include "rsn_supp/wpa_i.h" 22 #include "drivers/driver.h" 23 #include "l2_packet/l2_packet.h" 24 25 #ifdef CONFIG_TDLS_TESTING 26 #define TDLS_TESTING_LONG_FRAME BIT(0) 27 #define TDLS_TESTING_ALT_RSN_IE BIT(1) 28 #define TDLS_TESTING_DIFF_BSSID BIT(2) 29 #define TDLS_TESTING_SHORT_LIFETIME BIT(3) 30 #define TDLS_TESTING_WRONG_LIFETIME_RESP BIT(4) 31 #define TDLS_TESTING_WRONG_LIFETIME_CONF BIT(5) 32 #define TDLS_TESTING_LONG_LIFETIME BIT(6) 33 #define TDLS_TESTING_CONCURRENT_INIT BIT(7) 34 #define TDLS_TESTING_NO_TPK_EXPIRATION BIT(8) 35 #define TDLS_TESTING_DECLINE_RESP BIT(9) 36 #define TDLS_TESTING_IGNORE_AP_PROHIBIT BIT(10) 37 #define TDLS_TESTING_WRONG_MIC BIT(11) 38 unsigned int tdls_testing = 0; 39 #endif /* CONFIG_TDLS_TESTING */ 40 41 #define TPK_LIFETIME 43200 /* 12 hours */ 42 #define TPK_M1_RETRY_COUNT 3 43 #define TPK_M1_TIMEOUT 5000 /* in milliseconds */ 44 #define TPK_M2_RETRY_COUNT 10 45 #define TPK_M2_TIMEOUT 500 /* in milliseconds */ 46 47 #define TDLS_MIC_LEN 16 48 49 #define TDLS_TIMEOUT_LEN 4 50 51 struct wpa_tdls_ftie { 52 u8 ie_type; /* FTIE */ 53 u8 ie_len; 54 u8 mic_ctrl[2]; 55 u8 mic[TDLS_MIC_LEN]; 56 u8 Anonce[WPA_NONCE_LEN]; /* Responder Nonce in TDLS */ 57 u8 Snonce[WPA_NONCE_LEN]; /* Initiator Nonce in TDLS */ 58 /* followed by optional elements */ 59 } STRUCT_PACKED; 60 61 struct wpa_tdls_timeoutie { 62 u8 ie_type; /* Timeout IE */ 63 u8 ie_len; 64 u8 interval_type; 65 u8 value[TDLS_TIMEOUT_LEN]; 66 } STRUCT_PACKED; 67 68 struct wpa_tdls_lnkid { 69 u8 ie_type; /* Link Identifier IE */ 70 u8 ie_len; 71 u8 bssid[ETH_ALEN]; 72 u8 init_sta[ETH_ALEN]; 73 u8 resp_sta[ETH_ALEN]; 74 } STRUCT_PACKED; 75 76 /* TDLS frame headers as per IEEE Std 802.11z-2010 */ 77 struct wpa_tdls_frame { 78 u8 payloadtype; /* IEEE80211_TDLS_RFTYPE */ 79 u8 category; /* Category */ 80 u8 action; /* Action (enum tdls_frame_type) */ 81 } STRUCT_PACKED; 82 83 static u8 * wpa_add_tdls_timeoutie(u8 *pos, u8 *ie, size_t ie_len, u32 tsecs); 84 static void wpa_tdls_tpk_retry_timeout(void *eloop_ctx, void *timeout_ctx); 85 static void wpa_tdls_peer_free(struct wpa_sm *sm, struct wpa_tdls_peer *peer); 86 static void wpa_tdls_disable_peer_link(struct wpa_sm *sm, 87 struct wpa_tdls_peer *peer); 88 static int wpa_tdls_send_teardown(struct wpa_sm *sm, const u8 *addr, 89 u16 reason_code); 90 91 92 #define TDLS_MAX_IE_LEN 80 93 #define IEEE80211_MAX_SUPP_RATES 32 94 95 struct wpa_tdls_peer { 96 struct wpa_tdls_peer *next; 97 unsigned int reconfig_key:1; 98 int initiator; /* whether this end was initiator for TDLS setup */ 99 u8 addr[ETH_ALEN]; /* other end MAC address */ 100 u8 inonce[WPA_NONCE_LEN]; /* Initiator Nonce */ 101 u8 rnonce[WPA_NONCE_LEN]; /* Responder Nonce */ 102 u8 rsnie_i[TDLS_MAX_IE_LEN]; /* Initiator RSN IE */ 103 size_t rsnie_i_len; 104 u8 rsnie_p[TDLS_MAX_IE_LEN]; /* Peer RSN IE */ 105 size_t rsnie_p_len; 106 u32 lifetime; 107 int cipher; /* Selected cipher (WPA_CIPHER_*) */ 108 u8 dtoken; 109 110 struct tpk { 111 u8 kck[16]; /* TPK-KCK */ 112 u8 tk[16]; /* TPK-TK; assuming only CCMP will be used */ 113 } tpk; 114 int tpk_set; 115 int tpk_success; 116 int tpk_in_progress; 117 118 struct tpk_timer { 119 u8 dest[ETH_ALEN]; 120 int count; /* Retry Count */ 121 int timer; /* Timeout in milliseconds */ 122 u8 action_code; /* TDLS frame type */ 123 u8 dialog_token; 124 u16 status_code; 125 u32 peer_capab; 126 int buf_len; /* length of TPK message for retransmission */ 127 u8 *buf; /* buffer for TPK message */ 128 } sm_tmr; 129 130 u16 capability; 131 132 u8 supp_rates[IEEE80211_MAX_SUPP_RATES]; 133 size_t supp_rates_len; 134 135 struct ieee80211_ht_capabilities *ht_capabilities; 136 struct ieee80211_vht_capabilities *vht_capabilities; 137 138 u8 qos_info; 139 140 u16 aid; 141 142 u8 *ext_capab; 143 size_t ext_capab_len; 144 145 u8 *supp_channels; 146 size_t supp_channels_len; 147 148 u8 *supp_oper_classes; 149 size_t supp_oper_classes_len; 150 151 u8 wmm_capable; 152 153 /* channel switch currently enabled */ 154 int chan_switch_enabled; 155 }; 156 157 158 static int wpa_tdls_get_privacy(struct wpa_sm *sm) 159 { 160 /* 161 * Get info needed from supplicant to check if the current BSS supports 162 * security. Other than OPEN mode, rest are considered secured 163 * WEP/WPA/WPA2 hence TDLS frames are processed for TPK handshake. 164 */ 165 return sm->pairwise_cipher != WPA_CIPHER_NONE; 166 } 167 168 169 static u8 * wpa_add_ie(u8 *pos, const u8 *ie, size_t ie_len) 170 { 171 os_memcpy(pos, ie, ie_len); 172 return pos + ie_len; 173 } 174 175 176 static int wpa_tdls_del_key(struct wpa_sm *sm, struct wpa_tdls_peer *peer) 177 { 178 if (wpa_sm_set_key(sm, WPA_ALG_NONE, peer->addr, 179 0, 0, NULL, 0, NULL, 0) < 0) { 180 wpa_printf(MSG_WARNING, "TDLS: Failed to delete TPK-TK from " 181 "the driver"); 182 return -1; 183 } 184 185 return 0; 186 } 187 188 189 static int wpa_tdls_set_key(struct wpa_sm *sm, struct wpa_tdls_peer *peer) 190 { 191 u8 key_len; 192 u8 rsc[6]; 193 enum wpa_alg alg; 194 195 os_memset(rsc, 0, 6); 196 197 switch (peer->cipher) { 198 case WPA_CIPHER_CCMP: 199 alg = WPA_ALG_CCMP; 200 key_len = 16; 201 break; 202 case WPA_CIPHER_NONE: 203 wpa_printf(MSG_DEBUG, "TDLS: Pairwise Cipher Suite: " 204 "NONE - do not use pairwise keys"); 205 return -1; 206 default: 207 wpa_printf(MSG_WARNING, "TDLS: Unsupported pairwise cipher %d", 208 sm->pairwise_cipher); 209 return -1; 210 } 211 212 if (wpa_sm_set_key(sm, alg, peer->addr, -1, 1, 213 rsc, sizeof(rsc), peer->tpk.tk, key_len) < 0) { 214 wpa_printf(MSG_WARNING, "TDLS: Failed to set TPK to the " 215 "driver"); 216 return -1; 217 } 218 return 0; 219 } 220 221 222 static int wpa_tdls_send_tpk_msg(struct wpa_sm *sm, const u8 *dst, 223 u8 action_code, u8 dialog_token, 224 u16 status_code, u32 peer_capab, 225 int initiator, const u8 *buf, size_t len) 226 { 227 return wpa_sm_send_tdls_mgmt(sm, dst, action_code, dialog_token, 228 status_code, peer_capab, initiator, buf, 229 len); 230 } 231 232 233 static int wpa_tdls_tpk_send(struct wpa_sm *sm, const u8 *dest, u8 action_code, 234 u8 dialog_token, u16 status_code, u32 peer_capab, 235 int initiator, const u8 *msg, size_t msg_len) 236 { 237 struct wpa_tdls_peer *peer; 238 239 wpa_printf(MSG_DEBUG, "TDLS: TPK send dest=" MACSTR " action_code=%u " 240 "dialog_token=%u status_code=%u peer_capab=%u initiator=%d " 241 "msg_len=%u", 242 MAC2STR(dest), action_code, dialog_token, status_code, 243 peer_capab, initiator, (unsigned int) msg_len); 244 245 if (wpa_tdls_send_tpk_msg(sm, dest, action_code, dialog_token, 246 status_code, peer_capab, initiator, msg, 247 msg_len)) { 248 wpa_printf(MSG_INFO, "TDLS: Failed to send message " 249 "(action_code=%u)", action_code); 250 return -1; 251 } 252 253 if (action_code == WLAN_TDLS_SETUP_CONFIRM || 254 action_code == WLAN_TDLS_TEARDOWN || 255 action_code == WLAN_TDLS_DISCOVERY_REQUEST || 256 action_code == WLAN_TDLS_DISCOVERY_RESPONSE) 257 return 0; /* No retries */ 258 259 for (peer = sm->tdls; peer; peer = peer->next) { 260 if (os_memcmp(peer->addr, dest, ETH_ALEN) == 0) 261 break; 262 } 263 264 if (peer == NULL) { 265 wpa_printf(MSG_INFO, "TDLS: No matching entry found for " 266 "retry " MACSTR, MAC2STR(dest)); 267 return 0; 268 } 269 270 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer); 271 272 if (action_code == WLAN_TDLS_SETUP_RESPONSE) { 273 peer->sm_tmr.count = TPK_M2_RETRY_COUNT; 274 peer->sm_tmr.timer = TPK_M2_TIMEOUT; 275 } else { 276 peer->sm_tmr.count = TPK_M1_RETRY_COUNT; 277 peer->sm_tmr.timer = TPK_M1_TIMEOUT; 278 } 279 280 /* Copy message to resend on timeout */ 281 os_memcpy(peer->sm_tmr.dest, dest, ETH_ALEN); 282 peer->sm_tmr.action_code = action_code; 283 peer->sm_tmr.dialog_token = dialog_token; 284 peer->sm_tmr.status_code = status_code; 285 peer->sm_tmr.peer_capab = peer_capab; 286 peer->sm_tmr.buf_len = msg_len; 287 os_free(peer->sm_tmr.buf); 288 peer->sm_tmr.buf = os_malloc(msg_len); 289 if (peer->sm_tmr.buf == NULL) 290 return -1; 291 os_memcpy(peer->sm_tmr.buf, msg, msg_len); 292 293 wpa_printf(MSG_DEBUG, "TDLS: Retry timeout registered " 294 "(action_code=%u)", action_code); 295 eloop_register_timeout(peer->sm_tmr.timer / 1000, 296 (peer->sm_tmr.timer % 1000) * 1000, 297 wpa_tdls_tpk_retry_timeout, sm, peer); 298 return 0; 299 } 300 301 302 static int wpa_tdls_do_teardown(struct wpa_sm *sm, struct wpa_tdls_peer *peer, 303 u16 reason_code) 304 { 305 int ret; 306 307 ret = wpa_tdls_send_teardown(sm, peer->addr, reason_code); 308 /* disable the link after teardown was sent */ 309 wpa_tdls_disable_peer_link(sm, peer); 310 311 return ret; 312 } 313 314 315 static void wpa_tdls_tpk_retry_timeout(void *eloop_ctx, void *timeout_ctx) 316 { 317 318 struct wpa_sm *sm = eloop_ctx; 319 struct wpa_tdls_peer *peer = timeout_ctx; 320 321 if (peer->sm_tmr.count) { 322 peer->sm_tmr.count--; 323 324 wpa_printf(MSG_INFO, "TDLS: Retrying sending of message " 325 "(action_code=%u)", 326 peer->sm_tmr.action_code); 327 328 if (peer->sm_tmr.buf == NULL) { 329 wpa_printf(MSG_INFO, "TDLS: No retry buffer available " 330 "for action_code=%u", 331 peer->sm_tmr.action_code); 332 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, 333 peer); 334 return; 335 } 336 337 /* resend TPK Handshake Message to Peer */ 338 if (wpa_tdls_send_tpk_msg(sm, peer->sm_tmr.dest, 339 peer->sm_tmr.action_code, 340 peer->sm_tmr.dialog_token, 341 peer->sm_tmr.status_code, 342 peer->sm_tmr.peer_capab, 343 peer->initiator, 344 peer->sm_tmr.buf, 345 peer->sm_tmr.buf_len)) { 346 wpa_printf(MSG_INFO, "TDLS: Failed to retry " 347 "transmission"); 348 } 349 350 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer); 351 eloop_register_timeout(peer->sm_tmr.timer / 1000, 352 (peer->sm_tmr.timer % 1000) * 1000, 353 wpa_tdls_tpk_retry_timeout, sm, peer); 354 } else { 355 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer); 356 357 wpa_printf(MSG_DEBUG, "TDLS: Sending Teardown Request"); 358 wpa_tdls_do_teardown(sm, peer, 359 WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 360 } 361 } 362 363 364 static void wpa_tdls_tpk_retry_timeout_cancel(struct wpa_sm *sm, 365 struct wpa_tdls_peer *peer, 366 u8 action_code) 367 { 368 if (action_code == peer->sm_tmr.action_code) { 369 wpa_printf(MSG_DEBUG, "TDLS: Retry timeout cancelled for " 370 "action_code=%u", action_code); 371 372 /* Cancel Timeout registered */ 373 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer); 374 375 /* free all resources meant for retry */ 376 os_free(peer->sm_tmr.buf); 377 peer->sm_tmr.buf = NULL; 378 379 peer->sm_tmr.count = 0; 380 peer->sm_tmr.timer = 0; 381 peer->sm_tmr.buf_len = 0; 382 peer->sm_tmr.action_code = 0xff; 383 } else { 384 wpa_printf(MSG_INFO, "TDLS: Error in cancelling retry timeout " 385 "(Unknown action_code=%u)", action_code); 386 } 387 } 388 389 390 static void wpa_tdls_generate_tpk(struct wpa_tdls_peer *peer, 391 const u8 *own_addr, const u8 *bssid) 392 { 393 u8 key_input[SHA256_MAC_LEN]; 394 const u8 *nonce[2]; 395 size_t len[2]; 396 u8 data[3 * ETH_ALEN]; 397 398 /* IEEE Std 802.11z-2010 8.5.9.1: 399 * TPK-Key-Input = SHA-256(min(SNonce, ANonce) || max(SNonce, ANonce)) 400 */ 401 len[0] = WPA_NONCE_LEN; 402 len[1] = WPA_NONCE_LEN; 403 if (os_memcmp(peer->inonce, peer->rnonce, WPA_NONCE_LEN) < 0) { 404 nonce[0] = peer->inonce; 405 nonce[1] = peer->rnonce; 406 } else { 407 nonce[0] = peer->rnonce; 408 nonce[1] = peer->inonce; 409 } 410 wpa_hexdump(MSG_DEBUG, "TDLS: min(Nonce)", nonce[0], WPA_NONCE_LEN); 411 wpa_hexdump(MSG_DEBUG, "TDLS: max(Nonce)", nonce[1], WPA_NONCE_LEN); 412 sha256_vector(2, nonce, len, key_input); 413 wpa_hexdump_key(MSG_DEBUG, "TDLS: TPK-Key-Input", 414 key_input, SHA256_MAC_LEN); 415 416 /* 417 * TPK-Key-Data = KDF-N_KEY(TPK-Key-Input, "TDLS PMK", 418 * min(MAC_I, MAC_R) || max(MAC_I, MAC_R) || BSSID || N_KEY) 419 * TODO: is N_KEY really included in KDF Context and if so, in which 420 * presentation format (little endian 16-bit?) is it used? It gets 421 * added by the KDF anyway.. 422 */ 423 424 if (os_memcmp(own_addr, peer->addr, ETH_ALEN) < 0) { 425 os_memcpy(data, own_addr, ETH_ALEN); 426 os_memcpy(data + ETH_ALEN, peer->addr, ETH_ALEN); 427 } else { 428 os_memcpy(data, peer->addr, ETH_ALEN); 429 os_memcpy(data + ETH_ALEN, own_addr, ETH_ALEN); 430 } 431 os_memcpy(data + 2 * ETH_ALEN, bssid, ETH_ALEN); 432 wpa_hexdump(MSG_DEBUG, "TDLS: KDF Context", data, sizeof(data)); 433 434 sha256_prf(key_input, SHA256_MAC_LEN, "TDLS PMK", data, sizeof(data), 435 (u8 *) &peer->tpk, sizeof(peer->tpk)); 436 wpa_hexdump_key(MSG_DEBUG, "TDLS: TPK-KCK", 437 peer->tpk.kck, sizeof(peer->tpk.kck)); 438 wpa_hexdump_key(MSG_DEBUG, "TDLS: TPK-TK", 439 peer->tpk.tk, sizeof(peer->tpk.tk)); 440 peer->tpk_set = 1; 441 } 442 443 444 /** 445 * wpa_tdls_ftie_mic - Calculate TDLS FTIE MIC 446 * @kck: TPK-KCK 447 * @lnkid: Pointer to the beginning of Link Identifier IE 448 * @rsnie: Pointer to the beginning of RSN IE used for handshake 449 * @timeoutie: Pointer to the beginning of Timeout IE used for handshake 450 * @ftie: Pointer to the beginning of FT IE 451 * @mic: Pointer for writing MIC 452 * 453 * Calculate MIC for TDLS frame. 454 */ 455 static int wpa_tdls_ftie_mic(const u8 *kck, u8 trans_seq, const u8 *lnkid, 456 const u8 *rsnie, const u8 *timeoutie, 457 const u8 *ftie, u8 *mic) 458 { 459 u8 *buf, *pos; 460 struct wpa_tdls_ftie *_ftie; 461 const struct wpa_tdls_lnkid *_lnkid; 462 int ret; 463 int len = 2 * ETH_ALEN + 1 + 2 + lnkid[1] + 2 + rsnie[1] + 464 2 + timeoutie[1] + 2 + ftie[1]; 465 buf = os_zalloc(len); 466 if (!buf) { 467 wpa_printf(MSG_WARNING, "TDLS: No memory for MIC calculation"); 468 return -1; 469 } 470 471 pos = buf; 472 _lnkid = (const struct wpa_tdls_lnkid *) lnkid; 473 /* 1) TDLS initiator STA MAC address */ 474 os_memcpy(pos, _lnkid->init_sta, ETH_ALEN); 475 pos += ETH_ALEN; 476 /* 2) TDLS responder STA MAC address */ 477 os_memcpy(pos, _lnkid->resp_sta, ETH_ALEN); 478 pos += ETH_ALEN; 479 /* 3) Transaction Sequence number */ 480 *pos++ = trans_seq; 481 /* 4) Link Identifier IE */ 482 os_memcpy(pos, lnkid, 2 + lnkid[1]); 483 pos += 2 + lnkid[1]; 484 /* 5) RSN IE */ 485 os_memcpy(pos, rsnie, 2 + rsnie[1]); 486 pos += 2 + rsnie[1]; 487 /* 6) Timeout Interval IE */ 488 os_memcpy(pos, timeoutie, 2 + timeoutie[1]); 489 pos += 2 + timeoutie[1]; 490 /* 7) FTIE, with the MIC field of the FTIE set to 0 */ 491 os_memcpy(pos, ftie, 2 + ftie[1]); 492 _ftie = (struct wpa_tdls_ftie *) pos; 493 os_memset(_ftie->mic, 0, TDLS_MIC_LEN); 494 pos += 2 + ftie[1]; 495 496 wpa_hexdump(MSG_DEBUG, "TDLS: Data for FTIE MIC", buf, pos - buf); 497 wpa_hexdump_key(MSG_DEBUG, "TDLS: KCK", kck, 16); 498 ret = omac1_aes_128(kck, buf, pos - buf, mic); 499 os_free(buf); 500 wpa_hexdump(MSG_DEBUG, "TDLS: FTIE MIC", mic, 16); 501 return ret; 502 } 503 504 505 /** 506 * wpa_tdls_key_mic_teardown - Calculate TDLS FTIE MIC for Teardown frame 507 * @kck: TPK-KCK 508 * @trans_seq: Transaction Sequence Number (4 - Teardown) 509 * @rcode: Reason code for Teardown 510 * @dtoken: Dialog Token used for that particular link 511 * @lnkid: Pointer to the beginning of Link Identifier IE 512 * @ftie: Pointer to the beginning of FT IE 513 * @mic: Pointer for writing MIC 514 * 515 * Calculate MIC for TDLS frame. 516 */ 517 static int wpa_tdls_key_mic_teardown(const u8 *kck, u8 trans_seq, u16 rcode, 518 u8 dtoken, const u8 *lnkid, 519 const u8 *ftie, u8 *mic) 520 { 521 u8 *buf, *pos; 522 struct wpa_tdls_ftie *_ftie; 523 int ret; 524 int len; 525 526 if (lnkid == NULL) 527 return -1; 528 529 len = 2 + lnkid[1] + sizeof(rcode) + sizeof(dtoken) + 530 sizeof(trans_seq) + 2 + ftie[1]; 531 532 buf = os_zalloc(len); 533 if (!buf) { 534 wpa_printf(MSG_WARNING, "TDLS: No memory for MIC calculation"); 535 return -1; 536 } 537 538 pos = buf; 539 /* 1) Link Identifier IE */ 540 os_memcpy(pos, lnkid, 2 + lnkid[1]); 541 pos += 2 + lnkid[1]; 542 /* 2) Reason Code */ 543 WPA_PUT_LE16(pos, rcode); 544 pos += sizeof(rcode); 545 /* 3) Dialog token */ 546 *pos++ = dtoken; 547 /* 4) Transaction Sequence number */ 548 *pos++ = trans_seq; 549 /* 7) FTIE, with the MIC field of the FTIE set to 0 */ 550 os_memcpy(pos, ftie, 2 + ftie[1]); 551 _ftie = (struct wpa_tdls_ftie *) pos; 552 os_memset(_ftie->mic, 0, TDLS_MIC_LEN); 553 pos += 2 + ftie[1]; 554 555 wpa_hexdump(MSG_DEBUG, "TDLS: Data for FTIE MIC", buf, pos - buf); 556 wpa_hexdump_key(MSG_DEBUG, "TDLS: KCK", kck, 16); 557 ret = omac1_aes_128(kck, buf, pos - buf, mic); 558 os_free(buf); 559 wpa_hexdump(MSG_DEBUG, "TDLS: FTIE MIC", mic, 16); 560 return ret; 561 } 562 563 564 static int wpa_supplicant_verify_tdls_mic(u8 trans_seq, 565 struct wpa_tdls_peer *peer, 566 const u8 *lnkid, const u8 *timeoutie, 567 const struct wpa_tdls_ftie *ftie) 568 { 569 u8 mic[16]; 570 571 if (peer->tpk_set) { 572 wpa_tdls_ftie_mic(peer->tpk.kck, trans_seq, lnkid, 573 peer->rsnie_p, timeoutie, (u8 *) ftie, 574 mic); 575 if (os_memcmp_const(mic, ftie->mic, 16) != 0) { 576 wpa_printf(MSG_INFO, "TDLS: Invalid MIC in FTIE - " 577 "dropping packet"); 578 wpa_hexdump(MSG_DEBUG, "TDLS: Received MIC", 579 ftie->mic, 16); 580 wpa_hexdump(MSG_DEBUG, "TDLS: Calculated MIC", 581 mic, 16); 582 return -1; 583 } 584 } else { 585 wpa_printf(MSG_WARNING, "TDLS: Could not verify TDLS MIC, " 586 "TPK not set - dropping packet"); 587 return -1; 588 } 589 return 0; 590 } 591 592 593 static int wpa_supplicant_verify_tdls_mic_teardown( 594 u8 trans_seq, u16 rcode, u8 dtoken, struct wpa_tdls_peer *peer, 595 const u8 *lnkid, const struct wpa_tdls_ftie *ftie) 596 { 597 u8 mic[16]; 598 599 if (peer->tpk_set) { 600 wpa_tdls_key_mic_teardown(peer->tpk.kck, trans_seq, rcode, 601 dtoken, lnkid, (u8 *) ftie, mic); 602 if (os_memcmp_const(mic, ftie->mic, 16) != 0) { 603 wpa_printf(MSG_INFO, "TDLS: Invalid MIC in Teardown - " 604 "dropping packet"); 605 return -1; 606 } 607 } else { 608 wpa_printf(MSG_INFO, "TDLS: Could not verify TDLS Teardown " 609 "MIC, TPK not set - dropping packet"); 610 return -1; 611 } 612 return 0; 613 } 614 615 616 static void wpa_tdls_tpk_timeout(void *eloop_ctx, void *timeout_ctx) 617 { 618 struct wpa_sm *sm = eloop_ctx; 619 struct wpa_tdls_peer *peer = timeout_ctx; 620 621 /* 622 * On TPK lifetime expiration, we have an option of either tearing down 623 * the direct link or trying to re-initiate it. The selection of what 624 * to do is not strictly speaking controlled by our role in the expired 625 * link, but for now, use that to select whether to renew or tear down 626 * the link. 627 */ 628 629 if (peer->initiator) { 630 u8 addr[ETH_ALEN]; 631 632 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime expired for " MACSTR 633 " - try to renew", MAC2STR(peer->addr)); 634 /* cache the peer address before do_teardown */ 635 os_memcpy(addr, peer->addr, ETH_ALEN); 636 wpa_tdls_do_teardown(sm, peer, 637 WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 638 wpa_tdls_start(sm, addr); 639 } else { 640 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime expired for " MACSTR 641 " - tear down", MAC2STR(peer->addr)); 642 wpa_tdls_do_teardown(sm, peer, 643 WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 644 } 645 } 646 647 648 static void wpa_tdls_peer_remove_from_list(struct wpa_sm *sm, 649 struct wpa_tdls_peer *peer) 650 { 651 struct wpa_tdls_peer *cur, *prev; 652 653 cur = sm->tdls; 654 prev = NULL; 655 while (cur && cur != peer) { 656 prev = cur; 657 cur = cur->next; 658 } 659 660 if (cur != peer) { 661 wpa_printf(MSG_ERROR, "TDLS: Could not find peer " MACSTR 662 " to remove it from the list", 663 MAC2STR(peer->addr)); 664 return; 665 } 666 667 if (prev) 668 prev->next = peer->next; 669 else 670 sm->tdls = peer->next; 671 } 672 673 674 static void wpa_tdls_peer_clear(struct wpa_sm *sm, struct wpa_tdls_peer *peer) 675 { 676 wpa_printf(MSG_DEBUG, "TDLS: Clear state for peer " MACSTR, 677 MAC2STR(peer->addr)); 678 eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer); 679 eloop_cancel_timeout(wpa_tdls_tpk_retry_timeout, sm, peer); 680 peer->reconfig_key = 0; 681 peer->initiator = 0; 682 peer->tpk_in_progress = 0; 683 os_free(peer->sm_tmr.buf); 684 peer->sm_tmr.buf = NULL; 685 os_free(peer->ht_capabilities); 686 peer->ht_capabilities = NULL; 687 os_free(peer->vht_capabilities); 688 peer->vht_capabilities = NULL; 689 os_free(peer->ext_capab); 690 peer->ext_capab = NULL; 691 os_free(peer->supp_channels); 692 peer->supp_channels = NULL; 693 os_free(peer->supp_oper_classes); 694 peer->supp_oper_classes = NULL; 695 peer->rsnie_i_len = peer->rsnie_p_len = 0; 696 peer->cipher = 0; 697 peer->qos_info = 0; 698 peer->wmm_capable = 0; 699 peer->tpk_set = peer->tpk_success = 0; 700 peer->chan_switch_enabled = 0; 701 os_memset(&peer->tpk, 0, sizeof(peer->tpk)); 702 os_memset(peer->inonce, 0, WPA_NONCE_LEN); 703 os_memset(peer->rnonce, 0, WPA_NONCE_LEN); 704 } 705 706 707 static void wpa_tdls_peer_free(struct wpa_sm *sm, struct wpa_tdls_peer *peer) 708 { 709 wpa_tdls_peer_clear(sm, peer); 710 wpa_tdls_peer_remove_from_list(sm, peer); 711 os_free(peer); 712 } 713 714 715 static void wpa_tdls_linkid(struct wpa_sm *sm, struct wpa_tdls_peer *peer, 716 struct wpa_tdls_lnkid *lnkid) 717 { 718 lnkid->ie_type = WLAN_EID_LINK_ID; 719 lnkid->ie_len = 3 * ETH_ALEN; 720 os_memcpy(lnkid->bssid, sm->bssid, ETH_ALEN); 721 if (peer->initiator) { 722 os_memcpy(lnkid->init_sta, sm->own_addr, ETH_ALEN); 723 os_memcpy(lnkid->resp_sta, peer->addr, ETH_ALEN); 724 } else { 725 os_memcpy(lnkid->init_sta, peer->addr, ETH_ALEN); 726 os_memcpy(lnkid->resp_sta, sm->own_addr, ETH_ALEN); 727 } 728 } 729 730 731 static int wpa_tdls_send_teardown(struct wpa_sm *sm, const u8 *addr, 732 u16 reason_code) 733 { 734 struct wpa_tdls_peer *peer; 735 struct wpa_tdls_ftie *ftie; 736 struct wpa_tdls_lnkid lnkid; 737 u8 dialog_token; 738 u8 *rbuf, *pos; 739 int ielen; 740 741 if (sm->tdls_disabled || !sm->tdls_supported) 742 return -1; 743 744 /* Find the node and free from the list */ 745 for (peer = sm->tdls; peer; peer = peer->next) { 746 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) 747 break; 748 } 749 750 if (peer == NULL) { 751 wpa_printf(MSG_INFO, "TDLS: No matching entry found for " 752 "Teardown " MACSTR, MAC2STR(addr)); 753 return 0; 754 } 755 756 /* Cancel active channel switch before teardown */ 757 if (peer->chan_switch_enabled) { 758 wpa_printf(MSG_DEBUG, "TDLS: First returning link with " MACSTR 759 " to base channel", MAC2STR(addr)); 760 wpa_sm_tdls_disable_channel_switch(sm, peer->addr); 761 } 762 763 dialog_token = peer->dtoken; 764 765 wpa_printf(MSG_DEBUG, "TDLS: TDLS Teardown for " MACSTR, 766 MAC2STR(addr)); 767 768 ielen = 0; 769 if (wpa_tdls_get_privacy(sm) && peer->tpk_set && peer->tpk_success) { 770 /* To add FTIE for Teardown request and compute MIC */ 771 ielen += sizeof(*ftie); 772 #ifdef CONFIG_TDLS_TESTING 773 if (tdls_testing & TDLS_TESTING_LONG_FRAME) 774 ielen += 170; 775 #endif /* CONFIG_TDLS_TESTING */ 776 } 777 778 rbuf = os_zalloc(ielen + 1); 779 if (rbuf == NULL) 780 return -1; 781 pos = rbuf; 782 783 if (!wpa_tdls_get_privacy(sm) || !peer->tpk_set || !peer->tpk_success) 784 goto skip_ies; 785 786 ftie = (struct wpa_tdls_ftie *) pos; 787 ftie->ie_type = WLAN_EID_FAST_BSS_TRANSITION; 788 /* Using the recent nonce which should be for CONFIRM frame */ 789 os_memcpy(ftie->Anonce, peer->rnonce, WPA_NONCE_LEN); 790 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN); 791 ftie->ie_len = sizeof(struct wpa_tdls_ftie) - 2; 792 pos = (u8 *) (ftie + 1); 793 #ifdef CONFIG_TDLS_TESTING 794 if (tdls_testing & TDLS_TESTING_LONG_FRAME) { 795 wpa_printf(MSG_DEBUG, "TDLS: Testing - add extra subelem to " 796 "FTIE"); 797 ftie->ie_len += 170; 798 *pos++ = 255; /* FTIE subelem */ 799 *pos++ = 168; /* FTIE subelem length */ 800 pos += 168; 801 } 802 #endif /* CONFIG_TDLS_TESTING */ 803 wpa_hexdump(MSG_DEBUG, "TDLS: FTIE for TDLS Teardown handshake", 804 (u8 *) ftie, pos - (u8 *) ftie); 805 806 /* compute MIC before sending */ 807 wpa_tdls_linkid(sm, peer, &lnkid); 808 wpa_tdls_key_mic_teardown(peer->tpk.kck, 4, reason_code, 809 dialog_token, (u8 *) &lnkid, (u8 *) ftie, 810 ftie->mic); 811 812 skip_ies: 813 /* TODO: register for a Timeout handler, if Teardown is not received at 814 * the other end, then try again another time */ 815 816 /* request driver to send Teardown using this FTIE */ 817 wpa_tdls_tpk_send(sm, addr, WLAN_TDLS_TEARDOWN, 0, 818 reason_code, 0, peer->initiator, rbuf, pos - rbuf); 819 os_free(rbuf); 820 821 return 0; 822 } 823 824 825 int wpa_tdls_teardown_link(struct wpa_sm *sm, const u8 *addr, u16 reason_code) 826 { 827 struct wpa_tdls_peer *peer; 828 829 if (sm->tdls_disabled || !sm->tdls_supported) 830 return -1; 831 832 for (peer = sm->tdls; peer; peer = peer->next) { 833 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) 834 break; 835 } 836 837 if (peer == NULL) { 838 wpa_printf(MSG_DEBUG, "TDLS: Could not find peer " MACSTR 839 " for link Teardown", MAC2STR(addr)); 840 return -1; 841 } 842 843 if (!peer->tpk_success) { 844 wpa_printf(MSG_DEBUG, "TDLS: Peer " MACSTR 845 " not connected - cannot Teardown link", MAC2STR(addr)); 846 return -1; 847 } 848 849 return wpa_tdls_do_teardown(sm, peer, reason_code); 850 } 851 852 853 static void wpa_tdls_disable_peer_link(struct wpa_sm *sm, 854 struct wpa_tdls_peer *peer) 855 { 856 wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr); 857 wpa_tdls_peer_free(sm, peer); 858 } 859 860 861 void wpa_tdls_disable_unreachable_link(struct wpa_sm *sm, const u8 *addr) 862 { 863 struct wpa_tdls_peer *peer; 864 865 for (peer = sm->tdls; peer; peer = peer->next) { 866 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) 867 break; 868 } 869 870 if (!peer || !peer->tpk_success) { 871 wpa_printf(MSG_DEBUG, "TDLS: Peer " MACSTR 872 " not connected - cannot teardown unreachable link", 873 MAC2STR(addr)); 874 return; 875 } 876 877 if (wpa_tdls_is_external_setup(sm)) { 878 /* 879 * Get us on the base channel, disable the link, send a 880 * teardown packet through the AP, and then reset link data. 881 */ 882 if (peer->chan_switch_enabled) 883 wpa_sm_tdls_disable_channel_switch(sm, peer->addr); 884 wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, addr); 885 wpa_tdls_send_teardown(sm, addr, 886 WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE); 887 wpa_tdls_peer_free(sm, peer); 888 } else { 889 wpa_tdls_disable_peer_link(sm, peer); 890 } 891 } 892 893 894 const char * wpa_tdls_get_link_status(struct wpa_sm *sm, const u8 *addr) 895 { 896 struct wpa_tdls_peer *peer; 897 898 if (sm->tdls_disabled || !sm->tdls_supported) 899 return "disabled"; 900 901 for (peer = sm->tdls; peer; peer = peer->next) { 902 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) 903 break; 904 } 905 906 if (peer == NULL) 907 return "peer does not exist"; 908 909 if (!peer->tpk_success) 910 return "peer not connected"; 911 912 return "connected"; 913 } 914 915 916 static int wpa_tdls_recv_teardown(struct wpa_sm *sm, const u8 *src_addr, 917 const u8 *buf, size_t len) 918 { 919 struct wpa_tdls_peer *peer = NULL; 920 struct wpa_tdls_ftie *ftie; 921 struct wpa_tdls_lnkid *lnkid; 922 struct wpa_eapol_ie_parse kde; 923 u16 reason_code; 924 const u8 *pos; 925 int ielen; 926 927 /* Find the node and free from the list */ 928 for (peer = sm->tdls; peer; peer = peer->next) { 929 if (os_memcmp(peer->addr, src_addr, ETH_ALEN) == 0) 930 break; 931 } 932 933 if (peer == NULL) { 934 wpa_printf(MSG_INFO, "TDLS: No matching entry found for " 935 "Teardown " MACSTR, MAC2STR(src_addr)); 936 return 0; 937 } 938 939 pos = buf; 940 pos += 1 /* pkt_type */ + 1 /* Category */ + 1 /* Action */; 941 942 reason_code = WPA_GET_LE16(pos); 943 pos += 2; 944 945 wpa_printf(MSG_DEBUG, "TDLS: TDLS Teardown Request from " MACSTR 946 " (reason code %u)", MAC2STR(src_addr), reason_code); 947 948 ielen = len - (pos - buf); /* start of IE in buf */ 949 950 /* 951 * Don't reject the message if failing to parse IEs. The IEs we need are 952 * explicitly checked below. Some APs may add arbitrary padding to the 953 * end of short TDLS frames and that would look like invalid IEs. 954 */ 955 if (wpa_supplicant_parse_ies((const u8 *) pos, ielen, &kde) < 0) 956 wpa_printf(MSG_DEBUG, 957 "TDLS: Failed to parse IEs in Teardown - ignore as an interop workaround"); 958 959 if (kde.lnkid == NULL || kde.lnkid_len < 3 * ETH_ALEN) { 960 wpa_printf(MSG_INFO, "TDLS: No Link Identifier IE in TDLS " 961 "Teardown"); 962 return -1; 963 } 964 lnkid = (struct wpa_tdls_lnkid *) kde.lnkid; 965 966 if (!wpa_tdls_get_privacy(sm) || !peer->tpk_set || !peer->tpk_success) 967 goto skip_ftie; 968 969 if (kde.ftie == NULL || kde.ftie_len < sizeof(*ftie)) { 970 wpa_printf(MSG_INFO, "TDLS: No FTIE in TDLS Teardown"); 971 return -1; 972 } 973 974 ftie = (struct wpa_tdls_ftie *) kde.ftie; 975 976 /* Process MIC check to see if TDLS Teardown is right */ 977 if (wpa_supplicant_verify_tdls_mic_teardown(4, reason_code, 978 peer->dtoken, peer, 979 (u8 *) lnkid, ftie) < 0) { 980 wpa_printf(MSG_DEBUG, "TDLS: MIC failure for TDLS " 981 "Teardown Request from " MACSTR, MAC2STR(src_addr)); 982 return -1; 983 } 984 985 skip_ftie: 986 /* 987 * Request the driver to disable the direct link and clear associated 988 * keys. 989 */ 990 wpa_tdls_disable_peer_link(sm, peer); 991 return 0; 992 } 993 994 995 /** 996 * wpa_tdls_send_error - To send suitable TDLS status response with 997 * appropriate status code mentioning reason for error/failure. 998 * @dst - MAC addr of Peer station 999 * @tdls_action - TDLS frame type for which error code is sent 1000 * @initiator - was this end the initiator of the connection 1001 * @status - status code mentioning reason 1002 */ 1003 1004 static int wpa_tdls_send_error(struct wpa_sm *sm, const u8 *dst, 1005 u8 tdls_action, u8 dialog_token, int initiator, 1006 u16 status) 1007 { 1008 wpa_printf(MSG_DEBUG, "TDLS: Sending error to " MACSTR 1009 " (action=%u status=%u)", 1010 MAC2STR(dst), tdls_action, status); 1011 return wpa_tdls_tpk_send(sm, dst, tdls_action, dialog_token, status, 1012 0, initiator, NULL, 0); 1013 } 1014 1015 1016 static struct wpa_tdls_peer * 1017 wpa_tdls_add_peer(struct wpa_sm *sm, const u8 *addr, int *existing) 1018 { 1019 struct wpa_tdls_peer *peer; 1020 1021 if (existing) 1022 *existing = 0; 1023 for (peer = sm->tdls; peer; peer = peer->next) { 1024 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) { 1025 if (existing) 1026 *existing = 1; 1027 return peer; /* re-use existing entry */ 1028 } 1029 } 1030 1031 wpa_printf(MSG_INFO, "TDLS: Creating peer entry for " MACSTR, 1032 MAC2STR(addr)); 1033 1034 peer = os_zalloc(sizeof(*peer)); 1035 if (peer == NULL) 1036 return NULL; 1037 1038 os_memcpy(peer->addr, addr, ETH_ALEN); 1039 peer->next = sm->tdls; 1040 sm->tdls = peer; 1041 1042 return peer; 1043 } 1044 1045 1046 static int wpa_tdls_send_tpk_m1(struct wpa_sm *sm, 1047 struct wpa_tdls_peer *peer) 1048 { 1049 size_t buf_len; 1050 struct wpa_tdls_timeoutie timeoutie; 1051 u16 rsn_capab; 1052 struct wpa_tdls_ftie *ftie; 1053 u8 *rbuf, *pos, *count_pos; 1054 u16 count; 1055 struct rsn_ie_hdr *hdr; 1056 int status; 1057 1058 if (!wpa_tdls_get_privacy(sm)) { 1059 wpa_printf(MSG_DEBUG, "TDLS: No security used on the link"); 1060 peer->rsnie_i_len = 0; 1061 goto skip_rsnie; 1062 } 1063 1064 /* 1065 * TPK Handshake Message 1: 1066 * FTIE: ANonce=0, SNonce=initiator nonce MIC=0, DataKDs=(RSNIE_I, 1067 * Timeout Interval IE)) 1068 */ 1069 1070 /* Filling RSN IE */ 1071 hdr = (struct rsn_ie_hdr *) peer->rsnie_i; 1072 hdr->elem_id = WLAN_EID_RSN; 1073 WPA_PUT_LE16(hdr->version, RSN_VERSION); 1074 1075 pos = (u8 *) (hdr + 1); 1076 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED); 1077 pos += RSN_SELECTOR_LEN; 1078 count_pos = pos; 1079 pos += 2; 1080 1081 count = 0; 1082 1083 /* 1084 * AES-CCMP is the default Encryption preferred for TDLS, so 1085 * RSN IE is filled only with CCMP CIPHER 1086 * Note: TKIP is not used to encrypt TDLS link. 1087 * 1088 * Regardless of the cipher used on the AP connection, select CCMP 1089 * here. 1090 */ 1091 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP); 1092 pos += RSN_SELECTOR_LEN; 1093 count++; 1094 1095 WPA_PUT_LE16(count_pos, count); 1096 1097 WPA_PUT_LE16(pos, 1); 1098 pos += 2; 1099 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_TPK_HANDSHAKE); 1100 pos += RSN_SELECTOR_LEN; 1101 1102 rsn_capab = WPA_CAPABILITY_PEERKEY_ENABLED; 1103 rsn_capab |= RSN_NUM_REPLAY_COUNTERS_16 << 2; 1104 #ifdef CONFIG_TDLS_TESTING 1105 if (tdls_testing & TDLS_TESTING_ALT_RSN_IE) { 1106 wpa_printf(MSG_DEBUG, "TDLS: Use alternative RSN IE for " 1107 "testing"); 1108 rsn_capab = WPA_CAPABILITY_PEERKEY_ENABLED; 1109 } 1110 #endif /* CONFIG_TDLS_TESTING */ 1111 WPA_PUT_LE16(pos, rsn_capab); 1112 pos += 2; 1113 #ifdef CONFIG_TDLS_TESTING 1114 if (tdls_testing & TDLS_TESTING_ALT_RSN_IE) { 1115 /* Number of PMKIDs */ 1116 *pos++ = 0x00; 1117 *pos++ = 0x00; 1118 } 1119 #endif /* CONFIG_TDLS_TESTING */ 1120 1121 hdr->len = (pos - peer->rsnie_i) - 2; 1122 peer->rsnie_i_len = pos - peer->rsnie_i; 1123 wpa_hexdump(MSG_DEBUG, "TDLS: RSN IE for TPK handshake", 1124 peer->rsnie_i, peer->rsnie_i_len); 1125 1126 skip_rsnie: 1127 buf_len = 0; 1128 if (wpa_tdls_get_privacy(sm)) 1129 buf_len += peer->rsnie_i_len + sizeof(struct wpa_tdls_ftie) + 1130 sizeof(struct wpa_tdls_timeoutie); 1131 #ifdef CONFIG_TDLS_TESTING 1132 if (wpa_tdls_get_privacy(sm) && 1133 (tdls_testing & TDLS_TESTING_LONG_FRAME)) 1134 buf_len += 170; 1135 if (tdls_testing & TDLS_TESTING_DIFF_BSSID) 1136 buf_len += sizeof(struct wpa_tdls_lnkid); 1137 #endif /* CONFIG_TDLS_TESTING */ 1138 rbuf = os_zalloc(buf_len + 1); 1139 if (rbuf == NULL) { 1140 wpa_tdls_peer_free(sm, peer); 1141 return -1; 1142 } 1143 pos = rbuf; 1144 1145 if (!wpa_tdls_get_privacy(sm)) 1146 goto skip_ies; 1147 1148 /* Initiator RSN IE */ 1149 pos = wpa_add_ie(pos, peer->rsnie_i, peer->rsnie_i_len); 1150 1151 ftie = (struct wpa_tdls_ftie *) pos; 1152 ftie->ie_type = WLAN_EID_FAST_BSS_TRANSITION; 1153 ftie->ie_len = sizeof(struct wpa_tdls_ftie) - 2; 1154 1155 if (os_get_random(peer->inonce, WPA_NONCE_LEN)) { 1156 wpa_msg(sm->ctx->msg_ctx, MSG_WARNING, 1157 "TDLS: Failed to get random data for initiator Nonce"); 1158 os_free(rbuf); 1159 wpa_tdls_peer_free(sm, peer); 1160 return -1; 1161 } 1162 wpa_hexdump(MSG_DEBUG, "TDLS: Initiator Nonce for TPK handshake", 1163 peer->inonce, WPA_NONCE_LEN); 1164 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN); 1165 1166 wpa_hexdump(MSG_DEBUG, "TDLS: FTIE for TPK Handshake M1", 1167 (u8 *) ftie, sizeof(struct wpa_tdls_ftie)); 1168 1169 pos = (u8 *) (ftie + 1); 1170 1171 #ifdef CONFIG_TDLS_TESTING 1172 if (tdls_testing & TDLS_TESTING_LONG_FRAME) { 1173 wpa_printf(MSG_DEBUG, "TDLS: Testing - add extra subelem to " 1174 "FTIE"); 1175 ftie->ie_len += 170; 1176 *pos++ = 255; /* FTIE subelem */ 1177 *pos++ = 168; /* FTIE subelem length */ 1178 pos += 168; 1179 } 1180 #endif /* CONFIG_TDLS_TESTING */ 1181 1182 /* Lifetime */ 1183 peer->lifetime = TPK_LIFETIME; 1184 #ifdef CONFIG_TDLS_TESTING 1185 if (tdls_testing & TDLS_TESTING_SHORT_LIFETIME) { 1186 wpa_printf(MSG_DEBUG, "TDLS: Testing - use short TPK " 1187 "lifetime"); 1188 peer->lifetime = 301; 1189 } 1190 if (tdls_testing & TDLS_TESTING_LONG_LIFETIME) { 1191 wpa_printf(MSG_DEBUG, "TDLS: Testing - use long TPK " 1192 "lifetime"); 1193 peer->lifetime = 0xffffffff; 1194 } 1195 #endif /* CONFIG_TDLS_TESTING */ 1196 pos = wpa_add_tdls_timeoutie(pos, (u8 *) &timeoutie, 1197 sizeof(timeoutie), peer->lifetime); 1198 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime %u seconds", peer->lifetime); 1199 1200 skip_ies: 1201 1202 #ifdef CONFIG_TDLS_TESTING 1203 if (tdls_testing & TDLS_TESTING_DIFF_BSSID) { 1204 wpa_printf(MSG_DEBUG, "TDLS: Testing - use incorrect BSSID in " 1205 "Link Identifier"); 1206 struct wpa_tdls_lnkid *l = (struct wpa_tdls_lnkid *) pos; 1207 wpa_tdls_linkid(sm, peer, l); 1208 l->bssid[5] ^= 0x01; 1209 pos += sizeof(*l); 1210 } 1211 #endif /* CONFIG_TDLS_TESTING */ 1212 1213 wpa_printf(MSG_DEBUG, "TDLS: Sending TDLS Setup Request / TPK " 1214 "Handshake Message 1 (peer " MACSTR ")", 1215 MAC2STR(peer->addr)); 1216 1217 status = wpa_tdls_tpk_send(sm, peer->addr, WLAN_TDLS_SETUP_REQUEST, 1218 1, 0, 0, peer->initiator, rbuf, pos - rbuf); 1219 os_free(rbuf); 1220 1221 return status; 1222 } 1223 1224 1225 static int wpa_tdls_send_tpk_m2(struct wpa_sm *sm, 1226 const unsigned char *src_addr, u8 dtoken, 1227 struct wpa_tdls_lnkid *lnkid, 1228 const struct wpa_tdls_peer *peer) 1229 { 1230 u8 *rbuf, *pos; 1231 size_t buf_len; 1232 u32 lifetime; 1233 struct wpa_tdls_timeoutie timeoutie; 1234 struct wpa_tdls_ftie *ftie; 1235 int status; 1236 1237 buf_len = 0; 1238 if (wpa_tdls_get_privacy(sm)) { 1239 /* Peer RSN IE, FTIE(Initiator Nonce, Responder Nonce), 1240 * Lifetime */ 1241 buf_len += peer->rsnie_i_len + sizeof(struct wpa_tdls_ftie) + 1242 sizeof(struct wpa_tdls_timeoutie); 1243 #ifdef CONFIG_TDLS_TESTING 1244 if (tdls_testing & TDLS_TESTING_LONG_FRAME) 1245 buf_len += 170; 1246 #endif /* CONFIG_TDLS_TESTING */ 1247 } 1248 1249 rbuf = os_zalloc(buf_len + 1); 1250 if (rbuf == NULL) 1251 return -1; 1252 pos = rbuf; 1253 1254 if (!wpa_tdls_get_privacy(sm)) 1255 goto skip_ies; 1256 1257 /* Peer RSN IE */ 1258 pos = wpa_add_ie(pos, peer->rsnie_p, peer->rsnie_p_len); 1259 1260 ftie = (struct wpa_tdls_ftie *) pos; 1261 ftie->ie_type = WLAN_EID_FAST_BSS_TRANSITION; 1262 /* TODO: ftie->mic_control to set 2-RESPONSE */ 1263 os_memcpy(ftie->Anonce, peer->rnonce, WPA_NONCE_LEN); 1264 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN); 1265 ftie->ie_len = sizeof(struct wpa_tdls_ftie) - 2; 1266 wpa_hexdump(MSG_DEBUG, "TDLS: FTIE for TPK M2", 1267 (u8 *) ftie, sizeof(*ftie)); 1268 1269 pos = (u8 *) (ftie + 1); 1270 1271 #ifdef CONFIG_TDLS_TESTING 1272 if (tdls_testing & TDLS_TESTING_LONG_FRAME) { 1273 wpa_printf(MSG_DEBUG, "TDLS: Testing - add extra subelem to " 1274 "FTIE"); 1275 ftie->ie_len += 170; 1276 *pos++ = 255; /* FTIE subelem */ 1277 *pos++ = 168; /* FTIE subelem length */ 1278 pos += 168; 1279 } 1280 #endif /* CONFIG_TDLS_TESTING */ 1281 1282 /* Lifetime */ 1283 lifetime = peer->lifetime; 1284 #ifdef CONFIG_TDLS_TESTING 1285 if (tdls_testing & TDLS_TESTING_WRONG_LIFETIME_RESP) { 1286 wpa_printf(MSG_DEBUG, "TDLS: Testing - use wrong TPK " 1287 "lifetime in response"); 1288 lifetime++; 1289 } 1290 #endif /* CONFIG_TDLS_TESTING */ 1291 pos = wpa_add_tdls_timeoutie(pos, (u8 *) &timeoutie, 1292 sizeof(timeoutie), lifetime); 1293 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime %u seconds from initiator", 1294 lifetime); 1295 1296 /* compute MIC before sending */ 1297 wpa_tdls_ftie_mic(peer->tpk.kck, 2, (u8 *) lnkid, peer->rsnie_p, 1298 (u8 *) &timeoutie, (u8 *) ftie, ftie->mic); 1299 #ifdef CONFIG_TDLS_TESTING 1300 if (tdls_testing & TDLS_TESTING_WRONG_MIC) { 1301 wpa_printf(MSG_DEBUG, "TDLS: Testing - use wrong MIC"); 1302 ftie->mic[0] ^= 0x01; 1303 } 1304 #endif /* CONFIG_TDLS_TESTING */ 1305 1306 skip_ies: 1307 status = wpa_tdls_tpk_send(sm, src_addr, WLAN_TDLS_SETUP_RESPONSE, 1308 dtoken, 0, 0, peer->initiator, rbuf, 1309 pos - rbuf); 1310 os_free(rbuf); 1311 1312 return status; 1313 } 1314 1315 1316 static int wpa_tdls_send_tpk_m3(struct wpa_sm *sm, 1317 const unsigned char *src_addr, u8 dtoken, 1318 struct wpa_tdls_lnkid *lnkid, 1319 const struct wpa_tdls_peer *peer) 1320 { 1321 u8 *rbuf, *pos; 1322 size_t buf_len; 1323 struct wpa_tdls_ftie *ftie; 1324 struct wpa_tdls_timeoutie timeoutie; 1325 u32 lifetime; 1326 int status; 1327 u32 peer_capab = 0; 1328 1329 buf_len = 0; 1330 if (wpa_tdls_get_privacy(sm)) { 1331 /* Peer RSN IE, FTIE(Initiator Nonce, Responder Nonce), 1332 * Lifetime */ 1333 buf_len += peer->rsnie_i_len + sizeof(struct wpa_tdls_ftie) + 1334 sizeof(struct wpa_tdls_timeoutie); 1335 #ifdef CONFIG_TDLS_TESTING 1336 if (tdls_testing & TDLS_TESTING_LONG_FRAME) 1337 buf_len += 170; 1338 #endif /* CONFIG_TDLS_TESTING */ 1339 } 1340 1341 rbuf = os_zalloc(buf_len + 1); 1342 if (rbuf == NULL) 1343 return -1; 1344 pos = rbuf; 1345 1346 if (!wpa_tdls_get_privacy(sm)) 1347 goto skip_ies; 1348 1349 /* Peer RSN IE */ 1350 pos = wpa_add_ie(pos, peer->rsnie_p, peer->rsnie_p_len); 1351 1352 ftie = (struct wpa_tdls_ftie *) pos; 1353 ftie->ie_type = WLAN_EID_FAST_BSS_TRANSITION; 1354 /*TODO: ftie->mic_control to set 3-CONFIRM */ 1355 os_memcpy(ftie->Anonce, peer->rnonce, WPA_NONCE_LEN); 1356 os_memcpy(ftie->Snonce, peer->inonce, WPA_NONCE_LEN); 1357 ftie->ie_len = sizeof(struct wpa_tdls_ftie) - 2; 1358 1359 pos = (u8 *) (ftie + 1); 1360 1361 #ifdef CONFIG_TDLS_TESTING 1362 if (tdls_testing & TDLS_TESTING_LONG_FRAME) { 1363 wpa_printf(MSG_DEBUG, "TDLS: Testing - add extra subelem to " 1364 "FTIE"); 1365 ftie->ie_len += 170; 1366 *pos++ = 255; /* FTIE subelem */ 1367 *pos++ = 168; /* FTIE subelem length */ 1368 pos += 168; 1369 } 1370 #endif /* CONFIG_TDLS_TESTING */ 1371 1372 /* Lifetime */ 1373 lifetime = peer->lifetime; 1374 #ifdef CONFIG_TDLS_TESTING 1375 if (tdls_testing & TDLS_TESTING_WRONG_LIFETIME_CONF) { 1376 wpa_printf(MSG_DEBUG, "TDLS: Testing - use wrong TPK " 1377 "lifetime in confirm"); 1378 lifetime++; 1379 } 1380 #endif /* CONFIG_TDLS_TESTING */ 1381 pos = wpa_add_tdls_timeoutie(pos, (u8 *) &timeoutie, 1382 sizeof(timeoutie), lifetime); 1383 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime %u seconds", 1384 lifetime); 1385 1386 /* compute MIC before sending */ 1387 wpa_tdls_ftie_mic(peer->tpk.kck, 3, (u8 *) lnkid, peer->rsnie_p, 1388 (u8 *) &timeoutie, (u8 *) ftie, ftie->mic); 1389 #ifdef CONFIG_TDLS_TESTING 1390 if (tdls_testing & TDLS_TESTING_WRONG_MIC) { 1391 wpa_printf(MSG_DEBUG, "TDLS: Testing - use wrong MIC"); 1392 ftie->mic[0] ^= 0x01; 1393 } 1394 #endif /* CONFIG_TDLS_TESTING */ 1395 1396 skip_ies: 1397 1398 if (peer->vht_capabilities) 1399 peer_capab |= TDLS_PEER_VHT; 1400 if (peer->ht_capabilities) 1401 peer_capab |= TDLS_PEER_HT; 1402 if (peer->wmm_capable) 1403 peer_capab |= TDLS_PEER_WMM; 1404 1405 status = wpa_tdls_tpk_send(sm, src_addr, WLAN_TDLS_SETUP_CONFIRM, 1406 dtoken, 0, peer_capab, peer->initiator, 1407 rbuf, pos - rbuf); 1408 os_free(rbuf); 1409 1410 return status; 1411 } 1412 1413 1414 static int wpa_tdls_send_discovery_response(struct wpa_sm *sm, 1415 struct wpa_tdls_peer *peer, 1416 u8 dialog_token) 1417 { 1418 size_t buf_len = 0; 1419 struct wpa_tdls_timeoutie timeoutie; 1420 u16 rsn_capab; 1421 u8 *rbuf, *pos, *count_pos; 1422 u16 count; 1423 struct rsn_ie_hdr *hdr; 1424 int status; 1425 1426 wpa_printf(MSG_DEBUG, "TDLS: Sending TDLS Discovery Response " 1427 "(peer " MACSTR ")", MAC2STR(peer->addr)); 1428 if (!wpa_tdls_get_privacy(sm)) 1429 goto skip_rsn_ies; 1430 1431 /* Filling RSN IE */ 1432 hdr = (struct rsn_ie_hdr *) peer->rsnie_i; 1433 hdr->elem_id = WLAN_EID_RSN; 1434 WPA_PUT_LE16(hdr->version, RSN_VERSION); 1435 pos = (u8 *) (hdr + 1); 1436 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED); 1437 pos += RSN_SELECTOR_LEN; 1438 count_pos = pos; 1439 pos += 2; 1440 count = 0; 1441 1442 /* 1443 * AES-CCMP is the default encryption preferred for TDLS, so 1444 * RSN IE is filled only with CCMP cipher suite. 1445 * Note: TKIP is not used to encrypt TDLS link. 1446 * 1447 * Regardless of the cipher used on the AP connection, select CCMP 1448 * here. 1449 */ 1450 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP); 1451 pos += RSN_SELECTOR_LEN; 1452 count++; 1453 WPA_PUT_LE16(count_pos, count); 1454 WPA_PUT_LE16(pos, 1); 1455 pos += 2; 1456 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_TPK_HANDSHAKE); 1457 pos += RSN_SELECTOR_LEN; 1458 1459 rsn_capab = WPA_CAPABILITY_PEERKEY_ENABLED; 1460 rsn_capab |= RSN_NUM_REPLAY_COUNTERS_16 << 2; 1461 WPA_PUT_LE16(pos, rsn_capab); 1462 pos += 2; 1463 hdr->len = (pos - (u8 *) hdr) - 2; 1464 peer->rsnie_i_len = pos - peer->rsnie_i; 1465 1466 wpa_hexdump(MSG_DEBUG, "TDLS: RSN IE for Discovery Response", 1467 (u8 *) hdr, hdr->len + 2); 1468 skip_rsn_ies: 1469 buf_len = 0; 1470 if (wpa_tdls_get_privacy(sm)) { 1471 /* Peer RSN IE, Lifetime */ 1472 buf_len += peer->rsnie_i_len + 1473 sizeof(struct wpa_tdls_timeoutie); 1474 } 1475 rbuf = os_zalloc(buf_len + 1); 1476 if (rbuf == NULL) { 1477 wpa_tdls_peer_free(sm, peer); 1478 return -1; 1479 } 1480 pos = rbuf; 1481 1482 if (!wpa_tdls_get_privacy(sm)) 1483 goto skip_ies; 1484 /* Initiator RSN IE */ 1485 pos = wpa_add_ie(pos, peer->rsnie_i, peer->rsnie_i_len); 1486 /* Lifetime */ 1487 peer->lifetime = TPK_LIFETIME; 1488 pos = wpa_add_tdls_timeoutie(pos, (u8 *) &timeoutie, 1489 sizeof(timeoutie), peer->lifetime); 1490 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime %u seconds", peer->lifetime); 1491 skip_ies: 1492 status = wpa_tdls_tpk_send(sm, peer->addr, WLAN_TDLS_DISCOVERY_RESPONSE, 1493 dialog_token, 0, 0, 0, rbuf, pos - rbuf); 1494 os_free(rbuf); 1495 1496 return status; 1497 } 1498 1499 1500 static int 1501 wpa_tdls_process_discovery_request(struct wpa_sm *sm, const u8 *addr, 1502 const u8 *buf, size_t len) 1503 { 1504 struct wpa_eapol_ie_parse kde; 1505 const struct wpa_tdls_lnkid *lnkid; 1506 struct wpa_tdls_peer *peer; 1507 size_t min_req_len = sizeof(struct wpa_tdls_frame) + 1508 1 /* dialog token */ + sizeof(struct wpa_tdls_lnkid); 1509 u8 dialog_token; 1510 1511 wpa_printf(MSG_DEBUG, "TDLS: Discovery Request from " MACSTR, 1512 MAC2STR(addr)); 1513 1514 if (len < min_req_len) { 1515 wpa_printf(MSG_DEBUG, "TDLS Discovery Request is too short: " 1516 "%d", (int) len); 1517 return -1; 1518 } 1519 1520 dialog_token = buf[sizeof(struct wpa_tdls_frame)]; 1521 1522 /* 1523 * Some APs will tack on a weird IE to the end of a TDLS 1524 * discovery request packet. This needn't fail the response, 1525 * since the required IE are verified separately. 1526 */ 1527 if (wpa_supplicant_parse_ies(buf + sizeof(struct wpa_tdls_frame) + 1, 1528 len - (sizeof(struct wpa_tdls_frame) + 1), 1529 &kde) < 0) { 1530 wpa_printf(MSG_DEBUG, 1531 "TDLS: Failed to parse IEs in Discovery Request - ignore as an interop workaround"); 1532 } 1533 1534 if (!kde.lnkid) { 1535 wpa_printf(MSG_DEBUG, "TDLS: Link ID not found in Discovery " 1536 "Request"); 1537 return -1; 1538 } 1539 1540 lnkid = (const struct wpa_tdls_lnkid *) kde.lnkid; 1541 1542 if (os_memcmp(sm->bssid, lnkid->bssid, ETH_ALEN) != 0) { 1543 wpa_printf(MSG_DEBUG, "TDLS: Discovery Request from different " 1544 " BSS " MACSTR, MAC2STR(lnkid->bssid)); 1545 return -1; 1546 } 1547 1548 peer = wpa_tdls_add_peer(sm, addr, NULL); 1549 if (peer == NULL) 1550 return -1; 1551 1552 return wpa_tdls_send_discovery_response(sm, peer, dialog_token); 1553 } 1554 1555 1556 int wpa_tdls_send_discovery_request(struct wpa_sm *sm, const u8 *addr) 1557 { 1558 if (sm->tdls_disabled || !sm->tdls_supported) 1559 return -1; 1560 1561 wpa_printf(MSG_DEBUG, "TDLS: Sending Discovery Request to peer " 1562 MACSTR, MAC2STR(addr)); 1563 return wpa_tdls_tpk_send(sm, addr, WLAN_TDLS_DISCOVERY_REQUEST, 1564 1, 0, 0, 1, NULL, 0); 1565 } 1566 1567 1568 static int copy_supp_rates(const struct wpa_eapol_ie_parse *kde, 1569 struct wpa_tdls_peer *peer) 1570 { 1571 if (!kde->supp_rates) { 1572 wpa_printf(MSG_DEBUG, "TDLS: No supported rates received"); 1573 return -1; 1574 } 1575 peer->supp_rates_len = merge_byte_arrays( 1576 peer->supp_rates, sizeof(peer->supp_rates), 1577 kde->supp_rates + 2, kde->supp_rates_len - 2, 1578 kde->ext_supp_rates ? kde->ext_supp_rates + 2 : NULL, 1579 kde->ext_supp_rates_len - 2); 1580 return 0; 1581 } 1582 1583 1584 static int copy_peer_ht_capab(const struct wpa_eapol_ie_parse *kde, 1585 struct wpa_tdls_peer *peer) 1586 { 1587 if (!kde->ht_capabilities) { 1588 wpa_printf(MSG_DEBUG, "TDLS: No supported ht capabilities " 1589 "received"); 1590 return 0; 1591 } 1592 1593 if (!peer->ht_capabilities) { 1594 peer->ht_capabilities = 1595 os_zalloc(sizeof(struct ieee80211_ht_capabilities)); 1596 if (peer->ht_capabilities == NULL) 1597 return -1; 1598 } 1599 1600 os_memcpy(peer->ht_capabilities, kde->ht_capabilities, 1601 sizeof(struct ieee80211_ht_capabilities)); 1602 wpa_hexdump(MSG_DEBUG, "TDLS: Peer HT capabilities", 1603 (u8 *) peer->ht_capabilities, 1604 sizeof(struct ieee80211_ht_capabilities)); 1605 1606 return 0; 1607 } 1608 1609 1610 static int copy_peer_vht_capab(const struct wpa_eapol_ie_parse *kde, 1611 struct wpa_tdls_peer *peer) 1612 { 1613 if (!kde->vht_capabilities) { 1614 wpa_printf(MSG_DEBUG, "TDLS: No supported vht capabilities " 1615 "received"); 1616 return 0; 1617 } 1618 1619 if (!peer->vht_capabilities) { 1620 peer->vht_capabilities = 1621 os_zalloc(sizeof(struct ieee80211_vht_capabilities)); 1622 if (peer->vht_capabilities == NULL) 1623 return -1; 1624 } 1625 1626 os_memcpy(peer->vht_capabilities, kde->vht_capabilities, 1627 sizeof(struct ieee80211_vht_capabilities)); 1628 wpa_hexdump(MSG_DEBUG, "TDLS: Peer VHT capabilities", 1629 (u8 *) peer->vht_capabilities, 1630 sizeof(struct ieee80211_vht_capabilities)); 1631 1632 return 0; 1633 } 1634 1635 1636 static int copy_peer_ext_capab(const struct wpa_eapol_ie_parse *kde, 1637 struct wpa_tdls_peer *peer) 1638 { 1639 if (!kde->ext_capab) { 1640 wpa_printf(MSG_DEBUG, "TDLS: No extended capabilities " 1641 "received"); 1642 return 0; 1643 } 1644 1645 if (!peer->ext_capab || peer->ext_capab_len < kde->ext_capab_len - 2) { 1646 /* Need to allocate buffer to fit the new information */ 1647 os_free(peer->ext_capab); 1648 peer->ext_capab = os_zalloc(kde->ext_capab_len - 2); 1649 if (peer->ext_capab == NULL) 1650 return -1; 1651 } 1652 1653 peer->ext_capab_len = kde->ext_capab_len - 2; 1654 os_memcpy(peer->ext_capab, kde->ext_capab + 2, peer->ext_capab_len); 1655 1656 return 0; 1657 } 1658 1659 1660 static int copy_peer_wmm_capab(const struct wpa_eapol_ie_parse *kde, 1661 struct wpa_tdls_peer *peer) 1662 { 1663 struct wmm_information_element *wmm; 1664 1665 if (!kde->wmm) { 1666 wpa_printf(MSG_DEBUG, "TDLS: No supported WMM capabilities received"); 1667 return 0; 1668 } 1669 1670 if (kde->wmm_len < sizeof(struct wmm_information_element)) { 1671 wpa_printf(MSG_DEBUG, "TDLS: Invalid supported WMM capabilities received"); 1672 return -1; 1673 } 1674 1675 wmm = (struct wmm_information_element *) kde->wmm; 1676 peer->qos_info = wmm->qos_info; 1677 1678 peer->wmm_capable = 1; 1679 1680 wpa_printf(MSG_DEBUG, "TDLS: Peer WMM QOS Info 0x%x", peer->qos_info); 1681 return 0; 1682 } 1683 1684 1685 static int copy_peer_supp_channels(const struct wpa_eapol_ie_parse *kde, 1686 struct wpa_tdls_peer *peer) 1687 { 1688 if (!kde->supp_channels) { 1689 wpa_printf(MSG_DEBUG, "TDLS: No supported channels received"); 1690 return 0; 1691 } 1692 1693 if (!peer->supp_channels || 1694 peer->supp_channels_len < kde->supp_channels_len) { 1695 os_free(peer->supp_channels); 1696 peer->supp_channels = os_zalloc(kde->supp_channels_len); 1697 if (peer->supp_channels == NULL) 1698 return -1; 1699 } 1700 1701 peer->supp_channels_len = kde->supp_channels_len; 1702 1703 os_memcpy(peer->supp_channels, kde->supp_channels, 1704 peer->supp_channels_len); 1705 wpa_hexdump(MSG_DEBUG, "TDLS: Peer Supported Channels", 1706 (u8 *) peer->supp_channels, peer->supp_channels_len); 1707 return 0; 1708 } 1709 1710 1711 static int copy_peer_supp_oper_classes(const struct wpa_eapol_ie_parse *kde, 1712 struct wpa_tdls_peer *peer) 1713 { 1714 if (!kde->supp_oper_classes) { 1715 wpa_printf(MSG_DEBUG, "TDLS: No supported operating classes received"); 1716 return 0; 1717 } 1718 1719 if (!peer->supp_oper_classes || 1720 peer->supp_oper_classes_len < kde->supp_oper_classes_len) { 1721 os_free(peer->supp_oper_classes); 1722 peer->supp_oper_classes = os_zalloc(kde->supp_oper_classes_len); 1723 if (peer->supp_oper_classes == NULL) 1724 return -1; 1725 } 1726 1727 peer->supp_oper_classes_len = kde->supp_oper_classes_len; 1728 os_memcpy(peer->supp_oper_classes, kde->supp_oper_classes, 1729 peer->supp_oper_classes_len); 1730 wpa_hexdump(MSG_DEBUG, "TDLS: Peer Supported Operating Classes", 1731 (u8 *) peer->supp_oper_classes, 1732 peer->supp_oper_classes_len); 1733 return 0; 1734 } 1735 1736 1737 static int wpa_tdls_addset_peer(struct wpa_sm *sm, struct wpa_tdls_peer *peer, 1738 int add) 1739 { 1740 return wpa_sm_tdls_peer_addset(sm, peer->addr, add, peer->aid, 1741 peer->capability, 1742 peer->supp_rates, peer->supp_rates_len, 1743 peer->ht_capabilities, 1744 peer->vht_capabilities, 1745 peer->qos_info, peer->wmm_capable, 1746 peer->ext_capab, peer->ext_capab_len, 1747 peer->supp_channels, 1748 peer->supp_channels_len, 1749 peer->supp_oper_classes, 1750 peer->supp_oper_classes_len); 1751 } 1752 1753 1754 static int wpa_tdls_process_tpk_m1(struct wpa_sm *sm, const u8 *src_addr, 1755 const u8 *buf, size_t len) 1756 { 1757 struct wpa_tdls_peer *peer; 1758 struct wpa_eapol_ie_parse kde; 1759 struct wpa_ie_data ie; 1760 int cipher; 1761 const u8 *cpos; 1762 struct wpa_tdls_ftie *ftie = NULL; 1763 struct wpa_tdls_timeoutie *timeoutie; 1764 struct wpa_tdls_lnkid *lnkid; 1765 u32 lifetime = 0; 1766 #if 0 1767 struct rsn_ie_hdr *hdr; 1768 u8 *pos; 1769 u16 rsn_capab; 1770 u16 rsn_ver; 1771 #endif 1772 u8 dtoken; 1773 u16 ielen; 1774 u16 status = WLAN_STATUS_UNSPECIFIED_FAILURE; 1775 int tdls_prohibited = sm->tdls_prohibited; 1776 int existing_peer = 0; 1777 1778 if (len < 3 + 3) 1779 return -1; 1780 1781 cpos = buf; 1782 cpos += 1 /* pkt_type */ + 1 /* Category */ + 1 /* Action */; 1783 1784 /* driver had already verified the frame format */ 1785 dtoken = *cpos++; /* dialog token */ 1786 1787 wpa_printf(MSG_INFO, "TDLS: Dialog Token in TPK M1 %d", dtoken); 1788 1789 peer = wpa_tdls_add_peer(sm, src_addr, &existing_peer); 1790 if (peer == NULL) 1791 goto error; 1792 1793 /* If found, use existing entry instead of adding a new one; 1794 * how to handle the case where both ends initiate at the 1795 * same time? */ 1796 if (existing_peer) { 1797 if (peer->tpk_success) { 1798 wpa_printf(MSG_DEBUG, "TDLS: TDLS Setup Request while " 1799 "direct link is enabled - tear down the " 1800 "old link first"); 1801 wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr); 1802 wpa_tdls_peer_clear(sm, peer); 1803 } else if (peer->initiator) { 1804 /* 1805 * An entry is already present, so check if we already 1806 * sent a TDLS Setup Request. If so, compare MAC 1807 * addresses and let the STA with the lower MAC address 1808 * continue as the initiator. The other negotiation is 1809 * terminated. 1810 */ 1811 if (os_memcmp(sm->own_addr, src_addr, ETH_ALEN) < 0) { 1812 wpa_printf(MSG_DEBUG, "TDLS: Discard request " 1813 "from peer with higher address " 1814 MACSTR, MAC2STR(src_addr)); 1815 return -1; 1816 } else { 1817 wpa_printf(MSG_DEBUG, "TDLS: Accept request " 1818 "from peer with lower address " 1819 MACSTR " (terminate previously " 1820 "initiated negotiation", 1821 MAC2STR(src_addr)); 1822 wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, 1823 peer->addr); 1824 wpa_tdls_peer_clear(sm, peer); 1825 } 1826 } 1827 } 1828 1829 /* capability information */ 1830 peer->capability = WPA_GET_LE16(cpos); 1831 cpos += 2; 1832 1833 ielen = len - (cpos - buf); /* start of IE in buf */ 1834 1835 /* 1836 * Don't reject the message if failing to parse IEs. The IEs we need are 1837 * explicitly checked below. Some APs may add arbitrary padding to the 1838 * end of short TDLS frames and that would look like invalid IEs. 1839 */ 1840 if (wpa_supplicant_parse_ies(cpos, ielen, &kde) < 0) 1841 wpa_printf(MSG_DEBUG, 1842 "TDLS: Failed to parse IEs in TPK M1 - ignore as an interop workaround"); 1843 1844 if (kde.lnkid == NULL || kde.lnkid_len < 3 * ETH_ALEN) { 1845 wpa_printf(MSG_INFO, "TDLS: No valid Link Identifier IE in " 1846 "TPK M1"); 1847 goto error; 1848 } 1849 wpa_hexdump(MSG_DEBUG, "TDLS: Link ID Received from TPK M1", 1850 kde.lnkid, kde.lnkid_len); 1851 lnkid = (struct wpa_tdls_lnkid *) kde.lnkid; 1852 if (os_memcmp(sm->bssid, lnkid->bssid, ETH_ALEN) != 0) { 1853 wpa_printf(MSG_INFO, "TDLS: TPK M1 from diff BSS"); 1854 status = WLAN_STATUS_REQUEST_DECLINED; 1855 goto error; 1856 } 1857 1858 wpa_printf(MSG_DEBUG, "TDLS: TPK M1 - TPK initiator " MACSTR, 1859 MAC2STR(src_addr)); 1860 1861 if (copy_supp_rates(&kde, peer) < 0) 1862 goto error; 1863 1864 if (copy_peer_ht_capab(&kde, peer) < 0) 1865 goto error; 1866 1867 if (copy_peer_vht_capab(&kde, peer) < 0) 1868 goto error; 1869 1870 if (copy_peer_ext_capab(&kde, peer) < 0) 1871 goto error; 1872 1873 if (copy_peer_supp_channels(&kde, peer) < 0) 1874 goto error; 1875 1876 if (copy_peer_supp_oper_classes(&kde, peer) < 0) 1877 goto error; 1878 1879 peer->qos_info = kde.qosinfo; 1880 1881 /* Overwrite with the qos_info obtained in WMM IE */ 1882 if (copy_peer_wmm_capab(&kde, peer) < 0) 1883 goto error; 1884 1885 peer->aid = kde.aid; 1886 1887 #ifdef CONFIG_TDLS_TESTING 1888 if (tdls_testing & TDLS_TESTING_CONCURRENT_INIT) { 1889 peer = wpa_tdls_add_peer(sm, src_addr, NULL); 1890 if (peer == NULL) 1891 goto error; 1892 wpa_printf(MSG_DEBUG, "TDLS: Testing concurrent initiation of " 1893 "TDLS setup - send own request"); 1894 peer->initiator = 1; 1895 wpa_sm_tdls_peer_addset(sm, peer->addr, 1, 0, 0, NULL, 0, NULL, 1896 NULL, 0, 0, NULL, 0, NULL, 0, NULL, 0); 1897 wpa_tdls_send_tpk_m1(sm, peer); 1898 } 1899 1900 if ((tdls_testing & TDLS_TESTING_IGNORE_AP_PROHIBIT) && 1901 tdls_prohibited) { 1902 wpa_printf(MSG_DEBUG, "TDLS: Testing - ignore AP prohibition " 1903 "on TDLS"); 1904 tdls_prohibited = 0; 1905 } 1906 #endif /* CONFIG_TDLS_TESTING */ 1907 1908 if (tdls_prohibited) { 1909 wpa_printf(MSG_INFO, "TDLS: TDLS prohibited in this BSS"); 1910 status = WLAN_STATUS_REQUEST_DECLINED; 1911 goto error; 1912 } 1913 1914 if (!wpa_tdls_get_privacy(sm)) { 1915 if (kde.rsn_ie) { 1916 wpa_printf(MSG_INFO, "TDLS: RSN IE in TPK M1 while " 1917 "security is disabled"); 1918 status = WLAN_STATUS_SECURITY_DISABLED; 1919 goto error; 1920 } 1921 goto skip_rsn; 1922 } 1923 1924 if (kde.ftie == NULL || kde.ftie_len < sizeof(*ftie) || 1925 kde.rsn_ie == NULL) { 1926 wpa_printf(MSG_INFO, "TDLS: No FTIE or RSN IE in TPK M1"); 1927 status = WLAN_STATUS_INVALID_PARAMETERS; 1928 goto error; 1929 } 1930 1931 if (kde.rsn_ie_len > TDLS_MAX_IE_LEN) { 1932 wpa_printf(MSG_INFO, "TDLS: Too long Initiator RSN IE in " 1933 "TPK M1"); 1934 status = WLAN_STATUS_INVALID_RSNIE; 1935 goto error; 1936 } 1937 1938 if (wpa_parse_wpa_ie_rsn(kde.rsn_ie, kde.rsn_ie_len, &ie) < 0) { 1939 wpa_printf(MSG_INFO, "TDLS: Failed to parse RSN IE in TPK M1"); 1940 status = WLAN_STATUS_INVALID_RSNIE; 1941 goto error; 1942 } 1943 1944 cipher = ie.pairwise_cipher; 1945 if (cipher & WPA_CIPHER_CCMP) { 1946 wpa_printf(MSG_DEBUG, "TDLS: Using CCMP for direct link"); 1947 cipher = WPA_CIPHER_CCMP; 1948 } else { 1949 wpa_printf(MSG_INFO, "TDLS: No acceptable cipher in TPK M1"); 1950 status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; 1951 goto error; 1952 } 1953 1954 if ((ie.capabilities & 1955 (WPA_CAPABILITY_NO_PAIRWISE | WPA_CAPABILITY_PEERKEY_ENABLED)) != 1956 WPA_CAPABILITY_PEERKEY_ENABLED) { 1957 wpa_printf(MSG_INFO, "TDLS: Invalid RSN Capabilities in " 1958 "TPK M1"); 1959 status = WLAN_STATUS_INVALID_RSN_IE_CAPAB; 1960 goto error; 1961 } 1962 1963 /* Lifetime */ 1964 if (kde.key_lifetime == NULL) { 1965 wpa_printf(MSG_INFO, "TDLS: No Key Lifetime IE in TPK M1"); 1966 status = WLAN_STATUS_UNACCEPTABLE_LIFETIME; 1967 goto error; 1968 } 1969 timeoutie = (struct wpa_tdls_timeoutie *) kde.key_lifetime; 1970 lifetime = WPA_GET_LE32(timeoutie->value); 1971 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime %u seconds", lifetime); 1972 if (lifetime < 300) { 1973 wpa_printf(MSG_INFO, "TDLS: Too short TPK lifetime"); 1974 status = WLAN_STATUS_UNACCEPTABLE_LIFETIME; 1975 goto error; 1976 } 1977 1978 skip_rsn: 1979 #ifdef CONFIG_TDLS_TESTING 1980 if (tdls_testing & TDLS_TESTING_CONCURRENT_INIT) { 1981 if (os_memcmp(sm->own_addr, peer->addr, ETH_ALEN) < 0) { 1982 /* 1983 * The request frame from us is going to win, so do not 1984 * replace information based on this request frame from 1985 * the peer. 1986 */ 1987 goto skip_rsn_check; 1988 } 1989 } 1990 #endif /* CONFIG_TDLS_TESTING */ 1991 1992 peer->initiator = 0; /* Need to check */ 1993 peer->dtoken = dtoken; 1994 1995 if (!wpa_tdls_get_privacy(sm)) { 1996 peer->rsnie_i_len = 0; 1997 peer->rsnie_p_len = 0; 1998 peer->cipher = WPA_CIPHER_NONE; 1999 goto skip_rsn_check; 2000 } 2001 2002 ftie = (struct wpa_tdls_ftie *) kde.ftie; 2003 os_memcpy(peer->rsnie_i, kde.rsn_ie, kde.rsn_ie_len); 2004 peer->rsnie_i_len = kde.rsn_ie_len; 2005 peer->cipher = cipher; 2006 2007 if (os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) != 0) { 2008 /* 2009 * There is no point in updating the RNonce for every obtained 2010 * TPK M1 frame (e.g., retransmission due to timeout) with the 2011 * same INonce (SNonce in FTIE). However, if the TPK M1 is 2012 * retransmitted with a different INonce, update the RNonce 2013 * since this is for a new TDLS session. 2014 */ 2015 wpa_printf(MSG_DEBUG, 2016 "TDLS: New TPK M1 INonce - generate new RNonce"); 2017 os_memcpy(peer->inonce, ftie->Snonce, WPA_NONCE_LEN); 2018 if (os_get_random(peer->rnonce, WPA_NONCE_LEN)) { 2019 wpa_msg(sm->ctx->ctx, MSG_WARNING, 2020 "TDLS: Failed to get random data for responder nonce"); 2021 goto error; 2022 } 2023 } 2024 2025 #if 0 2026 /* get version info from RSNIE received from Peer */ 2027 hdr = (struct rsn_ie_hdr *) kde.rsn_ie; 2028 rsn_ver = WPA_GET_LE16(hdr->version); 2029 2030 /* use min(peer's version, out version) */ 2031 if (rsn_ver > RSN_VERSION) 2032 rsn_ver = RSN_VERSION; 2033 2034 hdr = (struct rsn_ie_hdr *) peer->rsnie_p; 2035 2036 hdr->elem_id = WLAN_EID_RSN; 2037 WPA_PUT_LE16(hdr->version, rsn_ver); 2038 pos = (u8 *) (hdr + 1); 2039 2040 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED); 2041 pos += RSN_SELECTOR_LEN; 2042 /* Include only the selected cipher in pairwise cipher suite */ 2043 WPA_PUT_LE16(pos, 1); 2044 pos += 2; 2045 if (cipher == WPA_CIPHER_CCMP) 2046 RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP); 2047 pos += RSN_SELECTOR_LEN; 2048 2049 WPA_PUT_LE16(pos, 1); 2050 pos += 2; 2051 RSN_SELECTOR_PUT(pos, RSN_AUTH_KEY_MGMT_TPK_HANDSHAKE); 2052 pos += RSN_SELECTOR_LEN; 2053 2054 rsn_capab = WPA_CAPABILITY_PEERKEY_ENABLED; 2055 rsn_capab |= RSN_NUM_REPLAY_COUNTERS_16 << 2; 2056 WPA_PUT_LE16(pos, rsn_capab); 2057 pos += 2; 2058 2059 hdr->len = (pos - peer->rsnie_p) - 2; 2060 peer->rsnie_p_len = pos - peer->rsnie_p; 2061 #endif 2062 2063 /* temp fix: validation of RSNIE later */ 2064 os_memcpy(peer->rsnie_p, peer->rsnie_i, peer->rsnie_i_len); 2065 peer->rsnie_p_len = peer->rsnie_i_len; 2066 2067 wpa_hexdump(MSG_DEBUG, "TDLS: RSN IE for TPK handshake", 2068 peer->rsnie_p, peer->rsnie_p_len); 2069 2070 peer->lifetime = lifetime; 2071 2072 wpa_tdls_generate_tpk(peer, sm->own_addr, sm->bssid); 2073 2074 skip_rsn_check: 2075 #ifdef CONFIG_TDLS_TESTING 2076 if (tdls_testing & TDLS_TESTING_CONCURRENT_INIT) 2077 goto skip_add_peer; 2078 #endif /* CONFIG_TDLS_TESTING */ 2079 2080 /* add supported rates, capabilities, and qos_info to the TDLS peer */ 2081 if (wpa_tdls_addset_peer(sm, peer, 1) < 0) 2082 goto error; 2083 2084 #ifdef CONFIG_TDLS_TESTING 2085 skip_add_peer: 2086 #endif /* CONFIG_TDLS_TESTING */ 2087 peer->tpk_in_progress = 1; 2088 2089 wpa_printf(MSG_DEBUG, "TDLS: Sending TDLS Setup Response / TPK M2"); 2090 if (wpa_tdls_send_tpk_m2(sm, src_addr, dtoken, lnkid, peer) < 0) { 2091 wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr); 2092 goto error; 2093 } 2094 2095 return 0; 2096 2097 error: 2098 wpa_tdls_send_error(sm, src_addr, WLAN_TDLS_SETUP_RESPONSE, dtoken, 0, 2099 status); 2100 if (peer) 2101 wpa_tdls_peer_free(sm, peer); 2102 return -1; 2103 } 2104 2105 2106 static int wpa_tdls_enable_link(struct wpa_sm *sm, struct wpa_tdls_peer *peer) 2107 { 2108 peer->tpk_success = 1; 2109 peer->tpk_in_progress = 0; 2110 eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer); 2111 if (wpa_tdls_get_privacy(sm)) { 2112 u32 lifetime = peer->lifetime; 2113 /* 2114 * Start the initiator process a bit earlier to avoid race 2115 * condition with the responder sending teardown request. 2116 */ 2117 if (lifetime > 3 && peer->initiator) 2118 lifetime -= 3; 2119 eloop_register_timeout(lifetime, 0, wpa_tdls_tpk_timeout, 2120 sm, peer); 2121 #ifdef CONFIG_TDLS_TESTING 2122 if (tdls_testing & TDLS_TESTING_NO_TPK_EXPIRATION) { 2123 wpa_printf(MSG_DEBUG, "TDLS: Testing - disable TPK " 2124 "expiration"); 2125 eloop_cancel_timeout(wpa_tdls_tpk_timeout, sm, peer); 2126 } 2127 #endif /* CONFIG_TDLS_TESTING */ 2128 } 2129 2130 if (peer->reconfig_key && wpa_tdls_set_key(sm, peer) < 0) { 2131 wpa_printf(MSG_INFO, "TDLS: Could not configure key to the " 2132 "driver"); 2133 return -1; 2134 } 2135 peer->reconfig_key = 0; 2136 2137 return wpa_sm_tdls_oper(sm, TDLS_ENABLE_LINK, peer->addr); 2138 } 2139 2140 2141 static int wpa_tdls_process_tpk_m2(struct wpa_sm *sm, const u8 *src_addr, 2142 const u8 *buf, size_t len) 2143 { 2144 struct wpa_tdls_peer *peer; 2145 struct wpa_eapol_ie_parse kde; 2146 struct wpa_ie_data ie; 2147 int cipher; 2148 struct wpa_tdls_ftie *ftie; 2149 struct wpa_tdls_timeoutie *timeoutie; 2150 struct wpa_tdls_lnkid *lnkid; 2151 u32 lifetime; 2152 u8 dtoken; 2153 int ielen; 2154 u16 status; 2155 const u8 *pos; 2156 int ret = 0; 2157 2158 wpa_printf(MSG_DEBUG, "TDLS: Received TDLS Setup Response / TPK M2 " 2159 "(Peer " MACSTR ")", MAC2STR(src_addr)); 2160 for (peer = sm->tdls; peer; peer = peer->next) { 2161 if (os_memcmp(peer->addr, src_addr, ETH_ALEN) == 0) 2162 break; 2163 } 2164 if (peer == NULL) { 2165 wpa_printf(MSG_INFO, "TDLS: No matching peer found for " 2166 "TPK M2: " MACSTR, MAC2STR(src_addr)); 2167 return -1; 2168 } 2169 if (!peer->initiator) { 2170 /* 2171 * This may happen if both devices try to initiate TDLS at the 2172 * same time and we accept the TPK M1 from the peer in 2173 * wpa_tdls_process_tpk_m1() and clear our previous state. 2174 */ 2175 wpa_printf(MSG_INFO, "TDLS: We were not the initiator, so " 2176 "ignore TPK M2 from " MACSTR, MAC2STR(src_addr)); 2177 return -1; 2178 } 2179 2180 if (peer->tpk_success) { 2181 wpa_printf(MSG_INFO, "TDLS: Ignore incoming TPK M2 retry, from " 2182 MACSTR " as TPK M3 was already sent", 2183 MAC2STR(src_addr)); 2184 return 0; 2185 } 2186 2187 wpa_tdls_tpk_retry_timeout_cancel(sm, peer, WLAN_TDLS_SETUP_REQUEST); 2188 2189 if (len < 3 + 2 + 1) { 2190 wpa_tdls_disable_peer_link(sm, peer); 2191 return -1; 2192 } 2193 2194 pos = buf; 2195 pos += 1 /* pkt_type */ + 1 /* Category */ + 1 /* Action */; 2196 status = WPA_GET_LE16(pos); 2197 pos += 2 /* status code */; 2198 2199 if (status != WLAN_STATUS_SUCCESS) { 2200 wpa_printf(MSG_INFO, "TDLS: Status code in TPK M2: %u", 2201 status); 2202 wpa_tdls_disable_peer_link(sm, peer); 2203 return -1; 2204 } 2205 2206 status = WLAN_STATUS_UNSPECIFIED_FAILURE; 2207 2208 /* TODO: need to verify dialog token matches here or in kernel */ 2209 dtoken = *pos++; /* dialog token */ 2210 2211 wpa_printf(MSG_DEBUG, "TDLS: Dialog Token in TPK M2 %d", dtoken); 2212 2213 if (len < 3 + 2 + 1 + 2) { 2214 wpa_tdls_disable_peer_link(sm, peer); 2215 return -1; 2216 } 2217 2218 /* capability information */ 2219 peer->capability = WPA_GET_LE16(pos); 2220 pos += 2; 2221 2222 ielen = len - (pos - buf); /* start of IE in buf */ 2223 2224 /* 2225 * Don't reject the message if failing to parse IEs. The IEs we need are 2226 * explicitly checked below. Some APs may add arbitrary padding to the 2227 * end of short TDLS frames and that would look like invalid IEs. 2228 */ 2229 if (wpa_supplicant_parse_ies(pos, ielen, &kde) < 0) 2230 wpa_printf(MSG_DEBUG, 2231 "TDLS: Failed to parse IEs in TPK M2 - ignore as an interop workaround"); 2232 2233 #ifdef CONFIG_TDLS_TESTING 2234 if (tdls_testing & TDLS_TESTING_DECLINE_RESP) { 2235 wpa_printf(MSG_DEBUG, "TDLS: Testing - decline response"); 2236 status = WLAN_STATUS_REQUEST_DECLINED; 2237 goto error; 2238 } 2239 #endif /* CONFIG_TDLS_TESTING */ 2240 2241 if (kde.lnkid == NULL || kde.lnkid_len < 3 * ETH_ALEN) { 2242 wpa_printf(MSG_INFO, "TDLS: No valid Link Identifier IE in " 2243 "TPK M2"); 2244 goto error; 2245 } 2246 wpa_hexdump(MSG_DEBUG, "TDLS: Link ID Received from TPK M2", 2247 kde.lnkid, kde.lnkid_len); 2248 lnkid = (struct wpa_tdls_lnkid *) kde.lnkid; 2249 2250 if (os_memcmp(sm->bssid, lnkid->bssid, ETH_ALEN) != 0) { 2251 wpa_printf(MSG_INFO, "TDLS: TPK M2 from different BSS"); 2252 status = WLAN_STATUS_NOT_IN_SAME_BSS; 2253 goto error; 2254 } 2255 2256 if (copy_supp_rates(&kde, peer) < 0) 2257 goto error; 2258 2259 if (copy_peer_ht_capab(&kde, peer) < 0) 2260 goto error; 2261 2262 if (copy_peer_vht_capab(&kde, peer) < 0) 2263 goto error; 2264 2265 if (copy_peer_ext_capab(&kde, peer) < 0) 2266 goto error; 2267 2268 if (copy_peer_supp_channels(&kde, peer) < 0) 2269 goto error; 2270 2271 if (copy_peer_supp_oper_classes(&kde, peer) < 0) 2272 goto error; 2273 2274 peer->qos_info = kde.qosinfo; 2275 2276 /* Overwrite with the qos_info obtained in WMM IE */ 2277 if (copy_peer_wmm_capab(&kde, peer) < 0) 2278 goto error; 2279 2280 peer->aid = kde.aid; 2281 2282 if (!wpa_tdls_get_privacy(sm)) { 2283 peer->rsnie_p_len = 0; 2284 peer->cipher = WPA_CIPHER_NONE; 2285 goto skip_rsn; 2286 } 2287 2288 if (kde.ftie == NULL || kde.ftie_len < sizeof(*ftie) || 2289 kde.rsn_ie == NULL) { 2290 wpa_printf(MSG_INFO, "TDLS: No FTIE or RSN IE in TPK M2"); 2291 status = WLAN_STATUS_INVALID_PARAMETERS; 2292 goto error; 2293 } 2294 wpa_hexdump(MSG_DEBUG, "TDLS: RSN IE Received from TPK M2", 2295 kde.rsn_ie, kde.rsn_ie_len); 2296 2297 if (kde.rsn_ie_len > TDLS_MAX_IE_LEN) { 2298 wpa_printf(MSG_INFO, 2299 "TDLS: Too long Responder RSN IE in TPK M2"); 2300 status = WLAN_STATUS_INVALID_RSNIE; 2301 goto error; 2302 } 2303 2304 /* 2305 * FIX: bitwise comparison of RSN IE is not the correct way of 2306 * validation this. It can be different, but certain fields must 2307 * match. Since we list only a single pairwise cipher in TPK M1, the 2308 * memcmp is likely to work in most cases, though. 2309 */ 2310 if (kde.rsn_ie_len != peer->rsnie_i_len || 2311 os_memcmp(peer->rsnie_i, kde.rsn_ie, peer->rsnie_i_len) != 0) { 2312 wpa_printf(MSG_INFO, "TDLS: RSN IE in TPK M2 does " 2313 "not match with RSN IE used in TPK M1"); 2314 wpa_hexdump(MSG_DEBUG, "TDLS: RSN IE Sent in TPK M1", 2315 peer->rsnie_i, peer->rsnie_i_len); 2316 wpa_hexdump(MSG_DEBUG, "TDLS: RSN IE Received from TPK M2", 2317 kde.rsn_ie, kde.rsn_ie_len); 2318 status = WLAN_STATUS_INVALID_RSNIE; 2319 goto error; 2320 } 2321 2322 if (wpa_parse_wpa_ie_rsn(kde.rsn_ie, kde.rsn_ie_len, &ie) < 0) { 2323 wpa_printf(MSG_INFO, "TDLS: Failed to parse RSN IE in TPK M2"); 2324 status = WLAN_STATUS_INVALID_RSNIE; 2325 goto error; 2326 } 2327 2328 cipher = ie.pairwise_cipher; 2329 if (cipher == WPA_CIPHER_CCMP) { 2330 wpa_printf(MSG_DEBUG, "TDLS: Using CCMP for direct link"); 2331 cipher = WPA_CIPHER_CCMP; 2332 } else { 2333 wpa_printf(MSG_INFO, "TDLS: No acceptable cipher in TPK M2"); 2334 status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; 2335 goto error; 2336 } 2337 2338 wpa_hexdump(MSG_DEBUG, "TDLS: FTIE Received from TPK M2", 2339 kde.ftie, sizeof(*ftie)); 2340 ftie = (struct wpa_tdls_ftie *) kde.ftie; 2341 2342 if (os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) != 0) { 2343 wpa_printf(MSG_INFO, "TDLS: FTIE SNonce in TPK M2 does " 2344 "not match with FTIE SNonce used in TPK M1"); 2345 /* Silently discard the frame */ 2346 return -1; 2347 } 2348 2349 /* Responder Nonce and RSN IE */ 2350 os_memcpy(peer->rnonce, ftie->Anonce, WPA_NONCE_LEN); 2351 os_memcpy(peer->rsnie_p, kde.rsn_ie, kde.rsn_ie_len); 2352 peer->rsnie_p_len = kde.rsn_ie_len; 2353 peer->cipher = cipher; 2354 2355 /* Lifetime */ 2356 if (kde.key_lifetime == NULL) { 2357 wpa_printf(MSG_INFO, "TDLS: No Key Lifetime IE in TPK M2"); 2358 status = WLAN_STATUS_UNACCEPTABLE_LIFETIME; 2359 goto error; 2360 } 2361 timeoutie = (struct wpa_tdls_timeoutie *) kde.key_lifetime; 2362 lifetime = WPA_GET_LE32(timeoutie->value); 2363 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime %u seconds in TPK M2", 2364 lifetime); 2365 if (lifetime != peer->lifetime) { 2366 wpa_printf(MSG_INFO, "TDLS: Unexpected TPK lifetime %u in " 2367 "TPK M2 (expected %u)", lifetime, peer->lifetime); 2368 status = WLAN_STATUS_UNACCEPTABLE_LIFETIME; 2369 goto error; 2370 } 2371 2372 wpa_tdls_generate_tpk(peer, sm->own_addr, sm->bssid); 2373 2374 /* Process MIC check to see if TPK M2 is right */ 2375 if (wpa_supplicant_verify_tdls_mic(2, peer, (u8 *) lnkid, 2376 (u8 *) timeoutie, ftie) < 0) { 2377 /* Discard the frame */ 2378 wpa_tdls_del_key(sm, peer); 2379 wpa_tdls_disable_peer_link(sm, peer); 2380 return -1; 2381 } 2382 2383 if (wpa_tdls_set_key(sm, peer) < 0) { 2384 /* 2385 * Some drivers may not be able to config the key prior to full 2386 * STA entry having been configured. 2387 */ 2388 wpa_printf(MSG_DEBUG, "TDLS: Try to configure TPK again after " 2389 "STA entry is complete"); 2390 peer->reconfig_key = 1; 2391 } 2392 2393 skip_rsn: 2394 peer->dtoken = dtoken; 2395 2396 /* add supported rates, capabilities, and qos_info to the TDLS peer */ 2397 if (wpa_tdls_addset_peer(sm, peer, 0) < 0) 2398 goto error; 2399 2400 wpa_printf(MSG_DEBUG, "TDLS: Sending TDLS Setup Confirm / " 2401 "TPK Handshake Message 3"); 2402 if (wpa_tdls_send_tpk_m3(sm, src_addr, dtoken, lnkid, peer) < 0) 2403 goto error_no_msg; 2404 2405 if (!peer->tpk_success) { 2406 /* 2407 * Enable Link only when tpk_success is 0, signifying that this 2408 * processing of TPK M2 frame is not because of a retransmission 2409 * during TDLS setup handshake. 2410 */ 2411 ret = wpa_tdls_enable_link(sm, peer); 2412 if (ret < 0) { 2413 wpa_printf(MSG_DEBUG, "TDLS: Could not enable link"); 2414 wpa_tdls_do_teardown( 2415 sm, peer, 2416 WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 2417 } 2418 } 2419 return ret; 2420 2421 error: 2422 wpa_tdls_send_error(sm, src_addr, WLAN_TDLS_SETUP_CONFIRM, dtoken, 1, 2423 status); 2424 error_no_msg: 2425 wpa_tdls_disable_peer_link(sm, peer); 2426 return -1; 2427 } 2428 2429 2430 static int wpa_tdls_process_tpk_m3(struct wpa_sm *sm, const u8 *src_addr, 2431 const u8 *buf, size_t len) 2432 { 2433 struct wpa_tdls_peer *peer; 2434 struct wpa_eapol_ie_parse kde; 2435 struct wpa_tdls_ftie *ftie; 2436 struct wpa_tdls_timeoutie *timeoutie; 2437 struct wpa_tdls_lnkid *lnkid; 2438 int ielen; 2439 u16 status; 2440 const u8 *pos; 2441 u32 lifetime; 2442 int ret = 0; 2443 2444 wpa_printf(MSG_DEBUG, "TDLS: Received TDLS Setup Confirm / TPK M3 " 2445 "(Peer " MACSTR ")", MAC2STR(src_addr)); 2446 for (peer = sm->tdls; peer; peer = peer->next) { 2447 if (os_memcmp(peer->addr, src_addr, ETH_ALEN) == 0) 2448 break; 2449 } 2450 if (peer == NULL) { 2451 wpa_printf(MSG_INFO, "TDLS: No matching peer found for " 2452 "TPK M3: " MACSTR, MAC2STR(src_addr)); 2453 return -1; 2454 } 2455 wpa_tdls_tpk_retry_timeout_cancel(sm, peer, WLAN_TDLS_SETUP_RESPONSE); 2456 2457 if (len < 3 + 3) 2458 goto error; 2459 pos = buf; 2460 pos += 1 /* pkt_type */ + 1 /* Category */ + 1 /* Action */; 2461 2462 status = WPA_GET_LE16(pos); 2463 2464 if (status != 0) { 2465 wpa_printf(MSG_INFO, "TDLS: Status code in TPK M3: %u", 2466 status); 2467 goto error; 2468 } 2469 pos += 2 /* status code */ + 1 /* dialog token */; 2470 2471 ielen = len - (pos - buf); /* start of IE in buf */ 2472 2473 /* 2474 * Don't reject the message if failing to parse IEs. The IEs we need are 2475 * explicitly checked below. Some APs piggy-back broken IEs to the end 2476 * of a TDLS Confirm packet, which will fail the link if we don't ignore 2477 * this error. 2478 */ 2479 if (wpa_supplicant_parse_ies((const u8 *) pos, ielen, &kde) < 0) { 2480 wpa_printf(MSG_DEBUG, 2481 "TDLS: Failed to parse KDEs in TPK M3 - ignore as an interop workaround"); 2482 } 2483 2484 if (kde.lnkid == NULL || kde.lnkid_len < 3 * ETH_ALEN) { 2485 wpa_printf(MSG_INFO, "TDLS: No Link Identifier IE in TPK M3"); 2486 goto error; 2487 } 2488 wpa_hexdump(MSG_DEBUG, "TDLS: Link ID Received from TPK M3", 2489 (u8 *) kde.lnkid, kde.lnkid_len); 2490 lnkid = (struct wpa_tdls_lnkid *) kde.lnkid; 2491 2492 if (os_memcmp(sm->bssid, lnkid->bssid, ETH_ALEN) != 0) { 2493 wpa_printf(MSG_INFO, "TDLS: TPK M3 from diff BSS"); 2494 goto error; 2495 } 2496 2497 if (!wpa_tdls_get_privacy(sm)) 2498 goto skip_rsn; 2499 2500 if (kde.ftie == NULL || kde.ftie_len < sizeof(*ftie)) { 2501 wpa_printf(MSG_INFO, "TDLS: No FTIE in TPK M3"); 2502 goto error; 2503 } 2504 wpa_hexdump(MSG_DEBUG, "TDLS: FTIE Received from TPK M3", 2505 kde.ftie, sizeof(*ftie)); 2506 ftie = (struct wpa_tdls_ftie *) kde.ftie; 2507 2508 if (kde.rsn_ie == NULL) { 2509 wpa_printf(MSG_INFO, "TDLS: No RSN IE in TPK M3"); 2510 goto error; 2511 } 2512 wpa_hexdump(MSG_DEBUG, "TDLS: RSN IE Received from TPK M3", 2513 kde.rsn_ie, kde.rsn_ie_len); 2514 if (kde.rsn_ie_len != peer->rsnie_p_len || 2515 os_memcmp(kde.rsn_ie, peer->rsnie_p, peer->rsnie_p_len) != 0) { 2516 wpa_printf(MSG_INFO, "TDLS: RSN IE in TPK M3 does not match " 2517 "with the one sent in TPK M2"); 2518 goto error; 2519 } 2520 2521 if (os_memcmp(peer->rnonce, ftie->Anonce, WPA_NONCE_LEN) != 0) { 2522 wpa_printf(MSG_INFO, "TDLS: FTIE ANonce in TPK M3 does " 2523 "not match with FTIE ANonce used in TPK M2"); 2524 goto error; 2525 } 2526 2527 if (os_memcmp(peer->inonce, ftie->Snonce, WPA_NONCE_LEN) != 0) { 2528 wpa_printf(MSG_INFO, "TDLS: FTIE SNonce in TPK M3 does not " 2529 "match with FTIE SNonce used in TPK M1"); 2530 goto error; 2531 } 2532 2533 if (kde.key_lifetime == NULL) { 2534 wpa_printf(MSG_INFO, "TDLS: No Key Lifetime IE in TPK M3"); 2535 goto error; 2536 } 2537 timeoutie = (struct wpa_tdls_timeoutie *) kde.key_lifetime; 2538 wpa_hexdump(MSG_DEBUG, "TDLS: Timeout IE Received from TPK M3", 2539 (u8 *) timeoutie, sizeof(*timeoutie)); 2540 lifetime = WPA_GET_LE32(timeoutie->value); 2541 wpa_printf(MSG_DEBUG, "TDLS: TPK lifetime %u seconds in TPK M3", 2542 lifetime); 2543 if (lifetime != peer->lifetime) { 2544 wpa_printf(MSG_INFO, "TDLS: Unexpected TPK lifetime %u in " 2545 "TPK M3 (expected %u)", lifetime, peer->lifetime); 2546 goto error; 2547 } 2548 2549 if (wpa_supplicant_verify_tdls_mic(3, peer, (u8 *) lnkid, 2550 (u8 *) timeoutie, ftie) < 0) { 2551 wpa_tdls_del_key(sm, peer); 2552 goto error; 2553 } 2554 2555 if (wpa_tdls_set_key(sm, peer) < 0) { 2556 /* 2557 * Some drivers may not be able to config the key prior to full 2558 * STA entry having been configured. 2559 */ 2560 wpa_printf(MSG_DEBUG, "TDLS: Try to configure TPK again after " 2561 "STA entry is complete"); 2562 peer->reconfig_key = 1; 2563 } 2564 2565 skip_rsn: 2566 /* add supported rates, capabilities, and qos_info to the TDLS peer */ 2567 if (wpa_tdls_addset_peer(sm, peer, 0) < 0) 2568 goto error; 2569 2570 if (!peer->tpk_success) { 2571 /* 2572 * Enable Link only when tpk_success is 0, signifying that this 2573 * processing of TPK M3 frame is not because of a retransmission 2574 * during TDLS setup handshake. 2575 */ 2576 ret = wpa_tdls_enable_link(sm, peer); 2577 if (ret < 0) { 2578 wpa_printf(MSG_DEBUG, "TDLS: Could not enable link"); 2579 goto error; 2580 } 2581 } 2582 return ret; 2583 error: 2584 wpa_tdls_do_teardown(sm, peer, WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 2585 return -1; 2586 } 2587 2588 2589 static u8 * wpa_add_tdls_timeoutie(u8 *pos, u8 *ie, size_t ie_len, u32 tsecs) 2590 { 2591 struct wpa_tdls_timeoutie *lifetime = (struct wpa_tdls_timeoutie *) ie; 2592 2593 os_memset(lifetime, 0, ie_len); 2594 lifetime->ie_type = WLAN_EID_TIMEOUT_INTERVAL; 2595 lifetime->ie_len = sizeof(struct wpa_tdls_timeoutie) - 2; 2596 lifetime->interval_type = WLAN_TIMEOUT_KEY_LIFETIME; 2597 WPA_PUT_LE32(lifetime->value, tsecs); 2598 os_memcpy(pos, ie, ie_len); 2599 return pos + ie_len; 2600 } 2601 2602 2603 /** 2604 * wpa_tdls_start - Initiate TDLS handshake (send TPK Handshake Message 1) 2605 * @sm: Pointer to WPA state machine data from wpa_sm_init() 2606 * @peer: MAC address of the peer STA 2607 * Returns: 0 on success, or -1 on failure 2608 * 2609 * Send TPK Handshake Message 1 info to driver to start TDLS 2610 * handshake with the peer. 2611 */ 2612 int wpa_tdls_start(struct wpa_sm *sm, const u8 *addr) 2613 { 2614 struct wpa_tdls_peer *peer; 2615 int tdls_prohibited = sm->tdls_prohibited; 2616 2617 if (sm->tdls_disabled || !sm->tdls_supported) 2618 return -1; 2619 2620 #ifdef CONFIG_TDLS_TESTING 2621 if ((tdls_testing & TDLS_TESTING_IGNORE_AP_PROHIBIT) && 2622 tdls_prohibited) { 2623 wpa_printf(MSG_DEBUG, "TDLS: Testing - ignore AP prohibition " 2624 "on TDLS"); 2625 tdls_prohibited = 0; 2626 } 2627 #endif /* CONFIG_TDLS_TESTING */ 2628 2629 if (tdls_prohibited) { 2630 wpa_printf(MSG_DEBUG, "TDLS: TDLS is prohibited in this BSS - " 2631 "reject request to start setup"); 2632 return -1; 2633 } 2634 2635 peer = wpa_tdls_add_peer(sm, addr, NULL); 2636 if (peer == NULL) 2637 return -1; 2638 2639 if (peer->tpk_in_progress) { 2640 wpa_printf(MSG_DEBUG, "TDLS: Setup is already in progress with the peer"); 2641 return 0; 2642 } 2643 2644 peer->initiator = 1; 2645 2646 /* add the peer to the driver as a "setup in progress" peer */ 2647 if (wpa_sm_tdls_peer_addset(sm, peer->addr, 1, 0, 0, NULL, 0, NULL, 2648 NULL, 0, 0, NULL, 0, NULL, 0, NULL, 0)) { 2649 wpa_tdls_disable_peer_link(sm, peer); 2650 return -1; 2651 } 2652 2653 peer->tpk_in_progress = 1; 2654 2655 if (wpa_tdls_send_tpk_m1(sm, peer) < 0) { 2656 wpa_tdls_disable_peer_link(sm, peer); 2657 return -1; 2658 } 2659 2660 return 0; 2661 } 2662 2663 2664 void wpa_tdls_remove(struct wpa_sm *sm, const u8 *addr) 2665 { 2666 struct wpa_tdls_peer *peer; 2667 2668 if (sm->tdls_disabled || !sm->tdls_supported) 2669 return; 2670 2671 for (peer = sm->tdls; peer; peer = peer->next) { 2672 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) 2673 break; 2674 } 2675 2676 if (peer == NULL || !peer->tpk_success) 2677 return; 2678 2679 if (sm->tdls_external_setup) { 2680 /* 2681 * Disable previous link to allow renegotiation to be completed 2682 * on AP path. 2683 */ 2684 wpa_tdls_do_teardown(sm, peer, 2685 WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 2686 } 2687 } 2688 2689 2690 /** 2691 * wpa_supplicant_rx_tdls - Receive TDLS data frame 2692 * 2693 * This function is called to receive TDLS (ethertype = 0x890d) data frames. 2694 */ 2695 static void wpa_supplicant_rx_tdls(void *ctx, const u8 *src_addr, 2696 const u8 *buf, size_t len) 2697 { 2698 struct wpa_sm *sm = ctx; 2699 struct wpa_tdls_frame *tf; 2700 2701 wpa_hexdump(MSG_DEBUG, "TDLS: Received Data frame encapsulation", 2702 buf, len); 2703 2704 if (sm->tdls_disabled || !sm->tdls_supported) { 2705 wpa_printf(MSG_DEBUG, "TDLS: Discard message - TDLS disabled " 2706 "or unsupported by driver"); 2707 return; 2708 } 2709 2710 if (os_memcmp(src_addr, sm->own_addr, ETH_ALEN) == 0) { 2711 wpa_printf(MSG_DEBUG, "TDLS: Discard copy of own message"); 2712 return; 2713 } 2714 2715 if (len < sizeof(*tf)) { 2716 wpa_printf(MSG_INFO, "TDLS: Drop too short frame"); 2717 return; 2718 } 2719 2720 /* Check to make sure its a valid encapsulated TDLS frame */ 2721 tf = (struct wpa_tdls_frame *) buf; 2722 if (tf->payloadtype != 2 /* TDLS_RFTYPE */ || 2723 tf->category != WLAN_ACTION_TDLS) { 2724 wpa_printf(MSG_INFO, "TDLS: Invalid frame - payloadtype=%u " 2725 "category=%u action=%u", 2726 tf->payloadtype, tf->category, tf->action); 2727 return; 2728 } 2729 2730 switch (tf->action) { 2731 case WLAN_TDLS_SETUP_REQUEST: 2732 wpa_tdls_process_tpk_m1(sm, src_addr, buf, len); 2733 break; 2734 case WLAN_TDLS_SETUP_RESPONSE: 2735 wpa_tdls_process_tpk_m2(sm, src_addr, buf, len); 2736 break; 2737 case WLAN_TDLS_SETUP_CONFIRM: 2738 wpa_tdls_process_tpk_m3(sm, src_addr, buf, len); 2739 break; 2740 case WLAN_TDLS_TEARDOWN: 2741 wpa_tdls_recv_teardown(sm, src_addr, buf, len); 2742 break; 2743 case WLAN_TDLS_DISCOVERY_REQUEST: 2744 wpa_tdls_process_discovery_request(sm, src_addr, buf, len); 2745 break; 2746 default: 2747 /* Kernel code will process remaining frames */ 2748 wpa_printf(MSG_DEBUG, "TDLS: Ignore TDLS frame action code %u", 2749 tf->action); 2750 break; 2751 } 2752 } 2753 2754 2755 /** 2756 * wpa_tdls_init - Initialize driver interface parameters for TDLS 2757 * @wpa_s: Pointer to wpa_supplicant data 2758 * Returns: 0 on success, -1 on failure 2759 * 2760 * This function is called to initialize driver interface parameters for TDLS. 2761 * wpa_drv_init() must have been called before this function to initialize the 2762 * driver interface. 2763 */ 2764 int wpa_tdls_init(struct wpa_sm *sm) 2765 { 2766 if (sm == NULL) 2767 return -1; 2768 2769 sm->l2_tdls = l2_packet_init(sm->bridge_ifname ? sm->bridge_ifname : 2770 sm->ifname, 2771 sm->own_addr, 2772 ETH_P_80211_ENCAP, wpa_supplicant_rx_tdls, 2773 sm, 0); 2774 if (sm->l2_tdls == NULL) { 2775 wpa_printf(MSG_ERROR, "TDLS: Failed to open l2_packet " 2776 "connection"); 2777 return -1; 2778 } 2779 2780 /* 2781 * Drivers that support TDLS but don't implement the get_capa callback 2782 * are assumed to perform everything internally 2783 */ 2784 if (wpa_sm_tdls_get_capa(sm, &sm->tdls_supported, 2785 &sm->tdls_external_setup, 2786 &sm->tdls_chan_switch) < 0) { 2787 sm->tdls_supported = 1; 2788 sm->tdls_external_setup = 0; 2789 } 2790 2791 wpa_printf(MSG_DEBUG, "TDLS: TDLS operation%s supported by " 2792 "driver", sm->tdls_supported ? "" : " not"); 2793 wpa_printf(MSG_DEBUG, "TDLS: Driver uses %s link setup", 2794 sm->tdls_external_setup ? "external" : "internal"); 2795 wpa_printf(MSG_DEBUG, "TDLS: Driver %s TDLS channel switching", 2796 sm->tdls_chan_switch ? "supports" : "does not support"); 2797 2798 return 0; 2799 } 2800 2801 2802 void wpa_tdls_teardown_peers(struct wpa_sm *sm) 2803 { 2804 struct wpa_tdls_peer *peer, *tmp; 2805 2806 if (!sm) 2807 return; 2808 peer = sm->tdls; 2809 2810 wpa_printf(MSG_DEBUG, "TDLS: Tear down peers"); 2811 2812 while (peer) { 2813 tmp = peer->next; 2814 wpa_printf(MSG_DEBUG, "TDLS: Tear down peer " MACSTR, 2815 MAC2STR(peer->addr)); 2816 if (sm->tdls_external_setup) 2817 wpa_tdls_do_teardown(sm, peer, 2818 WLAN_REASON_DEAUTH_LEAVING); 2819 else 2820 wpa_sm_tdls_oper(sm, TDLS_TEARDOWN, peer->addr); 2821 2822 peer = tmp; 2823 } 2824 } 2825 2826 2827 static void wpa_tdls_remove_peers(struct wpa_sm *sm) 2828 { 2829 struct wpa_tdls_peer *peer, *tmp; 2830 2831 peer = sm->tdls; 2832 2833 while (peer) { 2834 int res; 2835 tmp = peer->next; 2836 res = wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr); 2837 wpa_printf(MSG_DEBUG, "TDLS: Remove peer " MACSTR " (res=%d)", 2838 MAC2STR(peer->addr), res); 2839 wpa_tdls_peer_free(sm, peer); 2840 peer = tmp; 2841 } 2842 } 2843 2844 2845 /** 2846 * wpa_tdls_deinit - Deinitialize driver interface parameters for TDLS 2847 * 2848 * This function is called to recover driver interface parameters for TDLS 2849 * and frees resources allocated for it. 2850 */ 2851 void wpa_tdls_deinit(struct wpa_sm *sm) 2852 { 2853 if (sm == NULL) 2854 return; 2855 2856 if (sm->l2_tdls) 2857 l2_packet_deinit(sm->l2_tdls); 2858 sm->l2_tdls = NULL; 2859 2860 wpa_tdls_remove_peers(sm); 2861 } 2862 2863 2864 void wpa_tdls_assoc(struct wpa_sm *sm) 2865 { 2866 wpa_printf(MSG_DEBUG, "TDLS: Remove peers on association"); 2867 wpa_tdls_remove_peers(sm); 2868 } 2869 2870 2871 void wpa_tdls_disassoc(struct wpa_sm *sm) 2872 { 2873 wpa_printf(MSG_DEBUG, "TDLS: Remove peers on disassociation"); 2874 wpa_tdls_remove_peers(sm); 2875 } 2876 2877 2878 static int wpa_tdls_prohibited(struct ieee802_11_elems *elems) 2879 { 2880 /* bit 38 - TDLS Prohibited */ 2881 return !!(elems->ext_capab[2 + 4] & 0x40); 2882 } 2883 2884 2885 static int wpa_tdls_chan_switch_prohibited(struct ieee802_11_elems *elems) 2886 { 2887 /* bit 39 - TDLS Channel Switch Prohibited */ 2888 return !!(elems->ext_capab[2 + 4] & 0x80); 2889 } 2890 2891 2892 void wpa_tdls_ap_ies(struct wpa_sm *sm, const u8 *ies, size_t len) 2893 { 2894 struct ieee802_11_elems elems; 2895 2896 sm->tdls_prohibited = 0; 2897 sm->tdls_chan_switch_prohibited = 0; 2898 2899 if (ies == NULL || 2900 ieee802_11_parse_elems(ies, len, &elems, 0) == ParseFailed || 2901 elems.ext_capab == NULL || elems.ext_capab_len < 2 + 5) 2902 return; 2903 2904 sm->tdls_prohibited = wpa_tdls_prohibited(&elems); 2905 wpa_printf(MSG_DEBUG, "TDLS: TDLS is %s in the target BSS", 2906 sm->tdls_prohibited ? "prohibited" : "allowed"); 2907 sm->tdls_chan_switch_prohibited = 2908 wpa_tdls_chan_switch_prohibited(&elems); 2909 wpa_printf(MSG_DEBUG, "TDLS: TDLS channel switch %s in the target BSS", 2910 sm->tdls_chan_switch_prohibited ? "prohibited" : "allowed"); 2911 } 2912 2913 2914 void wpa_tdls_assoc_resp_ies(struct wpa_sm *sm, const u8 *ies, size_t len) 2915 { 2916 struct ieee802_11_elems elems; 2917 2918 if (ies == NULL || 2919 ieee802_11_parse_elems(ies, len, &elems, 0) == ParseFailed || 2920 elems.ext_capab == NULL || elems.ext_capab_len < 2 + 5) 2921 return; 2922 2923 if (!sm->tdls_prohibited && wpa_tdls_prohibited(&elems)) { 2924 wpa_printf(MSG_DEBUG, "TDLS: TDLS prohibited based on " 2925 "(Re)Association Response IEs"); 2926 sm->tdls_prohibited = 1; 2927 } 2928 2929 if (!sm->tdls_chan_switch_prohibited && 2930 wpa_tdls_chan_switch_prohibited(&elems)) { 2931 wpa_printf(MSG_DEBUG, 2932 "TDLS: TDLS channel switch prohibited based on (Re)Association Response IEs"); 2933 sm->tdls_chan_switch_prohibited = 1; 2934 } 2935 } 2936 2937 2938 void wpa_tdls_enable(struct wpa_sm *sm, int enabled) 2939 { 2940 wpa_printf(MSG_DEBUG, "TDLS: %s", enabled ? "enabled" : "disabled"); 2941 sm->tdls_disabled = !enabled; 2942 } 2943 2944 2945 int wpa_tdls_is_external_setup(struct wpa_sm *sm) 2946 { 2947 return sm->tdls_external_setup; 2948 } 2949 2950 2951 int wpa_tdls_enable_chan_switch(struct wpa_sm *sm, const u8 *addr, 2952 u8 oper_class, 2953 struct hostapd_freq_params *freq_params) 2954 { 2955 struct wpa_tdls_peer *peer; 2956 int ret; 2957 2958 if (sm->tdls_disabled || !sm->tdls_supported) 2959 return -1; 2960 2961 if (!sm->tdls_chan_switch) { 2962 wpa_printf(MSG_DEBUG, 2963 "TDLS: Channel switching not supported by the driver"); 2964 return -1; 2965 } 2966 2967 if (sm->tdls_chan_switch_prohibited) { 2968 wpa_printf(MSG_DEBUG, 2969 "TDLS: Channel switching is prohibited in this BSS - reject request to switch channel"); 2970 return -1; 2971 } 2972 2973 for (peer = sm->tdls; peer; peer = peer->next) { 2974 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) 2975 break; 2976 } 2977 2978 if (peer == NULL || !peer->tpk_success) { 2979 wpa_printf(MSG_ERROR, "TDLS: Peer " MACSTR 2980 " not found for channel switching", MAC2STR(addr)); 2981 return -1; 2982 } 2983 2984 if (peer->chan_switch_enabled) { 2985 wpa_printf(MSG_DEBUG, "TDLS: Peer " MACSTR 2986 " already has channel switching enabled", 2987 MAC2STR(addr)); 2988 return 0; 2989 } 2990 2991 ret = wpa_sm_tdls_enable_channel_switch(sm, peer->addr, 2992 oper_class, freq_params); 2993 if (!ret) 2994 peer->chan_switch_enabled = 1; 2995 2996 return ret; 2997 } 2998 2999 3000 int wpa_tdls_disable_chan_switch(struct wpa_sm *sm, const u8 *addr) 3001 { 3002 struct wpa_tdls_peer *peer; 3003 3004 if (sm->tdls_disabled || !sm->tdls_supported) 3005 return -1; 3006 3007 for (peer = sm->tdls; peer; peer = peer->next) { 3008 if (os_memcmp(peer->addr, addr, ETH_ALEN) == 0) 3009 break; 3010 } 3011 3012 if (!peer || !peer->chan_switch_enabled) { 3013 wpa_printf(MSG_ERROR, "TDLS: Channel switching not enabled for " 3014 MACSTR, MAC2STR(addr)); 3015 return -1; 3016 } 3017 3018 /* ignore the return value */ 3019 wpa_sm_tdls_disable_channel_switch(sm, peer->addr); 3020 3021 peer->chan_switch_enabled = 0; 3022 return 0; 3023 } 3024