tdls.c 81 KB

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