rtw_tdls.c 107 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2007 - 2017 Realtek Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. *****************************************************************************/
  15. #define _RTW_TDLS_C_
  16. #include <drv_types.h>
  17. #include <hal_data.h>
  18. #ifdef CONFIG_TDLS
  19. #define ONE_SEC 1000 /* 1000 ms */
  20. extern unsigned char MCS_rate_2R[16];
  21. extern unsigned char MCS_rate_1R[16];
  22. inline void rtw_tdls_set_link_established(_adapter *adapter, bool en)
  23. {
  24. adapter->tdlsinfo.link_established = en;
  25. rtw_mi_update_iface_status(&(adapter->mlmepriv), 0);
  26. }
  27. void rtw_reset_tdls_info(_adapter *padapter)
  28. {
  29. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  30. ptdlsinfo->ap_prohibited = _FALSE;
  31. /* For TDLS channel switch, currently we only allow it to work in wifi logo test mode */
  32. if (padapter->registrypriv.wifi_spec == 1)
  33. ptdlsinfo->ch_switch_prohibited = _FALSE;
  34. else
  35. ptdlsinfo->ch_switch_prohibited = _TRUE;
  36. rtw_tdls_set_link_established(padapter, _FALSE);
  37. ptdlsinfo->sta_cnt = 0;
  38. ptdlsinfo->sta_maximum = _FALSE;
  39. #ifdef CONFIG_TDLS_CH_SW
  40. ptdlsinfo->chsw_info.ch_sw_state = TDLS_STATE_NONE;
  41. ATOMIC_SET(&ptdlsinfo->chsw_info.chsw_on, _FALSE);
  42. ptdlsinfo->chsw_info.off_ch_num = 0;
  43. ptdlsinfo->chsw_info.ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  44. ptdlsinfo->chsw_info.cur_time = 0;
  45. ptdlsinfo->chsw_info.delay_switch_back = _FALSE;
  46. ptdlsinfo->chsw_info.dump_stack = _FALSE;
  47. #endif
  48. ptdlsinfo->ch_sensing = 0;
  49. ptdlsinfo->watchdog_count = 0;
  50. ptdlsinfo->dev_discovered = _FALSE;
  51. #ifdef CONFIG_WFD
  52. ptdlsinfo->wfd_info = &padapter->wfd_info;
  53. #endif
  54. ptdlsinfo->tdls_sctx = NULL;
  55. }
  56. int rtw_init_tdls_info(_adapter *padapter)
  57. {
  58. int res = _SUCCESS;
  59. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  60. rtw_reset_tdls_info(padapter);
  61. #ifdef CONFIG_TDLS_DRIVER_SETUP
  62. ptdlsinfo->driver_setup = _TRUE;
  63. #else
  64. ptdlsinfo->driver_setup = _FALSE;
  65. #endif /* CONFIG_TDLS_DRIVER_SETUP */
  66. _rtw_spinlock_init(&ptdlsinfo->cmd_lock);
  67. _rtw_spinlock_init(&ptdlsinfo->hdl_lock);
  68. return res;
  69. }
  70. void rtw_free_tdls_info(struct tdls_info *ptdlsinfo)
  71. {
  72. _rtw_spinlock_free(&ptdlsinfo->cmd_lock);
  73. _rtw_spinlock_free(&ptdlsinfo->hdl_lock);
  74. _rtw_memset(ptdlsinfo, 0, sizeof(struct tdls_info));
  75. }
  76. void rtw_free_all_tdls_sta(_adapter *padapter, u8 enqueue_cmd)
  77. {
  78. struct sta_priv *pstapriv = &padapter->stapriv;
  79. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  80. _irqL irqL;
  81. _list *plist, *phead;
  82. s32 index;
  83. struct sta_info *psta = NULL;
  84. struct sta_info *ptdls_sta[NUM_STA];
  85. u8 empty_hwaddr[ETH_ALEN] = { 0x00 };
  86. _rtw_memset(ptdls_sta, 0x00, sizeof(ptdls_sta));
  87. _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  88. for (index = 0; index < NUM_STA; index++) {
  89. phead = &(pstapriv->sta_hash[index]);
  90. plist = get_next(phead);
  91. while (rtw_end_of_queue_search(phead, plist) == _FALSE) {
  92. psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  93. plist = get_next(plist);
  94. if (psta->tdls_sta_state != TDLS_STATE_NONE)
  95. ptdls_sta[index] = psta;
  96. }
  97. }
  98. _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  99. for (index = 0; index < NUM_STA; index++) {
  100. if (ptdls_sta[index]) {
  101. struct TDLSoption_param tdls_param;
  102. psta = ptdls_sta[index];
  103. RTW_INFO("Do tear down to "MAC_FMT" by enqueue_cmd = %d\n", MAC_ARG(psta->cmn.mac_addr), enqueue_cmd);
  104. _rtw_memcpy(&(tdls_param.addr), psta->cmn.mac_addr, ETH_ALEN);
  105. tdls_param.option = TDLS_TEARDOWN_STA_NO_WAIT;
  106. tdls_hdl(padapter, (unsigned char *)&(tdls_param));
  107. rtw_tdls_teardown_pre_hdl(padapter, psta);
  108. if (enqueue_cmd == _TRUE)
  109. rtw_tdls_cmd(padapter, psta->cmn.mac_addr, TDLS_TEARDOWN_STA_LOCALLY_POST);
  110. else
  111. {
  112. tdls_param.option = TDLS_TEARDOWN_STA_LOCALLY_POST;
  113. tdls_hdl(padapter, (unsigned char *)&(tdls_param));
  114. }
  115. }
  116. }
  117. }
  118. int check_ap_tdls_prohibited(u8 *pframe, u8 pkt_len)
  119. {
  120. u8 tdls_prohibited_bit = 0x40; /* bit(38); TDLS_prohibited */
  121. if (pkt_len < 5)
  122. return _FALSE;
  123. pframe += 4;
  124. if ((*pframe) & tdls_prohibited_bit)
  125. return _TRUE;
  126. return _FALSE;
  127. }
  128. int check_ap_tdls_ch_switching_prohibited(u8 *pframe, u8 pkt_len)
  129. {
  130. u8 tdls_ch_swithcing_prohibited_bit = 0x80; /* bit(39); TDLS_channel_switching prohibited */
  131. if (pkt_len < 5)
  132. return _FALSE;
  133. pframe += 4;
  134. if ((*pframe) & tdls_ch_swithcing_prohibited_bit)
  135. return _TRUE;
  136. return _FALSE;
  137. }
  138. u8 rtw_is_tdls_enabled(_adapter *padapter)
  139. {
  140. return padapter->registrypriv.en_tdls;
  141. }
  142. void rtw_set_tdls_enable(_adapter *padapter, u8 enable)
  143. {
  144. padapter->registrypriv.en_tdls = enable;
  145. RTW_INFO("%s: en_tdls = %d\n", __func__, rtw_is_tdls_enabled(padapter));
  146. }
  147. void rtw_enable_tdls_func(_adapter *padapter)
  148. {
  149. if (rtw_is_tdls_enabled(padapter) == _TRUE)
  150. return;
  151. #if 0
  152. #ifdef CONFIG_MCC_MODE
  153. if (rtw_hal_check_mcc_status(padapter, MCC_STATUS_DOING_MCC) == _TRUE) {
  154. RTW_INFO("[TDLS] MCC is running, can't enable TDLS !\n");
  155. return;
  156. }
  157. #endif
  158. #endif
  159. rtw_set_tdls_enable(padapter, _TRUE);
  160. }
  161. void rtw_disable_tdls_func(_adapter *padapter, u8 enqueue_cmd)
  162. {
  163. if (rtw_is_tdls_enabled(padapter) == _FALSE)
  164. return;
  165. rtw_free_all_tdls_sta(padapter, enqueue_cmd);
  166. rtw_tdls_cmd(padapter, NULL, TDLS_RS_RCR);
  167. rtw_reset_tdls_info(padapter);
  168. rtw_set_tdls_enable(padapter, _FALSE);
  169. }
  170. u8 rtw_is_tdls_sta_existed(_adapter *padapter)
  171. {
  172. struct sta_priv *pstapriv = &padapter->stapriv;
  173. struct sta_info *psta;
  174. int i = 0;
  175. _irqL irqL;
  176. _list *plist, *phead;
  177. u8 ret = _FALSE;
  178. if (rtw_is_tdls_enabled(padapter) == _FALSE)
  179. return _FALSE;
  180. _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  181. for (i = 0; i < NUM_STA; i++) {
  182. phead = &(pstapriv->sta_hash[i]);
  183. plist = get_next(phead);
  184. while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
  185. psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  186. plist = get_next(plist);
  187. if (psta->tdls_sta_state != TDLS_STATE_NONE) {
  188. ret = _TRUE;
  189. goto Exit;
  190. }
  191. }
  192. }
  193. Exit:
  194. _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  195. return ret;
  196. }
  197. u8 rtw_tdls_is_setup_allowed(_adapter *padapter)
  198. {
  199. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  200. if (is_client_associated_to_ap(padapter) == _FALSE)
  201. return _FALSE;
  202. if (ptdlsinfo->ap_prohibited == _TRUE)
  203. return _FALSE;
  204. return _TRUE;
  205. }
  206. #ifdef CONFIG_TDLS_CH_SW
  207. u8 rtw_tdls_is_chsw_allowed(_adapter *padapter)
  208. {
  209. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  210. if (ptdlsinfo->ch_switch_prohibited == _TRUE)
  211. return _FALSE;
  212. if (padapter->registrypriv.wifi_spec == 0)
  213. return _FALSE;
  214. return _TRUE;
  215. }
  216. #endif
  217. int _issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int wait_ms)
  218. {
  219. int ret = _FAIL;
  220. struct xmit_frame *pmgntframe;
  221. struct pkt_attrib *pattrib;
  222. unsigned char *pframe;
  223. struct rtw_ieee80211_hdr *pwlanhdr;
  224. unsigned short *fctrl, *qc;
  225. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  226. struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  227. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  228. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  229. if (pmgntframe == NULL)
  230. goto exit;
  231. pattrib = &pmgntframe->attrib;
  232. update_mgntframe_attrib(padapter, pattrib);
  233. pattrib->hdrlen += 2;
  234. pattrib->qos_en = _TRUE;
  235. pattrib->eosp = 1;
  236. pattrib->ack_policy = 0;
  237. pattrib->mdata = 0;
  238. pattrib->retry_ctrl = _FALSE;
  239. _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  240. pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  241. pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  242. fctrl = &(pwlanhdr->frame_ctl);
  243. *(fctrl) = 0;
  244. if (power_mode)
  245. SetPwrMgt(fctrl);
  246. qc = (unsigned short *)(pframe + pattrib->hdrlen - 2);
  247. SetPriority(qc, 7); /* Set priority to VO */
  248. SetEOSP(qc, pattrib->eosp);
  249. SetAckpolicy(qc, pattrib->ack_policy);
  250. _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);
  251. _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);
  252. _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
  253. SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  254. pmlmeext->mgnt_seq++;
  255. set_frame_sub_type(pframe, WIFI_QOS_DATA_NULL);
  256. pframe += sizeof(struct rtw_ieee80211_hdr_3addr_qos);
  257. pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos);
  258. pattrib->last_txcmdsz = pattrib->pktlen;
  259. if (wait_ms)
  260. ret = dump_mgntframe_and_wait_ack_timeout(padapter, pmgntframe, wait_ms);
  261. else {
  262. dump_mgntframe(padapter, pmgntframe);
  263. ret = _SUCCESS;
  264. }
  265. exit:
  266. return ret;
  267. }
  268. /*
  269. *wait_ms == 0 means that there is no need to wait ack through C2H_CCX_TX_RPT
  270. *wait_ms > 0 means you want to wait ack through C2H_CCX_TX_RPT, and the value of wait_ms means the interval between each TX
  271. *try_cnt means the maximal TX count to try
  272. */
  273. int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms)
  274. {
  275. int ret;
  276. int i = 0;
  277. systime start = rtw_get_current_time();
  278. struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  279. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  280. #if 0
  281. psta = rtw_get_stainfo(&padapter->stapriv, da);
  282. if (psta) {
  283. if (power_mode)
  284. rtw_hal_macid_sleep(padapter, psta->cmn.mac_id);
  285. else
  286. rtw_hal_macid_wakeup(padapter, psta->cmn.mac_id);
  287. } else {
  288. RTW_INFO(FUNC_ADPT_FMT ": Can't find sta info for " MAC_FMT ", skip macid %s!!\n",
  289. FUNC_ADPT_ARG(padapter), MAC_ARG(da), power_mode ? "sleep" : "wakeup");
  290. rtw_warn_on(1);
  291. }
  292. #endif
  293. do {
  294. ret = _issue_nulldata_to_TDLS_peer_STA(padapter, da, power_mode, wait_ms);
  295. i++;
  296. if (RTW_CANNOT_RUN(padapter))
  297. break;
  298. if (i < try_cnt && wait_ms > 0 && ret == _FAIL)
  299. rtw_msleep_os(wait_ms);
  300. } while ((i < try_cnt) && (ret == _FAIL || wait_ms == 0));
  301. if (ret != _FAIL) {
  302. ret = _SUCCESS;
  303. #ifndef DBG_XMIT_ACK
  304. goto exit;
  305. #endif
  306. }
  307. if (try_cnt && wait_ms) {
  308. if (da)
  309. RTW_INFO(FUNC_ADPT_FMT" to "MAC_FMT", ch:%u%s, %d/%d in %u ms\n",
  310. FUNC_ADPT_ARG(padapter), MAC_ARG(da), rtw_get_oper_ch(padapter),
  311. ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start));
  312. else
  313. RTW_INFO(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n",
  314. FUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter),
  315. ret == _SUCCESS ? ", acked" : "", i, try_cnt, rtw_get_passing_time_ms(start));
  316. }
  317. exit:
  318. return ret;
  319. }
  320. /* TDLS encryption(if needed) will always be CCMP */
  321. void rtw_tdls_set_key(_adapter *padapter, struct sta_info *ptdls_sta)
  322. {
  323. ptdls_sta->dot118021XPrivacy = _AES_;
  324. rtw_setstakey_cmd(padapter, ptdls_sta, TDLS_KEY, _TRUE);
  325. }
  326. #ifdef CONFIG_80211N_HT
  327. void rtw_tdls_process_ht_cap(_adapter *padapter, struct sta_info *ptdls_sta, u8 *data, u8 Length)
  328. {
  329. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  330. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  331. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  332. struct ht_priv *phtpriv = &pmlmepriv->htpriv;
  333. u8 max_AMPDU_len, min_MPDU_spacing;
  334. u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, cur_beamform_cap = 0;
  335. /* Save HT capabilities in the sta object */
  336. _rtw_memset(&ptdls_sta->htpriv.ht_cap, 0, sizeof(struct rtw_ieee80211_ht_cap));
  337. if (data && Length >= sizeof(struct rtw_ieee80211_ht_cap)) {
  338. ptdls_sta->flags |= WLAN_STA_HT;
  339. ptdls_sta->flags |= WLAN_STA_WME;
  340. _rtw_memcpy(&ptdls_sta->htpriv.ht_cap, data, sizeof(struct rtw_ieee80211_ht_cap));
  341. } else {
  342. ptdls_sta->flags &= ~WLAN_STA_HT;
  343. return;
  344. }
  345. if (ptdls_sta->flags & WLAN_STA_HT) {
  346. if (padapter->registrypriv.ht_enable == _TRUE && is_supported_ht(padapter->registrypriv.wireless_mode) ) {
  347. ptdls_sta->htpriv.ht_option = _TRUE;
  348. ptdls_sta->qos_option = _TRUE;
  349. } else {
  350. ptdls_sta->htpriv.ht_option = _FALSE;
  351. ptdls_sta->qos_option = _FALSE;
  352. }
  353. }
  354. /* HT related cap */
  355. if (ptdls_sta->htpriv.ht_option) {
  356. /* Check if sta supports rx ampdu */
  357. if (padapter->registrypriv.ampdu_enable == 1)
  358. ptdls_sta->htpriv.ampdu_enable = _TRUE;
  359. /* AMPDU Parameters field */
  360. /* Get MIN of MAX AMPDU Length Exp */
  361. if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3) > (data[2] & 0x3))
  362. max_AMPDU_len = (data[2] & 0x3);
  363. else
  364. max_AMPDU_len = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3);
  365. /* Get MAX of MIN MPDU Start Spacing */
  366. if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) > (data[2] & 0x1c))
  367. min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c);
  368. else
  369. min_MPDU_spacing = (data[2] & 0x1c);
  370. ptdls_sta->htpriv.rx_ampdu_min_spacing = max_AMPDU_len | min_MPDU_spacing;
  371. /* Check if sta support s Short GI 20M */
  372. if ((phtpriv->sgi_20m == _TRUE) && (ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SGI_20)))
  373. ptdls_sta->htpriv.sgi_20m = _TRUE;
  374. /* Check if sta support s Short GI 40M */
  375. if ((phtpriv->sgi_40m == _TRUE) && (ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SGI_40)))
  376. ptdls_sta->htpriv.sgi_40m = _TRUE;
  377. /* Bwmode would still followed AP's setting */
  378. if (ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) {
  379. if (padapter->mlmeextpriv.cur_bwmode >= CHANNEL_WIDTH_40)
  380. ptdls_sta->cmn.bw_mode = CHANNEL_WIDTH_40;
  381. ptdls_sta->htpriv.ch_offset = padapter->mlmeextpriv.cur_ch_offset;
  382. }
  383. /* Config LDPC Coding Capability */
  384. if (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX) && GET_HT_CAP_ELE_LDPC_CAP(data)) {
  385. SET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX));
  386. RTW_INFO("Enable HT Tx LDPC!\n");
  387. }
  388. ptdls_sta->htpriv.ldpc_cap = cur_ldpc_cap;
  389. /* Config STBC setting */
  390. if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAP_ELE_RX_STBC(data)) {
  391. SET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX));
  392. RTW_INFO("Enable HT Tx STBC!\n");
  393. }
  394. ptdls_sta->htpriv.stbc_cap = cur_stbc_cap;
  395. #ifdef CONFIG_BEAMFORMING
  396. /* Config Tx beamforming setting */
  397. if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) &&
  398. GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(data))
  399. SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE);
  400. if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) &&
  401. GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(data))
  402. SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE);
  403. ptdls_sta->htpriv.beamform_cap = cur_beamform_cap;
  404. if (cur_beamform_cap)
  405. RTW_INFO("Client HT Beamforming Cap = 0x%02X\n", cur_beamform_cap);
  406. #endif /* CONFIG_BEAMFORMING */
  407. }
  408. }
  409. u8 *rtw_tdls_set_ht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)
  410. {
  411. rtw_ht_use_default_setting(padapter);
  412. if (padapter->registrypriv.wifi_spec == 1) {
  413. padapter->mlmepriv.htpriv.sgi_20m = _FALSE;
  414. padapter->mlmepriv.htpriv.sgi_40m = _FALSE;
  415. }
  416. rtw_restructure_ht_ie(padapter, NULL, pframe, 0, &(pattrib->pktlen), padapter->mlmeextpriv.cur_channel);
  417. return pframe + pattrib->pktlen;
  418. }
  419. #endif
  420. #ifdef CONFIG_80211AC_VHT
  421. void rtw_tdls_process_vht_cap(_adapter *padapter, struct sta_info *ptdls_sta, u8 *data, u8 Length)
  422. {
  423. struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);
  424. struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter);
  425. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  426. struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv;
  427. u8 cur_ldpc_cap = 0, cur_stbc_cap = 0, cur_beamform_cap = 0, rf_type = RF_1T1R, tx_nss = 0;
  428. u8 *pcap_mcs;
  429. _rtw_memset(&ptdls_sta->vhtpriv, 0, sizeof(struct vht_priv));
  430. if (data && Length == 12) {
  431. ptdls_sta->flags |= WLAN_STA_VHT;
  432. _rtw_memcpy(ptdls_sta->vhtpriv.vht_cap, data, 12);
  433. #if 0
  434. if (elems.vht_op_mode_notify && elems.vht_op_mode_notify_len == 1)
  435. _rtw_memcpy(&pstat->vhtpriv.vht_op_mode_notify, elems.vht_op_mode_notify, 1);
  436. else /* for Frame without Operating Mode notify ie; default: 80M */
  437. pstat->vhtpriv.vht_op_mode_notify = CHANNEL_WIDTH_80;
  438. #else
  439. ptdls_sta->vhtpriv.vht_op_mode_notify = CHANNEL_WIDTH_80;
  440. #endif
  441. } else {
  442. ptdls_sta->flags &= ~WLAN_STA_VHT;
  443. return;
  444. }
  445. if (ptdls_sta->flags & WLAN_STA_VHT) {
  446. if (REGSTY_IS_11AC_ENABLE(&padapter->registrypriv)
  447. && is_supported_vht(padapter->registrypriv.wireless_mode)
  448. && (!rfctl->country_ent || COUNTRY_CHPLAN_EN_11AC(rfctl->country_ent)))
  449. ptdls_sta->vhtpriv.vht_option = _TRUE;
  450. else
  451. ptdls_sta->vhtpriv.vht_option = _FALSE;
  452. }
  453. /* B4 Rx LDPC */
  454. if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX) &&
  455. GET_VHT_CAPABILITY_ELE_RX_LDPC(data)) {
  456. SET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX));
  457. RTW_INFO("Current VHT LDPC Setting = %02X\n", cur_ldpc_cap);
  458. }
  459. ptdls_sta->vhtpriv.ldpc_cap = cur_ldpc_cap;
  460. /* B5 Short GI for 80 MHz */
  461. ptdls_sta->vhtpriv.sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(data) & pvhtpriv->sgi_80m) ? _TRUE : _FALSE;
  462. /* B8 B9 B10 Rx STBC */
  463. if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX) &&
  464. GET_VHT_CAPABILITY_ELE_RX_STBC(data)) {
  465. SET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX));
  466. RTW_INFO("Current VHT STBC Setting = %02X\n", cur_stbc_cap);
  467. }
  468. ptdls_sta->vhtpriv.stbc_cap = cur_stbc_cap;
  469. #ifdef CONFIG_BEAMFORMING
  470. /* B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee */
  471. if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) &&
  472. GET_VHT_CAPABILITY_ELE_SU_BFEE(data))
  473. SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE);
  474. /* B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer */
  475. if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) &&
  476. GET_VHT_CAPABILITY_ELE_SU_BFER(data))
  477. SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE);
  478. ptdls_sta->vhtpriv.beamform_cap = cur_beamform_cap;
  479. if (cur_beamform_cap)
  480. RTW_INFO("Current VHT Beamforming Setting = %02X\n", cur_beamform_cap);
  481. #endif /*CONFIG_BEAMFORMING*/
  482. /* B23 B24 B25 Maximum A-MPDU Length Exponent */
  483. ptdls_sta->vhtpriv.ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(data);
  484. pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(data);
  485. rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  486. tx_nss = rtw_min(rf_type_to_rf_tx_cnt(rf_type), hal_spec->tx_nss_num);
  487. rtw_vht_nss_to_mcsmap(tx_nss, ptdls_sta->vhtpriv.vht_mcs_map, pcap_mcs);
  488. ptdls_sta->vhtpriv.vht_highest_rate = rtw_get_vht_highest_rate(ptdls_sta->vhtpriv.vht_mcs_map);
  489. }
  490. void rtw_tdls_process_vht_operation(_adapter *padapter, struct sta_info *ptdls_sta, u8 *data, u8 Length)
  491. {
  492. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  493. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  494. struct registry_priv *regsty = adapter_to_regsty(padapter);
  495. u8 operation_bw = 0;
  496. if (GET_VHT_OPERATION_ELE_CHL_WIDTH(data) >= 1) {
  497. operation_bw = CHANNEL_WIDTH_80;
  498. if (hal_is_bw_support(padapter, operation_bw) && REGSTY_IS_BW_5G_SUPPORT(regsty, operation_bw)
  499. && (operation_bw <= pmlmeext->cur_bwmode))
  500. ptdls_sta->cmn.bw_mode = operation_bw;
  501. else
  502. ptdls_sta->cmn.bw_mode = pmlmeext->cur_bwmode;
  503. } else
  504. ptdls_sta->cmn.bw_mode = pmlmeext->cur_bwmode;
  505. }
  506. void rtw_tdls_process_vht_op_mode_notify(_adapter *padapter, struct sta_info *ptdls_sta, u8 *data, u8 Length)
  507. {
  508. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  509. struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv;
  510. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  511. struct registry_priv *regsty = adapter_to_regsty(padapter);
  512. u8 target_bw;
  513. u8 target_rxss, current_rxss;
  514. if (pvhtpriv->vht_option == _FALSE)
  515. return;
  516. target_bw = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(data);
  517. target_rxss = (GET_VHT_OPERATING_MODE_FIELD_RX_NSS(data) + 1);
  518. if (hal_is_bw_support(padapter, target_bw) && REGSTY_IS_BW_5G_SUPPORT(regsty, target_bw)
  519. && (target_bw <= pmlmeext->cur_bwmode))
  520. ptdls_sta->cmn.bw_mode = target_bw;
  521. else
  522. ptdls_sta->cmn.bw_mode = pmlmeext->cur_bwmode;
  523. current_rxss = rtw_vht_mcsmap_to_nss(ptdls_sta->vhtpriv.vht_mcs_map);
  524. if (target_rxss != current_rxss) {
  525. u8 vht_mcs_map[2] = {};
  526. rtw_vht_nss_to_mcsmap(target_rxss, vht_mcs_map, ptdls_sta->vhtpriv.vht_mcs_map);
  527. _rtw_memcpy(ptdls_sta->vhtpriv.vht_mcs_map, vht_mcs_map, 2);
  528. }
  529. }
  530. u8 *rtw_tdls_set_aid(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)
  531. {
  532. return rtw_set_ie(pframe, EID_AID, 2, (u8 *)&(padapter->mlmepriv.cur_network.aid), &(pattrib->pktlen));
  533. }
  534. u8 *rtw_tdls_set_vht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)
  535. {
  536. u32 ie_len = 0;
  537. rtw_vht_use_default_setting(padapter);
  538. ie_len = rtw_build_vht_cap_ie(padapter, pframe);
  539. pattrib->pktlen += ie_len;
  540. return pframe + ie_len;
  541. }
  542. u8 *rtw_tdls_set_vht_operation(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib, u8 channel)
  543. {
  544. u32 ie_len = 0;
  545. ie_len = rtw_build_vht_operation_ie(padapter, pframe, channel);
  546. pattrib->pktlen += ie_len;
  547. return pframe + ie_len;
  548. }
  549. u8 *rtw_tdls_set_vht_op_mode_notify(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib, u8 bw)
  550. {
  551. u32 ie_len = 0;
  552. ie_len = rtw_build_vht_op_mode_notify_ie(padapter, pframe, bw);
  553. pattrib->pktlen += ie_len;
  554. return pframe + ie_len;
  555. }
  556. #endif
  557. u8 *rtw_tdls_set_sup_ch(_adapter *adapter, u8 *pframe, struct pkt_attrib *pattrib)
  558. {
  559. struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
  560. u8 sup_ch[30 * 2] = {0x00}, ch_set_idx = 0, sup_ch_idx = 2;
  561. while (ch_set_idx < rfctl->max_chan_nums && rfctl->channel_set[ch_set_idx].ChannelNum != 0) {
  562. if (rfctl->channel_set[ch_set_idx].ChannelNum <= 14) {
  563. /* TODO: fix 2.4G supported channel when channel doesn't start from 1 and continuous */
  564. sup_ch[0] = 1; /* First channel number */
  565. sup_ch[1] = rfctl->channel_set[ch_set_idx].ChannelNum; /* Number of channel */
  566. } else {
  567. sup_ch[sup_ch_idx++] = rfctl->channel_set[ch_set_idx].ChannelNum;
  568. sup_ch[sup_ch_idx++] = 1;
  569. }
  570. ch_set_idx++;
  571. }
  572. return rtw_set_ie(pframe, _SUPPORTED_CH_IE_, sup_ch_idx, sup_ch, &(pattrib->pktlen));
  573. }
  574. u8 *rtw_tdls_set_rsnie(struct tdls_txmgmt *ptxmgmt, u8 *pframe, struct pkt_attrib *pattrib, int init, struct sta_info *ptdls_sta)
  575. {
  576. u8 *p = NULL;
  577. int len = 0;
  578. if (ptxmgmt->len > 0)
  579. p = rtw_get_ie(ptxmgmt->buf, _RSN_IE_2_, &len, ptxmgmt->len);
  580. if (p != NULL)
  581. return rtw_set_ie(pframe, _RSN_IE_2_, len, p + 2, &(pattrib->pktlen));
  582. else if (init == _TRUE)
  583. return rtw_set_ie(pframe, _RSN_IE_2_, sizeof(TDLS_RSNIE), TDLS_RSNIE, &(pattrib->pktlen));
  584. else
  585. return rtw_set_ie(pframe, _RSN_IE_2_, sizeof(ptdls_sta->TDLS_RSNIE), ptdls_sta->TDLS_RSNIE, &(pattrib->pktlen));
  586. }
  587. u8 *rtw_tdls_set_ext_cap(u8 *pframe, struct pkt_attrib *pattrib)
  588. {
  589. return rtw_set_ie(pframe, _EXT_CAP_IE_ , sizeof(TDLS_EXT_CAPIE), TDLS_EXT_CAPIE, &(pattrib->pktlen));
  590. }
  591. u8 *rtw_tdls_set_qos_cap(u8 *pframe, struct pkt_attrib *pattrib)
  592. {
  593. return rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, sizeof(TDLS_WMMIE), TDLS_WMMIE, &(pattrib->pktlen));
  594. }
  595. u8 *rtw_tdls_set_ftie(struct tdls_txmgmt *ptxmgmt, u8 *pframe, struct pkt_attrib *pattrib, u8 *ANonce, u8 *SNonce)
  596. {
  597. struct wpa_tdls_ftie FTIE = {0};
  598. u8 *p = NULL;
  599. int len = 0;
  600. if (ptxmgmt->len > 0)
  601. p = rtw_get_ie(ptxmgmt->buf, _FTIE_, &len, ptxmgmt->len);
  602. if (p != NULL)
  603. return rtw_set_ie(pframe, _FTIE_, len, p + 2, &(pattrib->pktlen));
  604. else {
  605. if (ANonce != NULL)
  606. _rtw_memcpy(FTIE.Anonce, ANonce, WPA_NONCE_LEN);
  607. if (SNonce != NULL)
  608. _rtw_memcpy(FTIE.Snonce, SNonce, WPA_NONCE_LEN);
  609. return rtw_set_ie(pframe, _FTIE_, TDLS_FTIE_DATA_LEN,
  610. (u8 *)FTIE.data, &(pattrib->pktlen));
  611. }
  612. }
  613. u8 *rtw_tdls_set_timeout_interval(struct tdls_txmgmt *ptxmgmt, u8 *pframe, struct pkt_attrib *pattrib, int init, struct sta_info *ptdls_sta)
  614. {
  615. u8 timeout_itvl[5]; /* set timeout interval to maximum value */
  616. u32 timeout_interval = TDLS_TPK_RESEND_COUNT;
  617. u8 *p = NULL;
  618. int len = 0;
  619. if (ptxmgmt->len > 0)
  620. p = rtw_get_ie(ptxmgmt->buf, _TIMEOUT_ITVL_IE_, &len, ptxmgmt->len);
  621. if (p != NULL)
  622. return rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, len, p + 2, &(pattrib->pktlen));
  623. else {
  624. /* Timeout interval */
  625. timeout_itvl[0] = 0x02;
  626. if (init == _TRUE)
  627. _rtw_memcpy(timeout_itvl + 1, &timeout_interval, 4);
  628. else
  629. _rtw_memcpy(timeout_itvl + 1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4);
  630. return rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen));
  631. }
  632. }
  633. u8 *rtw_tdls_set_bss_coexist(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)
  634. {
  635. u8 iedata = 0;
  636. if (padapter->mlmepriv.num_FortyMHzIntolerant > 0)
  637. iedata |= BIT(2); /* 20 MHz BSS Width Request */
  638. /* Information Bit should be set by TDLS test plan 5.9 */
  639. iedata |= BIT(0);
  640. return rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen));
  641. }
  642. u8 *rtw_tdls_set_payload_type(u8 *pframe, struct pkt_attrib *pattrib)
  643. {
  644. u8 payload_type = 0x02;
  645. return rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));
  646. }
  647. u8 *rtw_tdls_set_category(u8 *pframe, struct pkt_attrib *pattrib, u8 category)
  648. {
  649. return rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  650. }
  651. u8 *rtw_tdls_set_action(u8 *pframe, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt)
  652. {
  653. return rtw_set_fixed_ie(pframe, 1, &(ptxmgmt->action_code), &(pattrib->pktlen));
  654. }
  655. u8 *rtw_tdls_set_status_code(u8 *pframe, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt)
  656. {
  657. return rtw_set_fixed_ie(pframe, 2, (u8 *)&(ptxmgmt->status_code), &(pattrib->pktlen));
  658. }
  659. u8 *rtw_tdls_set_dialog(u8 *pframe, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt)
  660. {
  661. u8 dialogtoken = 1;
  662. if (ptxmgmt->dialog_token)
  663. return rtw_set_fixed_ie(pframe, 1, &(ptxmgmt->dialog_token), &(pattrib->pktlen));
  664. else
  665. return rtw_set_fixed_ie(pframe, 1, &(dialogtoken), &(pattrib->pktlen));
  666. }
  667. u8 *rtw_tdls_set_reg_class(u8 *pframe, struct pkt_attrib *pattrib, struct sta_info *ptdls_sta)
  668. {
  669. u8 reg_class = 22;
  670. return rtw_set_fixed_ie(pframe, 1, &(reg_class), &(pattrib->pktlen));
  671. }
  672. u8 *rtw_tdls_set_second_channel_offset(u8 *pframe, struct pkt_attrib *pattrib, u8 ch_offset)
  673. {
  674. return rtw_set_ie(pframe, EID_SecondaryChnlOffset , 1, &ch_offset, &(pattrib->pktlen));
  675. }
  676. u8 *rtw_tdls_set_capability(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)
  677. {
  678. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  679. struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
  680. u8 cap_from_ie[2] = {0};
  681. _rtw_memcpy(cap_from_ie, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);
  682. return rtw_set_fixed_ie(pframe, 2, cap_from_ie, &(pattrib->pktlen));
  683. }
  684. u8 *rtw_tdls_set_supported_rate(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)
  685. {
  686. u8 bssrate[NDIS_802_11_LENGTH_RATES_EX];
  687. int bssrate_len = 0;
  688. u8 more_supportedrates = 0;
  689. rtw_set_supported_rate(bssrate, (padapter->registrypriv.wireless_mode == WIRELESS_MODE_MAX) ? padapter->mlmeextpriv.cur_wireless_mode : padapter->registrypriv.wireless_mode);
  690. bssrate_len = rtw_get_rateset_len(bssrate);
  691. if (bssrate_len > 8) {
  692. pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen));
  693. more_supportedrates = 1;
  694. } else
  695. pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen));
  696. /* extended supported rates */
  697. if (more_supportedrates == 1)
  698. pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen));
  699. return pframe;
  700. }
  701. u8 *rtw_tdls_set_sup_reg_class(u8 *pframe, struct pkt_attrib *pattrib)
  702. {
  703. return rtw_set_ie(pframe, _SRC_IE_ , sizeof(TDLS_SRC), TDLS_SRC, &(pattrib->pktlen));
  704. }
  705. u8 *rtw_tdls_set_linkid(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib, u8 init)
  706. {
  707. struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  708. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  709. u8 link_id_addr[18] = {0};
  710. _rtw_memcpy(link_id_addr, get_my_bssid(&(pmlmeinfo->network)), 6);
  711. if (init == _TRUE) {
  712. _rtw_memcpy((link_id_addr + 6), pattrib->src, 6);
  713. _rtw_memcpy((link_id_addr + 12), pattrib->dst, 6);
  714. } else {
  715. _rtw_memcpy((link_id_addr + 6), pattrib->dst, 6);
  716. _rtw_memcpy((link_id_addr + 12), pattrib->src, 6);
  717. }
  718. return rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen));
  719. }
  720. #ifdef CONFIG_TDLS_CH_SW
  721. u8 *rtw_tdls_set_target_ch(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)
  722. {
  723. u8 target_ch = 1;
  724. if (padapter->tdlsinfo.chsw_info.off_ch_num)
  725. return rtw_set_fixed_ie(pframe, 1, &(padapter->tdlsinfo.chsw_info.off_ch_num), &(pattrib->pktlen));
  726. else
  727. return rtw_set_fixed_ie(pframe, 1, &(target_ch), &(pattrib->pktlen));
  728. }
  729. u8 *rtw_tdls_set_ch_sw(u8 *pframe, struct pkt_attrib *pattrib, struct sta_info *ptdls_sta)
  730. {
  731. u8 ch_switch_timing[4] = {0};
  732. u16 switch_time = (ptdls_sta->ch_switch_time >= TDLS_CH_SWITCH_TIME * 1000) ?
  733. ptdls_sta->ch_switch_time : TDLS_CH_SWITCH_TIME;
  734. u16 switch_timeout = (ptdls_sta->ch_switch_timeout >= TDLS_CH_SWITCH_TIMEOUT * 1000) ?
  735. ptdls_sta->ch_switch_timeout : TDLS_CH_SWITCH_TIMEOUT;
  736. _rtw_memcpy(ch_switch_timing, &switch_time, 2);
  737. _rtw_memcpy(ch_switch_timing + 2, &switch_timeout, 2);
  738. return rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen));
  739. }
  740. void rtw_tdls_set_ch_sw_oper_control(_adapter *padapter, u8 enable)
  741. {
  742. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  743. if (enable == _TRUE) {
  744. #ifdef CONFIG_TDLS_CH_SW_V2
  745. pHalData->ch_switch_offload = _TRUE;
  746. #endif
  747. #ifdef CONFIG_TDLS_CH_SW_BY_DRV
  748. pHalData->ch_switch_offload = _FALSE;
  749. #endif
  750. }
  751. else
  752. pHalData->ch_switch_offload = _FALSE;
  753. if (ATOMIC_READ(&padapter->tdlsinfo.chsw_info.chsw_on) != enable)
  754. ATOMIC_SET(&padapter->tdlsinfo.chsw_info.chsw_on, enable);
  755. rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_BCN_EARLY_C2H_RPT, &enable);
  756. RTW_INFO("[TDLS] %s Bcn Early C2H Report\n", (enable == _TRUE) ? "Start" : "Stop");
  757. }
  758. void rtw_tdls_ch_sw_back_to_base_chnl(_adapter *padapter)
  759. {
  760. struct mlme_priv *pmlmepriv;
  761. struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
  762. pmlmepriv = &padapter->mlmepriv;
  763. if ((ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) &&
  764. (padapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(padapter)))
  765. rtw_tdls_cmd(padapter, pchsw_info->addr, TDLS_CH_SW_TO_BASE_CHNL_UNSOLICITED);
  766. }
  767. static void rtw_tdls_chsw_oper_init(_adapter *padapter, u32 timeout_ms)
  768. {
  769. struct submit_ctx *chsw_sctx = &padapter->tdlsinfo.chsw_info.chsw_sctx;
  770. rtw_sctx_init(chsw_sctx, timeout_ms);
  771. }
  772. static int rtw_tdls_chsw_oper_wait(_adapter *padapter)
  773. {
  774. struct submit_ctx *chsw_sctx = &padapter->tdlsinfo.chsw_info.chsw_sctx;
  775. return rtw_sctx_wait(chsw_sctx, __func__);
  776. }
  777. void rtw_tdls_chsw_oper_done(_adapter *padapter)
  778. {
  779. struct submit_ctx *chsw_sctx = &padapter->tdlsinfo.chsw_info.chsw_sctx;
  780. rtw_sctx_done(&chsw_sctx);
  781. }
  782. s32 rtw_tdls_do_ch_sw(_adapter *padapter, struct sta_info *ptdls_sta, u8 chnl_type, u8 channel, u8 channel_offset, u16 bwmode, u16 ch_switch_time)
  783. {
  784. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  785. u8 center_ch, chnl_offset80 = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  786. u32 ch_sw_time_start, ch_sw_time_spent, wait_time;
  787. u8 take_care_iqk;
  788. s32 ret = _FAIL;
  789. ch_sw_time_start = rtw_systime_to_ms(rtw_get_current_time());
  790. /* set mac_id sleep before channel switch */
  791. rtw_hal_macid_sleep(padapter, ptdls_sta->cmn.mac_id);
  792. #if defined(CONFIG_TDLS_CH_SW_BY_DRV) || defined(CONFIG_TDLS_CH_SW_V2)
  793. set_channel_bwmode(padapter, channel, channel_offset, bwmode);
  794. ret = _SUCCESS;
  795. #else
  796. rtw_tdls_chsw_oper_init(padapter, TDLS_CH_SWITCH_OPER_OFFLOAD_TIMEOUT);
  797. /* channel switch IOs offload to FW */
  798. if (rtw_hal_ch_sw_oper_offload(padapter, channel, channel_offset, bwmode) == _SUCCESS) {
  799. if (rtw_tdls_chsw_oper_wait(padapter) == _SUCCESS) {
  800. /* set channel and bw related variables in driver */
  801. _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);
  802. rtw_set_oper_ch(padapter, channel);
  803. rtw_set_oper_choffset(padapter, channel_offset);
  804. rtw_set_oper_bw(padapter, bwmode);
  805. center_ch = rtw_get_center_ch(channel, bwmode, channel_offset);
  806. pHalData->current_channel = center_ch;
  807. pHalData->CurrentCenterFrequencyIndex1 = center_ch;
  808. pHalData->current_channel_bw = bwmode;
  809. pHalData->nCur40MhzPrimeSC = channel_offset;
  810. if (bwmode == CHANNEL_WIDTH_80) {
  811. if (center_ch > channel)
  812. chnl_offset80 = HAL_PRIME_CHNL_OFFSET_LOWER;
  813. else if (center_ch < channel)
  814. chnl_offset80 = HAL_PRIME_CHNL_OFFSET_UPPER;
  815. else
  816. chnl_offset80 = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  817. }
  818. pHalData->nCur80MhzPrimeSC = chnl_offset80;
  819. pHalData->CurrentCenterFrequencyIndex1 = center_ch;
  820. _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);
  821. rtw_hal_get_hwreg(padapter, HW_VAR_CH_SW_NEED_TO_TAKE_CARE_IQK_INFO, &take_care_iqk);
  822. if (take_care_iqk == _TRUE)
  823. rtw_hal_ch_sw_iqk_info_restore(padapter, CH_SW_USE_CASE_TDLS);
  824. ret = _SUCCESS;
  825. } else
  826. RTW_INFO("[TDLS] chsw oper wait fail !!\n");
  827. }
  828. #endif
  829. if (ret == _SUCCESS) {
  830. ch_sw_time_spent = rtw_systime_to_ms(rtw_get_current_time()) - ch_sw_time_start;
  831. if (chnl_type == TDLS_CH_SW_OFF_CHNL) {
  832. if ((u32)ch_switch_time / 1000 > ch_sw_time_spent)
  833. wait_time = (u32)ch_switch_time / 1000 - ch_sw_time_spent;
  834. else
  835. wait_time = 0;
  836. if (wait_time > 0)
  837. rtw_msleep_os(wait_time);
  838. }
  839. }
  840. /* set mac_id wakeup after channel switch */
  841. rtw_hal_macid_wakeup(padapter, ptdls_sta->cmn.mac_id);
  842. return ret;
  843. }
  844. #endif
  845. u8 *rtw_tdls_set_wmm_params(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)
  846. {
  847. struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  848. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  849. u8 wmm_param_ele[24] = {0};
  850. if (&pmlmeinfo->WMM_param) {
  851. _rtw_memcpy(wmm_param_ele, WMM_PARA_OUI, 6);
  852. if (_rtw_memcmp(&pmlmeinfo->WMM_param, &wmm_param_ele[6], 18) == _TRUE)
  853. /* Use default WMM Param */
  854. _rtw_memcpy(wmm_param_ele + 6, (u8 *)&TDLS_WMM_PARAM_IE, sizeof(TDLS_WMM_PARAM_IE));
  855. else
  856. _rtw_memcpy(wmm_param_ele + 6, (u8 *)&pmlmeinfo->WMM_param, sizeof(pmlmeinfo->WMM_param));
  857. return rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 24, wmm_param_ele, &(pattrib->pktlen));
  858. } else
  859. return pframe;
  860. }
  861. #ifdef CONFIG_WFD
  862. void rtw_tdls_process_wfd_ie(struct tdls_info *ptdlsinfo, u8 *ptr, u8 length)
  863. {
  864. u8 *wfd_ie;
  865. u32 wfd_ielen = 0;
  866. if (!hal_chk_wl_func(tdls_info_to_adapter(ptdlsinfo), WL_FUNC_MIRACAST))
  867. return;
  868. /* Try to get the TCP port information when receiving the negotiation response. */
  869. wfd_ie = rtw_get_wfd_ie(ptr, length, NULL, &wfd_ielen);
  870. while (wfd_ie) {
  871. u8 *attr_content;
  872. u32 attr_contentlen = 0;
  873. int i;
  874. RTW_INFO("[%s] WFD IE Found!!\n", __FUNCTION__);
  875. attr_content = rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, NULL, &attr_contentlen);
  876. if (attr_content && attr_contentlen) {
  877. ptdlsinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16(attr_content + 2);
  878. RTW_INFO("[%s] Peer PORT NUM = %d\n", __FUNCTION__, ptdlsinfo->wfd_info->peer_rtsp_ctrlport);
  879. }
  880. attr_content = rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_LOCAL_IP_ADDR, NULL, &attr_contentlen);
  881. if (attr_content && attr_contentlen) {
  882. _rtw_memcpy(ptdlsinfo->wfd_info->peer_ip_address, (attr_content + 1), 4);
  883. RTW_INFO("[%s] Peer IP = %02u.%02u.%02u.%02u\n", __FUNCTION__,
  884. ptdlsinfo->wfd_info->peer_ip_address[0], ptdlsinfo->wfd_info->peer_ip_address[1],
  885. ptdlsinfo->wfd_info->peer_ip_address[2], ptdlsinfo->wfd_info->peer_ip_address[3]);
  886. }
  887. wfd_ie = rtw_get_wfd_ie(wfd_ie + wfd_ielen, (ptr + length) - (wfd_ie + wfd_ielen), NULL, &wfd_ielen);
  888. }
  889. }
  890. int issue_tunneled_probe_req(_adapter *padapter)
  891. {
  892. struct xmit_frame *pmgntframe;
  893. struct pkt_attrib *pattrib;
  894. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  895. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  896. u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  897. struct tdls_txmgmt txmgmt;
  898. int ret = _FAIL;
  899. RTW_INFO("[%s]\n", __FUNCTION__);
  900. _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
  901. txmgmt.action_code = TUNNELED_PROBE_REQ;
  902. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  903. if (pmgntframe == NULL)
  904. goto exit;
  905. pattrib = &pmgntframe->attrib;
  906. pmgntframe->frame_tag = DATA_FRAMETAG;
  907. pattrib->ether_type = 0x890d;
  908. _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN);
  909. _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
  910. _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  911. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  912. update_tdls_attrib(padapter, pattrib);
  913. pattrib->qsel = pattrib->priority;
  914. if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) != _SUCCESS) {
  915. rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  916. rtw_free_xmitframe(pxmitpriv, pmgntframe);
  917. goto exit;
  918. }
  919. dump_mgntframe(padapter, pmgntframe);
  920. ret = _SUCCESS;
  921. exit:
  922. return ret;
  923. }
  924. int issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame)
  925. {
  926. struct xmit_frame *pmgntframe;
  927. struct pkt_attrib *pattrib;
  928. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  929. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  930. struct tdls_txmgmt txmgmt;
  931. int ret = _FAIL;
  932. RTW_INFO("[%s]\n", __FUNCTION__);
  933. _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
  934. txmgmt.action_code = TUNNELED_PROBE_RSP;
  935. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  936. if (pmgntframe == NULL)
  937. goto exit;
  938. pattrib = &pmgntframe->attrib;
  939. pmgntframe->frame_tag = DATA_FRAMETAG;
  940. pattrib->ether_type = 0x890d;
  941. _rtw_memcpy(pattrib->dst, precv_frame->u.hdr.attrib.src, ETH_ALEN);
  942. _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
  943. _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  944. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  945. update_tdls_attrib(padapter, pattrib);
  946. pattrib->qsel = pattrib->priority;
  947. if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) != _SUCCESS) {
  948. rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  949. rtw_free_xmitframe(pxmitpriv, pmgntframe);
  950. goto exit;
  951. }
  952. dump_mgntframe(padapter, pmgntframe);
  953. ret = _SUCCESS;
  954. exit:
  955. return ret;
  956. }
  957. #endif /* CONFIG_WFD */
  958. int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack)
  959. {
  960. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  961. struct xmit_frame *pmgntframe;
  962. struct pkt_attrib *pattrib;
  963. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  964. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  965. struct sta_priv *pstapriv = &padapter->stapriv;
  966. struct sta_info *ptdls_sta = NULL;
  967. _irqL irqL;
  968. int ret = _FAIL;
  969. /* Retry timer should be set at least 301 sec, using TPK_count counting 301 times. */
  970. u32 timeout_interval = TDLS_TPK_RESEND_COUNT;
  971. RTW_INFO("[TDLS] %s\n", __FUNCTION__);
  972. if (rtw_tdls_is_setup_allowed(padapter) == _FALSE)
  973. goto exit;
  974. if (IS_MCAST(ptxmgmt->peer))
  975. goto exit;
  976. ptdls_sta = rtw_get_stainfo(pstapriv, ptxmgmt->peer);
  977. if (ptdlsinfo->sta_maximum == _TRUE) {
  978. if (ptdls_sta == NULL)
  979. goto exit;
  980. else if (!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE))
  981. goto exit;
  982. }
  983. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  984. if (pmgntframe == NULL)
  985. goto exit;
  986. if (ptdls_sta == NULL) {
  987. ptdls_sta = rtw_alloc_stainfo(pstapriv, ptxmgmt->peer);
  988. if (ptdls_sta == NULL) {
  989. RTW_INFO("[%s] rtw_alloc_stainfo fail\n", __FUNCTION__);
  990. rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  991. rtw_free_xmitframe(pxmitpriv, pmgntframe);
  992. goto exit;
  993. }
  994. ptdlsinfo->sta_cnt++;
  995. }
  996. ptxmgmt->action_code = TDLS_SETUP_REQUEST;
  997. pattrib = &pmgntframe->attrib;
  998. pmgntframe->frame_tag = DATA_FRAMETAG;
  999. pattrib->ether_type = 0x890d;
  1000. _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);
  1001. _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
  1002. _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  1003. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  1004. update_tdls_attrib(padapter, pattrib);
  1005. if (ptdlsinfo->sta_cnt == MAX_ALLOWED_TDLS_STA_NUM)
  1006. ptdlsinfo->sta_maximum = _TRUE;
  1007. ptdls_sta->tdls_sta_state |= TDLS_RESPONDER_STATE;
  1008. if (rtw_tdls_is_driver_setup(padapter) == _TRUE) {
  1009. ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval;
  1010. _set_timer(&ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME);
  1011. }
  1012. pattrib->qsel = pattrib->priority;
  1013. if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {
  1014. rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  1015. rtw_free_xmitframe(pxmitpriv, pmgntframe);
  1016. goto exit;
  1017. }
  1018. if (wait_ack)
  1019. ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);
  1020. else {
  1021. dump_mgntframe(padapter, pmgntframe);
  1022. ret = _SUCCESS;
  1023. }
  1024. exit:
  1025. return ret;
  1026. }
  1027. int _issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta, u8 wait_ack)
  1028. {
  1029. struct xmit_frame *pmgntframe;
  1030. struct pkt_attrib *pattrib;
  1031. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  1032. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  1033. struct sta_priv *pstapriv = &padapter->stapriv;
  1034. _irqL irqL;
  1035. int ret = _FAIL;
  1036. RTW_INFO("[TDLS] %s\n", __FUNCTION__);
  1037. ptxmgmt->action_code = TDLS_TEARDOWN;
  1038. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  1039. if (pmgntframe == NULL)
  1040. goto exit;
  1041. rtw_mi_set_scan_deny(padapter, 550);
  1042. rtw_mi_scan_abort(padapter, _TRUE);
  1043. pattrib = &pmgntframe->attrib;
  1044. pmgntframe->frame_tag = DATA_FRAMETAG;
  1045. pattrib->ether_type = 0x890d;
  1046. _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);
  1047. _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
  1048. if (ptxmgmt->status_code == _RSON_TDLS_TEAR_UN_RSN_)
  1049. _rtw_memcpy(pattrib->ra, ptxmgmt->peer, ETH_ALEN);
  1050. else
  1051. _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  1052. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  1053. update_tdls_attrib(padapter, pattrib);
  1054. pattrib->qsel = pattrib->priority;
  1055. if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {
  1056. rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  1057. rtw_free_xmitframe(pxmitpriv, pmgntframe);
  1058. goto exit;
  1059. }
  1060. if (rtw_tdls_is_driver_setup(padapter) == _TRUE)
  1061. if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)
  1062. if (pattrib->encrypt)
  1063. _cancel_timer_ex(&ptdls_sta->TPK_timer);
  1064. if (wait_ack)
  1065. ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);
  1066. else {
  1067. dump_mgntframe(padapter, pmgntframe);
  1068. ret = _SUCCESS;
  1069. }
  1070. exit:
  1071. return ret;
  1072. }
  1073. int issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack)
  1074. {
  1075. struct sta_info *ptdls_sta = NULL;
  1076. int ret = _FAIL;
  1077. ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), ptxmgmt->peer);
  1078. if (ptdls_sta == NULL) {
  1079. RTW_INFO("No tdls_sta for tearing down\n");
  1080. goto exit;
  1081. }
  1082. ret = _issue_tdls_teardown(padapter, ptxmgmt, ptdls_sta, wait_ack);
  1083. if ((ptxmgmt->status_code == _RSON_TDLS_TEAR_UN_RSN_) && (ret == _FAIL)) {
  1084. /* Change status code and send teardown again via AP */
  1085. ptxmgmt->status_code = _RSON_TDLS_TEAR_TOOFAR_;
  1086. ret = _issue_tdls_teardown(padapter, ptxmgmt, ptdls_sta, wait_ack);
  1087. }
  1088. if (rtw_tdls_is_driver_setup(padapter)) {
  1089. rtw_tdls_teardown_pre_hdl(padapter, ptdls_sta);
  1090. rtw_tdls_cmd(padapter, ptxmgmt->peer, TDLS_TEARDOWN_STA_LOCALLY_POST);
  1091. }
  1092. exit:
  1093. return ret;
  1094. }
  1095. int issue_tdls_dis_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt)
  1096. {
  1097. struct xmit_frame *pmgntframe;
  1098. struct pkt_attrib *pattrib;
  1099. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  1100. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  1101. int ret = _FAIL;
  1102. RTW_INFO("[TDLS] %s\n", __FUNCTION__);
  1103. ptxmgmt->action_code = TDLS_DISCOVERY_REQUEST;
  1104. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  1105. if (pmgntframe == NULL)
  1106. goto exit;
  1107. pattrib = &pmgntframe->attrib;
  1108. pmgntframe->frame_tag = DATA_FRAMETAG;
  1109. pattrib->ether_type = 0x890d;
  1110. _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);
  1111. _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
  1112. _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  1113. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  1114. update_tdls_attrib(padapter, pattrib);
  1115. pattrib->qsel = pattrib->priority;
  1116. if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {
  1117. rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  1118. rtw_free_xmitframe(pxmitpriv, pmgntframe);
  1119. goto exit;
  1120. }
  1121. dump_mgntframe(padapter, pmgntframe);
  1122. RTW_INFO("issue tdls dis req\n");
  1123. ret = _SUCCESS;
  1124. exit:
  1125. return ret;
  1126. }
  1127. int issue_tdls_setup_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt)
  1128. {
  1129. struct xmit_frame *pmgntframe;
  1130. struct pkt_attrib *pattrib;
  1131. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  1132. int ret = _FAIL;
  1133. RTW_INFO("[TDLS] %s\n", __FUNCTION__);
  1134. ptxmgmt->action_code = TDLS_SETUP_RESPONSE;
  1135. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  1136. if (pmgntframe == NULL)
  1137. goto exit;
  1138. pattrib = &pmgntframe->attrib;
  1139. pmgntframe->frame_tag = DATA_FRAMETAG;
  1140. pattrib->ether_type = 0x890d;
  1141. _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);
  1142. _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
  1143. _rtw_memcpy(pattrib->ra, get_bssid(&(padapter->mlmepriv)), ETH_ALEN);
  1144. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  1145. update_tdls_attrib(padapter, pattrib);
  1146. pattrib->qsel = pattrib->priority;
  1147. if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {
  1148. rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  1149. rtw_free_xmitframe(pxmitpriv, pmgntframe);
  1150. goto exit;
  1151. }
  1152. dump_mgntframe(padapter, pmgntframe);
  1153. ret = _SUCCESS;
  1154. exit:
  1155. return ret;
  1156. }
  1157. int issue_tdls_setup_cfm(_adapter *padapter, struct tdls_txmgmt *ptxmgmt)
  1158. {
  1159. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  1160. struct xmit_frame *pmgntframe;
  1161. struct pkt_attrib *pattrib;
  1162. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  1163. int ret = _FAIL;
  1164. RTW_INFO("[TDLS] %s\n", __FUNCTION__);
  1165. ptxmgmt->action_code = TDLS_SETUP_CONFIRM;
  1166. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  1167. if (pmgntframe == NULL)
  1168. goto exit;
  1169. pattrib = &pmgntframe->attrib;
  1170. pmgntframe->frame_tag = DATA_FRAMETAG;
  1171. pattrib->ether_type = 0x890d;
  1172. _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);
  1173. _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
  1174. _rtw_memcpy(pattrib->ra, get_bssid(&padapter->mlmepriv), ETH_ALEN);
  1175. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  1176. update_tdls_attrib(padapter, pattrib);
  1177. pattrib->qsel = pattrib->priority;
  1178. if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {
  1179. rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  1180. rtw_free_xmitframe(pxmitpriv, pmgntframe);
  1181. goto exit;
  1182. }
  1183. dump_mgntframe(padapter, pmgntframe);
  1184. ret = _SUCCESS;
  1185. exit:
  1186. return ret;
  1187. }
  1188. /* TDLS Discovery Response frame is a management action frame */
  1189. int issue_tdls_dis_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 privacy)
  1190. {
  1191. struct xmit_frame *pmgntframe;
  1192. struct pkt_attrib *pattrib;
  1193. unsigned char *pframe;
  1194. struct rtw_ieee80211_hdr *pwlanhdr;
  1195. unsigned short *fctrl;
  1196. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  1197. struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  1198. int ret = _FAIL;
  1199. RTW_INFO("[TDLS] %s\n", __FUNCTION__);
  1200. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  1201. if (pmgntframe == NULL)
  1202. goto exit;
  1203. pattrib = &pmgntframe->attrib;
  1204. update_mgntframe_attrib(padapter, pattrib);
  1205. _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  1206. pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  1207. pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  1208. fctrl = &(pwlanhdr->frame_ctl);
  1209. *(fctrl) = 0;
  1210. /* unicast probe request frame */
  1211. _rtw_memcpy(pwlanhdr->addr1, ptxmgmt->peer, ETH_ALEN);
  1212. _rtw_memcpy(pattrib->dst, pwlanhdr->addr1, ETH_ALEN);
  1213. _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);
  1214. _rtw_memcpy(pattrib->src, pwlanhdr->addr2, ETH_ALEN);
  1215. _rtw_memcpy(pwlanhdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN);
  1216. _rtw_memcpy(pattrib->ra, pwlanhdr->addr3, ETH_ALEN);
  1217. SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
  1218. pmlmeext->mgnt_seq++;
  1219. set_frame_sub_type(pframe, WIFI_ACTION);
  1220. pframe += sizeof(struct rtw_ieee80211_hdr_3addr);
  1221. pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  1222. rtw_build_tdls_dis_rsp_ies(padapter, pmgntframe, pframe, ptxmgmt, privacy);
  1223. pattrib->nr_frags = 1;
  1224. pattrib->last_txcmdsz = pattrib->pktlen;
  1225. dump_mgntframe(padapter, pmgntframe);
  1226. ret = _SUCCESS;
  1227. exit:
  1228. return ret;
  1229. }
  1230. int issue_tdls_peer_traffic_rsp(_adapter *padapter, struct sta_info *ptdls_sta, struct tdls_txmgmt *ptxmgmt)
  1231. {
  1232. struct xmit_frame *pmgntframe;
  1233. struct pkt_attrib *pattrib;
  1234. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  1235. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  1236. int ret = _FAIL;
  1237. RTW_INFO("[TDLS] %s\n", __FUNCTION__);
  1238. ptxmgmt->action_code = TDLS_PEER_TRAFFIC_RESPONSE;
  1239. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  1240. if (pmgntframe == NULL)
  1241. goto exit;
  1242. pattrib = &pmgntframe->attrib;
  1243. pmgntframe->frame_tag = DATA_FRAMETAG;
  1244. pattrib->ether_type = 0x890d;
  1245. _rtw_memcpy(pattrib->dst, ptdls_sta->cmn.mac_addr, ETH_ALEN);
  1246. _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
  1247. _rtw_memcpy(pattrib->ra, ptdls_sta->cmn.mac_addr, ETH_ALEN);
  1248. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  1249. update_tdls_attrib(padapter, pattrib);
  1250. pattrib->qsel = pattrib->priority;
  1251. if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {
  1252. rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  1253. rtw_free_xmitframe(pxmitpriv, pmgntframe);
  1254. goto exit;
  1255. }
  1256. dump_mgntframe(padapter, pmgntframe);
  1257. ret = _SUCCESS;
  1258. exit:
  1259. return ret;
  1260. }
  1261. int issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptdls_sta)
  1262. {
  1263. struct xmit_frame *pmgntframe;
  1264. struct pkt_attrib *pattrib;
  1265. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  1266. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  1267. struct tdls_txmgmt txmgmt;
  1268. int ret = _FAIL;
  1269. RTW_INFO("[TDLS] %s\n", __FUNCTION__);
  1270. _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
  1271. txmgmt.action_code = TDLS_PEER_TRAFFIC_INDICATION;
  1272. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  1273. if (pmgntframe == NULL)
  1274. goto exit;
  1275. pattrib = &pmgntframe->attrib;
  1276. pmgntframe->frame_tag = DATA_FRAMETAG;
  1277. pattrib->ether_type = 0x890d;
  1278. _rtw_memcpy(pattrib->dst, ptdls_sta->cmn.mac_addr, ETH_ALEN);
  1279. _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
  1280. _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  1281. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  1282. /* PTI frame's priority should be AC_VO */
  1283. pattrib->priority = 7;
  1284. update_tdls_attrib(padapter, pattrib);
  1285. pattrib->qsel = pattrib->priority;
  1286. if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) != _SUCCESS) {
  1287. rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  1288. rtw_free_xmitframe(pxmitpriv, pmgntframe);
  1289. goto exit;
  1290. }
  1291. dump_mgntframe(padapter, pmgntframe);
  1292. ret = _SUCCESS;
  1293. exit:
  1294. return ret;
  1295. }
  1296. #ifdef CONFIG_TDLS_CH_SW
  1297. int issue_tdls_ch_switch_req(_adapter *padapter, struct sta_info *ptdls_sta)
  1298. {
  1299. struct xmit_frame *pmgntframe;
  1300. struct pkt_attrib *pattrib;
  1301. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  1302. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  1303. struct tdls_txmgmt txmgmt;
  1304. int ret = _FAIL;
  1305. RTW_INFO("[TDLS] %s\n", __FUNCTION__);
  1306. if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE) {
  1307. RTW_INFO("[TDLS] Ignore %s since channel switch is not allowed\n", __func__);
  1308. goto exit;
  1309. }
  1310. _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
  1311. txmgmt.action_code = TDLS_CHANNEL_SWITCH_REQUEST;
  1312. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  1313. if (pmgntframe == NULL)
  1314. goto exit;
  1315. pattrib = &pmgntframe->attrib;
  1316. pmgntframe->frame_tag = DATA_FRAMETAG;
  1317. pattrib->ether_type = 0x890d;
  1318. _rtw_memcpy(pattrib->dst, ptdls_sta->cmn.mac_addr, ETH_ALEN);
  1319. _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
  1320. _rtw_memcpy(pattrib->ra, ptdls_sta->cmn.mac_addr, ETH_ALEN);
  1321. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  1322. update_tdls_attrib(padapter, pattrib);
  1323. pattrib->qsel = pattrib->priority;
  1324. if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) != _SUCCESS) {
  1325. rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  1326. rtw_free_xmitframe(pxmitpriv, pmgntframe);
  1327. goto exit;
  1328. }
  1329. dump_mgntframe(padapter, pmgntframe);
  1330. ret = _SUCCESS;
  1331. exit:
  1332. return ret;
  1333. }
  1334. int issue_tdls_ch_switch_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack)
  1335. {
  1336. struct xmit_frame *pmgntframe;
  1337. struct pkt_attrib *pattrib;
  1338. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  1339. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  1340. int ret = _FAIL;
  1341. RTW_INFO("[TDLS] %s\n", __FUNCTION__);
  1342. if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE) {
  1343. RTW_INFO("[TDLS] Ignore %s since channel switch is not allowed\n", __func__);
  1344. goto exit;
  1345. }
  1346. ptxmgmt->action_code = TDLS_CHANNEL_SWITCH_RESPONSE;
  1347. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  1348. if (pmgntframe == NULL)
  1349. goto exit;
  1350. pattrib = &pmgntframe->attrib;
  1351. pmgntframe->frame_tag = DATA_FRAMETAG;
  1352. pattrib->ether_type = 0x890d;
  1353. _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);
  1354. _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
  1355. _rtw_memcpy(pattrib->ra, ptxmgmt->peer, ETH_ALEN);
  1356. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  1357. update_tdls_attrib(padapter, pattrib);
  1358. pattrib->qsel = pattrib->priority;
  1359. /*
  1360. _enter_critical_bh(&pxmitpriv->lock, &irqL);
  1361. if(xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pmgntframe)==_TRUE){
  1362. _exit_critical_bh(&pxmitpriv->lock, &irqL);
  1363. return _FALSE;
  1364. }
  1365. */
  1366. if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {
  1367. rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);
  1368. rtw_free_xmitframe(pxmitpriv, pmgntframe);
  1369. goto exit;
  1370. }
  1371. if (wait_ack)
  1372. ret = dump_mgntframe_and_wait_ack_timeout(padapter, pmgntframe, 10);
  1373. else {
  1374. dump_mgntframe(padapter, pmgntframe);
  1375. ret = _SUCCESS;
  1376. }
  1377. exit:
  1378. return ret;
  1379. }
  1380. #endif
  1381. int On_TDLS_Dis_Rsp(_adapter *padapter, union recv_frame *precv_frame)
  1382. {
  1383. struct sta_info *ptdls_sta = NULL, *psta = rtw_get_stainfo(&(padapter->stapriv), get_bssid(&(padapter->mlmepriv)));
  1384. struct recv_priv *precvpriv = &(padapter->recvpriv);
  1385. u8 *ptr = precv_frame->u.hdr.rx_data, *psa;
  1386. struct rx_pkt_attrib *pattrib = &(precv_frame->u.hdr.attrib);
  1387. struct tdls_info *ptdlsinfo = &(padapter->tdlsinfo);
  1388. u8 empty_addr[ETH_ALEN] = { 0x00 };
  1389. int rssi = 0;
  1390. struct tdls_txmgmt txmgmt;
  1391. int ret = _SUCCESS;
  1392. if (psta)
  1393. rssi = psta->cmn.rssi_stat.rssi;
  1394. _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
  1395. /* WFDTDLS: for sigma test, not to setup direct link automatically */
  1396. ptdlsinfo->dev_discovered = _TRUE;
  1397. psa = get_sa(ptr);
  1398. ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), psa);
  1399. if (ptdls_sta != NULL)
  1400. ptdls_sta->sta_stats.rx_tdls_disc_rsp_pkts++;
  1401. #ifdef CONFIG_TDLS_AUTOSETUP
  1402. if (ptdls_sta != NULL) {
  1403. /* Record the tdls sta with lowest signal strength */
  1404. if (ptdlsinfo->sta_maximum == _TRUE && ptdls_sta->alive_count >= 1) {
  1405. if (_rtw_memcmp(ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN)) {
  1406. _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN);
  1407. ptdlsinfo->ss_record.RxPWDBAll = pattrib->phy_info.rx_pwdb_all;
  1408. } else {
  1409. if (ptdlsinfo->ss_record.RxPWDBAll < pattrib->phy_info.rx_pwdb_all) {
  1410. _rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN);
  1411. ptdlsinfo->ss_record.RxPWDBAll = pattrib->phy_info.rx_pwdb_all;
  1412. }
  1413. }
  1414. }
  1415. } else {
  1416. if (ptdlsinfo->sta_maximum == _TRUE) {
  1417. if (_rtw_memcmp(ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN)) {
  1418. /* All traffics are busy, do not set up another direct link. */
  1419. ret = _FAIL;
  1420. goto exit;
  1421. } else {
  1422. if (pattrib->phy_info.rx_pwdb_all > ptdlsinfo->ss_record.RxPWDBAll) {
  1423. _rtw_memcpy(txmgmt.peer, ptdlsinfo->ss_record.macaddr, ETH_ALEN);
  1424. /* issue_tdls_teardown(padapter, ptdlsinfo->ss_record.macaddr, _FALSE); */
  1425. } else {
  1426. ret = _FAIL;
  1427. goto exit;
  1428. }
  1429. }
  1430. }
  1431. if (pattrib->phy_info.rx_pwdb_all + TDLS_SIGNAL_THRESH >= rssi) {
  1432. RTW_INFO("pattrib->RxPWDBAll=%d, pdmpriv->undecorated_smoothed_pwdb=%d\n", pattrib->phy_info.rx_pwdb_all, rssi);
  1433. _rtw_memcpy(txmgmt.peer, psa, ETH_ALEN);
  1434. issue_tdls_setup_req(padapter, &txmgmt, _FALSE);
  1435. }
  1436. }
  1437. #endif /* CONFIG_TDLS_AUTOSETUP */
  1438. exit:
  1439. return ret;
  1440. }
  1441. sint On_TDLS_Setup_Req(_adapter *padapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta)
  1442. {
  1443. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  1444. u8 *psa, *pmyid;
  1445. struct sta_priv *pstapriv = &padapter->stapriv;
  1446. u8 *ptr = precv_frame->u.hdr.rx_data;
  1447. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  1448. struct security_priv *psecuritypriv = &padapter->securitypriv;
  1449. _irqL irqL;
  1450. struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  1451. u8 *prsnie, *ppairwise_cipher;
  1452. u8 i, k;
  1453. u8 ccmp_included = 0, rsnie_included = 0;
  1454. u16 j, pairwise_count;
  1455. u8 SNonce[32];
  1456. u32 timeout_interval = TDLS_TPK_RESEND_COUNT;
  1457. sint parsing_length; /* Frame body length, without icv_len */
  1458. PNDIS_802_11_VARIABLE_IEs pIE;
  1459. u8 FIXED_IE = 5;
  1460. unsigned char supportRate[16];
  1461. int supportRateNum = 0;
  1462. struct tdls_txmgmt txmgmt;
  1463. if (rtw_tdls_is_setup_allowed(padapter) == _FALSE)
  1464. goto exit;
  1465. _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
  1466. psa = get_sa(ptr);
  1467. if (ptdlsinfo->sta_maximum == _TRUE) {
  1468. if (ptdls_sta == NULL)
  1469. goto exit;
  1470. else if (!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE))
  1471. goto exit;
  1472. }
  1473. pmyid = adapter_mac_addr(padapter);
  1474. ptr += prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN;
  1475. parsing_length = ((union recv_frame *)precv_frame)->u.hdr.len
  1476. - prx_pkt_attrib->hdrlen
  1477. - prx_pkt_attrib->iv_len
  1478. - prx_pkt_attrib->icv_len
  1479. - LLC_HEADER_SIZE
  1480. - ETH_TYPE_LEN
  1481. - PAYLOAD_TYPE_LEN;
  1482. if (ptdls_sta == NULL) {
  1483. ptdls_sta = rtw_alloc_stainfo(pstapriv, psa);
  1484. if (ptdls_sta == NULL)
  1485. goto exit;
  1486. ptdlsinfo->sta_cnt++;
  1487. }
  1488. else {
  1489. if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) {
  1490. /* If the direct link is already set up */
  1491. /* Process as re-setup after tear down */
  1492. RTW_INFO("re-setup a direct link\n");
  1493. }
  1494. /* Already receiving TDLS setup request */
  1495. else if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE) {
  1496. RTW_INFO("receive duplicated TDLS setup request frame in handshaking\n");
  1497. goto exit;
  1498. }
  1499. /* When receiving and sending setup_req to the same link at the same time */
  1500. /* STA with higher MAC_addr would be initiator */
  1501. else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE) {
  1502. RTW_INFO("receive setup_req after sending setup_req\n");
  1503. for (i = 0; i < 6; i++) {
  1504. if (*(pmyid + i) == *(psa + i)) {
  1505. } else if (*(pmyid + i) > *(psa + i)) {
  1506. ptdls_sta->tdls_sta_state = TDLS_INITIATOR_STATE;
  1507. break;
  1508. } else if (*(pmyid + i) < *(psa + i))
  1509. goto exit;
  1510. }
  1511. }
  1512. }
  1513. if (ptdls_sta) {
  1514. txmgmt.dialog_token = *(ptr + 2); /* Copy dialog token */
  1515. txmgmt.status_code = _STATS_SUCCESSFUL_;
  1516. /* Parsing information element */
  1517. for (j = FIXED_IE; j < parsing_length;) {
  1518. pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j);
  1519. switch (pIE->ElementID) {
  1520. case _SUPPORTEDRATES_IE_:
  1521. _rtw_memcpy(supportRate, pIE->data, pIE->Length);
  1522. supportRateNum = pIE->Length;
  1523. break;
  1524. case _COUNTRY_IE_:
  1525. break;
  1526. case _EXT_SUPPORTEDRATES_IE_:
  1527. if (supportRateNum < sizeof(supportRate)) {
  1528. _rtw_memcpy(supportRate + supportRateNum, pIE->data, pIE->Length);
  1529. supportRateNum += pIE->Length;
  1530. }
  1531. break;
  1532. case _SUPPORTED_CH_IE_:
  1533. break;
  1534. case _RSN_IE_2_:
  1535. rsnie_included = 1;
  1536. if (prx_pkt_attrib->encrypt) {
  1537. prsnie = (u8 *)pIE;
  1538. /* Check CCMP pairwise_cipher presence. */
  1539. ppairwise_cipher = prsnie + 10;
  1540. _rtw_memcpy(ptdls_sta->TDLS_RSNIE, pIE->data, pIE->Length);
  1541. pairwise_count = *(u16 *)(ppairwise_cipher - 2);
  1542. for (k = 0; k < pairwise_count; k++) {
  1543. if (_rtw_memcmp(ppairwise_cipher + 4 * k, RSN_CIPHER_SUITE_CCMP, 4) == _TRUE)
  1544. ccmp_included = 1;
  1545. }
  1546. if (ccmp_included == 0)
  1547. txmgmt.status_code = _STATS_INVALID_RSNIE_;
  1548. }
  1549. break;
  1550. case _EXT_CAP_IE_:
  1551. break;
  1552. case _VENDOR_SPECIFIC_IE_:
  1553. break;
  1554. case _FTIE_:
  1555. if (prx_pkt_attrib->encrypt)
  1556. _rtw_memcpy(SNonce, (ptr + j + 52), 32);
  1557. break;
  1558. case _TIMEOUT_ITVL_IE_:
  1559. if (prx_pkt_attrib->encrypt)
  1560. timeout_interval = cpu_to_le32(*(u32 *)(ptr + j + 3));
  1561. break;
  1562. case _RIC_Descriptor_IE_:
  1563. break;
  1564. #ifdef CONFIG_80211N_HT
  1565. case _HT_CAPABILITY_IE_:
  1566. rtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length);
  1567. break;
  1568. #endif
  1569. #ifdef CONFIG_80211AC_VHT
  1570. case EID_AID:
  1571. break;
  1572. case EID_VHTCapability:
  1573. rtw_tdls_process_vht_cap(padapter, ptdls_sta, pIE->data, pIE->Length);
  1574. break;
  1575. #endif
  1576. case EID_BSSCoexistence:
  1577. break;
  1578. case _LINK_ID_IE_:
  1579. if (_rtw_memcmp(get_bssid(pmlmepriv), pIE->data, 6) == _FALSE)
  1580. txmgmt.status_code = _STATS_NOT_IN_SAME_BSS_;
  1581. break;
  1582. default:
  1583. break;
  1584. }
  1585. j += (pIE->Length + 2);
  1586. }
  1587. /* Check status code */
  1588. /* If responder STA has/hasn't security on AP, but request hasn't/has RSNIE, it should reject */
  1589. if (txmgmt.status_code == _STATS_SUCCESSFUL_) {
  1590. if (rsnie_included && prx_pkt_attrib->encrypt == 0)
  1591. txmgmt.status_code = _STATS_SEC_DISABLED_;
  1592. else if (rsnie_included == 0 && prx_pkt_attrib->encrypt)
  1593. txmgmt.status_code = _STATS_INVALID_PARAMETERS_;
  1594. #ifdef CONFIG_WFD
  1595. /* WFD test plan version 0.18.2 test item 5.1.5 */
  1596. /* SoUT does not use TDLS if AP uses weak security */
  1597. if (padapter->wdinfo.wfd_tdls_enable && (rsnie_included && prx_pkt_attrib->encrypt != _AES_))
  1598. txmgmt.status_code = _STATS_SEC_DISABLED_;
  1599. #endif /* CONFIG_WFD */
  1600. }
  1601. ptdls_sta->tdls_sta_state |= TDLS_INITIATOR_STATE;
  1602. if (prx_pkt_attrib->encrypt) {
  1603. _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32);
  1604. if (timeout_interval <= 300)
  1605. ptdls_sta->TDLS_PeerKey_Lifetime = TDLS_TPK_RESEND_COUNT;
  1606. else
  1607. ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval;
  1608. }
  1609. /* Update station supportRate */
  1610. ptdls_sta->bssratelen = supportRateNum;
  1611. _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum);
  1612. /* -2: AP + BC/MC sta, -4: default key */
  1613. if (ptdlsinfo->sta_cnt == MAX_ALLOWED_TDLS_STA_NUM)
  1614. ptdlsinfo->sta_maximum = _TRUE;
  1615. #ifdef CONFIG_WFD
  1616. rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length);
  1617. #endif
  1618. } else
  1619. goto exit;
  1620. _rtw_memcpy(txmgmt.peer, prx_pkt_attrib->src, ETH_ALEN);
  1621. if (rtw_tdls_is_driver_setup(padapter)) {
  1622. issue_tdls_setup_rsp(padapter, &txmgmt);
  1623. if (txmgmt.status_code == _STATS_SUCCESSFUL_)
  1624. _set_timer(&ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME);
  1625. else {
  1626. rtw_tdls_teardown_pre_hdl(padapter, ptdls_sta);
  1627. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_TEARDOWN_STA_LOCALLY_POST);
  1628. }
  1629. }
  1630. exit:
  1631. return _SUCCESS;
  1632. }
  1633. int On_TDLS_Setup_Rsp(_adapter *padapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta)
  1634. {
  1635. struct registry_priv *pregistrypriv = &padapter->registrypriv;
  1636. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  1637. struct sta_priv *pstapriv = &padapter->stapriv;
  1638. u8 *ptr = precv_frame->u.hdr.rx_data;
  1639. _irqL irqL;
  1640. struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  1641. u8 *psa;
  1642. u16 status_code = 0;
  1643. sint parsing_length; /* Frame body length, without icv_len */
  1644. PNDIS_802_11_VARIABLE_IEs pIE;
  1645. u8 FIXED_IE = 7;
  1646. u8 ANonce[32];
  1647. u8 *pftie = NULL, *ptimeout_ie = NULL, *plinkid_ie = NULL, *prsnie = NULL, *pftie_mic = NULL, *ppairwise_cipher = NULL;
  1648. u16 pairwise_count, j, k;
  1649. u8 verify_ccmp = 0;
  1650. unsigned char supportRate[16];
  1651. int supportRateNum = 0;
  1652. struct tdls_txmgmt txmgmt;
  1653. int ret = _SUCCESS;
  1654. u32 timeout_interval = TDLS_TPK_RESEND_COUNT;
  1655. _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
  1656. psa = get_sa(ptr);
  1657. ptr += prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN;
  1658. parsing_length = ((union recv_frame *)precv_frame)->u.hdr.len
  1659. - prx_pkt_attrib->hdrlen
  1660. - prx_pkt_attrib->iv_len
  1661. - prx_pkt_attrib->icv_len
  1662. - LLC_HEADER_SIZE
  1663. - ETH_TYPE_LEN
  1664. - PAYLOAD_TYPE_LEN;
  1665. _rtw_memcpy(&status_code, ptr + 2, 2);
  1666. if (status_code != 0) {
  1667. RTW_INFO("[TDLS] %s status_code = %d, free_tdls_sta\n", __FUNCTION__, status_code);
  1668. rtw_tdls_teardown_pre_hdl(padapter, ptdls_sta);
  1669. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_TEARDOWN_STA_LOCALLY_POST);
  1670. ret = _FAIL;
  1671. goto exit;
  1672. }
  1673. status_code = 0;
  1674. /* parsing information element */
  1675. for (j = FIXED_IE; j < parsing_length;) {
  1676. pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j);
  1677. switch (pIE->ElementID) {
  1678. case _SUPPORTEDRATES_IE_:
  1679. _rtw_memcpy(supportRate, pIE->data, pIE->Length);
  1680. supportRateNum = pIE->Length;
  1681. break;
  1682. case _COUNTRY_IE_:
  1683. break;
  1684. case _EXT_SUPPORTEDRATES_IE_:
  1685. if (supportRateNum < sizeof(supportRate)) {
  1686. _rtw_memcpy(supportRate + supportRateNum, pIE->data, pIE->Length);
  1687. supportRateNum += pIE->Length;
  1688. }
  1689. break;
  1690. case _SUPPORTED_CH_IE_:
  1691. break;
  1692. case _RSN_IE_2_:
  1693. prsnie = (u8 *)pIE;
  1694. /* Check CCMP pairwise_cipher presence. */
  1695. ppairwise_cipher = prsnie + 10;
  1696. _rtw_memcpy(&pairwise_count, (u16 *)(ppairwise_cipher - 2), 2);
  1697. for (k = 0; k < pairwise_count; k++) {
  1698. if (_rtw_memcmp(ppairwise_cipher + 4 * k, RSN_CIPHER_SUITE_CCMP, 4) == _TRUE)
  1699. verify_ccmp = 1;
  1700. }
  1701. case _EXT_CAP_IE_:
  1702. break;
  1703. case _VENDOR_SPECIFIC_IE_:
  1704. if (_rtw_memcmp((u8 *)pIE + 2, WMM_INFO_OUI, 6) == _TRUE) {
  1705. /* WMM Info ID and OUI */
  1706. if ((pregistrypriv->wmm_enable == _TRUE) || (padapter->mlmepriv.htpriv.ht_option == _TRUE))
  1707. ptdls_sta->qos_option = _TRUE;
  1708. }
  1709. break;
  1710. case _FTIE_:
  1711. pftie = (u8 *)pIE;
  1712. _rtw_memcpy(ANonce, (ptr + j + 20), 32);
  1713. break;
  1714. case _TIMEOUT_ITVL_IE_:
  1715. ptimeout_ie = (u8 *)pIE;
  1716. timeout_interval = cpu_to_le32(*(u32 *)(ptimeout_ie + 3));
  1717. break;
  1718. case _RIC_Descriptor_IE_:
  1719. break;
  1720. #ifdef CONFIG_80211N_HT
  1721. case _HT_CAPABILITY_IE_:
  1722. rtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length);
  1723. break;
  1724. #endif
  1725. #ifdef CONFIG_80211AC_VHT
  1726. case EID_AID:
  1727. /* todo in the future if necessary */
  1728. break;
  1729. case EID_VHTCapability:
  1730. rtw_tdls_process_vht_cap(padapter, ptdls_sta, pIE->data, pIE->Length);
  1731. break;
  1732. case EID_OpModeNotification:
  1733. rtw_tdls_process_vht_op_mode_notify(padapter, ptdls_sta, pIE->data, pIE->Length);
  1734. break;
  1735. #endif
  1736. case EID_BSSCoexistence:
  1737. break;
  1738. case _LINK_ID_IE_:
  1739. plinkid_ie = (u8 *)pIE;
  1740. break;
  1741. default:
  1742. break;
  1743. }
  1744. j += (pIE->Length + 2);
  1745. }
  1746. ptdls_sta->bssratelen = supportRateNum;
  1747. _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum);
  1748. _rtw_memcpy(ptdls_sta->ANonce, ANonce, 32);
  1749. #ifdef CONFIG_WFD
  1750. rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length);
  1751. #endif
  1752. if (prx_pkt_attrib->encrypt) {
  1753. if (verify_ccmp == 1) {
  1754. txmgmt.status_code = _STATS_SUCCESSFUL_;
  1755. if (rtw_tdls_is_driver_setup(padapter) == _TRUE) {
  1756. wpa_tdls_generate_tpk(padapter, ptdls_sta);
  1757. if (tdls_verify_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie) == _FAIL) {
  1758. RTW_INFO("[TDLS] %s tdls_verify_mic fail, free_tdls_sta\n", __FUNCTION__);
  1759. rtw_tdls_teardown_pre_hdl(padapter, ptdls_sta);
  1760. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_TEARDOWN_STA_LOCALLY_POST);
  1761. ret = _FAIL;
  1762. goto exit;
  1763. }
  1764. ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval;
  1765. }
  1766. } else
  1767. txmgmt.status_code = _STATS_INVALID_RSNIE_;
  1768. } else
  1769. txmgmt.status_code = _STATS_SUCCESSFUL_;
  1770. if (rtw_tdls_is_driver_setup(padapter) == _TRUE) {
  1771. _rtw_memcpy(txmgmt.peer, prx_pkt_attrib->src, ETH_ALEN);
  1772. issue_tdls_setup_cfm(padapter, &txmgmt);
  1773. if (txmgmt.status_code == _STATS_SUCCESSFUL_) {
  1774. rtw_tdls_set_link_established(padapter, _TRUE);
  1775. if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE) {
  1776. ptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE;
  1777. ptdls_sta->state |= _FW_LINKED;
  1778. _cancel_timer_ex(&ptdls_sta->handshake_timer);
  1779. }
  1780. if (prx_pkt_attrib->encrypt)
  1781. rtw_tdls_set_key(padapter, ptdls_sta);
  1782. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_ESTABLISHED);
  1783. }
  1784. }
  1785. exit:
  1786. if (rtw_tdls_is_driver_setup(padapter) == _TRUE)
  1787. return ret;
  1788. else
  1789. return _SUCCESS;
  1790. }
  1791. int On_TDLS_Setup_Cfm(_adapter *padapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta)
  1792. {
  1793. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  1794. struct sta_priv *pstapriv = &padapter->stapriv;
  1795. u8 *ptr = precv_frame->u.hdr.rx_data;
  1796. _irqL irqL;
  1797. struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  1798. u8 *psa;
  1799. u16 status_code = 0;
  1800. sint parsing_length;
  1801. PNDIS_802_11_VARIABLE_IEs pIE;
  1802. u8 FIXED_IE = 5;
  1803. u8 *pftie = NULL, *ptimeout_ie = NULL, *plinkid_ie = NULL, *prsnie = NULL, *pftie_mic = NULL, *ppairwise_cipher = NULL;
  1804. u16 j, pairwise_count;
  1805. int ret = _SUCCESS;
  1806. psa = get_sa(ptr);
  1807. ptr += prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN;
  1808. parsing_length = ((union recv_frame *)precv_frame)->u.hdr.len
  1809. - prx_pkt_attrib->hdrlen
  1810. - prx_pkt_attrib->iv_len
  1811. - prx_pkt_attrib->icv_len
  1812. - LLC_HEADER_SIZE
  1813. - ETH_TYPE_LEN
  1814. - PAYLOAD_TYPE_LEN;
  1815. _rtw_memcpy(&status_code, ptr + 2, 2);
  1816. if (status_code != 0) {
  1817. RTW_INFO("[%s] status_code = %d\n, free_tdls_sta", __FUNCTION__, status_code);
  1818. rtw_tdls_teardown_pre_hdl(padapter, ptdls_sta);
  1819. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_TEARDOWN_STA_LOCALLY_POST);
  1820. ret = _FAIL;
  1821. goto exit;
  1822. }
  1823. /* Parsing information element */
  1824. for (j = FIXED_IE; j < parsing_length;) {
  1825. pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j);
  1826. switch (pIE->ElementID) {
  1827. case _RSN_IE_2_:
  1828. prsnie = (u8 *)pIE;
  1829. break;
  1830. case _VENDOR_SPECIFIC_IE_:
  1831. if (_rtw_memcmp((u8 *)pIE + 2, WMM_PARA_OUI, 6) == _TRUE) {
  1832. /* WMM Parameter ID and OUI */
  1833. ptdls_sta->qos_option = _TRUE;
  1834. }
  1835. break;
  1836. case _FTIE_:
  1837. pftie = (u8 *)pIE;
  1838. break;
  1839. case _TIMEOUT_ITVL_IE_:
  1840. ptimeout_ie = (u8 *)pIE;
  1841. break;
  1842. #ifdef CONFIG_80211N_HT
  1843. case _HT_EXTRA_INFO_IE_:
  1844. break;
  1845. #endif
  1846. #ifdef CONFIG_80211AC_VHT
  1847. case EID_VHTOperation:
  1848. rtw_tdls_process_vht_operation(padapter, ptdls_sta, pIE->data, pIE->Length);
  1849. break;
  1850. case EID_OpModeNotification:
  1851. rtw_tdls_process_vht_op_mode_notify(padapter, ptdls_sta, pIE->data, pIE->Length);
  1852. break;
  1853. #endif
  1854. case _LINK_ID_IE_:
  1855. plinkid_ie = (u8 *)pIE;
  1856. break;
  1857. default:
  1858. break;
  1859. }
  1860. j += (pIE->Length + 2);
  1861. }
  1862. if (prx_pkt_attrib->encrypt) {
  1863. /* Verify mic in FTIE MIC field */
  1864. if (rtw_tdls_is_driver_setup(padapter) &&
  1865. (tdls_verify_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie) == _FAIL)) {
  1866. rtw_tdls_teardown_pre_hdl(padapter, ptdls_sta);
  1867. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_TEARDOWN_STA_LOCALLY_POST);
  1868. ret = _FAIL;
  1869. goto exit;
  1870. }
  1871. }
  1872. if (rtw_tdls_is_driver_setup(padapter)) {
  1873. rtw_tdls_set_link_established(padapter, _TRUE);
  1874. if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE) {
  1875. ptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE;
  1876. ptdls_sta->state |= _FW_LINKED;
  1877. _cancel_timer_ex(&ptdls_sta->handshake_timer);
  1878. }
  1879. if (prx_pkt_attrib->encrypt) {
  1880. rtw_tdls_set_key(padapter, ptdls_sta);
  1881. /* Start TPK timer */
  1882. ptdls_sta->TPK_count = 0;
  1883. _set_timer(&ptdls_sta->TPK_timer, ONE_SEC);
  1884. }
  1885. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_ESTABLISHED);
  1886. }
  1887. exit:
  1888. return ret;
  1889. }
  1890. int On_TDLS_Dis_Req(_adapter *padapter, union recv_frame *precv_frame)
  1891. {
  1892. struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  1893. struct sta_priv *pstapriv = &padapter->stapriv;
  1894. struct sta_info *psta_ap;
  1895. u8 *ptr = precv_frame->u.hdr.rx_data;
  1896. sint parsing_length; /* Frame body length, without icv_len */
  1897. PNDIS_802_11_VARIABLE_IEs pIE;
  1898. u8 FIXED_IE = 3, *dst;
  1899. u16 j;
  1900. struct tdls_txmgmt txmgmt;
  1901. int ret = _SUCCESS;
  1902. if (rtw_tdls_is_driver_setup(padapter) == _FALSE)
  1903. goto exit;
  1904. _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
  1905. ptr += prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN;
  1906. txmgmt.dialog_token = *(ptr + 2);
  1907. _rtw_memcpy(&txmgmt.peer, precv_frame->u.hdr.attrib.src, ETH_ALEN);
  1908. txmgmt.action_code = TDLS_DISCOVERY_RESPONSE;
  1909. parsing_length = ((union recv_frame *)precv_frame)->u.hdr.len
  1910. - prx_pkt_attrib->hdrlen
  1911. - prx_pkt_attrib->iv_len
  1912. - prx_pkt_attrib->icv_len
  1913. - LLC_HEADER_SIZE
  1914. - ETH_TYPE_LEN
  1915. - PAYLOAD_TYPE_LEN;
  1916. /* Parsing information element */
  1917. for (j = FIXED_IE; j < parsing_length;) {
  1918. pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j);
  1919. switch (pIE->ElementID) {
  1920. case _LINK_ID_IE_:
  1921. psta_ap = rtw_get_stainfo(pstapriv, pIE->data);
  1922. if (psta_ap == NULL)
  1923. goto exit;
  1924. dst = pIE->data + 12;
  1925. if (MacAddr_isBcst(dst) == _FALSE && (_rtw_memcmp(adapter_mac_addr(padapter), dst, ETH_ALEN) == _FALSE))
  1926. goto exit;
  1927. break;
  1928. default:
  1929. break;
  1930. }
  1931. j += (pIE->Length + 2);
  1932. }
  1933. issue_tdls_dis_rsp(padapter, &txmgmt, prx_pkt_attrib->privacy);
  1934. exit:
  1935. return ret;
  1936. }
  1937. int On_TDLS_Teardown(_adapter *padapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta)
  1938. {
  1939. u8 *ptr = precv_frame->u.hdr.rx_data;
  1940. struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  1941. struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  1942. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  1943. struct sta_priv *pstapriv = &padapter->stapriv;
  1944. _irqL irqL;
  1945. u8 reason;
  1946. reason = *(ptr + prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN + 2);
  1947. RTW_INFO("[TDLS] %s Reason code(%d)\n", __FUNCTION__, reason);
  1948. if (rtw_tdls_is_driver_setup(padapter)) {
  1949. rtw_tdls_teardown_pre_hdl(padapter, ptdls_sta);
  1950. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_TEARDOWN_STA_LOCALLY_POST);
  1951. }
  1952. return _SUCCESS;
  1953. }
  1954. #if 0
  1955. u8 TDLS_check_ch_state(uint state)
  1956. {
  1957. if (state & TDLS_CH_SWITCH_ON_STATE &&
  1958. state & TDLS_PEER_AT_OFF_STATE) {
  1959. if (state & TDLS_PEER_SLEEP_STATE)
  1960. return 2; /* U-APSD + ch. switch */
  1961. else
  1962. return 1; /* ch. switch */
  1963. } else
  1964. return 0;
  1965. }
  1966. #endif
  1967. int On_TDLS_Peer_Traffic_Indication(_adapter *padapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta)
  1968. {
  1969. struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  1970. u8 *ptr = precv_frame->u.hdr.rx_data;
  1971. struct tdls_txmgmt txmgmt;
  1972. ptr += pattrib->hdrlen + pattrib->iv_len + LLC_HEADER_SIZE + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN;
  1973. _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
  1974. txmgmt.dialog_token = *(ptr + 2);
  1975. issue_tdls_peer_traffic_rsp(padapter, ptdls_sta, &txmgmt);
  1976. /* issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->cmn.mac_addr, 0, 0, 0); */
  1977. return _SUCCESS;
  1978. }
  1979. /* We process buffered data for 1. U-APSD, 2. ch. switch, 3. U-APSD + ch. switch here */
  1980. int On_TDLS_Peer_Traffic_Rsp(_adapter *padapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta)
  1981. {
  1982. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  1983. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  1984. struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  1985. struct sta_priv *pstapriv = &padapter->stapriv;
  1986. u8 wmmps_ac = 0;
  1987. /* u8 state=TDLS_check_ch_state(ptdls_sta->tdls_sta_state); */
  1988. int i;
  1989. ptdls_sta->sta_stats.rx_data_pkts++;
  1990. ptdls_sta->tdls_sta_state &= ~(TDLS_WAIT_PTR_STATE);
  1991. /* Check 4-AC queue bit */
  1992. if (ptdls_sta->uapsd_vo || ptdls_sta->uapsd_vi || ptdls_sta->uapsd_be || ptdls_sta->uapsd_bk)
  1993. wmmps_ac = 1;
  1994. /* If it's a direct link and have buffered frame */
  1995. if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) {
  1996. if (wmmps_ac) {
  1997. _irqL irqL;
  1998. _list *xmitframe_plist, *xmitframe_phead;
  1999. struct xmit_frame *pxmitframe = NULL;
  2000. _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
  2001. xmitframe_phead = get_list_head(&ptdls_sta->sleep_q);
  2002. xmitframe_plist = get_next(xmitframe_phead);
  2003. /* transmit buffered frames */
  2004. while (rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist) == _FALSE) {
  2005. pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  2006. xmitframe_plist = get_next(xmitframe_plist);
  2007. rtw_list_delete(&pxmitframe->list);
  2008. ptdls_sta->sleepq_len--;
  2009. ptdls_sta->sleepq_ac_len--;
  2010. if (ptdls_sta->sleepq_len > 0) {
  2011. pxmitframe->attrib.mdata = 1;
  2012. pxmitframe->attrib.eosp = 0;
  2013. } else {
  2014. pxmitframe->attrib.mdata = 0;
  2015. pxmitframe->attrib.eosp = 1;
  2016. }
  2017. pxmitframe->attrib.triggered = 1;
  2018. rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
  2019. }
  2020. if (ptdls_sta->sleepq_len == 0)
  2021. RTW_INFO("no buffered packets for tdls to xmit\n");
  2022. else {
  2023. RTW_INFO("error!psta->sleepq_len=%d\n", ptdls_sta->sleepq_len);
  2024. ptdls_sta->sleepq_len = 0;
  2025. }
  2026. _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
  2027. }
  2028. }
  2029. return _SUCCESS;
  2030. }
  2031. #ifdef CONFIG_TDLS_CH_SW
  2032. sint On_TDLS_Ch_Switch_Req(_adapter *padapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta)
  2033. {
  2034. struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
  2035. struct sta_priv *pstapriv = &padapter->stapriv;
  2036. u8 *ptr = precv_frame->u.hdr.rx_data;
  2037. struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  2038. sint parsing_length;
  2039. PNDIS_802_11_VARIABLE_IEs pIE;
  2040. u8 FIXED_IE = 4;
  2041. u16 j;
  2042. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  2043. u8 zaddr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  2044. u16 switch_time = TDLS_CH_SWITCH_TIME * 1000, switch_timeout = TDLS_CH_SWITCH_TIMEOUT * 1000;
  2045. u8 take_care_iqk;
  2046. if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE) {
  2047. RTW_INFO("[TDLS] Ignore %s since channel switch is not allowed\n", __func__);
  2048. return _FAIL;
  2049. }
  2050. ptdls_sta->ch_switch_time = switch_time;
  2051. ptdls_sta->ch_switch_timeout = switch_timeout;
  2052. ptr += prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN;
  2053. parsing_length = ((union recv_frame *)precv_frame)->u.hdr.len
  2054. - prx_pkt_attrib->hdrlen
  2055. - prx_pkt_attrib->iv_len
  2056. - prx_pkt_attrib->icv_len
  2057. - LLC_HEADER_SIZE
  2058. - ETH_TYPE_LEN
  2059. - PAYLOAD_TYPE_LEN;
  2060. pchsw_info->off_ch_num = *(ptr + 2);
  2061. if ((*(ptr + 2) == 2) && (hal_is_band_support(padapter, BAND_ON_5G)))
  2062. pchsw_info->off_ch_num = 44;
  2063. if (pchsw_info->off_ch_num != pmlmeext->cur_channel)
  2064. pchsw_info->delay_switch_back = _FALSE;
  2065. /* Parsing information element */
  2066. for (j = FIXED_IE; j < parsing_length;) {
  2067. pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j);
  2068. switch (pIE->ElementID) {
  2069. case EID_SecondaryChnlOffset:
  2070. switch (*(pIE->data)) {
  2071. case EXTCHNL_OFFSET_UPPER:
  2072. pchsw_info->ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
  2073. break;
  2074. case EXTCHNL_OFFSET_LOWER:
  2075. pchsw_info->ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
  2076. break;
  2077. default:
  2078. pchsw_info->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  2079. break;
  2080. }
  2081. break;
  2082. case _LINK_ID_IE_:
  2083. break;
  2084. case _CH_SWITCH_TIMING_:
  2085. ptdls_sta->ch_switch_time = (RTW_GET_LE16(pIE->data) >= TDLS_CH_SWITCH_TIME * 1000) ?
  2086. RTW_GET_LE16(pIE->data) : TDLS_CH_SWITCH_TIME * 1000;
  2087. ptdls_sta->ch_switch_timeout = (RTW_GET_LE16(pIE->data + 2) >= TDLS_CH_SWITCH_TIMEOUT * 1000) ?
  2088. RTW_GET_LE16(pIE->data + 2) : TDLS_CH_SWITCH_TIMEOUT * 1000;
  2089. RTW_INFO("[TDLS] %s ch_switch_time:%d, ch_switch_timeout:%d\n"
  2090. , __FUNCTION__, RTW_GET_LE16(pIE->data), RTW_GET_LE16(pIE->data + 2));
  2091. default:
  2092. break;
  2093. }
  2094. j += (pIE->Length + 2);
  2095. }
  2096. rtw_hal_get_hwreg(padapter, HW_VAR_CH_SW_NEED_TO_TAKE_CARE_IQK_INFO, &take_care_iqk);
  2097. if (take_care_iqk == _TRUE) {
  2098. u8 central_chnl;
  2099. u8 bw_mode;
  2100. bw_mode = (pchsw_info->ch_offset) ? CHANNEL_WIDTH_40 : CHANNEL_WIDTH_20;
  2101. central_chnl = rtw_get_center_ch(pchsw_info->off_ch_num, bw_mode, pchsw_info->ch_offset);
  2102. if (rtw_hal_ch_sw_iqk_info_search(padapter, central_chnl, bw_mode) < 0) {
  2103. if (!(pchsw_info->ch_sw_state & TDLS_CH_SWITCH_PREPARE_STATE))
  2104. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_CH_SW_PREPARE);
  2105. return _FAIL;
  2106. }
  2107. }
  2108. /* cancel ch sw monitor timer for responder */
  2109. if (!(pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE))
  2110. _cancel_timer_ex(&ptdls_sta->ch_sw_monitor_timer);
  2111. if (_rtw_memcmp(pchsw_info->addr, zaddr, ETH_ALEN) == _TRUE)
  2112. _rtw_memcpy(pchsw_info->addr, ptdls_sta->cmn.mac_addr, ETH_ALEN);
  2113. if (ATOMIC_READ(&pchsw_info->chsw_on) == _FALSE)
  2114. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_CH_SW_START);
  2115. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_CH_SW_RESP);
  2116. return _SUCCESS;
  2117. }
  2118. sint On_TDLS_Ch_Switch_Rsp(_adapter *padapter, union recv_frame *precv_frame, struct sta_info *ptdls_sta)
  2119. {
  2120. struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
  2121. struct sta_priv *pstapriv = &padapter->stapriv;
  2122. u8 *ptr = precv_frame->u.hdr.rx_data;
  2123. struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib;
  2124. sint parsing_length;
  2125. PNDIS_802_11_VARIABLE_IEs pIE;
  2126. u8 FIXED_IE = 4;
  2127. u16 status_code, j, switch_time, switch_timeout;
  2128. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  2129. int ret = _SUCCESS;
  2130. if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE) {
  2131. RTW_INFO("[TDLS] Ignore %s since channel switch is not allowed\n", __func__);
  2132. return _SUCCESS;
  2133. }
  2134. /* If we receive Unsolicited TDLS Channel Switch Response when channel switch is running, */
  2135. /* we will go back to base channel and terminate this channel switch procedure */
  2136. if (ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) {
  2137. if (pmlmeext->cur_channel != rtw_get_oper_ch(padapter)) {
  2138. RTW_INFO("[TDLS] Rx unsolicited channel switch response\n");
  2139. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_CH_SW_TO_BASE_CHNL);
  2140. goto exit;
  2141. }
  2142. }
  2143. ptr += prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN;
  2144. parsing_length = ((union recv_frame *)precv_frame)->u.hdr.len
  2145. - prx_pkt_attrib->hdrlen
  2146. - prx_pkt_attrib->iv_len
  2147. - prx_pkt_attrib->icv_len
  2148. - LLC_HEADER_SIZE
  2149. - ETH_TYPE_LEN
  2150. - PAYLOAD_TYPE_LEN;
  2151. _rtw_memcpy(&status_code, ptr + 2, 2);
  2152. if (status_code != 0) {
  2153. RTW_INFO("[TDLS] %s status_code:%d\n", __func__, status_code);
  2154. pchsw_info->ch_sw_state &= ~(TDLS_CH_SW_INITIATOR_STATE);
  2155. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_CH_SW_END);
  2156. ret = _FAIL;
  2157. goto exit;
  2158. }
  2159. /* Parsing information element */
  2160. for (j = FIXED_IE; j < parsing_length;) {
  2161. pIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j);
  2162. switch (pIE->ElementID) {
  2163. case _LINK_ID_IE_:
  2164. break;
  2165. case _CH_SWITCH_TIMING_:
  2166. _rtw_memcpy(&switch_time, pIE->data, 2);
  2167. if (switch_time > ptdls_sta->ch_switch_time)
  2168. _rtw_memcpy(&ptdls_sta->ch_switch_time, &switch_time, 2);
  2169. _rtw_memcpy(&switch_timeout, pIE->data + 2, 2);
  2170. if (switch_timeout > ptdls_sta->ch_switch_timeout)
  2171. _rtw_memcpy(&ptdls_sta->ch_switch_timeout, &switch_timeout, 2);
  2172. break;
  2173. default:
  2174. break;
  2175. }
  2176. j += (pIE->Length + 2);
  2177. }
  2178. if ((pmlmeext->cur_channel == rtw_get_oper_ch(padapter)) &&
  2179. (pchsw_info->ch_sw_state & TDLS_WAIT_CH_RSP_STATE)) {
  2180. if (ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE)
  2181. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_CH_SW_TO_OFF_CHNL);
  2182. }
  2183. exit:
  2184. return ret;
  2185. }
  2186. #endif /* CONFIG_TDLS_CH_SW */
  2187. #ifdef CONFIG_WFD
  2188. void wfd_ie_tdls(_adapter *padapter, u8 *pframe, u32 *pktlen)
  2189. {
  2190. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  2191. struct wifi_display_info *pwfd_info = padapter->tdlsinfo.wfd_info;
  2192. u8 wfdie[MAX_WFD_IE_LEN] = { 0x00 };
  2193. u32 wfdielen = 0;
  2194. u16 v16 = 0;
  2195. if (!hal_chk_wl_func(padapter, WL_FUNC_MIRACAST))
  2196. return;
  2197. /* WFD OUI */
  2198. wfdielen = 0;
  2199. wfdie[wfdielen++] = 0x50;
  2200. wfdie[wfdielen++] = 0x6F;
  2201. wfdie[wfdielen++] = 0x9A;
  2202. wfdie[wfdielen++] = 0x0A; /* WFA WFD v1.0 */
  2203. /*
  2204. * Commented by Albert 20110825
  2205. * According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes
  2206. * 1. WFD Device Information
  2207. * 2. Associated BSSID ( Optional )
  2208. * 3. Local IP Adress ( Optional )
  2209. */
  2210. /* WFD Device Information ATTR */
  2211. /* Type: */
  2212. wfdie[wfdielen++] = WFD_ATTR_DEVICE_INFO;
  2213. /* Length: */
  2214. /* Note: In the WFD specification, the size of length field is 2. */
  2215. RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  2216. wfdielen += 2;
  2217. /* Value1: */
  2218. /* WFD device information */
  2219. /* available for WFD session + Preferred TDLS + WSD ( WFD Service Discovery ) */
  2220. v16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL
  2221. | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_WSD;
  2222. RTW_PUT_BE16(wfdie + wfdielen, v16);
  2223. wfdielen += 2;
  2224. /* Value2: */
  2225. /* Session Management Control Port */
  2226. /* Default TCP port for RTSP messages is 554 */
  2227. RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->tdls_rtsp_ctrlport);
  2228. wfdielen += 2;
  2229. /* Value3: */
  2230. /* WFD Device Maximum Throughput */
  2231. /* 300Mbps is the maximum throughput */
  2232. RTW_PUT_BE16(wfdie + wfdielen, 300);
  2233. wfdielen += 2;
  2234. /* Associated BSSID ATTR */
  2235. /* Type: */
  2236. wfdie[wfdielen++] = WFD_ATTR_ASSOC_BSSID;
  2237. /* Length: */
  2238. /* Note: In the WFD specification, the size of length field is 2. */
  2239. RTW_PUT_BE16(wfdie + wfdielen, 0x0006);
  2240. wfdielen += 2;
  2241. /* Value: */
  2242. /* Associated BSSID */
  2243. if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
  2244. _rtw_memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[0], ETH_ALEN);
  2245. else
  2246. _rtw_memset(wfdie + wfdielen, 0x00, ETH_ALEN);
  2247. /* Local IP Address ATTR */
  2248. wfdie[wfdielen++] = WFD_ATTR_LOCAL_IP_ADDR;
  2249. /* Length: */
  2250. /* Note: In the WFD specification, the size of length field is 2. */
  2251. RTW_PUT_BE16(wfdie + wfdielen, 0x0005);
  2252. wfdielen += 2;
  2253. /* Version: */
  2254. /* 0x01: Version1;IPv4 */
  2255. wfdie[wfdielen++] = 0x01;
  2256. /* IPv4 Address */
  2257. _rtw_memcpy(wfdie + wfdielen, pwfd_info->ip_address, 4);
  2258. wfdielen += 4;
  2259. pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, pktlen);
  2260. }
  2261. #endif /* CONFIG_WFD */
  2262. void rtw_build_tdls_setup_req_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta)
  2263. {
  2264. struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);
  2265. struct registry_priv *pregistrypriv = &padapter->registrypriv;
  2266. struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  2267. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2268. int i = 0 ;
  2269. u32 time;
  2270. u8 *pframe_head;
  2271. /* SNonce */
  2272. if (pattrib->encrypt) {
  2273. for (i = 0; i < 8; i++) {
  2274. time = rtw_get_current_time();
  2275. _rtw_memcpy(&ptdls_sta->SNonce[4 * i], (u8 *)&time, 4);
  2276. }
  2277. }
  2278. pframe_head = pframe; /* For rtw_tdls_set_ht_cap() */
  2279. pframe = rtw_tdls_set_payload_type(pframe, pattrib);
  2280. pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);
  2281. pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);
  2282. pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);
  2283. pframe = rtw_tdls_set_capability(padapter, pframe, pattrib);
  2284. pframe = rtw_tdls_set_supported_rate(padapter, pframe, pattrib);
  2285. pframe = rtw_tdls_set_sup_ch(padapter, pframe, pattrib);
  2286. pframe = rtw_tdls_set_sup_reg_class(pframe, pattrib);
  2287. if (pattrib->encrypt)
  2288. pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta);
  2289. pframe = rtw_tdls_set_ext_cap(pframe, pattrib);
  2290. if (pattrib->encrypt) {
  2291. pframe = rtw_tdls_set_ftie(ptxmgmt
  2292. , pframe
  2293. , pattrib
  2294. , NULL
  2295. , ptdls_sta->SNonce);
  2296. pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta);
  2297. }
  2298. #ifdef CONFIG_80211N_HT
  2299. /* Sup_reg_classes(optional) */
  2300. if (pregistrypriv->ht_enable == _TRUE)
  2301. pframe = rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib);
  2302. #endif
  2303. pframe = rtw_tdls_set_bss_coexist(padapter, pframe, pattrib);
  2304. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _TRUE);
  2305. if ((pregistrypriv->wmm_enable == _TRUE) || (padapter->mlmepriv.htpriv.ht_option == _TRUE))
  2306. pframe = rtw_tdls_set_qos_cap(pframe, pattrib);
  2307. #ifdef CONFIG_80211AC_VHT
  2308. if ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pmlmeext->cur_channel > 14)
  2309. && REGSTY_IS_11AC_ENABLE(pregistrypriv)
  2310. && is_supported_vht(pregistrypriv->wireless_mode)
  2311. && (!rfctl->country_ent || COUNTRY_CHPLAN_EN_11AC(rfctl->country_ent))
  2312. ) {
  2313. pframe = rtw_tdls_set_aid(padapter, pframe, pattrib);
  2314. pframe = rtw_tdls_set_vht_cap(padapter, pframe, pattrib);
  2315. }
  2316. #endif
  2317. #ifdef CONFIG_WFD
  2318. if (padapter->wdinfo.wfd_tdls_enable == 1)
  2319. wfd_ie_tdls(padapter, pframe, &(pattrib->pktlen));
  2320. #endif
  2321. }
  2322. void rtw_build_tdls_setup_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta)
  2323. {
  2324. struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);
  2325. struct registry_priv *pregistrypriv = &padapter->registrypriv;
  2326. struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  2327. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2328. u8 k; /* for random ANonce */
  2329. u8 *pftie = NULL, *ptimeout_ie = NULL, *plinkid_ie = NULL, *prsnie = NULL, *pftie_mic = NULL;
  2330. u32 time;
  2331. u8 *pframe_head;
  2332. if (pattrib->encrypt) {
  2333. for (k = 0; k < 8; k++) {
  2334. time = rtw_get_current_time();
  2335. _rtw_memcpy(&ptdls_sta->ANonce[4 * k], (u8 *)&time, 4);
  2336. }
  2337. }
  2338. pframe_head = pframe;
  2339. pframe = rtw_tdls_set_payload_type(pframe, pattrib);
  2340. pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);
  2341. pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);
  2342. pframe = rtw_tdls_set_status_code(pframe, pattrib, ptxmgmt);
  2343. if (ptxmgmt->status_code != 0) {
  2344. RTW_INFO("[%s] status_code:%04x\n", __FUNCTION__, ptxmgmt->status_code);
  2345. return;
  2346. }
  2347. pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);
  2348. pframe = rtw_tdls_set_capability(padapter, pframe, pattrib);
  2349. pframe = rtw_tdls_set_supported_rate(padapter, pframe, pattrib);
  2350. pframe = rtw_tdls_set_sup_ch(padapter, pframe, pattrib);
  2351. pframe = rtw_tdls_set_sup_reg_class(pframe, pattrib);
  2352. if (pattrib->encrypt) {
  2353. prsnie = pframe;
  2354. pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _FALSE, ptdls_sta);
  2355. }
  2356. pframe = rtw_tdls_set_ext_cap(pframe, pattrib);
  2357. if (pattrib->encrypt) {
  2358. if (rtw_tdls_is_driver_setup(padapter) == _TRUE)
  2359. wpa_tdls_generate_tpk(padapter, ptdls_sta);
  2360. pftie = pframe;
  2361. pftie_mic = pframe + 4;
  2362. pframe = rtw_tdls_set_ftie(ptxmgmt
  2363. , pframe
  2364. , pattrib
  2365. , ptdls_sta->ANonce
  2366. , ptdls_sta->SNonce);
  2367. ptimeout_ie = pframe;
  2368. pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _FALSE, ptdls_sta);
  2369. }
  2370. #ifdef CONFIG_80211N_HT
  2371. /* Sup_reg_classes(optional) */
  2372. if (pregistrypriv->ht_enable == _TRUE)
  2373. pframe = rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib);
  2374. #endif
  2375. pframe = rtw_tdls_set_bss_coexist(padapter, pframe, pattrib);
  2376. plinkid_ie = pframe;
  2377. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _FALSE);
  2378. /* Fill FTIE mic */
  2379. if (pattrib->encrypt && rtw_tdls_is_driver_setup(padapter) == _TRUE)
  2380. wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic);
  2381. if ((pregistrypriv->wmm_enable == _TRUE) || (padapter->mlmepriv.htpriv.ht_option == _TRUE))
  2382. pframe = rtw_tdls_set_qos_cap(pframe, pattrib);
  2383. #ifdef CONFIG_80211AC_VHT
  2384. if ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pmlmeext->cur_channel > 14)
  2385. && REGSTY_IS_11AC_ENABLE(pregistrypriv)
  2386. && is_supported_vht(pregistrypriv->wireless_mode)
  2387. && (!rfctl->country_ent || COUNTRY_CHPLAN_EN_11AC(rfctl->country_ent))
  2388. ) {
  2389. pframe = rtw_tdls_set_aid(padapter, pframe, pattrib);
  2390. pframe = rtw_tdls_set_vht_cap(padapter, pframe, pattrib);
  2391. pframe = rtw_tdls_set_vht_op_mode_notify(padapter, pframe, pattrib, pmlmeext->cur_bwmode);
  2392. }
  2393. #endif
  2394. #ifdef CONFIG_WFD
  2395. if (padapter->wdinfo.wfd_tdls_enable)
  2396. wfd_ie_tdls(padapter, pframe, &(pattrib->pktlen));
  2397. #endif
  2398. }
  2399. void rtw_build_tdls_setup_cfm_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta)
  2400. {
  2401. struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);
  2402. struct registry_priv *pregistrypriv = &padapter->registrypriv;
  2403. struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  2404. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  2405. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2406. unsigned int ie_len;
  2407. unsigned char *p;
  2408. u8 wmm_param_ele[24] = {0};
  2409. u8 *pftie = NULL, *ptimeout_ie = NULL, *plinkid_ie = NULL, *prsnie = NULL, *pftie_mic = NULL;
  2410. pframe = rtw_tdls_set_payload_type(pframe, pattrib);
  2411. pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);
  2412. pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);
  2413. pframe = rtw_tdls_set_status_code(pframe, pattrib, ptxmgmt);
  2414. pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);
  2415. if (ptxmgmt->status_code != 0)
  2416. return;
  2417. if (pattrib->encrypt) {
  2418. prsnie = pframe;
  2419. pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta);
  2420. }
  2421. if (pattrib->encrypt) {
  2422. pftie = pframe;
  2423. pftie_mic = pframe + 4;
  2424. pframe = rtw_tdls_set_ftie(ptxmgmt
  2425. , pframe
  2426. , pattrib
  2427. , ptdls_sta->ANonce
  2428. , ptdls_sta->SNonce);
  2429. ptimeout_ie = pframe;
  2430. pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta);
  2431. if (rtw_tdls_is_driver_setup(padapter) == _TRUE) {
  2432. /* Start TPK timer */
  2433. ptdls_sta->TPK_count = 0;
  2434. _set_timer(&ptdls_sta->TPK_timer, ONE_SEC);
  2435. }
  2436. }
  2437. /* HT operation; todo */
  2438. plinkid_ie = pframe;
  2439. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _TRUE);
  2440. if (pattrib->encrypt && (rtw_tdls_is_driver_setup(padapter) == _TRUE))
  2441. wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic);
  2442. if (ptdls_sta->qos_option == _TRUE)
  2443. pframe = rtw_tdls_set_wmm_params(padapter, pframe, pattrib);
  2444. #ifdef CONFIG_80211AC_VHT
  2445. if ((padapter->mlmepriv.htpriv.ht_option == _TRUE)
  2446. && (ptdls_sta->vhtpriv.vht_option == _TRUE) && (pmlmeext->cur_channel > 14)
  2447. && REGSTY_IS_11AC_ENABLE(pregistrypriv)
  2448. && is_supported_vht(pregistrypriv->wireless_mode)
  2449. && (!rfctl->country_ent || COUNTRY_CHPLAN_EN_11AC(rfctl->country_ent))
  2450. ) {
  2451. pframe = rtw_tdls_set_vht_operation(padapter, pframe, pattrib, pmlmeext->cur_channel);
  2452. pframe = rtw_tdls_set_vht_op_mode_notify(padapter, pframe, pattrib, pmlmeext->cur_bwmode);
  2453. }
  2454. #endif
  2455. }
  2456. void rtw_build_tdls_teardown_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta)
  2457. {
  2458. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2459. u8 *pftie = NULL, *pftie_mic = NULL, *plinkid_ie = NULL;
  2460. pframe = rtw_tdls_set_payload_type(pframe, pattrib);
  2461. pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);
  2462. pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);
  2463. pframe = rtw_tdls_set_status_code(pframe, pattrib, ptxmgmt);
  2464. if (pattrib->encrypt) {
  2465. pftie = pframe;
  2466. pftie_mic = pframe + 4;
  2467. pframe = rtw_tdls_set_ftie(ptxmgmt
  2468. , pframe
  2469. , pattrib
  2470. , ptdls_sta->ANonce
  2471. , ptdls_sta->SNonce);
  2472. }
  2473. plinkid_ie = pframe;
  2474. if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE)
  2475. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _FALSE);
  2476. else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE)
  2477. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _TRUE);
  2478. if (pattrib->encrypt && (rtw_tdls_is_driver_setup(padapter) == _TRUE))
  2479. wpa_tdls_teardown_ftie_mic(ptdls_sta->tpk.kck, plinkid_ie, ptxmgmt->status_code, 1, 4, pftie, pftie_mic);
  2480. }
  2481. void rtw_build_tdls_dis_req_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)
  2482. {
  2483. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2484. pframe = rtw_tdls_set_payload_type(pframe, pattrib);
  2485. pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);
  2486. pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);
  2487. pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);
  2488. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _TRUE);
  2489. }
  2490. void rtw_build_tdls_dis_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, u8 privacy)
  2491. {
  2492. struct registry_priv *pregistrypriv = &padapter->registrypriv;
  2493. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  2494. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2495. u8 *pframe_head, pktlen_index;
  2496. pktlen_index = pattrib->pktlen;
  2497. pframe_head = pframe;
  2498. pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_PUBLIC);
  2499. pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);
  2500. pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);
  2501. pframe = rtw_tdls_set_capability(padapter, pframe, pattrib);
  2502. pframe = rtw_tdls_set_supported_rate(padapter, pframe, pattrib);
  2503. pframe = rtw_tdls_set_sup_ch(padapter, pframe, pattrib);
  2504. if (privacy)
  2505. pframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, NULL);
  2506. pframe = rtw_tdls_set_ext_cap(pframe, pattrib);
  2507. if (privacy) {
  2508. pframe = rtw_tdls_set_ftie(ptxmgmt, pframe, pattrib, NULL, NULL);
  2509. pframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _TRUE, NULL);
  2510. }
  2511. #ifdef CONFIG_80211N_HT
  2512. if (pregistrypriv->ht_enable == _TRUE)
  2513. pframe = rtw_tdls_set_ht_cap(padapter, pframe_head - pktlen_index, pattrib);
  2514. #endif
  2515. pframe = rtw_tdls_set_bss_coexist(padapter, pframe, pattrib);
  2516. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _FALSE);
  2517. }
  2518. void rtw_build_tdls_peer_traffic_indication_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta)
  2519. {
  2520. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2521. u8 AC_queue = 0;
  2522. pframe = rtw_tdls_set_payload_type(pframe, pattrib);
  2523. pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);
  2524. pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);
  2525. pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);
  2526. if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE)
  2527. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _FALSE);
  2528. else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE)
  2529. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _TRUE);
  2530. /* PTI control */
  2531. /* PU buffer status */
  2532. if (ptdls_sta->uapsd_bk & BIT(1))
  2533. AC_queue = BIT(0);
  2534. if (ptdls_sta->uapsd_be & BIT(1))
  2535. AC_queue = BIT(1);
  2536. if (ptdls_sta->uapsd_vi & BIT(1))
  2537. AC_queue = BIT(2);
  2538. if (ptdls_sta->uapsd_vo & BIT(1))
  2539. AC_queue = BIT(3);
  2540. pframe = rtw_set_ie(pframe, _PTI_BUFFER_STATUS_, 1, &AC_queue, &(pattrib->pktlen));
  2541. }
  2542. void rtw_build_tdls_peer_traffic_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta)
  2543. {
  2544. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2545. pframe = rtw_tdls_set_payload_type(pframe, pattrib);
  2546. pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);
  2547. pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);
  2548. pframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);
  2549. if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE)
  2550. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _FALSE);
  2551. else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE)
  2552. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _TRUE);
  2553. }
  2554. #ifdef CONFIG_TDLS_CH_SW
  2555. void rtw_build_tdls_ch_switch_req_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta)
  2556. {
  2557. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  2558. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2559. struct sta_priv *pstapriv = &padapter->stapriv;
  2560. u16 switch_time = TDLS_CH_SWITCH_TIME * 1000, switch_timeout = TDLS_CH_SWITCH_TIMEOUT * 1000;
  2561. ptdls_sta->ch_switch_time = switch_time;
  2562. ptdls_sta->ch_switch_timeout = switch_timeout;
  2563. pframe = rtw_tdls_set_payload_type(pframe, pattrib);
  2564. pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);
  2565. pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);
  2566. pframe = rtw_tdls_set_target_ch(padapter, pframe, pattrib);
  2567. pframe = rtw_tdls_set_reg_class(pframe, pattrib, ptdls_sta);
  2568. if (ptdlsinfo->chsw_info.ch_offset != HAL_PRIME_CHNL_OFFSET_DONT_CARE) {
  2569. switch (ptdlsinfo->chsw_info.ch_offset) {
  2570. case HAL_PRIME_CHNL_OFFSET_LOWER:
  2571. pframe = rtw_tdls_set_second_channel_offset(pframe, pattrib, SCA);
  2572. break;
  2573. case HAL_PRIME_CHNL_OFFSET_UPPER:
  2574. pframe = rtw_tdls_set_second_channel_offset(pframe, pattrib, SCB);
  2575. break;
  2576. }
  2577. }
  2578. if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE)
  2579. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _FALSE);
  2580. else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE)
  2581. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _TRUE);
  2582. pframe = rtw_tdls_set_ch_sw(pframe, pattrib, ptdls_sta);
  2583. }
  2584. void rtw_build_tdls_ch_switch_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, struct sta_info *ptdls_sta)
  2585. {
  2586. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2587. struct sta_priv *pstapriv = &padapter->stapriv;
  2588. pframe = rtw_tdls_set_payload_type(pframe, pattrib);
  2589. pframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);
  2590. pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);
  2591. pframe = rtw_tdls_set_status_code(pframe, pattrib, ptxmgmt);
  2592. if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE)
  2593. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _FALSE);
  2594. else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE)
  2595. pframe = rtw_tdls_set_linkid(padapter, pframe, pattrib, _TRUE);
  2596. pframe = rtw_tdls_set_ch_sw(pframe, pattrib, ptdls_sta);
  2597. }
  2598. #endif
  2599. #ifdef CONFIG_WFD
  2600. void rtw_build_tunneled_probe_req_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe)
  2601. {
  2602. u8 i;
  2603. _adapter *iface = NULL;
  2604. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  2605. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2606. struct wifidirect_info *pwdinfo;
  2607. u8 category = RTW_WLAN_CATEGORY_P2P;
  2608. u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a};
  2609. u8 probe_req = 4;
  2610. u8 wfdielen = 0;
  2611. pframe = rtw_tdls_set_payload_type(pframe, pattrib);
  2612. pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  2613. pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen));
  2614. pframe = rtw_set_fixed_ie(pframe, 1, &(probe_req), &(pattrib->pktlen));
  2615. for (i = 0; i < dvobj->iface_nums; i++) {
  2616. iface = dvobj->padapters[i];
  2617. if ((iface) && rtw_is_adapter_up(iface)) {
  2618. pwdinfo = &iface->wdinfo;
  2619. if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
  2620. wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe);
  2621. pframe += wfdielen;
  2622. pattrib->pktlen += wfdielen;
  2623. }
  2624. }
  2625. }
  2626. }
  2627. void rtw_build_tunneled_probe_rsp_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe)
  2628. {
  2629. u8 i;
  2630. _adapter *iface = NULL;
  2631. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  2632. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2633. struct wifidirect_info *pwdinfo;
  2634. u8 category = RTW_WLAN_CATEGORY_P2P;
  2635. u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a};
  2636. u8 probe_rsp = 5;
  2637. u8 wfdielen = 0;
  2638. pframe = rtw_tdls_set_payload_type(pframe, pattrib);
  2639. pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));
  2640. pframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen));
  2641. pframe = rtw_set_fixed_ie(pframe, 1, &(probe_rsp), &(pattrib->pktlen));
  2642. for (i = 0; i < dvobj->iface_nums; i++) {
  2643. iface = dvobj->padapters[i];
  2644. if ((iface) && rtw_is_adapter_up(iface)) {
  2645. pwdinfo = &iface->wdinfo;
  2646. if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
  2647. wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 1);
  2648. pframe += wfdielen;
  2649. pattrib->pktlen += wfdielen;
  2650. }
  2651. }
  2652. }
  2653. }
  2654. #endif /* CONFIG_WFD */
  2655. void _tdls_tpk_timer_hdl(void *FunctionContext)
  2656. {
  2657. struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  2658. struct tdls_txmgmt txmgmt;
  2659. _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
  2660. ptdls_sta->TPK_count++;
  2661. /* TPK_timer expired in a second */
  2662. /* Retry timer should set at least 301 sec. */
  2663. if (ptdls_sta->TPK_count >= (ptdls_sta->TDLS_PeerKey_Lifetime - 3)) {
  2664. RTW_INFO("[TDLS] %s, Re-Setup TDLS link with "MAC_FMT" since TPK lifetime expires!\n",
  2665. __FUNCTION__, MAC_ARG(ptdls_sta->cmn.mac_addr));
  2666. ptdls_sta->TPK_count = 0;
  2667. _rtw_memcpy(txmgmt.peer, ptdls_sta->cmn.mac_addr, ETH_ALEN);
  2668. issue_tdls_setup_req(ptdls_sta->padapter, &txmgmt, _FALSE);
  2669. }
  2670. _set_timer(&ptdls_sta->TPK_timer, ONE_SEC);
  2671. }
  2672. #ifdef CONFIG_TDLS_CH_SW
  2673. void _tdls_ch_switch_timer_hdl(void *FunctionContext)
  2674. {
  2675. struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  2676. _adapter *padapter = ptdls_sta->padapter;
  2677. struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
  2678. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_CH_SW_END_TO_BASE_CHNL);
  2679. RTW_INFO("[TDLS] %s, can't get traffic from op_ch:%d\n", __func__, rtw_get_oper_ch(padapter));
  2680. }
  2681. void _tdls_delay_timer_hdl(void *FunctionContext)
  2682. {
  2683. struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  2684. _adapter *padapter = ptdls_sta->padapter;
  2685. struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
  2686. RTW_INFO("[TDLS] %s, op_ch:%d, tdls_state:0x%08x\n", __func__, rtw_get_oper_ch(padapter), ptdls_sta->tdls_sta_state);
  2687. pchsw_info->delay_switch_back = _TRUE;
  2688. }
  2689. void _tdls_stay_on_base_chnl_timer_hdl(void *FunctionContext)
  2690. {
  2691. struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  2692. _adapter *padapter = ptdls_sta->padapter;
  2693. struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
  2694. if (ptdls_sta != NULL) {
  2695. issue_tdls_ch_switch_req(padapter, ptdls_sta);
  2696. pchsw_info->ch_sw_state |= TDLS_WAIT_CH_RSP_STATE;
  2697. }
  2698. }
  2699. void _tdls_ch_switch_monitor_timer_hdl(void *FunctionContext)
  2700. {
  2701. struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  2702. _adapter *padapter = ptdls_sta->padapter;
  2703. struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
  2704. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_CH_SW_END);
  2705. RTW_INFO("[TDLS] %s, does not receive ch sw req\n", __func__);
  2706. }
  2707. #endif
  2708. void _tdls_handshake_timer_hdl(void *FunctionContext)
  2709. {
  2710. struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  2711. _adapter *padapter = NULL;
  2712. struct tdls_txmgmt txmgmt;
  2713. _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
  2714. _rtw_memcpy(txmgmt.peer, ptdls_sta->cmn.mac_addr, ETH_ALEN);
  2715. txmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_;
  2716. if (ptdls_sta != NULL) {
  2717. padapter = ptdls_sta->padapter;
  2718. RTW_INFO("[TDLS] Handshake time out\n");
  2719. if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)
  2720. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_TEARDOWN_STA);
  2721. else
  2722. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_TEARDOWN_STA_LOCALLY);
  2723. }
  2724. }
  2725. void _tdls_pti_timer_hdl(void *FunctionContext)
  2726. {
  2727. struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
  2728. _adapter *padapter = NULL;
  2729. struct tdls_txmgmt txmgmt;
  2730. _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
  2731. _rtw_memcpy(txmgmt.peer, ptdls_sta->cmn.mac_addr, ETH_ALEN);
  2732. txmgmt.status_code = _RSON_TDLS_TEAR_TOOFAR_;
  2733. if (ptdls_sta != NULL) {
  2734. padapter = ptdls_sta->padapter;
  2735. if (ptdls_sta->tdls_sta_state & TDLS_WAIT_PTR_STATE) {
  2736. RTW_INFO("[TDLS] Doesn't receive PTR from peer dev:"MAC_FMT"; "
  2737. "Send TDLS Tear Down\n", MAC_ARG(ptdls_sta->cmn.mac_addr));
  2738. rtw_tdls_cmd(padapter, ptdls_sta->cmn.mac_addr, TDLS_TEARDOWN_STA);
  2739. }
  2740. }
  2741. }
  2742. void rtw_init_tdls_timer(_adapter *padapter, struct sta_info *psta)
  2743. {
  2744. psta->padapter = padapter;
  2745. rtw_init_timer(&psta->TPK_timer, padapter, _tdls_tpk_timer_hdl, psta);
  2746. #ifdef CONFIG_TDLS_CH_SW
  2747. rtw_init_timer(&psta->ch_sw_timer, padapter, _tdls_ch_switch_timer_hdl, psta);
  2748. rtw_init_timer(&psta->delay_timer, padapter, _tdls_delay_timer_hdl, psta);
  2749. rtw_init_timer(&psta->stay_on_base_chnl_timer, padapter, _tdls_stay_on_base_chnl_timer_hdl, psta);
  2750. rtw_init_timer(&psta->ch_sw_monitor_timer, padapter, _tdls_ch_switch_monitor_timer_hdl, psta);
  2751. #endif
  2752. rtw_init_timer(&psta->handshake_timer, padapter, _tdls_handshake_timer_hdl, psta);
  2753. rtw_init_timer(&psta->pti_timer, padapter, _tdls_pti_timer_hdl, psta);
  2754. }
  2755. void rtw_cancel_tdls_timer(struct sta_info *psta)
  2756. {
  2757. _cancel_timer_ex(&psta->TPK_timer);
  2758. #ifdef CONFIG_TDLS_CH_SW
  2759. _cancel_timer_ex(&psta->ch_sw_timer);
  2760. _cancel_timer_ex(&psta->delay_timer);
  2761. _cancel_timer_ex(&psta->stay_on_base_chnl_timer);
  2762. _cancel_timer_ex(&psta->ch_sw_monitor_timer);
  2763. #endif
  2764. _cancel_timer_ex(&psta->handshake_timer);
  2765. _cancel_timer_ex(&psta->pti_timer);
  2766. }
  2767. void rtw_tdls_teardown_pre_hdl(_adapter *padapter, struct sta_info *psta)
  2768. {
  2769. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  2770. struct sta_priv *pstapriv = &padapter->stapriv;
  2771. _irqL irqL;
  2772. rtw_cancel_tdls_timer(psta);
  2773. _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  2774. if (ptdlsinfo->sta_cnt != 0)
  2775. ptdlsinfo->sta_cnt--;
  2776. _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
  2777. if (ptdlsinfo->sta_cnt < MAX_ALLOWED_TDLS_STA_NUM) {
  2778. ptdlsinfo->sta_maximum = _FALSE;
  2779. _rtw_memset(&ptdlsinfo->ss_record, 0x00, sizeof(struct tdls_ss_record));
  2780. }
  2781. if (ptdlsinfo->sta_cnt == 0)
  2782. rtw_tdls_set_link_established(padapter, _FALSE);
  2783. else
  2784. RTW_INFO("Remain tdls sta:%02x\n", ptdlsinfo->sta_cnt);
  2785. }
  2786. void rtw_tdls_teardown_post_hdl(_adapter *padapter, struct sta_info *psta, u8 enqueue_cmd)
  2787. {
  2788. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  2789. /* Clear cam */
  2790. rtw_clearstakey_cmd(padapter, psta, enqueue_cmd);
  2791. /* Update sta media status */
  2792. if (enqueue_cmd)
  2793. rtw_sta_media_status_rpt_cmd(padapter, psta, 0);
  2794. else
  2795. rtw_sta_media_status_rpt(padapter, psta, 0);
  2796. /* Set RCR if necessary */
  2797. if (ptdlsinfo->sta_cnt == 0) {
  2798. if (enqueue_cmd)
  2799. rtw_tdls_cmd(padapter, NULL, TDLS_RS_RCR);
  2800. else
  2801. rtw_hal_rcr_set_chk_bssid(padapter, MLME_TDLS_NOLINK);
  2802. }
  2803. /* Free tdls sta info */
  2804. rtw_free_stainfo(padapter, psta);
  2805. }
  2806. int rtw_tdls_is_driver_setup(_adapter *padapter)
  2807. {
  2808. return padapter->tdlsinfo.driver_setup;
  2809. }
  2810. const char *rtw_tdls_action_txt(enum TDLS_ACTION_FIELD action)
  2811. {
  2812. switch (action) {
  2813. case TDLS_SETUP_REQUEST:
  2814. return "TDLS_SETUP_REQUEST";
  2815. case TDLS_SETUP_RESPONSE:
  2816. return "TDLS_SETUP_RESPONSE";
  2817. case TDLS_SETUP_CONFIRM:
  2818. return "TDLS_SETUP_CONFIRM";
  2819. case TDLS_TEARDOWN:
  2820. return "TDLS_TEARDOWN";
  2821. case TDLS_PEER_TRAFFIC_INDICATION:
  2822. return "TDLS_PEER_TRAFFIC_INDICATION";
  2823. case TDLS_CHANNEL_SWITCH_REQUEST:
  2824. return "TDLS_CHANNEL_SWITCH_REQUEST";
  2825. case TDLS_CHANNEL_SWITCH_RESPONSE:
  2826. return "TDLS_CHANNEL_SWITCH_RESPONSE";
  2827. case TDLS_PEER_PSM_REQUEST:
  2828. return "TDLS_PEER_PSM_REQUEST";
  2829. case TDLS_PEER_PSM_RESPONSE:
  2830. return "TDLS_PEER_PSM_RESPONSE";
  2831. case TDLS_PEER_TRAFFIC_RESPONSE:
  2832. return "TDLS_PEER_TRAFFIC_RESPONSE";
  2833. case TDLS_DISCOVERY_REQUEST:
  2834. return "TDLS_DISCOVERY_REQUEST";
  2835. case TDLS_DISCOVERY_RESPONSE:
  2836. return "TDLS_DISCOVERY_RESPONSE";
  2837. default:
  2838. return "UNKNOWN";
  2839. }
  2840. }
  2841. #endif /* CONFIG_TDLS */