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