btm_ble_gap.c 174 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716
  1. /******************************************************************************
  2. *
  3. * Copyright (C) 2008-2014 Broadcom Corporation
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at:
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. ******************************************************************************/
  18. /******************************************************************************
  19. *
  20. * This file contains functions for BLE GAP.
  21. *
  22. ******************************************************************************/
  23. #include <string.h>
  24. //#include <stdio.h>
  25. #include <stddef.h>
  26. #include "stack/bt_types.h"
  27. //#include "bt_utils.h"
  28. #include "btm_int.h"
  29. #include "stack/btm_ble_api.h"
  30. #include "stack/btu.h"
  31. #include "device/controller.h"
  32. #include "stack/hcimsgs.h"
  33. #include "stack/gap_api.h"
  34. #include "hci/hci_layer.h"
  35. #if BLE_INCLUDED == TRUE
  36. #include "l2c_int.h"
  37. #include "stack/gattdefs.h"
  38. #include "gatt_int.h"
  39. #include "btm_ble_int.h"
  40. //#define LOG_TAG "bt_btm_ble"
  41. //#include "osi/include/log.h"
  42. #include "osi/osi.h"
  43. #include "osi/mutex.h"
  44. #define BTM_BLE_NAME_SHORT 0x01
  45. #define BTM_BLE_NAME_CMPL 0x02
  46. #define BTM_BLE_FILTER_TARGET_UNKNOWN 0xff
  47. #define BTM_BLE_POLICY_UNKNOWN 0xff
  48. #define BTM_EXT_BLE_RMT_NAME_TIMEOUT 30
  49. #define MIN_ADV_LENGTH 2
  50. #define BTM_VSC_CHIP_CAPABILITY_RSP_LEN_L_RELEASE 9
  51. #define BTM_BLE_GAP_ADV_RPT_BATCH_SIZE (10)
  52. #if BTM_DYNAMIC_MEMORY == FALSE
  53. static tBTM_BLE_VSC_CB cmn_ble_gap_vsc_cb;
  54. #else
  55. static tBTM_BLE_VSC_CB *cmn_ble_gap_vsc_cb_ptr;
  56. #define cmn_ble_gap_vsc_cb (*cmn_ble_gap_vsc_cb_ptr)
  57. #endif
  58. #if BLE_VND_INCLUDED == TRUE
  59. static tBTM_BLE_CTRL_FEATURES_CBACK *p_ctrl_le_feature_rd_cmpl_cback = NULL;
  60. #endif
  61. tBTM_CallbackFunc conn_param_update_cb;
  62. /*******************************************************************************
  63. ** Local functions
  64. *******************************************************************************/
  65. static void btm_ble_update_adv_flag(UINT8 flag);
  66. static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p);
  67. UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
  68. tBTM_BLE_ADV_DATA *p_data);
  69. static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
  70. BD_ADDR_PTR p_peer_addr_ptr,
  71. tBLE_ADDR_TYPE *p_peer_addr_type,
  72. tBLE_ADDR_TYPE *p_own_addr_type);
  73. static void btm_ble_stop_observe(void);
  74. static void btm_ble_stop_discover(void);
  75. static void btm_adv_pkt_handler(void *arg);
  76. uint32_t BTM_BleUpdateOwnType(uint8_t *own_bda_type, tBTM_START_ADV_CMPL_CBACK *cb);
  77. #define BTM_BLE_INQ_RESULT 0x01
  78. #define BTM_BLE_OBS_RESULT 0x02
  79. #define BTM_BLE_SEL_CONN_RESULT 0x04
  80. #define BTM_BLE_DISCO_RESULT 0x08
  81. static bool is_ble50_inter = false;
  82. void btm_ble_inter_set(bool extble_inter)
  83. {
  84. is_ble50_inter = extble_inter;
  85. }
  86. bool btm_ble_inter_get(void)
  87. {
  88. return is_ble50_inter;
  89. }
  90. /* LE states combo bit to check */
  91. const UINT8 btm_le_state_combo_tbl[BTM_BLE_STATE_MAX][BTM_BLE_STATE_MAX][2] = {
  92. {/* single state support */
  93. {HCI_SUPP_LE_STATES_CONN_ADV_MASK, HCI_SUPP_LE_STATES_CONN_ADV_OFF}, /* conn_adv */
  94. {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* init */
  95. {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* master */
  96. {HCI_SUPP_LE_STATES_SLAVE_MASK, HCI_SUPP_LE_STATES_SLAVE_OFF}, /* slave */
  97. {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_OFF}, /* lo du dir adv */
  98. {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_OFF}, /* hi duty dir adv */
  99. {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF}, /* non connectable adv */
  100. {HCI_SUPP_LE_STATES_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_OFF}, /* passive scan */
  101. {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_OFF}, /* active scan */
  102. {HCI_SUPP_LE_STATES_SCAN_ADV_MASK, HCI_SUPP_LE_STATESSCAN_ADV_OFF} /* scanable adv */
  103. },
  104. { /* conn_adv =0 */
  105. {0, 0}, /* conn_adv */
  106. {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF}, /* init: 32 */
  107. {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF}, /* master: 35 */
  108. {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* slave: 38,*/
  109. {0, 0}, /* lo du dir adv */
  110. {0, 0}, /* hi duty dir adv */
  111. {0, 0}, /* non connectable adv */
  112. {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF}, /* passive scan */
  113. {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF}, /* active scan */
  114. {0, 0} /* scanable adv */
  115. },
  116. { /* init */
  117. {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF}, /* conn_adv: 32 */
  118. {0, 0}, /* init */
  119. {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF}, /* master 28 */
  120. {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* slave 41 */
  121. {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF} ,/* lo du dir adv 34 */
  122. {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF}, /* hi duty dir adv 33 */
  123. {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF}, /* non connectable adv */
  124. {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF}, /* passive scan */
  125. {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF}, /* active scan */
  126. {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF} /* scanable adv */
  127. },
  128. { /* master */
  129. {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF}, /* conn_adv: 35 */
  130. {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF}, /* init 28 */
  131. {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF}, /* master 28 */
  132. {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF}, /* slave: 32 */
  133. {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF}, /* lo duty cycle adv 37 */
  134. {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF}, /* hi duty cycle adv 36 */
  135. {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF}, /* non connectable adv */
  136. {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF}, /* passive scan */
  137. {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF}, /* active scan */
  138. {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF} /* scanable adv */
  139. },
  140. { /* slave */
  141. {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* conn_adv: 38,*/
  142. {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* init 41 */
  143. {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* master 41 */
  144. {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* slave: 38,*/
  145. {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF}, /* lo duty cycle adv 40 */
  146. {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF}, /* hi duty cycle adv 39 */
  147. {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF}, /* non connectable adv */
  148. {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF}, /* passive scan */
  149. {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF}, /* active scan */
  150. {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF} /* scanable adv */
  151. },
  152. { /* lo duty cycle adv */
  153. {0, 0}, /* conn_adv: 38,*/
  154. {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF} ,/* init 34 */
  155. {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF}, /* master 37 */
  156. {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF}, /* slave: 40 */
  157. {0, 0}, /* lo duty cycle adv 40 */
  158. {0, 0}, /* hi duty cycle adv 39 */
  159. {0, 0}, /* non connectable adv */
  160. {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_PASS_SCAN_OFF}, /* passive scan */
  161. {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_ACTIVE_SCAN_OFF}, /* active scan */
  162. {0, 0} /* scanable adv */
  163. },
  164. { /* hi duty cycle adv */
  165. {0, 0}, /* conn_adv: 38,*/
  166. {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF}, /* init 33 */
  167. {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF}, /* master 36 */
  168. {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF}, /* slave: 39*/
  169. {0, 0}, /* lo duty cycle adv 40 */
  170. {0, 0}, /* hi duty cycle adv 39 */
  171. {0, 0}, /* non connectable adv */
  172. {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF}, /* passive scan */
  173. {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF}, /* active scan */
  174. {0, 0} /* scanable adv */
  175. },
  176. { /* non connectable adv */
  177. {0, 0}, /* conn_adv: */
  178. {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF}, /* init */
  179. {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF}, /* master */
  180. {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF}, /* slave: */
  181. {0, 0}, /* lo duty cycle adv */
  182. {0, 0}, /* hi duty cycle adv */
  183. {0, 0}, /* non connectable adv */
  184. {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF}, /* passive scan */
  185. {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF}, /* active scan */
  186. {0, 0} /* scanable adv */
  187. },
  188. { /* passive scan */
  189. {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF}, /* conn_adv: */
  190. {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF}, /* init */
  191. {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF}, /* master */
  192. {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF}, /* slave: */
  193. {0, 0}, /* lo duty cycle adv */
  194. {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF}, /* hi duty cycle adv */
  195. {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF}, /* non connectable adv */
  196. {0, 0}, /* passive scan */
  197. {0, 0}, /* active scan */
  198. {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF} /* scanable adv */
  199. },
  200. { /* active scan */
  201. {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF}, /* conn_adv: */
  202. {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF}, /* init */
  203. {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF}, /* master */
  204. {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF}, /* slave: */
  205. {0, 0}, /* lo duty cycle adv */
  206. {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF}, /* hi duty cycle adv */
  207. {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF}, /* non connectable adv */
  208. {0, 0}, /* TODO: passive scan */
  209. {0, 0}, /* TODO: active scan */
  210. {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF} /* scanable adv */
  211. },
  212. { /* scanable adv */
  213. {0, 0}, /* conn_adv: */
  214. {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF}, /* init */
  215. {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF}, /* master */
  216. {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF}, /* slave: */
  217. {0, 0}, /* lo duty cycle adv */
  218. {0, 0}, /* hi duty cycle adv */
  219. {0, 0}, /* non connectable adv */
  220. {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF}, /* passive scan */
  221. {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF}, /* active scan */
  222. {0, 0} /* scanable adv */
  223. }
  224. };
  225. /* check LE combo state supported */
  226. #define BTM_LE_STATES_SUPPORTED(x, y, z) ((x)[(z)] & (y))
  227. static osi_mutex_t adv_enable_lock;
  228. static osi_mutex_t adv_data_lock;
  229. static osi_mutex_t adv_param_lock;
  230. static osi_mutex_t scan_enable_lock;
  231. static osi_mutex_t scan_param_lock;
  232. osi_sem_t adv_enable_sem;
  233. osi_sem_t adv_data_sem;
  234. osi_sem_t adv_param_sem;
  235. osi_sem_t scan_enable_sem;
  236. osi_sem_t scan_param_sem;
  237. uint8_t adv_enable_status = 0;
  238. uint8_t adv_data_status = 0;
  239. uint8_t adv_param_status = 0;
  240. uint8_t scan_enable_status = 0;
  241. uint8_t scan_param_status = 0;
  242. void btm_ble_lock_init(void)
  243. {
  244. osi_mutex_new(&adv_enable_lock);
  245. osi_mutex_new(&adv_data_lock);
  246. osi_mutex_new(&adv_param_lock);
  247. osi_mutex_new(&scan_enable_lock);
  248. osi_mutex_new(&scan_param_lock);
  249. }
  250. void btm_ble_lock_free(void)
  251. {
  252. osi_mutex_free(&adv_enable_lock);
  253. osi_mutex_free(&adv_data_lock);
  254. osi_mutex_free(&adv_param_lock);
  255. osi_mutex_free(&scan_enable_lock);
  256. osi_mutex_free(&scan_param_lock);
  257. }
  258. void btm_ble_sem_init(void)
  259. {
  260. osi_sem_new(&adv_enable_sem, 1, 0);
  261. osi_sem_new(&adv_data_sem, 1, 0);
  262. osi_sem_new(&adv_param_sem, 1, 0);
  263. osi_sem_new(&scan_enable_sem, 1, 0);
  264. osi_sem_new(&scan_param_sem, 1, 0);
  265. }
  266. void btm_ble_sem_free(void)
  267. {
  268. osi_sem_free(&adv_enable_sem);
  269. osi_sem_free(&adv_data_sem);
  270. osi_sem_free(&adv_param_sem);
  271. osi_sem_free(&scan_enable_sem);
  272. osi_sem_free(&scan_param_sem);
  273. }
  274. /*******************************************************************************
  275. **
  276. ** Function BTM_BleRegiseterConnParamCallback
  277. **
  278. ** Description register connection parameters update callback func
  279. **
  280. ** Returns void
  281. **
  282. *******************************************************************************/
  283. void BTM_BleRegiseterConnParamCallback(tBTM_UPDATE_CONN_PARAM_CBACK *update_conn_param_cb)
  284. {
  285. conn_param_update_cb.update_conn_param_cb = update_conn_param_cb;
  286. }
  287. /*******************************************************************************
  288. **
  289. ** Function BTM_BleUpdateAdvWhitelist
  290. **
  291. ** Description Add or remove device from advertising white list
  292. **
  293. ** Returns void
  294. **
  295. *******************************************************************************/
  296. BOOLEAN BTM_BleUpdateAdvWhitelist(BOOLEAN add_remove, BD_ADDR remote_bda, tBLE_ADDR_TYPE addr_type, tBTM_UPDATE_WHITELIST_CBACK *update_wl_cb)
  297. {
  298. return btm_update_dev_to_white_list(add_remove, remote_bda, addr_type, update_wl_cb);
  299. }
  300. /*******************************************************************************
  301. **
  302. ** Function BTM_BleUpdateAdvWhitelist
  303. **
  304. ** Description Add or remove device from advertising white list
  305. **
  306. ** Returns void
  307. **
  308. *******************************************************************************/
  309. void BTM_BleClearWhitelist(tBTM_UPDATE_WHITELIST_CBACK *update_wl_cb)
  310. {
  311. btm_ble_clear_white_list(update_wl_cb);
  312. }
  313. /*******************************************************************************
  314. **
  315. ** Function BTM_BleUpdateAdvFilterPolicy
  316. **
  317. ** Description This function update the filter policy of advertiser.
  318. **
  319. ** Parameter adv_policy: advertising filter policy
  320. **
  321. ** Return void
  322. *******************************************************************************/
  323. void BTM_BleUpdateAdvFilterPolicy(tBTM_BLE_AFP adv_policy)
  324. {
  325. tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
  326. tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC;
  327. BD_ADDR p_addr_ptr = {0};
  328. UINT8 adv_mode = p_cb->adv_mode;
  329. BTM_TRACE_EVENT ("BTM_BleUpdateAdvFilterPolicy\n");
  330. if (!controller_get_interface()->supports_ble()) {
  331. return;
  332. }
  333. if (p_cb->afp != adv_policy) {
  334. p_cb->afp = adv_policy;
  335. /* if adv active, stop and restart */
  336. btm_ble_stop_adv ();
  337. if (p_cb->connectable_mode & BTM_BLE_CONNECTABLE) {
  338. p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type,
  339. &p_cb->adv_addr_type);
  340. }
  341. btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
  342. BTM_BLE_GAP_ADV_SLOW_INT),
  343. (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
  344. BTM_BLE_GAP_ADV_SLOW_INT),
  345. p_cb->evt_type,
  346. p_cb->adv_addr_type,
  347. init_addr_type,
  348. p_addr_ptr,
  349. p_cb->adv_chnl_map,
  350. p_cb->afp);
  351. if (adv_mode == BTM_BLE_ADV_ENABLE) {
  352. btm_ble_start_adv ();
  353. }
  354. }
  355. }
  356. /*******************************************************************************
  357. **
  358. ** Function btm_ble_send_extended_scan_params
  359. **
  360. ** Description This function sends out the extended scan parameters command to the controller
  361. **
  362. ** Parameters scan_type - Scan type
  363. ** scan_int - Scan interval
  364. ** scan_win - Scan window
  365. ** addr_type_own - Own address type
  366. ** scan_filter_policy - Scan filter policy
  367. **
  368. ** Returns TRUE or FALSE
  369. **
  370. *******************************************************************************/
  371. BOOLEAN btm_ble_send_extended_scan_params(UINT8 scan_type, UINT32 scan_int,
  372. UINT32 scan_win, UINT8 addr_type_own,
  373. UINT8 scan_filter_policy)
  374. {
  375. UINT8 scan_param[HCIC_PARAM_SIZE_BLE_WRITE_EXTENDED_SCAN_PARAM];
  376. UINT8 *pp_scan = scan_param;
  377. memset(scan_param, 0, HCIC_PARAM_SIZE_BLE_WRITE_EXTENDED_SCAN_PARAM);
  378. UINT8_TO_STREAM(pp_scan, scan_type);
  379. UINT32_TO_STREAM(pp_scan, scan_int);
  380. UINT32_TO_STREAM(pp_scan, scan_win);
  381. UINT8_TO_STREAM(pp_scan, addr_type_own);
  382. UINT8_TO_STREAM(pp_scan, scan_filter_policy);
  383. BTM_TRACE_DEBUG("%s, %d, %d", __func__, scan_int, scan_win);
  384. if ((BTM_VendorSpecificCommand(HCI_BLE_EXTENDED_SCAN_PARAMS_OCF,
  385. HCIC_PARAM_SIZE_BLE_WRITE_EXTENDED_SCAN_PARAM, scan_param, NULL)) != BTM_SUCCESS) {
  386. BTM_TRACE_ERROR("%s error sending extended scan parameters", __func__);
  387. return FALSE;
  388. }
  389. return TRUE;
  390. }
  391. /*******************************************************************************
  392. **
  393. ** Function BTM_BleObserve
  394. **
  395. ** Description This procedure keep the device listening for advertising
  396. ** events from a broadcast device.
  397. **
  398. ** Parameters start: start or stop observe.
  399. ** white_list: use white list in observer mode or not.
  400. **
  401. ** Returns void
  402. **
  403. *******************************************************************************/
  404. tBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT32 duration,
  405. tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb)
  406. {
  407. tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
  408. tBTM_STATUS status = BTM_WRONG_MODE;
  409. UINT32 scan_interval = !p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval;
  410. UINT32 scan_window = !p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window;
  411. BTM_TRACE_EVENT ("%s : scan_type:%d, %d, %d\n", __func__, btm_cb.btm_inq_vars.scan_type,
  412. p_inq->scan_interval, p_inq->scan_window);
  413. if (!controller_get_interface()->supports_ble()) {
  414. return BTM_ILLEGAL_VALUE;
  415. }
  416. if (start) {
  417. /* shared inquiry database, do not allow observe if any inquiry is active */
  418. if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
  419. BTM_TRACE_ERROR("%s Observe Already Active", __func__);
  420. return status;
  421. }
  422. btm_cb.ble_ctr_cb.p_obs_results_cb = p_results_cb;
  423. btm_cb.ble_ctr_cb.p_obs_cmpl_cb = p_cmpl_cb;
  424. status = BTM_CMD_STARTED;
  425. /* scan is not started */
  426. if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
  427. /* allow config of scan type */
  428. p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ?
  429. BTM_BLE_SCAN_MODE_ACTI : p_inq->scan_type;
  430. /* assume observe always not using white list */
  431. #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
  432. /* enable resolving list */
  433. //btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_SCAN);
  434. #endif
  435. if (cmn_ble_gap_vsc_cb.extended_scan_support == 0) {
  436. btsnd_hcic_ble_set_scan_params(p_inq->scan_type, (UINT16)scan_interval,
  437. (UINT16)scan_window,
  438. btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
  439. BTM_BLE_DEFAULT_SFP);
  440. } else {
  441. btm_ble_send_extended_scan_params(p_inq->scan_type, scan_interval, scan_window,
  442. btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
  443. BTM_BLE_DEFAULT_SFP);
  444. }
  445. status = btm_ble_start_scan();
  446. }
  447. if (status == BTM_CMD_STARTED) {
  448. btm_cb.ble_ctr_cb.scan_activity |= BTM_LE_OBSERVE_ACTIVE;
  449. if (duration != 0)
  450. /* start observer timer */
  451. {
  452. btu_start_timer (&btm_cb.ble_ctr_cb.obs_timer_ent, BTU_TTYPE_BLE_OBSERVE, duration);
  453. }
  454. }
  455. } else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
  456. status = BTM_CMD_STARTED;
  457. btm_ble_stop_observe();
  458. } else {
  459. BTM_TRACE_ERROR("%s Observe not active\n", __func__);
  460. }
  461. return status;
  462. }
  463. /*******************************************************************************
  464. **
  465. ** Function BTM_BleScan
  466. **
  467. ** Description This procedure keep the device listening for advertising
  468. ** events from a broadcast device.
  469. **
  470. ** Parameters start: start or stop scan.
  471. ** white_list: use white list in observer mode or not.
  472. **
  473. ** Returns void
  474. **
  475. *******************************************************************************/
  476. tBTM_STATUS BTM_BleScan(BOOLEAN start, UINT32 duration,
  477. tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb, tBTM_INQ_DIS_CB *p_discard_cb)
  478. {
  479. tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
  480. tBTM_STATUS status = BTM_WRONG_MODE;
  481. if (!controller_get_interface()->supports_ble()) {
  482. return BTM_ILLEGAL_VALUE;
  483. }
  484. if (start) {
  485. /* shared inquiry database, do not allow scan if any inquiry is active */
  486. if (BTM_BLE_IS_DISCO_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
  487. BTM_TRACE_ERROR("%s scan already active", __func__);
  488. return status;
  489. }
  490. btm_cb.ble_ctr_cb.p_scan_results_cb = p_results_cb;
  491. btm_cb.ble_ctr_cb.p_scan_cmpl_cb = p_cmpl_cb;
  492. btm_cb.ble_ctr_cb.p_obs_discard_cb = p_discard_cb;
  493. status = BTM_CMD_STARTED;
  494. /* scan is not started */
  495. if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
  496. /* assume observe always not using white list */
  497. #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
  498. /* enable resolving list */
  499. //btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_SCAN);
  500. #endif
  501. // if not set scan params, set default scan params
  502. if (!p_inq->scan_params_set) {
  503. /* allow config of scan type */
  504. p_inq->scan_type = BTM_BLE_SCAN_MODE_ACTI;
  505. p_inq->scan_interval = BTM_BLE_GAP_DISC_SCAN_INT;
  506. p_inq->scan_window = BTM_BLE_GAP_DISC_SCAN_WIN;
  507. p_inq->sfp = BTM_BLE_DEFAULT_SFP;
  508. p_inq->scan_params_set = TRUE;
  509. p_inq->scan_duplicate_filter = BTM_BLE_DUPLICATE_DISABLE;
  510. btsnd_hcic_ble_set_scan_params(p_inq->scan_type, p_inq->scan_interval,
  511. p_inq->scan_window,
  512. btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
  513. p_inq->sfp);
  514. }
  515. status = btm_ble_start_scan();
  516. }
  517. if (status == BTM_CMD_STARTED) {
  518. btm_cb.ble_ctr_cb.scan_activity |= BTM_LE_DISCOVER_ACTIVE;
  519. if (duration != 0)
  520. /* start observer timer */
  521. {
  522. btu_start_timer (&btm_cb.ble_ctr_cb.scan_timer_ent, BTU_TTYPE_BLE_SCAN, duration);
  523. }
  524. }
  525. } else if (BTM_BLE_IS_DISCO_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
  526. status = BTM_CMD_STARTED;
  527. btm_ble_stop_discover();
  528. } else {
  529. BTM_TRACE_ERROR("%s scan not active\n", __func__);
  530. }
  531. return status;
  532. }
  533. /*******************************************************************************
  534. **
  535. ** Function BTM_BleBroadcast
  536. **
  537. ** Description This function is to start or stop broadcasting.
  538. **
  539. ** Parameters start: start or stop broadcasting.
  540. **
  541. ** Returns status.
  542. **
  543. *******************************************************************************/
  544. tBTM_STATUS BTM_BleBroadcast(BOOLEAN start, tBTM_START_STOP_ADV_CMPL_CBACK *p_stop_adv_cback)
  545. {
  546. tBTM_STATUS status = BTM_NO_RESOURCES;
  547. tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
  548. tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
  549. UINT8 evt_type = p_cb->scan_rsp ? BTM_BLE_DISCOVER_EVT : BTM_BLE_NON_CONNECT_EVT;
  550. if (!controller_get_interface()->supports_ble()) {
  551. return BTM_ILLEGAL_VALUE;
  552. }
  553. #ifdef BTM_BLE_PC_ADV_TEST_MODE
  554. if (BTM_BLE_PC_ADV_TEST_MODE) {
  555. evt_type = p_cb->scan_rsp ? BTM_BLE_CONNECT_EVT : BTM_BLE_NON_CONNECT_EVT;
  556. }
  557. #endif
  558. if (start) {
  559. /* update adv params */
  560. if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
  561. BTM_BLE_GAP_ADV_INT),
  562. (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
  563. BTM_BLE_GAP_ADV_INT),
  564. evt_type,
  565. p_addr_cb->own_addr_type,
  566. p_cb->direct_bda.type,
  567. p_cb->direct_bda.bda,
  568. p_cb->adv_chnl_map,
  569. p_cb->afp))
  570. {
  571. status = BTM_NO_RESOURCES;
  572. } else {
  573. p_cb->evt_type = evt_type;
  574. }
  575. status = btm_ble_start_adv ();
  576. } else {
  577. //save the stop adv callback to the BTM env.
  578. p_cb->p_stop_adv_cb = p_stop_adv_cback;
  579. status = btm_ble_stop_adv();
  580. #if BLE_PRIVACY_SPT == TRUE
  581. btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE);
  582. #endif
  583. }
  584. return status;
  585. }
  586. #if BLE_VND_INCLUDED == TRUE
  587. /*******************************************************************************
  588. **
  589. ** Function btm_vsc_brcm_features_complete
  590. **
  591. ** Description Command Complete callback for HCI_BLE_VENDOR_CAP_OCF
  592. **
  593. ** Returns void
  594. **
  595. *******************************************************************************/
  596. static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_params)
  597. {
  598. UINT8 status = 0xFF;
  599. UINT8 *p;
  600. BTM_TRACE_DEBUG("%s", __func__);
  601. /* Check status of command complete event */
  602. if ((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF) &&
  603. (p_vcs_cplt_params->param_len > 0)) {
  604. p = p_vcs_cplt_params->p_param_buf;
  605. STREAM_TO_UINT8(status, p);
  606. }
  607. if (status == HCI_SUCCESS) {
  608. STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.adv_inst_max, p);
  609. STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.rpa_offloading, p);
  610. STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg, p);
  611. STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz, p);
  612. STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.filter_support, p);
  613. STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.max_filter, p);
  614. STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.energy_support, p);
  615. if (p_vcs_cplt_params->param_len > BTM_VSC_CHIP_CAPABILITY_RSP_LEN_L_RELEASE) {
  616. STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.version_supported, p);
  617. } else {
  618. btm_cb.cmn_ble_vsc_cb.version_supported = BTM_VSC_CHIP_CAPABILITY_L_VERSION;
  619. }
  620. if (btm_cb.cmn_ble_vsc_cb.version_supported >= BTM_VSC_CHIP_CAPABILITY_M_VERSION) {
  621. STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.total_trackable_advertisers, p);
  622. STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.extended_scan_support, p);
  623. STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.debug_logging_supported, p);
  624. }
  625. btm_cb.cmn_ble_vsc_cb.values_read = TRUE;
  626. }
  627. BTM_TRACE_DEBUG("%s: stat=%d, irk=%d, ADV ins:%d, rpa=%d, ener=%d, ext_scan=%d",
  628. __func__, status, btm_cb.cmn_ble_vsc_cb.max_irk_list_sz,
  629. btm_cb.cmn_ble_vsc_cb.adv_inst_max, btm_cb.cmn_ble_vsc_cb.rpa_offloading,
  630. btm_cb.cmn_ble_vsc_cb.energy_support, btm_cb.cmn_ble_vsc_cb.extended_scan_support);
  631. if (BTM_BleMaxMultiAdvInstanceCount() > 0) {
  632. btm_ble_multi_adv_init();
  633. }
  634. if (btm_cb.cmn_ble_vsc_cb.max_filter > 0) {
  635. btm_ble_adv_filter_init();
  636. }
  637. #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
  638. /* VS capability included and non-4.2 device */
  639. if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz > 0 &&
  640. controller_get_interface()->get_ble_resolving_list_max_size() == 0) {
  641. btm_ble_resolving_list_init(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz);
  642. }
  643. #endif
  644. if (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg > 0) {
  645. btm_ble_batchscan_init();
  646. }
  647. if (p_ctrl_le_feature_rd_cmpl_cback != NULL) {
  648. p_ctrl_le_feature_rd_cmpl_cback(status);
  649. }
  650. }
  651. #endif
  652. /*******************************************************************************
  653. **
  654. ** Function BTM_BleGetVendorCapabilities
  655. **
  656. ** Description This function reads local LE features
  657. **
  658. ** Parameters p_cmn_vsc_cb : Locala LE capability structure
  659. **
  660. ** Returns void
  661. **
  662. *******************************************************************************/
  663. extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb)
  664. {
  665. BTM_TRACE_DEBUG("BTM_BleGetVendorCapabilities");
  666. if (NULL != p_cmn_vsc_cb) {
  667. *p_cmn_vsc_cb = btm_cb.cmn_ble_vsc_cb;
  668. }
  669. }
  670. /******************************************************************************
  671. **
  672. ** Function BTM_BleReadControllerFeatures
  673. **
  674. ** Description Reads BLE specific controller features
  675. **
  676. ** Parameters: tBTM_BLE_CTRL_FEATURES_CBACK : Callback to notify when features are read
  677. **
  678. ** Returns void
  679. **
  680. *******************************************************************************/
  681. extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK *p_vsc_cback)
  682. {
  683. if (TRUE == btm_cb.cmn_ble_vsc_cb.values_read) {
  684. return;
  685. }
  686. #if BLE_VND_INCLUDED == TRUE
  687. BTM_TRACE_DEBUG("BTM_BleReadControllerFeatures");
  688. p_ctrl_le_feature_rd_cmpl_cback = p_vsc_cback;
  689. if ( BTM_VendorSpecificCommand (HCI_BLE_VENDOR_CAP_OCF,
  690. 0,
  691. NULL,
  692. btm_ble_vendor_capability_vsc_cmpl_cback)
  693. != BTM_CMD_STARTED) {
  694. BTM_TRACE_ERROR("LE Get_Vendor Capabilities Command Failed.");
  695. }
  696. #else
  697. UNUSED(p_vsc_cback);
  698. #endif
  699. return ;
  700. }
  701. void BTM_VendorHciEchoCmdCallback(tBTM_VSC_CMPL *p1)
  702. {
  703. #if (!CONFIG_BT_STACK_NO_LOG)
  704. if (!p1) {
  705. return;
  706. }
  707. uint8_t *p = p1->p_param_buf;
  708. uint8_t status, echo;
  709. STREAM_TO_UINT8 (status, p);
  710. STREAM_TO_UINT8 (echo, p);
  711. #endif
  712. BTM_TRACE_DEBUG("%s status 0x%x echo 0x%x", __func__, status, echo);
  713. }
  714. /******************************************************************************
  715. **
  716. ** Function BTM_VendorHciEchoCmdTest
  717. **
  718. ** Description vendor common echo hci cmd test, controller will return status and echo
  719. **
  720. ** Parameters: echo : echo value
  721. **
  722. ** Returns void
  723. **
  724. *******************************************************************************/
  725. void BTM_VendorHciEchoCmdTest(uint8_t echo)
  726. {
  727. BTM_VendorSpecificCommand (HCI_VENDOR_COMMON_ECHO_CMD_OPCODE,
  728. 1,
  729. &echo,
  730. BTM_VendorHciEchoCmdCallback);
  731. }
  732. /*******************************************************************************
  733. **
  734. ** Function BTM_BleEnableMixedPrivacyMode
  735. **
  736. ** Description This function is called to enabled Mixed mode if privacy 1.2
  737. ** is applicable in controller.
  738. **
  739. ** Parameters mixed_on: mixed mode to be used or not.
  740. **
  741. ** Returns void
  742. **
  743. *******************************************************************************/
  744. void BTM_BleEnableMixedPrivacyMode(BOOLEAN mixed_on)
  745. {
  746. #if BLE_PRIVACY_SPT == TRUE
  747. btm_cb.ble_ctr_cb.mixed_mode = mixed_on;
  748. /* TODO: send VSC to enabled mixed mode */
  749. #endif
  750. }
  751. /*******************************************************************************
  752. **
  753. ** Function BTM_BleConfigPrivacy
  754. **
  755. ** Description This function is called to enable or disable the privacy in
  756. ** LE channel of the local device.
  757. **
  758. ** Parameters privacy_mode: privacy mode on or off.
  759. **
  760. ** Returns BOOLEAN privacy mode set success; otherwise failed.
  761. **
  762. *******************************************************************************/
  763. BOOLEAN BTM_BleConfigPrivacy(BOOLEAN privacy_mode, tBTM_SET_LOCAL_PRIVACY_CBACK *set_local_privacy_cback)
  764. {
  765. #if BLE_PRIVACY_SPT == TRUE
  766. tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
  767. tBTM_LE_RANDOM_CB *random_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
  768. if (random_cb){
  769. random_cb->set_local_privacy_cback = set_local_privacy_cback;
  770. }else{
  771. BTM_TRACE_ERROR("%s,random_cb = NULL", __func__);
  772. }
  773. BTM_TRACE_EVENT ("%s\n", __func__);
  774. /* if LE is not supported, return error */
  775. if (!controller_get_interface()->supports_ble()) {
  776. return FALSE;
  777. }
  778. #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE)
  779. uint8_t addr_resolution = 0;
  780. #endif /* defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE */
  781. if (!privacy_mode) { /* if privacy disabled, always use public address */
  782. p_cb->addr_mgnt_cb.exist_addr_bit &= (~BTM_BLE_GAP_ADDR_BIT_RESOLVABLE);
  783. memset(p_cb->addr_mgnt_cb.resolvale_addr, 0, BD_ADDR_LEN);
  784. p_cb->addr_mgnt_cb.own_addr_type = BLE_ADDR_PUBLIC;
  785. p_cb->privacy_mode = BTM_PRIVACY_NONE;
  786. // Disable RPA function
  787. btsnd_hcic_ble_set_addr_resolution_enable(FALSE);
  788. } else { /* privacy is turned on*/
  789. #if (CONTROLLER_RPA_LIST_ENABLE == FALSE)
  790. /* always set host random address, used when privacy 1.1 or priavcy 1.2 is disabled */
  791. btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
  792. #endif
  793. if (BTM_BleMaxMultiAdvInstanceCount() > 0) {
  794. btm_ble_multi_adv_enb_privacy(privacy_mode);
  795. }
  796. /* 4.2 controller only allow privacy 1.2 or mixed mode, resolvable private address in controller */
  797. if (controller_get_interface()->supports_ble_privacy()) {
  798. #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE)
  799. addr_resolution = 1;
  800. #endif /* defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE */
  801. /* check vendor specific capability */
  802. p_cb->privacy_mode = btm_cb.ble_ctr_cb.mixed_mode ? BTM_PRIVACY_MIXED : BTM_PRIVACY_1_2;
  803. } else { /* 4.1/4.0 controller */
  804. p_cb->privacy_mode = BTM_PRIVACY_1_1;
  805. }
  806. // Enable RPA function
  807. btsnd_hcic_ble_set_addr_resolution_enable(TRUE);
  808. }
  809. #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE)
  810. GAP_BleAttrDBUpdate (GATT_UUID_GAP_CENTRAL_ADDR_RESOL, (tGAP_BLE_ATTR_VALUE *)&addr_resolution);
  811. #endif
  812. return TRUE;
  813. #else
  814. return FALSE;
  815. #endif
  816. }
  817. /*******************************************************************************
  818. **
  819. ** Function BTMGetLocalResolvablePrivateAddr
  820. **
  821. ** Description This function is called to get local RPA address
  822. **
  823. ** Parameters bda: address pointer.
  824. **
  825. **
  826. *******************************************************************************/
  827. BOOLEAN BTM_GetLocalResolvablePrivateAddr(BD_ADDR bda)
  828. {
  829. tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
  830. BTM_TRACE_DEBUG ("get owm resolvable random address");
  831. if (bda) {
  832. /* if privacy disabled, return false */
  833. if ((p_cb->exist_addr_bit & BTM_BLE_GAP_ADDR_BIT_RESOLVABLE) == BTM_BLE_GAP_ADDR_BIT_RESOLVABLE) {
  834. memcpy(bda, p_cb->resolvale_addr, BD_ADDR_LEN);
  835. BTM_TRACE_DEBUG("own resolvable random address: 0x%02x:%02x:%02x:%02x:%02x:%02x",
  836. p_cb->resolvale_addr[0], p_cb->resolvale_addr[1],
  837. p_cb->resolvale_addr[2], p_cb->resolvale_addr[3],
  838. p_cb->resolvale_addr[4], p_cb->resolvale_addr[5]);
  839. return TRUE;
  840. }
  841. return FALSE;
  842. }
  843. return FALSE;
  844. }
  845. /*******************************************************************************
  846. **
  847. ** Function BTM_UpdateAddrInfor
  848. **
  849. ** Description This function is called to update address information
  850. **
  851. ** Parameters addr_type: address type
  852. ** bda: address pointer.
  853. **
  854. **
  855. *******************************************************************************/
  856. void BTM_UpdateAddrInfor(uint8_t addr_type, BD_ADDR bda)
  857. {
  858. btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type = addr_type;
  859. memcpy(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, bda, BD_ADDR_LEN);
  860. }
  861. /*******************************************************************************
  862. **
  863. ** Function BTM_BleSetStaticAddr
  864. **
  865. ** Description This function is called to save random address
  866. **
  867. ** Parameters rand_addr: address pointer.
  868. **
  869. **
  870. *******************************************************************************/
  871. void BTM_BleSetStaticAddr(BD_ADDR rand_addr)
  872. {
  873. memcpy(btm_cb.ble_ctr_cb.addr_mgnt_cb.static_rand_addr, rand_addr, BD_ADDR_LEN);
  874. btm_cb.ble_ctr_cb.addr_mgnt_cb.exist_addr_bit |= BTM_BLE_GAP_ADDR_BIT_RANDOM;
  875. }
  876. #if (CONTROLLER_RPA_LIST_ENABLE == FALSE)
  877. uint32_t BTM_BleUpdateOwnType(uint8_t *own_bda_type, tBTM_START_ADV_CMPL_CBACK *cb)
  878. {
  879. if(*own_bda_type == BLE_ADDR_RANDOM) {
  880. if((btm_cb.ble_ctr_cb.addr_mgnt_cb.exist_addr_bit & BTM_BLE_GAP_ADDR_BIT_RANDOM) == BTM_BLE_GAP_ADDR_BIT_RANDOM) {
  881. //close privacy
  882. #if BLE_PRIVACY_SPT == TRUE
  883. if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) {
  884. BTM_BleConfigPrivacy(FALSE, NULL);
  885. }
  886. #endif
  887. btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type = BLE_ADDR_RANDOM;
  888. memcpy(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, btm_cb.ble_ctr_cb.addr_mgnt_cb.static_rand_addr, BD_ADDR_LEN);
  889. // set address to controller
  890. btsnd_hcic_ble_set_random_addr(btm_cb.ble_ctr_cb.addr_mgnt_cb.static_rand_addr);
  891. } else if((btm_cb.ble_ctr_cb.addr_mgnt_cb.exist_addr_bit & BTM_BLE_GAP_ADDR_BIT_RESOLVABLE) == BTM_BLE_GAP_ADDR_BIT_RESOLVABLE) {
  892. btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type = BLE_ADDR_RANDOM;
  893. memcpy(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, btm_cb.ble_ctr_cb.addr_mgnt_cb.resolvale_addr, BD_ADDR_LEN);
  894. btsnd_hcic_ble_set_random_addr(btm_cb.ble_ctr_cb.addr_mgnt_cb.resolvale_addr);
  895. }else {
  896. BTM_TRACE_ERROR ("No random address yet, please set random address using API \"esp_ble_gap_set_rand_addr\" and retry\n");
  897. if(cb) {
  898. (* cb)(HCI_ERR_ESP_VENDOR_FAIL);
  899. }
  900. return BTM_ILLEGAL_VALUE;
  901. }
  902. } else if(*own_bda_type == BLE_ADDR_PUBLIC_ID || *own_bda_type == BLE_ADDR_RANDOM_ID) {
  903. if((btm_cb.ble_ctr_cb.addr_mgnt_cb.exist_addr_bit & BTM_BLE_GAP_ADDR_BIT_RESOLVABLE) == BTM_BLE_GAP_ADDR_BIT_RESOLVABLE) {
  904. *own_bda_type = BLE_ADDR_RANDOM;
  905. btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type = BLE_ADDR_RANDOM;
  906. memcpy(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, btm_cb.ble_ctr_cb.addr_mgnt_cb.resolvale_addr, BD_ADDR_LEN);
  907. btsnd_hcic_ble_set_random_addr(btm_cb.ble_ctr_cb.addr_mgnt_cb.resolvale_addr);
  908. } else {
  909. #if BLE_PRIVACY_SPT == TRUE
  910. if(btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) {
  911. BTM_TRACE_ERROR ("Error state\n");
  912. if(cb) {
  913. (* cb)(HCI_ERR_ESP_VENDOR_FAIL);
  914. }
  915. return BTM_ILLEGAL_VALUE;
  916. }
  917. #endif
  918. if(*own_bda_type == BLE_ADDR_PUBLIC_ID) {
  919. *own_bda_type = BLE_ADDR_PUBLIC;
  920. btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type = BLE_ADDR_PUBLIC;
  921. } else { //own_bda_type == BLE_ADDR_RANDOM_ID
  922. if((btm_cb.ble_ctr_cb.addr_mgnt_cb.exist_addr_bit & BTM_BLE_GAP_ADDR_BIT_RANDOM) == BTM_BLE_GAP_ADDR_BIT_RANDOM) {
  923. *own_bda_type = BLE_ADDR_RANDOM;
  924. btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type = BLE_ADDR_RANDOM;
  925. memcpy(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, btm_cb.ble_ctr_cb.addr_mgnt_cb.static_rand_addr, BD_ADDR_LEN);
  926. btsnd_hcic_ble_set_random_addr(btm_cb.ble_ctr_cb.addr_mgnt_cb.static_rand_addr);
  927. } else {
  928. BTM_TRACE_ERROR ("No RPA and no random address yet, please set RPA or random address and try\n");
  929. if(cb) {
  930. (* cb)(HCI_ERR_ESP_VENDOR_FAIL);
  931. }
  932. return BTM_ILLEGAL_VALUE;
  933. }
  934. }
  935. }
  936. } else {
  937. btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type = BLE_ADDR_PUBLIC;
  938. }
  939. return BTM_SUCCESS;
  940. }
  941. #else
  942. uint32_t BTM_BleUpdateOwnType(uint8_t *own_bda_type, tBTM_START_ADV_CMPL_CBACK *cb)
  943. {
  944. tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
  945. if((*own_bda_type == BLE_ADDR_RANDOM) || (*own_bda_type == BLE_ADDR_RANDOM_ID)) {
  946. if((p_cb->exist_addr_bit & BTM_BLE_GAP_ADDR_BIT_RANDOM) != BTM_BLE_GAP_ADDR_BIT_RANDOM) {
  947. BTM_TRACE_ERROR("No random address yet, please set random address and try\n");
  948. if(cb) {
  949. (* cb)(HCI_ERR_ESP_VENDOR_FAIL);
  950. }
  951. return BTM_ILLEGAL_VALUE;
  952. }
  953. // If a device is using RPA, it shall also have an Identity Address
  954. if ((*own_bda_type == BLE_ADDR_RANDOM_ID) && BTM_BLE_IS_NON_RESLVE_BDA(p_cb->static_rand_addr)) {
  955. BTM_TRACE_ERROR("No identity address yet, please set static random address and try\n");
  956. if (cb) {
  957. (* cb)(HCI_ERR_ESP_VENDOR_FAIL);
  958. }
  959. return BTM_ILLEGAL_VALUE;
  960. }
  961. }
  962. p_cb->own_addr_type = *own_bda_type;
  963. return BTM_SUCCESS;
  964. }
  965. #endif
  966. /*******************************************************************************
  967. **
  968. ** Function BTM_BleConfigLocalIcon
  969. **
  970. ** Description This function is called to set local icon
  971. **
  972. ** Parameters icon: appearance value.
  973. **
  974. **
  975. *******************************************************************************/
  976. void BTM_BleConfigLocalIcon(uint16_t icon)
  977. {
  978. #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE)
  979. tGAP_BLE_ATTR_VALUE p_value;
  980. p_value.icon = icon;
  981. GAP_BleAttrDBUpdate(GATT_UUID_GAP_ICON, &p_value);
  982. #else
  983. BTM_TRACE_ERROR("%s\n", __func__);
  984. #endif
  985. }
  986. /*******************************************************************************
  987. **
  988. ** Function BTM_BleConfigConnParams
  989. **
  990. ** Description This function is called to set the connection parameters
  991. **
  992. ** Parameters int_min: minimum connection interval
  993. ** int_max: maximum connection interval
  994. ** latency: slave latency
  995. ** timeout: supervision timeout
  996. **
  997. *******************************************************************************/
  998. void BTM_BleConfigConnParams(uint16_t int_min, uint16_t int_max, uint16_t latency, uint16_t timeout)
  999. {
  1000. #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE)
  1001. tGAP_BLE_ATTR_VALUE p_value;
  1002. p_value.conn_param.int_min = int_min;
  1003. p_value.conn_param.int_max = int_max;
  1004. p_value.conn_param.latency = latency;
  1005. p_value.conn_param.sp_tout = timeout;
  1006. GAP_BleAttrDBUpdate(GATT_UUID_GAP_PREF_CONN_PARAM, &p_value);
  1007. #else
  1008. BTM_TRACE_ERROR("%s\n", __func__);
  1009. #endif
  1010. }
  1011. /*******************************************************************************
  1012. **
  1013. ** Function BTM_BleMaxMultiAdvInstanceCount
  1014. **
  1015. ** Description Returns max number of multi adv instances supported by controller
  1016. **
  1017. ** Returns Max multi adv instance count
  1018. **
  1019. *******************************************************************************/
  1020. extern UINT8 BTM_BleMaxMultiAdvInstanceCount(void)
  1021. {
  1022. return btm_cb.cmn_ble_vsc_cb.adv_inst_max < BTM_BLE_MULTI_ADV_MAX ?
  1023. btm_cb.cmn_ble_vsc_cb.adv_inst_max : BTM_BLE_MULTI_ADV_MAX;
  1024. }
  1025. #if BLE_PRIVACY_SPT == TRUE
  1026. /*******************************************************************************
  1027. **
  1028. ** Function btm_ble_resolve_random_addr_on_adv
  1029. **
  1030. ** Description resolve random address complete callback.
  1031. **
  1032. ** Returns void
  1033. **
  1034. *******************************************************************************/
  1035. static void btm_ble_resolve_random_addr_on_adv(void *p_rec, void *p)
  1036. {
  1037. tBTM_SEC_DEV_REC *match_rec = (tBTM_SEC_DEV_REC *) p_rec;
  1038. UINT8 addr_type = BLE_ADDR_RANDOM;
  1039. BD_ADDR bda;
  1040. UINT8 *pp = (UINT8 *)p + 1;
  1041. UINT8 evt_type;
  1042. BTM_TRACE_EVENT ("btm_ble_resolve_random_addr_on_adv ");
  1043. STREAM_TO_UINT8 (evt_type, pp);
  1044. STREAM_TO_UINT8 (addr_type, pp);
  1045. STREAM_TO_BDADDR (bda, pp);
  1046. if (match_rec) {
  1047. BTM_TRACE_DEBUG("Random match");
  1048. match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
  1049. memcpy(match_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN);
  1050. if (btm_ble_init_pseudo_addr(match_rec, bda)) {
  1051. memcpy(bda, match_rec->bd_addr, BD_ADDR_LEN);
  1052. } else {
  1053. // Assign the original address to be the current report address
  1054. memcpy(bda, match_rec->ble.pseudo_addr, BD_ADDR_LEN);
  1055. }
  1056. }
  1057. btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, pp);
  1058. return;
  1059. }
  1060. #endif
  1061. /*******************************************************************************
  1062. **
  1063. ** Function BTM_BleLocalPrivacyEnabled
  1064. **
  1065. ** Description Checks if local device supports private address
  1066. **
  1067. ** Returns Return TRUE if local privacy is enabled else FALSE
  1068. **
  1069. *******************************************************************************/
  1070. BOOLEAN BTM_BleLocalPrivacyEnabled(void)
  1071. {
  1072. #if BLE_PRIVACY_SPT == TRUE
  1073. return (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE);
  1074. #else
  1075. return false;
  1076. #endif
  1077. }
  1078. /*******************************************************************************
  1079. **
  1080. ** Function BTM_BleSetBgConnType
  1081. **
  1082. ** Description This function is called to set BLE connectable mode for a
  1083. ** peripheral device.
  1084. **
  1085. ** Parameters bg_conn_type: it can be auto connection, or selective connection.
  1086. ** p_select_cback: callback function when selective connection procedure
  1087. ** is being used.
  1088. **
  1089. ** Returns void
  1090. **
  1091. *******************************************************************************/
  1092. BOOLEAN BTM_BleSetBgConnType(tBTM_BLE_CONN_TYPE bg_conn_type,
  1093. tBTM_BLE_SEL_CBACK *p_select_cback)
  1094. {
  1095. BOOLEAN started = TRUE;
  1096. BTM_TRACE_EVENT ("BTM_BleSetBgConnType ");
  1097. if (!controller_get_interface()->supports_ble()) {
  1098. return FALSE;
  1099. }
  1100. if (btm_cb.ble_ctr_cb.bg_conn_type != bg_conn_type) {
  1101. switch (bg_conn_type) {
  1102. case BTM_BLE_CONN_AUTO:
  1103. btm_ble_start_auto_conn(TRUE);
  1104. break;
  1105. case BTM_BLE_CONN_SELECTIVE:
  1106. if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO) {
  1107. btm_ble_start_auto_conn(FALSE);
  1108. }
  1109. btm_ble_start_select_conn(TRUE, p_select_cback);
  1110. break;
  1111. case BTM_BLE_CONN_NONE:
  1112. if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO) {
  1113. btm_ble_start_auto_conn(FALSE);
  1114. } else if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE) {
  1115. btm_ble_start_select_conn(FALSE, NULL);
  1116. }
  1117. started = TRUE;
  1118. break;
  1119. default:
  1120. BTM_TRACE_ERROR("invalid bg connection type : %d ", bg_conn_type);
  1121. started = FALSE;
  1122. break;
  1123. }
  1124. if (started) {
  1125. btm_cb.ble_ctr_cb.bg_conn_type = bg_conn_type;
  1126. }
  1127. }
  1128. return started;
  1129. }
  1130. /*******************************************************************************
  1131. **
  1132. ** Function BTM_BleClearBgConnDev
  1133. **
  1134. ** Description This function is called to clear the whitelist,
  1135. ** end any pending whitelist connections,
  1136. * and reset the local bg device list.
  1137. **
  1138. ** Parameters void
  1139. **
  1140. ** Returns void
  1141. **
  1142. *******************************************************************************/
  1143. void BTM_BleClearBgConnDev(void)
  1144. {
  1145. btm_ble_start_auto_conn(FALSE);
  1146. btm_ble_clear_white_list(NULL);
  1147. gatt_reset_bgdev_list();
  1148. }
  1149. /*******************************************************************************
  1150. **
  1151. ** Function BTM_BleUpdateBgConnDev
  1152. **
  1153. ** Description This function is called to add or remove a device into/from
  1154. ** background connection procedure. The background connection
  1155. * procedure is decided by the background connection type, it can be
  1156. * auto connection, or selective connection.
  1157. **
  1158. ** Parameters add_remove: TRUE to add; FALSE to remove.
  1159. ** remote_bda: device address to add/remove.
  1160. **
  1161. ** Returns void
  1162. **
  1163. *******************************************************************************/
  1164. BOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR remote_bda)
  1165. {
  1166. BTM_TRACE_EVENT("%s() add=%d", __func__, add_remove);
  1167. return btm_update_dev_to_white_list(add_remove, remote_bda, 0, NULL);
  1168. }
  1169. /*******************************************************************************
  1170. **
  1171. ** Function BTM_BleSetConnectableMode
  1172. **
  1173. ** Description This function is called to set BLE connectable mode for a
  1174. ** peripheral device.
  1175. **
  1176. ** Parameters conn_mode: directed connectable mode, or non-directed.It can
  1177. ** be BTM_BLE_CONNECT_EVT, BTM_BLE_CONNECT_DIR_EVT or
  1178. ** BTM_BLE_CONNECT_LO_DUTY_DIR_EVT
  1179. **
  1180. ** Returns BTM_ILLEGAL_VALUE if controller does not support BLE.
  1181. ** BTM_SUCCESS is status set successfully; otherwise failure.
  1182. **
  1183. *******************************************************************************/
  1184. tBTM_STATUS BTM_BleSetConnectableMode(tBTM_BLE_CONN_MODE connectable_mode)
  1185. {
  1186. tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
  1187. BTM_TRACE_EVENT ("%s connectable_mode = %d ", __func__, connectable_mode);
  1188. if (!controller_get_interface()->supports_ble()) {
  1189. return BTM_ILLEGAL_VALUE;
  1190. }
  1191. p_cb->directed_conn = connectable_mode;
  1192. return btm_ble_set_connectability( p_cb->connectable_mode);
  1193. }
  1194. /*******************************************************************************
  1195. **
  1196. ** Function btm_set_conn_mode_adv_init_addr
  1197. **
  1198. ** Description set initator address type and local address type based on adv
  1199. ** mode.
  1200. **
  1201. **
  1202. *******************************************************************************/
  1203. static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
  1204. BD_ADDR_PTR p_peer_addr_ptr,
  1205. tBLE_ADDR_TYPE *p_peer_addr_type,
  1206. tBLE_ADDR_TYPE *p_own_addr_type)
  1207. {
  1208. UINT8 evt_type;
  1209. #if BLE_PRIVACY_SPT == TRUE
  1210. UINT8 i = BTM_SEC_MAX_DEVICE_RECORDS;
  1211. tBTM_SEC_DEV_REC *p_dev_rec;
  1212. list_node_t *p_node = NULL;
  1213. #endif ///BLE_PRIVACY_SPT == TRUE
  1214. evt_type = (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE) ? \
  1215. ((p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT : BTM_BLE_NON_CONNECT_EVT )\
  1216. : BTM_BLE_CONNECT_EVT;
  1217. if (evt_type == BTM_BLE_CONNECT_EVT) {
  1218. evt_type = p_cb->directed_conn;
  1219. if ( p_cb->directed_conn == BTM_BLE_CONNECT_DIR_EVT ||
  1220. p_cb->directed_conn == BTM_BLE_CONNECT_LO_DUTY_DIR_EVT) {
  1221. #if BLE_PRIVACY_SPT == TRUE
  1222. /* for privacy 1.2, convert peer address as static, own address set as ID addr */
  1223. if (btm_cb.ble_ctr_cb.privacy_mode == BTM_PRIVACY_1_2 ||
  1224. btm_cb.ble_ctr_cb.privacy_mode == BTM_PRIVACY_MIXED) {
  1225. /* only do so for bonded device */
  1226. if ((p_dev_rec = btm_find_or_alloc_dev (p_cb->direct_bda.bda)) != NULL &&
  1227. p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) {
  1228. //btm_ble_enable_resolving_list(BTM_BLE_RL_ADV);
  1229. memcpy(p_peer_addr_ptr, p_dev_rec->ble.static_addr, BD_ADDR_LEN);
  1230. *p_peer_addr_type = p_dev_rec->ble.static_addr_type;
  1231. *p_own_addr_type = BLE_ADDR_RANDOM_ID;
  1232. return evt_type;
  1233. }
  1234. /* otherwise fall though as normal directed adv */
  1235. else {
  1236. btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE);
  1237. }
  1238. }
  1239. #endif
  1240. /* direct adv mode does not have privacy, if privacy is not enabled */
  1241. *p_peer_addr_type = p_cb->direct_bda.type;
  1242. memcpy(p_peer_addr_ptr, p_cb->direct_bda.bda, BD_ADDR_LEN);
  1243. return evt_type;
  1244. }
  1245. }
  1246. /* undirect adv mode or non-connectable mode*/
  1247. #if BLE_PRIVACY_SPT == TRUE
  1248. /* when privacy 1.2 privacy only mode is used, or mixed mode */
  1249. if ((btm_cb.ble_ctr_cb.privacy_mode == BTM_PRIVACY_1_2 && p_cb->afp != AP_SCAN_CONN_ALL) ||
  1250. btm_cb.ble_ctr_cb.privacy_mode == BTM_PRIVACY_MIXED) {
  1251. /* if enhanced privacy is required, set Identity address and matching IRK peer */
  1252. for (p_node = list_begin(btm_cb.p_sec_dev_rec_list); p_node; p_node = list_next(p_node)) {
  1253. p_dev_rec = list_node(p_node);
  1254. if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) != 0 &&
  1255. (p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) != 0) {
  1256. memcpy(p_peer_addr_ptr, p_dev_rec->ble.static_addr, BD_ADDR_LEN);
  1257. *p_peer_addr_type = p_dev_rec->ble.static_addr_type;
  1258. break;
  1259. }
  1260. }
  1261. if (i != BTM_SEC_MAX_DEVICE_RECORDS) {
  1262. *p_own_addr_type = BLE_ADDR_RANDOM_ID;
  1263. } else
  1264. /* resolving list is empty, not enabled */
  1265. {
  1266. *p_own_addr_type = BLE_ADDR_RANDOM;
  1267. }
  1268. }
  1269. /* privacy 1.1, or privacy 1.2, general discoverable/connectable mode, disable privacy in */
  1270. /* controller fall back to host based privacy */
  1271. else if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) {
  1272. *p_own_addr_type = BLE_ADDR_RANDOM;
  1273. }
  1274. #endif
  1275. /* if no privacy,do not set any peer address,*/
  1276. /* local address type go by global privacy setting */
  1277. return evt_type;
  1278. }
  1279. /*******************************************************************************
  1280. **
  1281. ** Function BTM_BleSetAdvParams
  1282. **
  1283. ** Description This function is called to set advertising parameters.
  1284. **
  1285. ** Parameters adv_int_min: minimum advertising interval
  1286. ** adv_int_max: maximum advertising interval
  1287. ** p_dir_bda: connectable direct initiator's LE device address
  1288. ** chnl_map: advertising channel map.
  1289. **
  1290. ** Returns void
  1291. **
  1292. *******************************************************************************/
  1293. tBTM_STATUS BTM_BleSetAdvParams(UINT16 adv_int_min, UINT16 adv_int_max,
  1294. tBLE_BD_ADDR *p_dir_bda,
  1295. tBTM_BLE_ADV_CHNL_MAP chnl_map)
  1296. {
  1297. tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
  1298. tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
  1299. tBTM_STATUS status = BTM_SUCCESS;
  1300. BD_ADDR p_addr_ptr = {0};
  1301. tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC;
  1302. tBLE_ADDR_TYPE own_addr_type = p_addr_cb->own_addr_type;
  1303. UINT8 adv_mode = p_cb->adv_mode;
  1304. BTM_TRACE_EVENT ("BTM_BleSetAdvParams");
  1305. if (!controller_get_interface()->supports_ble()) {
  1306. return BTM_ILLEGAL_VALUE;
  1307. }
  1308. if (!BTM_BLE_ISVALID_PARAM(adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) ||
  1309. !BTM_BLE_ISVALID_PARAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX)) {
  1310. return BTM_ILLEGAL_VALUE;
  1311. }
  1312. p_cb->adv_interval_min = adv_int_min;
  1313. p_cb->adv_interval_max = adv_int_max;
  1314. p_cb->adv_chnl_map = chnl_map;
  1315. if (p_dir_bda) {
  1316. memcpy(&p_cb->direct_bda, p_dir_bda, sizeof(tBLE_BD_ADDR));
  1317. }
  1318. BTM_TRACE_EVENT ("update params for an active adv\n");
  1319. btm_ble_stop_adv();
  1320. p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type,
  1321. &own_addr_type);
  1322. /* update adv params */
  1323. btsnd_hcic_ble_write_adv_params (p_cb->adv_interval_min,
  1324. p_cb->adv_interval_max,
  1325. p_cb->evt_type,
  1326. own_addr_type,
  1327. init_addr_type,
  1328. p_addr_ptr,
  1329. p_cb->adv_chnl_map,
  1330. p_cb->afp);
  1331. if (adv_mode == BTM_BLE_ADV_ENABLE) {
  1332. btm_ble_start_adv();
  1333. }
  1334. return status;
  1335. }
  1336. /*******************************************************************************
  1337. **
  1338. ** Function BTM_BleSetAdvParamsAll
  1339. **
  1340. ** Description This function is called to set all of the advertising parameters.
  1341. **
  1342. ** Parameters: None.
  1343. **
  1344. ** Returns void
  1345. **
  1346. *******************************************************************************/
  1347. tBTM_STATUS BTM_BleSetAdvParamsAll(UINT16 adv_int_min, UINT16 adv_int_max, UINT8 adv_type,
  1348. tBLE_ADDR_TYPE own_bda_type, tBLE_BD_ADDR *p_dir_bda,
  1349. tBTM_BLE_ADV_CHNL_MAP chnl_map, tBTM_BLE_AFP afp, tBTM_START_ADV_CMPL_CBACK *adv_cb)
  1350. {
  1351. tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
  1352. tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
  1353. BTM_TRACE_EVENT ("BTM_BleSetAdvParamsAll\n");
  1354. if (!controller_get_interface()->supports_ble()) {
  1355. return BTM_ILLEGAL_VALUE;
  1356. }
  1357. if (BTM_BleUpdateOwnType(&own_bda_type, adv_cb) != 0) {
  1358. return BTM_ILLEGAL_VALUE;
  1359. }
  1360. if (!BTM_BLE_ISVALID_PARAM(adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) ||
  1361. !BTM_BLE_ISVALID_PARAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX)) {
  1362. BTM_TRACE_ERROR ("adv_int_min or adv_int_max is invalid\n");
  1363. if(adv_cb) {
  1364. (* adv_cb)(HCI_ERR_ESP_VENDOR_FAIL);
  1365. }
  1366. return BTM_ILLEGAL_VALUE;
  1367. }
  1368. btm_ble_stop_adv();
  1369. osi_mutex_lock(&adv_param_lock, OSI_MUTEX_MAX_TIMEOUT);
  1370. if(adv_type == BTM_BLE_CONNECT_DIR_EVT){
  1371. btm_ble_set_topology_mask(BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT);
  1372. }else if(adv_type == BTM_BLE_CONNECT_LO_DUTY_DIR_EVT){
  1373. btm_ble_set_topology_mask(BTM_BLE_STATE_LO_DUTY_DIR_ADV_BIT);
  1374. }else if(adv_type == BTM_BLE_NON_CONNECT_EVT){
  1375. btm_ble_set_topology_mask(BTM_BLE_STATE_NON_CONN_ADV_BIT);
  1376. }
  1377. p_cb->adv_interval_min = adv_int_min;
  1378. p_cb->adv_interval_max = adv_int_max;
  1379. p_cb->adv_chnl_map = chnl_map;
  1380. p_addr_cb->own_addr_type = own_bda_type;
  1381. p_cb->evt_type = adv_type;
  1382. p_cb->afp = afp;
  1383. p_cb->p_adv_cb = adv_cb;
  1384. if (p_dir_bda) {
  1385. memcpy(&p_cb->direct_bda, p_dir_bda, sizeof(tBLE_BD_ADDR));
  1386. } else {
  1387. return BTM_ILLEGAL_VALUE;
  1388. }
  1389. BTM_TRACE_EVENT ("update params for an active adv\n");
  1390. tBTM_STATUS status = BTM_SUCCESS;
  1391. /* update adv params */
  1392. if (btsnd_hcic_ble_write_adv_params (adv_int_min,
  1393. adv_int_max,
  1394. adv_type,
  1395. own_bda_type,
  1396. p_dir_bda->type,
  1397. p_dir_bda->bda,
  1398. chnl_map,
  1399. p_cb->afp)) {
  1400. osi_sem_take(&adv_param_sem, OSI_SEM_MAX_TIMEOUT);
  1401. status = adv_param_status;
  1402. } else {
  1403. status = BTM_NO_RESOURCES;
  1404. }
  1405. osi_mutex_unlock(&adv_param_lock);
  1406. return status;
  1407. }
  1408. tBTM_STATUS BTM_BleStartAdv(void)
  1409. {
  1410. tBTM_STATUS status = BTM_SUCCESS;
  1411. if (!controller_get_interface()->supports_ble()) {
  1412. return BTM_ILLEGAL_VALUE;
  1413. }
  1414. btm_ble_stop_adv();
  1415. status = btm_ble_start_adv();
  1416. return status;
  1417. }
  1418. /*******************************************************************************
  1419. **
  1420. ** Function BTM_BleReadAdvParams
  1421. **
  1422. ** Description This function is called to set advertising parameters.
  1423. **
  1424. ** Parameters adv_int_min: minimum advertising interval
  1425. ** adv_int_max: maximum advertising interval
  1426. ** p_dir_bda: connectable direct initiator's LE device address
  1427. ** chnl_map: advertising channel map.
  1428. **
  1429. ** Returns void
  1430. **
  1431. *******************************************************************************/
  1432. void BTM_BleReadAdvParams (UINT16 *adv_int_min, UINT16 *adv_int_max,
  1433. tBLE_BD_ADDR *p_dir_bda, tBTM_BLE_ADV_CHNL_MAP *p_chnl_map)
  1434. {
  1435. tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
  1436. BTM_TRACE_EVENT ("BTM_BleReadAdvParams ");
  1437. if (!controller_get_interface()->supports_ble()) {
  1438. return ;
  1439. }
  1440. *adv_int_min = p_cb->adv_interval_min;
  1441. *adv_int_max = p_cb->adv_interval_max;
  1442. *p_chnl_map = p_cb->adv_chnl_map;
  1443. if (p_dir_bda != NULL) {
  1444. memcpy(p_dir_bda, &p_cb->direct_bda, sizeof(tBLE_BD_ADDR));
  1445. }
  1446. }
  1447. /*******************************************************************************
  1448. **
  1449. ** Function BTM_BleSetScanParams
  1450. **
  1451. ** Description This function is called to set scan parameters.
  1452. **
  1453. ** Parameters client_if - Client IF
  1454. ** scan_interval - Scan interval
  1455. ** scan_window - Scan window
  1456. ** scan_mode - Scan mode
  1457. ** scan_setup_status_cback - Scan param setup status callback
  1458. **
  1459. ** Returns void
  1460. **
  1461. *******************************************************************************/
  1462. void BTM_BleSetScanParams(tGATT_IF client_if, UINT32 scan_interval, UINT32 scan_window,
  1463. tBLE_SCAN_MODE scan_mode,
  1464. tBLE_SCAN_PARAM_SETUP_CBACK scan_setup_status_cback)
  1465. {
  1466. tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
  1467. UINT32 max_scan_interval;
  1468. UINT32 max_scan_window;
  1469. BTM_TRACE_EVENT ("%s\n", __func__);
  1470. if (!controller_get_interface()->supports_ble()) {
  1471. return;
  1472. }
  1473. /* If not supporting extended scan support, use the older range for checking */
  1474. if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0) {
  1475. max_scan_interval = BTM_BLE_SCAN_INT_MAX;
  1476. max_scan_window = BTM_BLE_SCAN_WIN_MAX;
  1477. } else {
  1478. /* If supporting extended scan support, use the new extended range for checking */
  1479. max_scan_interval = BTM_BLE_EXT_SCAN_INT_MAX;
  1480. max_scan_window = BTM_BLE_EXT_SCAN_WIN_MAX;
  1481. }
  1482. if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, max_scan_interval) &&
  1483. BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, max_scan_window) &&
  1484. (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS)) {
  1485. p_cb->scan_type = scan_mode;
  1486. p_cb->scan_interval = scan_interval;
  1487. p_cb->scan_window = scan_window;
  1488. if (scan_setup_status_cback != NULL) {
  1489. scan_setup_status_cback(client_if, BTM_SUCCESS);
  1490. }
  1491. } else {
  1492. if (scan_setup_status_cback != NULL) {
  1493. scan_setup_status_cback(client_if, BTM_ILLEGAL_VALUE);
  1494. }
  1495. BTM_TRACE_ERROR("Illegal params: scan_interval = %d scan_window = %d\n",
  1496. scan_interval, scan_window);
  1497. }
  1498. }
  1499. tBTM_STATUS BTM_BleSetScanFilterParams(tGATT_IF client_if, UINT32 scan_interval, UINT32 scan_window,
  1500. tBLE_SCAN_MODE scan_mode, UINT8 addr_type_own, UINT8 scan_duplicate_filter, tBTM_BLE_SFP scan_filter_policy,
  1501. tBLE_SCAN_PARAM_SETUP_CBACK scan_setup_status_cback)
  1502. {
  1503. tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
  1504. UINT32 max_scan_interval;
  1505. UINT32 max_scan_window;
  1506. tBTM_STATUS ret = BTM_SUCCESS;
  1507. BTM_TRACE_EVENT ("%s\n", __func__);
  1508. if (!controller_get_interface()->supports_ble()) {
  1509. return BTM_ILLEGAL_VALUE;
  1510. }
  1511. if (BTM_BleUpdateOwnType(&addr_type_own, NULL) != 0) {
  1512. return BTM_ILLEGAL_VALUE;
  1513. }
  1514. /* If not supporting extended scan support, use the older range for checking */
  1515. if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0) {
  1516. max_scan_interval = BTM_BLE_SCAN_INT_MAX;
  1517. max_scan_window = BTM_BLE_SCAN_WIN_MAX;
  1518. } else {
  1519. /* If supporting extended scan support, use the new extended range for checking */
  1520. max_scan_interval = BTM_BLE_EXT_SCAN_INT_MAX;
  1521. max_scan_window = BTM_BLE_EXT_SCAN_WIN_MAX;
  1522. }
  1523. osi_mutex_lock(&scan_param_lock, OSI_MUTEX_MAX_TIMEOUT);
  1524. if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, max_scan_interval) &&
  1525. BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, max_scan_window) &&
  1526. (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS) &&
  1527. (scan_duplicate_filter < BTM_BLE_SCAN_DUPLICATE_MAX) && (scan_window <= scan_interval)) {
  1528. p_cb->scan_type = scan_mode;
  1529. p_cb->scan_interval = scan_interval;
  1530. p_cb->scan_window = scan_window;
  1531. p_cb->sfp = scan_filter_policy;
  1532. p_cb->scan_params_set = TRUE;
  1533. p_cb->scan_duplicate_filter = scan_duplicate_filter;
  1534. if (btsnd_hcic_ble_set_scan_params(p_cb->scan_type, (UINT16)scan_interval,
  1535. (UINT16)scan_window,
  1536. addr_type_own,
  1537. scan_filter_policy)) {
  1538. osi_sem_take(&scan_param_sem, OSI_SEM_MAX_TIMEOUT);
  1539. ret = scan_param_status;
  1540. }
  1541. } else {
  1542. ret = BTM_ILLEGAL_VALUE;
  1543. BTM_TRACE_ERROR("Illegal params: scan_interval = %d scan_window = %d\n",
  1544. scan_interval, scan_window);
  1545. }
  1546. osi_mutex_unlock(&scan_param_lock);
  1547. return ret;
  1548. }
  1549. /*******************************************************************************
  1550. **
  1551. ** Function BTM_BleWriteScanRsp
  1552. **
  1553. ** Description This function is called to write LE scan response.
  1554. **
  1555. ** Parameters: p_scan_rsp: scan response information.
  1556. **
  1557. ** Returns void
  1558. **
  1559. *******************************************************************************/
  1560. tBTM_STATUS BTM_BleWriteScanRsp(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p_data)
  1561. {
  1562. tBTM_STATUS ret;
  1563. UINT8 rsp_data[BTM_BLE_AD_DATA_LEN],
  1564. *p = rsp_data;
  1565. BTM_TRACE_EVENT (" BTM_BleWriteScanRsp");
  1566. if (!controller_get_interface()->supports_ble()) {
  1567. return BTM_ILLEGAL_VALUE;
  1568. }
  1569. osi_mutex_lock(&adv_data_lock, OSI_MUTEX_MAX_TIMEOUT);
  1570. memset(rsp_data, 0, BTM_BLE_AD_DATA_LEN);
  1571. btm_ble_build_adv_data(&data_mask, &p, p_data);
  1572. if (data_mask != 0) {
  1573. //data length should not exceed 31 bytes
  1574. BTM_TRACE_WARNING("%s, Partial data write into ADV", __func__);
  1575. }
  1576. if (btsnd_hcic_ble_set_scan_rsp_data((UINT8)(p - rsp_data), rsp_data)) {
  1577. osi_sem_take(&adv_data_sem, OSI_SEM_MAX_TIMEOUT);
  1578. ret = adv_data_status;
  1579. if (adv_data_status == BTM_SUCCESS && data_mask != 0) {
  1580. btm_cb.ble_ctr_cb.inq_var.scan_rsp = TRUE;
  1581. } else {
  1582. btm_cb.ble_ctr_cb.inq_var.scan_rsp = FALSE;
  1583. }
  1584. } else {
  1585. ret = BTM_ILLEGAL_VALUE;
  1586. }
  1587. osi_mutex_unlock(&adv_data_lock);
  1588. return ret;
  1589. }
  1590. /*******************************************************************************
  1591. **
  1592. ** Function BTM_BleWriteScanRspRaw
  1593. **
  1594. ** Description This function is called to write raw scan response data
  1595. **
  1596. ** Parameters: None.
  1597. **
  1598. ** Returns void
  1599. **
  1600. *******************************************************************************/
  1601. tBTM_STATUS BTM_BleWriteScanRspRaw(UINT8 *p_raw_scan_rsp, UINT32 raw_scan_rsp_len)
  1602. {
  1603. tBTM_STATUS ret;
  1604. osi_mutex_lock(&adv_data_lock, OSI_MUTEX_MAX_TIMEOUT);
  1605. if (btsnd_hcic_ble_set_scan_rsp_data((UINT8)raw_scan_rsp_len, p_raw_scan_rsp)) {
  1606. osi_sem_take(&adv_data_sem, OSI_SEM_MAX_TIMEOUT);
  1607. ret = adv_data_status;
  1608. } else {
  1609. ret = BTM_NO_RESOURCES;
  1610. }
  1611. osi_mutex_unlock(&adv_data_lock);
  1612. return ret;
  1613. }
  1614. /*******************************************************************************
  1615. **
  1616. ** Function BTM_UpdateBleDuplicateExceptionalList
  1617. **
  1618. ** Description This function is called to update duplicate scan exceptional list.
  1619. **
  1620. ** Parameters: subcode: add, remove or clean duplicate scan exceptional list.
  1621. ** type: device info type
  1622. ** device_info: device information
  1623. ** update_exceptional_list_cmp_cb: complete callback
  1624. **
  1625. ** Returns status
  1626. **
  1627. *******************************************************************************/
  1628. tBTM_STATUS BTM_UpdateBleDuplicateExceptionalList(uint8_t subcode, uint32_t type, BD_ADDR device_info,
  1629. tBTM_UPDATE_DUPLICATE_EXCEPTIONAL_LIST_CMPL_CBACK update_exceptional_list_cmp_cb)
  1630. {
  1631. tBTM_BLE_CB *ble_cb = &btm_cb.ble_ctr_cb;
  1632. tBTM_STATUS status = BTM_NO_RESOURCES;
  1633. ble_cb->update_exceptional_list_cmp_cb = update_exceptional_list_cmp_cb;
  1634. if (!controller_get_interface()->supports_ble()) {
  1635. return BTM_ILLEGAL_VALUE;
  1636. }
  1637. if(!device_info) {
  1638. return BTM_ILLEGAL_VALUE;
  1639. }
  1640. // subcoe + type + device info
  1641. uint8_t device_info_array[1 + 4 + BD_ADDR_LEN] = {0};
  1642. device_info_array[0] = subcode;
  1643. device_info_array[1] = type & 0xff;
  1644. device_info_array[2] = (type >> 8) & 0xff;
  1645. device_info_array[3] = (type >> 16) & 0xff;
  1646. device_info_array[4] = (type >> 24) & 0xff;
  1647. switch (type)
  1648. {
  1649. case BTM_DUPLICATE_SCAN_EXCEPTIONAL_INFO_ADV_ADDR:
  1650. bt_rcopy(&device_info_array[5], device_info, BD_ADDR_LEN);
  1651. break;
  1652. case BTM_DUPLICATE_SCAN_EXCEPTIONAL_INFO_MESH_LINK_ID:
  1653. memcpy(&device_info_array[5], device_info, 4);
  1654. break;
  1655. case BTM_DUPLICATE_SCAN_EXCEPTIONAL_INFO_MESH_BEACON_TYPE:
  1656. //do nothing
  1657. break;
  1658. case BTM_DUPLICATE_SCAN_EXCEPTIONAL_INFO_MESH_PROV_SRV_ADV:
  1659. //do nothing
  1660. break;
  1661. case BTM_DUPLICATE_SCAN_EXCEPTIONAL_INFO_MESH_PROXY_SRV_ADV:
  1662. //do nothing
  1663. break;
  1664. default:
  1665. //do nothing
  1666. break;
  1667. }
  1668. status = BTM_VendorSpecificCommand(HCI_VENDOR_BLE_UPDATE_DUPLICATE_EXCEPTIONAL_LIST, 1 + 4 + BD_ADDR_LEN, device_info_array, NULL);
  1669. if(status == BTM_CMD_STARTED) {
  1670. status = BTM_SUCCESS;
  1671. }
  1672. return status;
  1673. }
  1674. /*******************************************************************************
  1675. **
  1676. ** Function BTM_BleWriteAdvData
  1677. **
  1678. ** Description This function is called to write advertising data.
  1679. **
  1680. ** Parameters: None.
  1681. **
  1682. ** Returns void
  1683. **
  1684. *******************************************************************************/
  1685. tBTM_STATUS BTM_BleWriteAdvData(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p_data)
  1686. {
  1687. tBTM_BLE_LOCAL_ADV_DATA *p_cb_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
  1688. UINT8 *p;
  1689. tBTM_BLE_AD_MASK mask = data_mask;
  1690. tBTM_STATUS ret;
  1691. BTM_TRACE_EVENT ("BTM_BleWriteAdvData ");
  1692. if (!controller_get_interface()->supports_ble()) {
  1693. return BTM_ILLEGAL_VALUE;
  1694. }
  1695. osi_mutex_lock(&adv_data_lock, OSI_MUTEX_MAX_TIMEOUT);
  1696. memset(p_cb_data, 0, sizeof(tBTM_BLE_LOCAL_ADV_DATA));
  1697. p = p_cb_data->ad_data;
  1698. p_cb_data->data_mask = data_mask;
  1699. p_cb_data->p_flags = btm_ble_build_adv_data(&mask, &p, p_data);
  1700. p_cb_data->p_pad = p;
  1701. if (mask != 0) {
  1702. //data length should not exceed 31 bytes
  1703. BTM_TRACE_WARNING("%s, Partial data write into ADV", __func__);
  1704. }
  1705. p_cb_data->data_mask &= ~mask;
  1706. if (btsnd_hcic_ble_set_adv_data((UINT8)(p_cb_data->p_pad - p_cb_data->ad_data),
  1707. p_cb_data->ad_data)) {
  1708. osi_sem_take(&adv_data_sem, OSI_SEM_MAX_TIMEOUT);
  1709. ret = adv_data_status;
  1710. } else {
  1711. ret = BTM_NO_RESOURCES;
  1712. }
  1713. osi_mutex_unlock(&adv_data_lock);
  1714. return ret;
  1715. }
  1716. /*******************************************************************************
  1717. **
  1718. ** Function BTM_BleWriteLongAdvData
  1719. **
  1720. ** Description This function is called to write long advertising data.
  1721. **
  1722. ** Parameters: adv_data: long advertising data
  1723. ** adv_data_len: the length of long advertising data
  1724. **
  1725. ** Returns void
  1726. **
  1727. *******************************************************************************/
  1728. tBTM_STATUS BTM_BleWriteLongAdvData(uint8_t *adv_data, uint8_t adv_data_len)
  1729. {
  1730. tBTM_STATUS status = BTM_NO_RESOURCES;
  1731. if (!controller_get_interface()->supports_ble()) {
  1732. return BTM_ILLEGAL_VALUE;
  1733. }
  1734. if(!adv_data || adv_data_len <= 0 || adv_data_len > BTM_BLE_LONG_ADV_MAX_LEN) {
  1735. return BTM_ILLEGAL_VALUE;
  1736. }
  1737. uint8_t long_adv[BTM_BLE_LONG_ADV_MAX_LEN + 1] = {0};
  1738. long_adv[0] = adv_data_len;
  1739. memcpy(&long_adv[1], adv_data, adv_data_len);
  1740. status = BTM_VendorSpecificCommand(HCI_VENDOR_BLE_LONG_ADV_DATA, BTM_BLE_LONG_ADV_MAX_LEN + 1, long_adv, NULL);
  1741. if(status == BTM_CMD_STARTED) {
  1742. status = BTM_SUCCESS;
  1743. }
  1744. return status;
  1745. }
  1746. /*******************************************************************************
  1747. **
  1748. ** Function BTM_BleWriteAdvDataRaw
  1749. **
  1750. ** Description This function is called to write raw advertising data.
  1751. **
  1752. ** Parameters: None.
  1753. **
  1754. ** Returns void
  1755. **
  1756. *******************************************************************************/
  1757. tBTM_STATUS BTM_BleWriteAdvDataRaw(UINT8 *p_raw_adv, UINT32 raw_adv_len)
  1758. {
  1759. tBTM_STATUS ret;
  1760. osi_mutex_lock(&adv_data_lock, OSI_MUTEX_MAX_TIMEOUT);
  1761. if (btsnd_hcic_ble_set_adv_data((UINT8)raw_adv_len, p_raw_adv)) {
  1762. osi_sem_take(&adv_data_sem, OSI_SEM_MAX_TIMEOUT);
  1763. ret = adv_data_status;
  1764. } else {
  1765. ret = BTM_NO_RESOURCES;
  1766. }
  1767. osi_mutex_unlock(&adv_data_lock);
  1768. return ret;
  1769. }
  1770. /*******************************************************************************
  1771. **
  1772. ** Function BTM_BleSetRandAddress
  1773. **
  1774. ** Description This function is called to set the LE random address.
  1775. **
  1776. ** Parameters: None.
  1777. **
  1778. ** Returns void
  1779. **
  1780. *******************************************************************************/
  1781. tBTM_STATUS BTM_BleSetRandAddress(BD_ADDR rand_addr)
  1782. {
  1783. if (rand_addr == NULL) {
  1784. return BTM_SET_STATIC_RAND_ADDR_FAIL;
  1785. }
  1786. if (btm_cb.ble_ctr_cb.inq_var.state != BTM_BLE_IDLE) {
  1787. BTM_TRACE_ERROR("Advertising or scaning now, can't set randaddress %d", btm_cb.ble_ctr_cb.inq_var.state);
  1788. return BTM_SET_STATIC_RAND_ADDR_FAIL;
  1789. }
  1790. memcpy(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, rand_addr, BD_ADDR_LEN);
  1791. memcpy(btm_cb.ble_ctr_cb.addr_mgnt_cb.static_rand_addr, rand_addr, BD_ADDR_LEN);
  1792. //send the set random address to the controller
  1793. if(btsnd_hcic_ble_set_random_addr(rand_addr)) {
  1794. btm_cb.ble_ctr_cb.addr_mgnt_cb.exist_addr_bit |= BTM_BLE_GAP_ADDR_BIT_RANDOM;
  1795. return BTM_SUCCESS;
  1796. } else {
  1797. return BTM_SET_STATIC_RAND_ADDR_FAIL;
  1798. }
  1799. }
  1800. /*******************************************************************************
  1801. **
  1802. ** Function BTM_BleClearRandAddress
  1803. **
  1804. ** Description This function is called to clear the LE random address.
  1805. **
  1806. ** Parameters: None.
  1807. **
  1808. ** Returns void
  1809. **
  1810. *******************************************************************************/
  1811. void BTM_BleClearRandAddress(void)
  1812. {
  1813. tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
  1814. if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM && (p_cb->inq_var.state != BTM_BLE_IDLE)) {
  1815. BTM_TRACE_ERROR("Advertising or scaning now, can't restore public address ");
  1816. return;
  1817. }
  1818. memset(btm_cb.ble_ctr_cb.addr_mgnt_cb.static_rand_addr, 0, BD_ADDR_LEN);
  1819. btm_cb.ble_ctr_cb.addr_mgnt_cb.exist_addr_bit &= (~BTM_BLE_GAP_ADDR_BIT_RANDOM);
  1820. btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type = BLE_ADDR_PUBLIC;
  1821. }
  1822. /*******************************************************************************
  1823. **
  1824. ** Function BTM_BleGetCurrentAddress
  1825. **
  1826. ** Description This function is called to get local used BLE address.
  1827. **
  1828. ** Parameters: None.
  1829. **
  1830. ** Returns success or fail
  1831. **
  1832. *******************************************************************************/
  1833. BOOLEAN BTM_BleGetCurrentAddress(BD_ADDR addr, uint8_t *addr_type)
  1834. {
  1835. if(addr == NULL || addr_type == NULL) {
  1836. BTM_TRACE_ERROR("%s addr or addr_type is NULL\n", __func__);
  1837. return FALSE;
  1838. }
  1839. if(btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM) {
  1840. *addr_type = BLE_ADDR_RANDOM;
  1841. memcpy(addr, btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, BD_ADDR_LEN);
  1842. } else if(btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_PUBLIC) {
  1843. *addr_type = BLE_ADDR_PUBLIC;
  1844. memcpy(addr, &controller_get_interface()->get_address()->address, BD_ADDR_LEN);
  1845. } else {
  1846. BTM_TRACE_ERROR("%s\n", __func__);
  1847. memset(addr, 0, BD_ADDR_LEN);
  1848. return FALSE;
  1849. }
  1850. return TRUE;
  1851. }
  1852. /*******************************************************************************
  1853. **
  1854. ** Function BTM_CheckAdvData
  1855. **
  1856. ** Description This function is called to get ADV data for a specific type.
  1857. **
  1858. ** Parameters p_adv - pointer of ADV data
  1859. ** type - finding ADV data type
  1860. ** p_length - return the length of ADV data not including type
  1861. **
  1862. ** Returns pointer of ADV data
  1863. **
  1864. *******************************************************************************/
  1865. UINT8 *BTM_CheckAdvData( UINT8 *p_adv, UINT8 type, UINT8 *p_length)
  1866. {
  1867. UINT8 *p = p_adv;
  1868. UINT8 length;
  1869. UINT8 adv_type;
  1870. BTM_TRACE_API("BTM_CheckAdvData type=0x%02X", type);
  1871. STREAM_TO_UINT8(length, p);
  1872. while ( length && (p - p_adv <= BTM_BLE_CACHE_ADV_DATA_MAX)) {
  1873. STREAM_TO_UINT8(adv_type, p);
  1874. if ( adv_type == type ) {
  1875. /* length doesn't include itself */
  1876. *p_length = length - 1; /* minus the length of type */
  1877. return p;
  1878. }
  1879. p += length - 1; /* skip the length of data */
  1880. STREAM_TO_UINT8(length, p);
  1881. }
  1882. *p_length = 0;
  1883. return NULL;
  1884. }
  1885. /*******************************************************************************
  1886. **
  1887. ** Function BTM__BLEReadDiscoverability
  1888. **
  1889. ** Description This function is called to read the current LE discoverability
  1890. ** mode of the device.
  1891. **
  1892. ** Returns BTM_BLE_NON_DISCOVERABLE ,BTM_BLE_LIMITED_DISCOVERABLE or
  1893. ** BTM_BLE_GENRAL_DISCOVERABLE
  1894. **
  1895. *******************************************************************************/
  1896. UINT16 BTM_BleReadDiscoverability(void)
  1897. {
  1898. BTM_TRACE_API("%s\n", __FUNCTION__);
  1899. return (btm_cb.ble_ctr_cb.inq_var.discoverable_mode);
  1900. }
  1901. /*******************************************************************************
  1902. **
  1903. ** Function BTM__BLEReadConnectability
  1904. **
  1905. ** Description This function is called to read the current LE connectibility
  1906. ** mode of the device.
  1907. **
  1908. ** Returns BTM_BLE_NON_CONNECTABLE or BTM_BLE_CONNECTABLE
  1909. **
  1910. *******************************************************************************/
  1911. UINT16 BTM_BleReadConnectability(void)
  1912. {
  1913. BTM_TRACE_API ("%s\n", __FUNCTION__);
  1914. return (btm_cb.ble_ctr_cb.inq_var.connectable_mode);
  1915. }
  1916. void BTM_Recovery_Pre_State(void)
  1917. {
  1918. tBTM_BLE_INQ_CB *ble_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
  1919. if (ble_inq_cb->state & BTM_BLE_ADVERTISING) {
  1920. btm_ble_stop_adv();
  1921. btm_ble_start_adv();
  1922. }
  1923. if (ble_inq_cb->state & BTM_BLE_SCANNING) {
  1924. btm_ble_start_scan();
  1925. }
  1926. return;
  1927. }
  1928. /*******************************************************************************
  1929. **
  1930. ** Function BTM_GetCurrentConnParams
  1931. **
  1932. ** Description This function is called to read the current connection parameters
  1933. ** of the device
  1934. **
  1935. ** Returns TRUE or FALSE
  1936. **
  1937. *******************************************************************************/
  1938. BOOLEAN BTM_GetCurrentConnParams(BD_ADDR bda, uint16_t *interval, uint16_t *latency, uint16_t *timeout)
  1939. {
  1940. if( (interval == NULL) || (latency == NULL) || (timeout == NULL) ) {
  1941. BTM_TRACE_ERROR("%s error ", __func__);
  1942. return FALSE;
  1943. }
  1944. if(btm_get_current_conn_params(bda, interval, latency, timeout)) {
  1945. return TRUE;
  1946. }
  1947. return FALSE;
  1948. }
  1949. /*******************************************************************************
  1950. **
  1951. ** Function btm_ble_build_adv_data
  1952. **
  1953. ** Description This function is called build the adv data and rsp data.
  1954. *******************************************************************************/
  1955. UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
  1956. tBTM_BLE_ADV_DATA *p_data)
  1957. {
  1958. UINT32 data_mask = *p_data_mask;
  1959. UINT8 *p = *p_dst,
  1960. *p_flag = NULL;
  1961. UINT16 len = BTM_BLE_AD_DATA_LEN, cp_len = 0;
  1962. UINT8 i = 0;
  1963. tBTM_BLE_PROP_ELEM *p_elem;
  1964. BTM_TRACE_EVENT (" btm_ble_build_adv_data");
  1965. /* build the adv data structure and build the data string */
  1966. if (data_mask) {
  1967. /* flags */
  1968. if (data_mask & BTM_BLE_AD_BIT_FLAGS) {
  1969. *p++ = MIN_ADV_LENGTH;
  1970. *p++ = BTM_BLE_AD_TYPE_FLAG;
  1971. p_flag = p;
  1972. if (p_data) {
  1973. *p++ = p_data->flag;
  1974. } else {
  1975. *p++ = 0;
  1976. }
  1977. len -= 3;
  1978. data_mask &= ~BTM_BLE_AD_BIT_FLAGS;
  1979. }
  1980. /* appearance data */
  1981. if (len > 3 && data_mask & BTM_BLE_AD_BIT_APPEARANCE) {
  1982. *p++ = 3; /* length */
  1983. *p++ = BTM_BLE_AD_TYPE_APPEARANCE;
  1984. UINT16_TO_STREAM(p, p_data->appearance);
  1985. len -= 4;
  1986. data_mask &= ~BTM_BLE_AD_BIT_APPEARANCE;
  1987. }
  1988. /* device name */
  1989. #if BTM_MAX_LOC_BD_NAME_LEN > 0
  1990. if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_DEV_NAME) {
  1991. if (strlen(btm_cb.cfg.bd_name) > (UINT16)(len - MIN_ADV_LENGTH)) {
  1992. cp_len = (UINT16)(len - MIN_ADV_LENGTH);
  1993. *p++ = cp_len + 1;
  1994. *p++ = BTM_BLE_AD_TYPE_NAME_SHORT;
  1995. ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, cp_len);
  1996. } else {
  1997. cp_len = (UINT16)strlen(btm_cb.cfg.bd_name);
  1998. *p++ = cp_len + 1;
  1999. *p++ = BTM_BLE_AD_TYPE_NAME_CMPL;
  2000. ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, cp_len);
  2001. }
  2002. len -= (cp_len + MIN_ADV_LENGTH);
  2003. data_mask &= ~BTM_BLE_AD_BIT_DEV_NAME;
  2004. }
  2005. #endif
  2006. /* manufacturer data */
  2007. if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_MANU &&
  2008. p_data && p_data->p_manu &&
  2009. p_data->p_manu->len != 0 && p_data->p_manu->p_val) {
  2010. if (p_data->p_manu->len > (len - MIN_ADV_LENGTH)) {
  2011. cp_len = len - MIN_ADV_LENGTH;
  2012. } else {
  2013. cp_len = p_data->p_manu->len;
  2014. }
  2015. BTM_TRACE_DEBUG("cp_len = %d\n,p_data->p_manu->len=%d\n", cp_len, p_data->p_manu->len);
  2016. for (int i = 0; i < p_data->p_manu->len; i++) {
  2017. BTM_TRACE_DEBUG("p_data->p_manu->p_val[%d] = %x\n", i, p_data->p_manu->p_val[i]);
  2018. }
  2019. *p++ = cp_len + 1;
  2020. *p++ = BTM_BLE_AD_TYPE_MANU;
  2021. ARRAY_TO_STREAM(p, p_data->p_manu->p_val, cp_len);
  2022. BTM_TRACE_DEBUG("p_addr = %p\n,p_data->p_manu->p_val = %p\n", p, p_data->p_manu->p_val);
  2023. len -= (cp_len + MIN_ADV_LENGTH);
  2024. data_mask &= ~BTM_BLE_AD_BIT_MANU;
  2025. }
  2026. /* TX power */
  2027. if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_TX_PWR) {
  2028. *p++ = MIN_ADV_LENGTH;
  2029. *p++ = BTM_BLE_AD_TYPE_TX_PWR;
  2030. if (p_data->tx_power > BTM_BLE_ADV_TX_POWER_MAX) {
  2031. p_data->tx_power = BTM_BLE_ADV_TX_POWER_MAX;
  2032. }
  2033. *p++ = btm_ble_map_adv_tx_power(p_data->tx_power);
  2034. len -= 3;
  2035. data_mask &= ~BTM_BLE_AD_BIT_TX_PWR;
  2036. }
  2037. /* 16 bits services */
  2038. if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE &&
  2039. p_data && p_data->p_services &&
  2040. p_data->p_services->num_service != 0 &&
  2041. p_data->p_services->p_uuid) {
  2042. if (p_data->p_services->num_service * LEN_UUID_16 > (len - MIN_ADV_LENGTH)) {
  2043. cp_len = (len - MIN_ADV_LENGTH) / LEN_UUID_16;
  2044. *p ++ = 1 + cp_len * LEN_UUID_16;
  2045. *p++ = BTM_BLE_AD_TYPE_16SRV_PART;
  2046. } else {
  2047. cp_len = p_data->p_services->num_service;
  2048. *p++ = 1 + cp_len * LEN_UUID_16;
  2049. *p++ = BTM_BLE_AD_TYPE_16SRV_CMPL;
  2050. }
  2051. for (i = 0; i < cp_len; i ++) {
  2052. UINT16_TO_STREAM(p, *(p_data->p_services->p_uuid + i));
  2053. }
  2054. len -= (cp_len * MIN_ADV_LENGTH + MIN_ADV_LENGTH);
  2055. data_mask &= ~BTM_BLE_AD_BIT_SERVICE;
  2056. }
  2057. /* 32 bits service uuid */
  2058. if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32 &&
  2059. p_data && p_data->p_service_32b &&
  2060. p_data->p_service_32b->num_service != 0 &&
  2061. p_data->p_service_32b->p_uuid) {
  2062. if ((p_data->p_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH)) {
  2063. cp_len = (len - MIN_ADV_LENGTH) / LEN_UUID_32;
  2064. *p ++ = 1 + cp_len * LEN_UUID_32;
  2065. *p++ = BTM_BLE_AD_TYPE_32SRV_PART;
  2066. } else {
  2067. cp_len = p_data->p_service_32b->num_service;
  2068. *p++ = 1 + cp_len * LEN_UUID_32;
  2069. *p++ = BTM_BLE_AD_TYPE_32SRV_CMPL;
  2070. }
  2071. for (i = 0; i < cp_len; i ++) {
  2072. UINT32_TO_STREAM(p, *(p_data->p_service_32b->p_uuid + i));
  2073. }
  2074. len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
  2075. data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32;
  2076. }
  2077. /* 128 bits services */
  2078. if (len >= (MAX_UUID_SIZE + 2) && data_mask & BTM_BLE_AD_BIT_SERVICE_128 &&
  2079. p_data && p_data->p_services_128b) {
  2080. *p ++ = 1 + MAX_UUID_SIZE;
  2081. if (!p_data->p_services_128b->list_cmpl) {
  2082. *p++ = BTM_BLE_AD_TYPE_128SRV_PART;
  2083. } else {
  2084. *p++ = BTM_BLE_AD_TYPE_128SRV_CMPL;
  2085. }
  2086. ARRAY_TO_STREAM(p, p_data->p_services_128b->uuid128, MAX_UUID_SIZE);
  2087. len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
  2088. data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128;
  2089. }
  2090. /* 32 bits Service Solicitation UUIDs */
  2091. if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32SOL &&
  2092. p_data && p_data->p_sol_service_32b &&
  2093. p_data->p_sol_service_32b->num_service != 0 &&
  2094. p_data->p_sol_service_32b->p_uuid) {
  2095. if ((p_data->p_sol_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH)) {
  2096. cp_len = (len - MIN_ADV_LENGTH) / LEN_UUID_32;
  2097. *p ++ = 1 + cp_len * LEN_UUID_32;
  2098. } else {
  2099. cp_len = p_data->p_sol_service_32b->num_service;
  2100. *p++ = 1 + cp_len * LEN_UUID_32;
  2101. }
  2102. *p++ = BTM_BLE_AD_TYPE_32SOL_SRV_UUID;
  2103. for (i = 0; i < cp_len; i ++) {
  2104. UINT32_TO_STREAM(p, *(p_data->p_sol_service_32b->p_uuid + i));
  2105. }
  2106. len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
  2107. data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32SOL;
  2108. }
  2109. /* 128 bits Solicitation services UUID */
  2110. if (len >= (MAX_UUID_SIZE + MIN_ADV_LENGTH) && data_mask & BTM_BLE_AD_BIT_SERVICE_128SOL &&
  2111. p_data && p_data->p_sol_service_128b) {
  2112. *p ++ = 1 + MAX_UUID_SIZE;
  2113. *p++ = BTM_BLE_AD_TYPE_128SOL_SRV_UUID;
  2114. ARRAY_TO_STREAM(p, p_data->p_sol_service_128b->uuid128, MAX_UUID_SIZE);
  2115. len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
  2116. data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128SOL;
  2117. }
  2118. /* 16bits/32bits/128bits Service Data */
  2119. if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_DATA &&
  2120. p_data && p_data->p_service_data->len != 0 && p_data->p_service_data->p_val) {
  2121. if (len > (p_data->p_service_data->service_uuid.len + MIN_ADV_LENGTH)) {
  2122. if (p_data->p_service_data->len > (len - MIN_ADV_LENGTH)) {
  2123. cp_len = len - MIN_ADV_LENGTH - p_data->p_service_data->service_uuid.len;
  2124. } else {
  2125. cp_len = p_data->p_service_data->len;
  2126. }
  2127. *p++ = cp_len + 1 + p_data->p_service_data->service_uuid.len;
  2128. if (p_data->p_service_data->service_uuid.len == LEN_UUID_16) {
  2129. *p++ = BTM_BLE_AD_TYPE_SERVICE_DATA;
  2130. UINT16_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid16);
  2131. } else if (p_data->p_service_data->service_uuid.len == LEN_UUID_32) {
  2132. *p++ = BTM_BLE_AD_TYPE_32SERVICE_DATA;
  2133. UINT32_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid32);
  2134. } else {
  2135. *p++ = BTM_BLE_AD_TYPE_128SERVICE_DATA;
  2136. ARRAY_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid128,
  2137. LEN_UUID_128);
  2138. }
  2139. ARRAY_TO_STREAM(p, p_data->p_service_data->p_val, cp_len);
  2140. len -= (cp_len + MIN_ADV_LENGTH + p_data->p_service_data->service_uuid.len);
  2141. data_mask &= ~BTM_BLE_AD_BIT_SERVICE_DATA;
  2142. } else {
  2143. BTM_TRACE_WARNING("service data does not fit");
  2144. }
  2145. }
  2146. if (len >= 6 && data_mask & BTM_BLE_AD_BIT_INT_RANGE &&
  2147. p_data) {
  2148. *p++ = 5;
  2149. *p++ = BTM_BLE_AD_TYPE_INT_RANGE;
  2150. UINT16_TO_STREAM(p, p_data->int_range.low);
  2151. UINT16_TO_STREAM(p, p_data->int_range.hi);
  2152. len -= 6;
  2153. data_mask &= ~BTM_BLE_AD_BIT_INT_RANGE;
  2154. }
  2155. if (data_mask & BTM_BLE_AD_BIT_PROPRIETARY && p_data && p_data->p_proprietary) {
  2156. for (i = 0; i < p_data->p_proprietary->num_elem ; i ++) {
  2157. p_elem = p_data->p_proprietary->p_elem + i;
  2158. if (len >= (MIN_ADV_LENGTH + p_elem->len))/* len byte(1) + ATTR type(1) + Uuid len(2)
  2159. + value length */
  2160. {
  2161. *p ++ = p_elem->len + 1; /* Uuid len + value length */
  2162. *p ++ = p_elem->adv_type;
  2163. ARRAY_TO_STREAM(p, p_elem->p_val, p_elem->len);
  2164. len -= (MIN_ADV_LENGTH + p_elem->len);
  2165. } else {
  2166. BTM_TRACE_WARNING("data exceed max adv packet length");
  2167. break;
  2168. }
  2169. }
  2170. data_mask &= ~BTM_BLE_AD_BIT_PROPRIETARY;
  2171. }
  2172. }
  2173. *p_data_mask = data_mask;
  2174. *p_dst = p;
  2175. return p_flag;
  2176. }
  2177. /*******************************************************************************
  2178. **
  2179. ** Function btm_ble_select_adv_interval
  2180. **
  2181. ** Description select adv interval based on device mode
  2182. **
  2183. ** Returns void
  2184. **
  2185. *******************************************************************************/
  2186. void btm_ble_select_adv_interval(tBTM_BLE_INQ_CB *p_cb, UINT8 evt_type, UINT16 *p_adv_int_min, UINT16 *p_adv_int_max)
  2187. {
  2188. if (p_cb->adv_interval_min && p_cb->adv_interval_max) {
  2189. *p_adv_int_min = p_cb->adv_interval_min;
  2190. *p_adv_int_max = p_cb->adv_interval_max;
  2191. } else {
  2192. switch (evt_type) {
  2193. case BTM_BLE_CONNECT_EVT:
  2194. case BTM_BLE_CONNECT_LO_DUTY_DIR_EVT:
  2195. *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_1;
  2196. break;
  2197. case BTM_BLE_NON_CONNECT_EVT:
  2198. case BTM_BLE_DISCOVER_EVT:
  2199. *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_2;
  2200. break;
  2201. /* connectable directed event */
  2202. case BTM_BLE_CONNECT_DIR_EVT:
  2203. *p_adv_int_min = BTM_BLE_GAP_ADV_DIR_MIN_INT;
  2204. *p_adv_int_max = BTM_BLE_GAP_ADV_DIR_MAX_INT;
  2205. break;
  2206. default:
  2207. *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_SLOW_INT;
  2208. break;
  2209. }
  2210. }
  2211. return;
  2212. }
  2213. /*******************************************************************************
  2214. **
  2215. ** Function btm_ble_update_dmt_flag_bits
  2216. **
  2217. ** Description Obtain updated adv flag value based on connect and discoverability mode.
  2218. ** Also, setup DMT support value in the flag based on whether the controller
  2219. ** supports both LE and BR/EDR.
  2220. **
  2221. ** Parameters: flag_value (Input / Output) - flag value
  2222. ** connect_mode (Input) - Connect mode value
  2223. ** disc_mode (Input) - discoverability mode
  2224. **
  2225. ** Returns void
  2226. **
  2227. *******************************************************************************/
  2228. void btm_ble_update_dmt_flag_bits(UINT8 *adv_flag_value, const UINT16 connect_mode,
  2229. const UINT16 disc_mode)
  2230. {
  2231. /* BR/EDR non-discoverable , non-connectable */
  2232. if ((disc_mode & BTM_DISCOVERABLE_MASK) == 0 &&
  2233. (connect_mode & BTM_CONNECTABLE_MASK) == 0) {
  2234. *adv_flag_value |= BTM_BLE_BREDR_NOT_SPT;
  2235. } else {
  2236. *adv_flag_value &= ~BTM_BLE_BREDR_NOT_SPT;
  2237. }
  2238. /* if local controller support, mark both controller and host support in flag */
  2239. if (controller_get_interface()->supports_simultaneous_le_bredr()) {
  2240. *adv_flag_value |= (BTM_BLE_DMT_CONTROLLER_SPT | BTM_BLE_DMT_HOST_SPT);
  2241. } else {
  2242. *adv_flag_value &= ~(BTM_BLE_DMT_CONTROLLER_SPT | BTM_BLE_DMT_HOST_SPT);
  2243. }
  2244. }
  2245. /*******************************************************************************
  2246. **
  2247. ** Function btm_ble_set_adv_flag
  2248. **
  2249. ** Description Set adv flag in adv data.
  2250. **
  2251. ** Parameters: connect_mode (Input)- Connect mode value
  2252. ** disc_mode (Input) - discoverability mode
  2253. **
  2254. ** Returns void
  2255. **
  2256. *******************************************************************************/
  2257. void btm_ble_set_adv_flag(UINT16 connect_mode, UINT16 disc_mode)
  2258. {
  2259. UINT8 flag = 0, old_flag = 0;
  2260. tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
  2261. if (p_adv_data->p_flags != NULL) {
  2262. flag = old_flag = *(p_adv_data->p_flags);
  2263. }
  2264. btm_ble_update_dmt_flag_bits (&flag, connect_mode, disc_mode);
  2265. BTM_TRACE_DEBUG("disc_mode %04x", disc_mode);
  2266. /* update discoverable flag */
  2267. if (disc_mode & BTM_BLE_LIMITED_DISCOVERABLE) {
  2268. flag &= ~BTM_BLE_GEN_DISC_FLAG;
  2269. flag |= BTM_BLE_LIMIT_DISC_FLAG;
  2270. } else if (disc_mode & BTM_BLE_GENERAL_DISCOVERABLE) {
  2271. flag |= BTM_BLE_GEN_DISC_FLAG;
  2272. flag &= ~BTM_BLE_LIMIT_DISC_FLAG;
  2273. } else { /* remove all discoverable flags */
  2274. flag &= ~(BTM_BLE_LIMIT_DISC_FLAG | BTM_BLE_GEN_DISC_FLAG);
  2275. }
  2276. if (flag != old_flag) {
  2277. BTM_TRACE_ERROR("flag = 0x%x,old_flag = 0x%x", flag, old_flag);
  2278. btm_ble_update_adv_flag(flag);
  2279. }
  2280. }
  2281. /*******************************************************************************
  2282. **
  2283. ** Function btm_ble_set_discoverability
  2284. **
  2285. ** Description This function is called to set BLE discoverable mode.
  2286. **
  2287. ** Parameters: combined_mode: discoverability mode.
  2288. **
  2289. ** Returns BTM_SUCCESS is status set successfully; otherwise failure.
  2290. **
  2291. *******************************************************************************/
  2292. tBTM_STATUS btm_ble_set_discoverability(UINT16 combined_mode)
  2293. {
  2294. tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
  2295. tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
  2296. UINT16 mode = (combined_mode & BTM_BLE_DISCOVERABLE_MASK);
  2297. UINT8 new_mode = BTM_BLE_ADV_ENABLE;
  2298. UINT8 evt_type;
  2299. tBTM_STATUS status = BTM_SUCCESS;
  2300. BD_ADDR p_addr_ptr = {0};
  2301. tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC,
  2302. own_addr_type = p_addr_cb->own_addr_type;
  2303. UINT16 adv_int_min, adv_int_max;
  2304. BTM_TRACE_EVENT ("%s mode=0x%0x combined_mode=0x%x\n", __FUNCTION__, mode, combined_mode);
  2305. /*** Check mode parameter ***/
  2306. if (mode > BTM_BLE_MAX_DISCOVERABLE) {
  2307. return (BTM_ILLEGAL_VALUE);
  2308. }
  2309. p_cb->discoverable_mode = mode;
  2310. evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
  2311. if (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE && mode == BTM_BLE_NON_DISCOVERABLE) {
  2312. new_mode = BTM_BLE_ADV_DISABLE;
  2313. }
  2314. btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max);
  2315. btu_stop_timer(&p_cb->fast_adv_timer);
  2316. /* update adv params if start advertising */
  2317. BTM_TRACE_EVENT ("evt_type=0x%x p-cb->evt_type=0x%x\n ", evt_type, p_cb->evt_type);
  2318. if (new_mode == BTM_BLE_ADV_ENABLE) {
  2319. btm_ble_set_adv_flag (btm_cb.btm_inq_vars.connectable_mode, combined_mode);
  2320. if (evt_type != p_cb->evt_type || p_cb->adv_addr_type != own_addr_type
  2321. || !p_cb->fast_adv_on) {
  2322. btm_ble_stop_adv();
  2323. /* update adv params */
  2324. if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
  2325. adv_int_max,
  2326. evt_type,
  2327. own_addr_type,
  2328. init_addr_type,
  2329. p_addr_ptr,
  2330. p_cb->adv_chnl_map,
  2331. p_cb->afp)) {
  2332. status = BTM_NO_RESOURCES;
  2333. } else {
  2334. p_cb->evt_type = evt_type;
  2335. p_cb->adv_addr_type = own_addr_type;
  2336. }
  2337. }
  2338. }
  2339. if (status == BTM_SUCCESS && p_cb->adv_mode != new_mode) {
  2340. if (new_mode == BTM_BLE_ADV_ENABLE) {
  2341. status = btm_ble_start_adv();
  2342. } else {
  2343. status = btm_ble_stop_adv();
  2344. }
  2345. }
  2346. if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) {
  2347. p_cb->fast_adv_on = TRUE;
  2348. /* start initial GAP mode adv timer */
  2349. btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
  2350. BTM_BLE_GAP_FAST_ADV_TOUT);
  2351. } else {
  2352. #if BLE_PRIVACY_SPT == TRUE
  2353. btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE);
  2354. #endif
  2355. }
  2356. /* set up stop advertising timer */
  2357. if (status == BTM_SUCCESS && mode == BTM_BLE_LIMITED_DISCOVERABLE) {
  2358. BTM_TRACE_EVENT ("start timer for limited disc mode duration=%d (180 secs)", BTM_BLE_GAP_LIM_TOUT);
  2359. /* start Tgap(lim_timeout) */
  2360. btu_start_timer (&p_cb->inq_timer_ent, BTU_TTYPE_BLE_GAP_LIM_DISC,
  2361. BTM_BLE_GAP_LIM_TOUT);
  2362. }
  2363. return status;
  2364. }
  2365. /*******************************************************************************
  2366. **
  2367. ** Function btm_ble_set_connectability
  2368. **
  2369. ** Description This function is called to set BLE connectability mode.
  2370. **
  2371. ** Parameters: combined_mode: connectability mode.
  2372. **
  2373. ** Returns BTM_SUCCESS is status set successfully; otherwise failure.
  2374. **
  2375. *******************************************************************************/
  2376. tBTM_STATUS btm_ble_set_connectability(UINT16 combined_mode)
  2377. {
  2378. tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
  2379. tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
  2380. UINT16 mode = (combined_mode & BTM_BLE_CONNECTABLE_MASK);
  2381. UINT8 new_mode = BTM_BLE_ADV_ENABLE;
  2382. UINT8 evt_type;
  2383. tBTM_STATUS status = BTM_SUCCESS;
  2384. BD_ADDR p_addr_ptr = {0};
  2385. tBLE_ADDR_TYPE peer_addr_type = BLE_ADDR_PUBLIC,
  2386. own_addr_type = p_addr_cb->own_addr_type;
  2387. UINT16 adv_int_min, adv_int_max;
  2388. BTM_TRACE_EVENT ("%s mode=0x%0x combined_mode=0x%x\n", __FUNCTION__, mode, combined_mode);
  2389. /*** Check mode parameter ***/
  2390. if (mode > BTM_BLE_MAX_CONNECTABLE) {
  2391. return (BTM_ILLEGAL_VALUE);
  2392. }
  2393. p_cb->connectable_mode = mode;
  2394. evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &peer_addr_type, &own_addr_type);
  2395. if (mode == BTM_BLE_NON_CONNECTABLE && p_cb->discoverable_mode == BTM_BLE_NON_DISCOVERABLE) {
  2396. new_mode = BTM_BLE_ADV_DISABLE;
  2397. }
  2398. btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max);
  2399. btu_stop_timer(&p_cb->fast_adv_timer);
  2400. /* update adv params if needed */
  2401. if (new_mode == BTM_BLE_ADV_ENABLE) {
  2402. btm_ble_set_adv_flag (combined_mode, btm_cb.btm_inq_vars.discoverable_mode);
  2403. if (p_cb->evt_type != evt_type || p_cb->adv_addr_type != p_addr_cb->own_addr_type
  2404. || !p_cb->fast_adv_on) {
  2405. btm_ble_stop_adv();
  2406. if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
  2407. adv_int_max,
  2408. evt_type,
  2409. own_addr_type,
  2410. peer_addr_type,
  2411. p_addr_ptr,
  2412. p_cb->adv_chnl_map,
  2413. p_cb->afp)) {
  2414. status = BTM_NO_RESOURCES;
  2415. } else {
  2416. p_cb->evt_type = evt_type;
  2417. p_cb->adv_addr_type = own_addr_type;
  2418. }
  2419. }
  2420. }
  2421. /* update advertising mode */
  2422. if (status == BTM_SUCCESS && new_mode != p_cb->adv_mode) {
  2423. if (new_mode == BTM_BLE_ADV_ENABLE) {
  2424. status = btm_ble_start_adv();
  2425. } else {
  2426. status = btm_ble_stop_adv();
  2427. }
  2428. }
  2429. if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) {
  2430. p_cb->fast_adv_on = TRUE;
  2431. /* start initial GAP mode adv timer */
  2432. btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
  2433. BTM_BLE_GAP_FAST_ADV_TOUT);
  2434. } else {
  2435. #if BLE_PRIVACY_SPT == TRUE
  2436. btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE);
  2437. #endif
  2438. }
  2439. return status;
  2440. }
  2441. /*******************************************************************************
  2442. **
  2443. ** Function btm_ble_start_inquiry
  2444. **
  2445. ** Description This function is called to start BLE inquiry procedure.
  2446. ** If the duration is zero, the periodic inquiry mode is cancelled.
  2447. **
  2448. ** Parameters: mode - GENERAL or LIMITED inquiry
  2449. ** p_inq_params - pointer to the BLE inquiry parameter.
  2450. ** p_results_cb - callback returning pointer to results (tBTM_INQ_RESULTS)
  2451. ** p_cmpl_cb - callback indicating the end of an inquiry
  2452. **
  2453. **
  2454. **
  2455. ** Returns BTM_CMD_STARTED if successfully started
  2456. ** BTM_NO_RESOURCES if could not allocate a message buffer
  2457. ** BTM_BUSY - if an inquiry is already active
  2458. **
  2459. *******************************************************************************/
  2460. tBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8 duration)
  2461. {
  2462. tBTM_STATUS status = BTM_CMD_STARTED;
  2463. tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
  2464. tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
  2465. BTM_TRACE_DEBUG("btm_ble_start_inquiry: mode = %02x inq_active = 0x%02x", mode, btm_cb.btm_inq_vars.inq_active);
  2466. /* if selective connection is active, or inquiry is already active, reject it */
  2467. if (BTM_BLE_IS_INQ_ACTIVE(p_ble_cb->scan_activity) ||
  2468. BTM_BLE_IS_SEL_CONN_ACTIVE (p_ble_cb->scan_activity)) {
  2469. BTM_TRACE_ERROR("LE Inquiry is active, can not start inquiry");
  2470. return (BTM_BUSY);
  2471. }
  2472. if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) {
  2473. btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_ACTI,
  2474. BTM_BLE_LOW_LATENCY_SCAN_INT,
  2475. BTM_BLE_LOW_LATENCY_SCAN_WIN,
  2476. btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
  2477. SP_ADV_ALL);
  2478. #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
  2479. /* enable IRK list */
  2480. //btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_SCAN);
  2481. #endif
  2482. status = btm_ble_start_scan();
  2483. } else if ((p_ble_cb->inq_var.scan_interval != BTM_BLE_LOW_LATENCY_SCAN_INT) ||
  2484. (p_ble_cb->inq_var.scan_window != BTM_BLE_LOW_LATENCY_SCAN_WIN)) {
  2485. BTM_TRACE_DEBUG("%s, restart LE scan with low latency scan params", __FUNCTION__);
  2486. btsnd_hcic_ble_set_scan_enable(BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
  2487. btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_ACTI,
  2488. BTM_BLE_LOW_LATENCY_SCAN_INT,
  2489. BTM_BLE_LOW_LATENCY_SCAN_WIN,
  2490. btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
  2491. SP_ADV_ALL);
  2492. btsnd_hcic_ble_set_scan_enable(BTM_BLE_SCAN_ENABLE, BTM_BLE_DUPLICATE_DISABLE);
  2493. }
  2494. if (status == BTM_CMD_STARTED) {
  2495. p_inq->inq_active |= mode;
  2496. p_ble_cb->scan_activity |= mode;
  2497. BTM_TRACE_DEBUG("btm_ble_start_inquiry inq_active = 0x%02x", p_inq->inq_active);
  2498. if (duration != 0) {
  2499. /* start inquiry timer */
  2500. btu_start_timer (&p_ble_cb->inq_var.inq_timer_ent, BTU_TTYPE_BLE_INQUIRY, duration);
  2501. }
  2502. }
  2503. return status;
  2504. }
  2505. /*******************************************************************************
  2506. **
  2507. ** Function btm_ble_read_remote_name_cmpl
  2508. **
  2509. ** Description This function is called when BLE remote name is received.
  2510. **
  2511. ** Returns void
  2512. **
  2513. *******************************************************************************/
  2514. void btm_ble_read_remote_name_cmpl(BOOLEAN status, BD_ADDR bda, UINT16 length, char *p_name)
  2515. {
  2516. UINT8 hci_status = HCI_SUCCESS;
  2517. BD_NAME bd_name;
  2518. memset(bd_name, 0, (BD_NAME_LEN + 1));
  2519. if (length > BD_NAME_LEN) {
  2520. length = BD_NAME_LEN;
  2521. }
  2522. memcpy((UINT8 *)bd_name, p_name, length);
  2523. if ((!status) || (length == 0)) {
  2524. hci_status = HCI_ERR_HOST_TIMEOUT;
  2525. }
  2526. btm_process_remote_name(bda, bd_name, length + 1, hci_status);
  2527. #if (SMP_INCLUDED == TRUE)
  2528. btm_sec_rmt_name_request_complete (bda, (UINT8 *)p_name, hci_status);
  2529. #endif ///SMP_INCLUDED == TRUE
  2530. }
  2531. /*******************************************************************************
  2532. **
  2533. ** Function btm_ble_read_remote_name
  2534. **
  2535. ** Description This function read remote LE device name using GATT read
  2536. ** procedure.
  2537. **
  2538. ** Parameters: None.
  2539. **
  2540. ** Returns void
  2541. **
  2542. *******************************************************************************/
  2543. tBTM_STATUS btm_ble_read_remote_name(BD_ADDR remote_bda, tBTM_INQ_INFO *p_cur, tBTM_CMPL_CB *p_cb)
  2544. {
  2545. tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
  2546. if (!controller_get_interface()->supports_ble()) {
  2547. return BTM_ERR_PROCESSING;
  2548. }
  2549. if (p_cur &&
  2550. p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_ADV &&
  2551. p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_DIR_ADV) {
  2552. BTM_TRACE_DEBUG("name request to non-connectable device failed.");
  2553. return BTM_ERR_PROCESSING;
  2554. }
  2555. /* read remote device name using GATT procedure */
  2556. if (p_inq->remname_active) {
  2557. return BTM_BUSY;
  2558. }
  2559. #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE)
  2560. if (!GAP_BleReadPeerDevName(remote_bda, btm_ble_read_remote_name_cmpl)) {
  2561. return BTM_BUSY;
  2562. }
  2563. #endif
  2564. p_inq->p_remname_cmpl_cb = p_cb;
  2565. p_inq->remname_active = TRUE;
  2566. memcpy(p_inq->remname_bda, remote_bda, BD_ADDR_LEN);
  2567. btu_start_timer (&p_inq->rmt_name_timer_ent,
  2568. BTU_TTYPE_BTM_RMT_NAME,
  2569. BTM_EXT_BLE_RMT_NAME_TIMEOUT);
  2570. return BTM_CMD_STARTED;
  2571. }
  2572. /*******************************************************************************
  2573. **
  2574. ** Function btm_ble_cancel_remote_name
  2575. **
  2576. ** Description This function cancel read remote LE device name.
  2577. **
  2578. ** Parameters: None.
  2579. **
  2580. ** Returns void
  2581. **
  2582. *******************************************************************************/
  2583. BOOLEAN btm_ble_cancel_remote_name(BD_ADDR remote_bda)
  2584. {
  2585. tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
  2586. BOOLEAN status = TRUE;
  2587. #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE)
  2588. status = GAP_BleCancelReadPeerDevName(remote_bda);
  2589. #endif
  2590. p_inq->remname_active = FALSE;
  2591. memset(p_inq->remname_bda, 0, BD_ADDR_LEN);
  2592. btu_stop_timer(&p_inq->rmt_name_timer_ent);
  2593. return status;
  2594. }
  2595. /*******************************************************************************
  2596. **
  2597. ** Function btm_ble_update_adv_flag
  2598. **
  2599. ** Description This function update the limited discoverable flag in the adv
  2600. ** data.
  2601. **
  2602. ** Parameters: None.
  2603. **
  2604. ** Returns void
  2605. **
  2606. *******************************************************************************/
  2607. static void btm_ble_update_adv_flag(UINT8 flag)
  2608. {
  2609. tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
  2610. UINT8 *p;
  2611. BTM_TRACE_DEBUG ("btm_ble_update_adv_flag new=0x%x", flag);
  2612. if (p_adv_data->p_flags != NULL) {
  2613. BTM_TRACE_DEBUG ("btm_ble_update_adv_flag old=0x%x", *p_adv_data->p_flags);
  2614. *p_adv_data->p_flags = flag;
  2615. } else { /* no FLAGS in ADV data*/
  2616. p = (p_adv_data->p_pad == NULL) ? p_adv_data->ad_data : p_adv_data->p_pad;
  2617. /* need 3 bytes space to stuff in the flags, if not */
  2618. /* erase all written data, just for flags */
  2619. if ((BTM_BLE_AD_DATA_LEN - (p - p_adv_data->ad_data)) < 3) {
  2620. p = p_adv_data->p_pad = p_adv_data->ad_data;
  2621. memset(p_adv_data->ad_data, 0, BTM_BLE_AD_DATA_LEN);
  2622. }
  2623. *p++ = 2;
  2624. *p++ = BTM_BLE_AD_TYPE_FLAG;
  2625. p_adv_data->p_flags = p;
  2626. *p++ = flag;
  2627. p_adv_data->p_pad = p;
  2628. }
  2629. if (btsnd_hcic_ble_set_adv_data((UINT8)(p_adv_data->p_pad - p_adv_data->ad_data),
  2630. p_adv_data->ad_data)) {
  2631. p_adv_data->data_mask |= BTM_BLE_AD_BIT_FLAGS;
  2632. }
  2633. }
  2634. #if 0
  2635. /*******************************************************************************
  2636. **
  2637. ** Function btm_ble_parse_adv_data
  2638. **
  2639. ** Description This function parse the adv data into a structure.
  2640. **
  2641. ** Returns pointer to entry, or NULL if not found
  2642. **
  2643. *******************************************************************************/
  2644. static void btm_ble_parse_adv_data(tBTM_INQ_INFO *p_info, UINT8 *p_data,
  2645. UINT8 len, tBTM_BLE_INQ_DATA *p_adv_data, UINT8 *p_buf)
  2646. {
  2647. UINT8 *p_cur = p_data;
  2648. UINT8 ad_len, ad_type, ad_flag;
  2649. BTM_TRACE_EVENT (" btm_ble_parse_adv_data");
  2650. while (len > 0) {
  2651. BTM_TRACE_DEBUG("btm_ble_parse_adv_data: len = %d", len);
  2652. if ((ad_len = *p_cur ++) == 0) {
  2653. break;
  2654. }
  2655. ad_type = *p_cur ++;
  2656. BTM_TRACE_DEBUG(" ad_type = %02x ad_len = %d", ad_type, ad_len);
  2657. switch (ad_type) {
  2658. case BTM_BLE_AD_TYPE_NAME_SHORT:
  2659. case BTM_BLE_AD_TYPE_NAME_CMPL:
  2660. p_adv_data->ad_mask |= BTM_BLE_AD_BIT_DEV_NAME;
  2661. if (p_info) {
  2662. p_info->remote_name_type = (ad_type == BTM_BLE_AD_TYPE_NAME_SHORT) ?
  2663. BTM_BLE_NAME_SHORT : BTM_BLE_NAME_CMPL;
  2664. memcpy(p_info->remote_name, p_cur, ad_len - 1);
  2665. p_info->remote_name[ad_len] = 0;
  2666. p_adv_data->p_remote_name = p_info->remote_name;
  2667. p_info->remote_name_len = p_adv_data->remote_name_len = ad_len - 1;
  2668. BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_NAME name = %s", p_adv_data->p_remote_name);
  2669. }
  2670. p_cur += (ad_len - 1);
  2671. break;
  2672. case BTM_BLE_AD_TYPE_FLAG:
  2673. p_adv_data->ad_mask |= BTM_BLE_AD_BIT_FLAGS;
  2674. ad_flag = *p_cur ++;
  2675. p_adv_data->flag = (UINT8)(ad_flag & BTM_BLE_ADV_FLAG_MASK) ;
  2676. BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_FLAG flag = %s | %s | %s",
  2677. (p_adv_data->flag & BTM_BLE_LIMIT_DISC_FLAG) ? "LE_LIMIT_DISC" : "",
  2678. (p_adv_data->flag & BTM_BLE_GEN_DISC_FLAG) ? "LE_GENERAL_DISC" : "",
  2679. (p_adv_data->flag & BTM_BLE_BREDR_NOT_SPT) ? "LE Only device" : "");
  2680. break;
  2681. case BTM_BLE_AD_TYPE_TX_PWR:
  2682. p_adv_data->ad_mask |= BTM_BLE_AD_BIT_TX_PWR;
  2683. p_adv_data->tx_power_level = (INT8) * p_cur ++;
  2684. BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_TX_PWR tx_level = %d", p_adv_data->tx_power_level);
  2685. break;
  2686. case BTM_BLE_AD_TYPE_MANU:
  2687. case BTM_BLE_AD_TYPE_16SRV_PART:
  2688. case BTM_BLE_AD_TYPE_16SRV_CMPL:
  2689. p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE;
  2690. /* need allocate memory to store UUID list */
  2691. p_adv_data->service.num_service = (ad_len - 1) / 2;
  2692. BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
  2693. p_cur += (ad_len - 1);
  2694. break;
  2695. case BTM_BLE_AD_TYPE_SOL_SRV_UUID:
  2696. p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_SOL;
  2697. /* need allocate memory to store UUID list */
  2698. p_adv_data->service.num_service = (ad_len - 1) / 2;
  2699. BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
  2700. p_cur += (ad_len - 1);
  2701. break;
  2702. case BTM_BLE_AD_TYPE_128SOL_SRV_UUID:
  2703. p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL;
  2704. /* need allocate memory to store UUID list */
  2705. p_adv_data->service.num_service = (ad_len - 1) / 16;
  2706. BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
  2707. p_cur += (ad_len - 1);
  2708. break;
  2709. case BTM_BLE_AD_TYPE_APPEARANCE:
  2710. case BTM_BLE_AD_TYPE_PUBLIC_TARGET:
  2711. case BTM_BLE_AD_TYPE_RANDOM_TARGET:
  2712. default:
  2713. break;
  2714. }
  2715. len -= (ad_len + 1);
  2716. }
  2717. }
  2718. #endif
  2719. /*******************************************************************************
  2720. **
  2721. ** Function btm_ble_cache_adv_data
  2722. **
  2723. ** Description Update advertising cache data.
  2724. **
  2725. ** Returns void
  2726. **
  2727. *******************************************************************************/
  2728. void btm_ble_cache_adv_data(BD_ADDR bda, tBTM_INQ_RESULTS *p_cur, UINT8 data_len, UINT8 *p, UINT8 evt_type)
  2729. {
  2730. tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
  2731. UINT8 *p_cache;
  2732. //UINT8 length;
  2733. /* cache adv report/scan response data */
  2734. if (evt_type != BTM_BLE_SCAN_RSP_EVT) {
  2735. p_le_inq_cb->adv_len = 0;
  2736. memset(p_le_inq_cb->adv_data_cache, 0, BTM_BLE_CACHE_ADV_DATA_MAX);
  2737. p_cur->adv_data_len = 0;
  2738. p_cur->scan_rsp_len = 0;
  2739. }
  2740. //Clear the adv cache if the addresses are not equal
  2741. if(memcmp(bda, p_le_inq_cb->adv_addr, BD_ADDR_LEN) != 0) {
  2742. p_le_inq_cb->adv_len = 0;
  2743. memcpy(p_le_inq_cb->adv_addr, bda, BD_ADDR_LEN);
  2744. memset(p_le_inq_cb->adv_data_cache, 0, BTM_BLE_CACHE_ADV_DATA_MAX);
  2745. p_cur->adv_data_len = 0;
  2746. p_cur->scan_rsp_len = 0;
  2747. }
  2748. if (data_len > 0) {
  2749. p_cache = &p_le_inq_cb->adv_data_cache[p_le_inq_cb->adv_len];
  2750. if((data_len + p_le_inq_cb->adv_len) <= BTM_BLE_CACHE_ADV_DATA_MAX) {
  2751. memcpy(p_cache, p, data_len);
  2752. p_le_inq_cb->adv_len += data_len;
  2753. }
  2754. }
  2755. if (evt_type != BTM_BLE_SCAN_RSP_EVT) {
  2756. p_cur->adv_data_len = p_le_inq_cb->adv_len;
  2757. }
  2758. else {
  2759. p_cur->scan_rsp_len = p_le_inq_cb->adv_len - p_cur->adv_data_len;
  2760. }
  2761. /* parse service UUID from adv packet and save it in inq db eir_uuid */
  2762. /* TODO */
  2763. }
  2764. /*******************************************************************************
  2765. **
  2766. ** Function btm_ble_is_discoverable
  2767. **
  2768. ** Description check ADV flag to make sure device is discoverable and match
  2769. ** the search condition
  2770. **
  2771. ** Parameters
  2772. **
  2773. ** Returns void
  2774. **
  2775. *******************************************************************************/
  2776. UINT8 btm_ble_is_discoverable(BD_ADDR bda, UINT8 evt_type, UINT8 *p)
  2777. {
  2778. UINT8 *p_flag, flag = 0, rt = 0;
  2779. UINT8 data_len;
  2780. tBTM_INQ_PARMS *p_cond = &btm_cb.btm_inq_vars.inqparms;
  2781. tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
  2782. UNUSED(p);
  2783. /* for observer, always "discoverable */
  2784. if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
  2785. rt |= BTM_BLE_OBS_RESULT;
  2786. }
  2787. /* for discover, always "discoverable */
  2788. if (BTM_BLE_IS_DISCO_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
  2789. rt |= BTM_BLE_DISCO_RESULT;
  2790. }
  2791. if (BTM_BLE_IS_SEL_CONN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity) &&
  2792. (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_CONNECT_DIR_EVT)) {
  2793. rt |= BTM_BLE_SEL_CONN_RESULT;
  2794. }
  2795. /* does not match filter condition */
  2796. if (p_cond->filter_cond_type == BTM_FILTER_COND_BD_ADDR &&
  2797. memcmp(bda, p_cond->filter_cond.bdaddr_cond, BD_ADDR_LEN) != 0) {
  2798. BTM_TRACE_DEBUG("BD ADDR does not meet filter condition");
  2799. return rt;
  2800. }
  2801. if (p_le_inq_cb->adv_len != 0) {
  2802. if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
  2803. BTM_BLE_AD_TYPE_FLAG, &data_len)) != NULL) {
  2804. flag = * p_flag;
  2805. if ((btm_cb.btm_inq_vars.inq_active & BTM_BLE_GENERAL_INQUIRY) &&
  2806. (flag & (BTM_BLE_LIMIT_DISC_FLAG | BTM_BLE_GEN_DISC_FLAG)) != 0) {
  2807. BTM_TRACE_DEBUG("Find Generable Discoverable device");
  2808. rt |= BTM_BLE_INQ_RESULT;
  2809. }
  2810. else if (btm_cb.btm_inq_vars.inq_active & BTM_BLE_LIMITED_INQUIRY &&
  2811. (flag & BTM_BLE_LIMIT_DISC_FLAG) != 0) {
  2812. BTM_TRACE_DEBUG("Find limited discoverable device");
  2813. rt |= BTM_BLE_INQ_RESULT;
  2814. }
  2815. }
  2816. }
  2817. return rt;
  2818. }
  2819. static void btm_ble_appearance_to_cod(UINT16 appearance, UINT8 *dev_class)
  2820. {
  2821. dev_class[0] = 0;
  2822. switch (appearance) {
  2823. case BTM_BLE_APPEARANCE_GENERIC_PHONE:
  2824. dev_class[1] = BTM_COD_MAJOR_PHONE;
  2825. dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
  2826. break;
  2827. case BTM_BLE_APPEARANCE_GENERIC_COMPUTER:
  2828. dev_class[1] = BTM_COD_MAJOR_COMPUTER;
  2829. dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
  2830. break;
  2831. case BTM_BLE_APPEARANCE_GENERIC_REMOTE:
  2832. dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
  2833. dev_class[2] = BTM_COD_MINOR_REMOTE_CONTROL;
  2834. break;
  2835. case BTM_BLE_APPEARANCE_GENERIC_THERMOMETER:
  2836. case BTM_BLE_APPEARANCE_THERMOMETER_EAR:
  2837. dev_class[1] = BTM_COD_MAJOR_HEALTH;
  2838. dev_class[2] = BTM_COD_MINOR_THERMOMETER;
  2839. break;
  2840. case BTM_BLE_APPEARANCE_GENERIC_HEART_RATE:
  2841. case BTM_BLE_APPEARANCE_HEART_RATE_BELT:
  2842. dev_class[1] = BTM_COD_MAJOR_HEALTH;
  2843. dev_class[2] = BTM_COD_MINOR_HEART_PULSE_MONITOR;
  2844. break;
  2845. case BTM_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE:
  2846. case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_ARM:
  2847. case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST:
  2848. dev_class[1] = BTM_COD_MAJOR_HEALTH;
  2849. dev_class[2] = BTM_COD_MINOR_BLOOD_MONITOR;
  2850. break;
  2851. case BTM_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER:
  2852. case BTM_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP:
  2853. case BTM_BLE_APPEARANCE_PULSE_OXIMETER_WRIST:
  2854. dev_class[1] = BTM_COD_MAJOR_HEALTH;
  2855. dev_class[2] = BTM_COD_MINOR_PULSE_OXIMETER;
  2856. break;
  2857. case BTM_BLE_APPEARANCE_GENERIC_GLUCOSE:
  2858. dev_class[1] = BTM_COD_MAJOR_HEALTH;
  2859. dev_class[2] = BTM_COD_MINOR_GLUCOSE_METER;
  2860. break;
  2861. case BTM_BLE_APPEARANCE_GENERIC_WEIGHT:
  2862. dev_class[1] = BTM_COD_MAJOR_HEALTH;
  2863. dev_class[2] = BTM_COD_MINOR_WEIGHING_SCALE;
  2864. break;
  2865. case BTM_BLE_APPEARANCE_GENERIC_WALKING:
  2866. case BTM_BLE_APPEARANCE_WALKING_IN_SHOE:
  2867. case BTM_BLE_APPEARANCE_WALKING_ON_SHOE:
  2868. case BTM_BLE_APPEARANCE_WALKING_ON_HIP:
  2869. dev_class[1] = BTM_COD_MAJOR_HEALTH;
  2870. dev_class[2] = BTM_COD_MINOR_STEP_COUNTER;
  2871. break;
  2872. case BTM_BLE_APPEARANCE_GENERIC_WATCH:
  2873. case BTM_BLE_APPEARANCE_SPORTS_WATCH:
  2874. dev_class[1] = BTM_COD_MAJOR_WEARABLE;
  2875. dev_class[2] = BTM_COD_MINOR_WRIST_WATCH;
  2876. break;
  2877. case BTM_BLE_APPEARANCE_GENERIC_EYEGLASSES:
  2878. dev_class[1] = BTM_COD_MAJOR_WEARABLE;
  2879. dev_class[2] = BTM_COD_MINOR_GLASSES;
  2880. break;
  2881. case BTM_BLE_APPEARANCE_GENERIC_DISPLAY:
  2882. dev_class[1] = BTM_COD_MAJOR_IMAGING;
  2883. dev_class[2] = BTM_COD_MINOR_DISPLAY;
  2884. break;
  2885. case BTM_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER:
  2886. dev_class[1] = BTM_COD_MAJOR_AUDIO;
  2887. dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
  2888. break;
  2889. case BTM_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER:
  2890. case BTM_BLE_APPEARANCE_HID_BARCODE_SCANNER:
  2891. case BTM_BLE_APPEARANCE_GENERIC_HID:
  2892. dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
  2893. dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
  2894. break;
  2895. case BTM_BLE_APPEARANCE_HID_KEYBOARD:
  2896. dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
  2897. dev_class[2] = BTM_COD_MINOR_KEYBOARD;
  2898. break;
  2899. case BTM_BLE_APPEARANCE_HID_MOUSE:
  2900. dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
  2901. dev_class[2] = BTM_COD_MINOR_POINTING;
  2902. break;
  2903. case BTM_BLE_APPEARANCE_HID_JOYSTICK:
  2904. dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
  2905. dev_class[2] = BTM_COD_MINOR_JOYSTICK;
  2906. break;
  2907. case BTM_BLE_APPEARANCE_HID_GAMEPAD:
  2908. dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
  2909. dev_class[2] = BTM_COD_MINOR_GAMEPAD;
  2910. break;
  2911. case BTM_BLE_APPEARANCE_HID_DIGITIZER_TABLET:
  2912. dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
  2913. dev_class[2] = BTM_COD_MINOR_DIGITIZING_TABLET;
  2914. break;
  2915. case BTM_BLE_APPEARANCE_HID_CARD_READER:
  2916. dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
  2917. dev_class[2] = BTM_COD_MINOR_CARD_READER;
  2918. break;
  2919. case BTM_BLE_APPEARANCE_HID_DIGITAL_PEN:
  2920. dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
  2921. dev_class[2] = BTM_COD_MINOR_DIGITAL_PAN;
  2922. break;
  2923. case BTM_BLE_APPEARANCE_UNKNOWN:
  2924. case BTM_BLE_APPEARANCE_GENERIC_CLOCK:
  2925. case BTM_BLE_APPEARANCE_GENERIC_TAG:
  2926. case BTM_BLE_APPEARANCE_GENERIC_KEYRING:
  2927. case BTM_BLE_APPEARANCE_GENERIC_CYCLING:
  2928. case BTM_BLE_APPEARANCE_CYCLING_COMPUTER:
  2929. case BTM_BLE_APPEARANCE_CYCLING_SPEED:
  2930. case BTM_BLE_APPEARANCE_CYCLING_CADENCE:
  2931. case BTM_BLE_APPEARANCE_CYCLING_POWER:
  2932. case BTM_BLE_APPEARANCE_CYCLING_SPEED_CADENCE:
  2933. case BTM_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS:
  2934. case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION:
  2935. case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV:
  2936. case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD:
  2937. case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV:
  2938. default:
  2939. dev_class[1] = BTM_COD_MAJOR_UNCLASSIFIED;
  2940. dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
  2941. };
  2942. }
  2943. /*******************************************************************************
  2944. **
  2945. ** Function btm_ble_update_inq_result
  2946. **
  2947. ** Description Update adv packet information into inquiry result.
  2948. **
  2949. ** Parameters
  2950. **
  2951. ** Returns void
  2952. **
  2953. *******************************************************************************/
  2954. BOOLEAN btm_ble_update_inq_result(BD_ADDR bda, tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
  2955. {
  2956. BOOLEAN to_report = TRUE;
  2957. tBTM_INQ_RESULTS *p_cur = &p_i->inq_info.results;
  2958. UINT8 len;
  2959. UINT8 *p_flag;
  2960. tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
  2961. UINT8 data_len, rssi;
  2962. tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
  2963. UINT8 *p1;
  2964. UINT8 *p_uuid16;
  2965. STREAM_TO_UINT8 (data_len, p);
  2966. if (data_len > BTM_BLE_ADV_DATA_LEN_MAX) {
  2967. BTM_TRACE_WARNING("EIR data too long %d. discard", data_len);
  2968. return FALSE;
  2969. }
  2970. btm_ble_cache_adv_data(bda, p_cur, data_len, p, evt_type);
  2971. p1 = (p + data_len);
  2972. STREAM_TO_UINT8 (rssi, p1);
  2973. /* Save the info */
  2974. p_cur->inq_result_type = BTM_INQ_RESULT_BLE;
  2975. p_cur->ble_addr_type = addr_type;
  2976. p_cur->rssi = rssi;
  2977. /* active scan, always wait until get scan_rsp to report the result */
  2978. if ((btm_cb.ble_ctr_cb.inq_var.scan_type == BTM_BLE_SCAN_MODE_ACTI &&
  2979. (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_DISCOVER_EVT))) {
  2980. BTM_TRACE_DEBUG("btm_ble_update_inq_result scan_rsp=false, to_report=false,\
  2981. scan_type_active=%d", btm_cb.ble_ctr_cb.inq_var.scan_type);
  2982. p_i->scan_rsp = FALSE;
  2983. #if BTM_BLE_ACTIVE_SCAN_REPORT_ADV_SCAN_RSP_INDIVIDUALLY == FALSE
  2984. to_report = FALSE;
  2985. #endif
  2986. } else {
  2987. p_i->scan_rsp = TRUE;
  2988. }
  2989. if (p_i->inq_count != p_inq->inq_counter) {
  2990. p_cur->device_type = BT_DEVICE_TYPE_BLE;
  2991. } else {
  2992. p_cur->device_type |= BT_DEVICE_TYPE_BLE;
  2993. }
  2994. if (evt_type != BTM_BLE_SCAN_RSP_EVT) {
  2995. p_cur->ble_evt_type = evt_type;
  2996. }
  2997. #if BTM_BLE_ACTIVE_SCAN_REPORT_ADV_SCAN_RSP_INDIVIDUALLY
  2998. if (evt_type == BTM_BLE_SCAN_RSP_EVT) {
  2999. p_cur->ble_evt_type = evt_type;
  3000. }
  3001. #endif
  3002. p_i->inq_count = p_inq->inq_counter; /* Mark entry for current inquiry */
  3003. if (p_le_inq_cb->adv_len != 0) {
  3004. if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_FLAG, &len)) != NULL) {
  3005. p_cur->flag = * p_flag;
  3006. }
  3007. }
  3008. if (p_le_inq_cb->adv_len != 0) {
  3009. /* Check to see the BLE device has the Appearance UUID in the advertising data. If it does
  3010. * then try to convert the appearance value to a class of device value Bluedroid can use.
  3011. * Otherwise fall back to trying to infer if it is a HID device based on the service class.
  3012. */
  3013. p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_APPEARANCE, &len);
  3014. if (p_uuid16 && len == 2) {
  3015. btm_ble_appearance_to_cod((UINT16)p_uuid16[0] | (p_uuid16[1] << 8), p_cur->dev_class);
  3016. } else {
  3017. if ((p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
  3018. BTM_BLE_AD_TYPE_16SRV_CMPL, &len)) != NULL) {
  3019. UINT8 i;
  3020. for (i = 0; i + 2 <= len; i = i + 2) {
  3021. #if BTA_HH_LE_INCLUDED == TRUE
  3022. /* if this BLE device support HID over LE, set HID Major in class of device */
  3023. if ((p_uuid16[i] | (p_uuid16[i + 1] << 8)) == UUID_SERVCLASS_LE_HID) {
  3024. p_cur->dev_class[0] = 0;
  3025. p_cur->dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
  3026. p_cur->dev_class[2] = 0;
  3027. break;
  3028. }
  3029. #endif /* BTA_HH_LE_INCLUDED */
  3030. }
  3031. }
  3032. }
  3033. }
  3034. /* if BR/EDR not supported is not set, assume is a DUMO device */
  3035. if ((p_cur->flag & BTM_BLE_BREDR_NOT_SPT) == 0 &&
  3036. evt_type != BTM_BLE_CONNECT_DIR_EVT) {
  3037. if (p_cur->ble_addr_type != BLE_ADDR_RANDOM) {
  3038. BTM_TRACE_DEBUG("BR/EDR NOT support bit not set, treat as DUMO");
  3039. p_cur->device_type |= BT_DEVICE_TYPE_DUMO;
  3040. } else {
  3041. BTM_TRACE_DEBUG("Random address, treating device as LE only");
  3042. }
  3043. } else {
  3044. BTM_TRACE_DEBUG("BR/EDR NOT SUPPORT bit set, LE only device");
  3045. }
  3046. return to_report;
  3047. }
  3048. /*******************************************************************************
  3049. **
  3050. ** Function btm_clear_all_pending_le_entry
  3051. **
  3052. ** Description This function is called to clear all LE pending entry in
  3053. ** inquiry database.
  3054. **
  3055. ** Returns void
  3056. **
  3057. *******************************************************************************/
  3058. void btm_clear_all_pending_le_entry(void)
  3059. {
  3060. UINT16 xx;
  3061. tINQ_DB_ENT *p_ent = btm_cb.btm_inq_vars.inq_db;
  3062. for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) {
  3063. /* mark all pending LE entry as unused if an LE only device has scan response outstanding */
  3064. if ((p_ent->in_use) &&
  3065. (p_ent->inq_info.results.device_type == BT_DEVICE_TYPE_BLE) &&
  3066. !p_ent->scan_rsp) {
  3067. p_ent->in_use = FALSE;
  3068. }
  3069. }
  3070. }
  3071. /*******************************************************************************
  3072. **
  3073. ** Function btm_send_sel_conn_callback
  3074. **
  3075. ** Description send selection connection request callback.
  3076. **
  3077. ** Parameters
  3078. **
  3079. ** Returns void
  3080. **
  3081. *******************************************************************************/
  3082. void btm_send_sel_conn_callback(BD_ADDR remote_bda, UINT8 evt_type, UINT8 *p_data, UINT8 addr_type)
  3083. {
  3084. UINT8 data_len, len;
  3085. UINT8 *p_dev_name, remname[31] = {0};
  3086. UNUSED(addr_type);
  3087. if (btm_cb.ble_ctr_cb.p_select_cback == NULL ||
  3088. /* non-connectable device */
  3089. (evt_type != BTM_BLE_EVT_CONN_ADV && evt_type != BTM_BLE_EVT_CONN_DIR_ADV)) {
  3090. return;
  3091. }
  3092. STREAM_TO_UINT8 (data_len, p_data);
  3093. /* get the device name if exist in ADV data */
  3094. if (data_len != 0) {
  3095. p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_CMPL, &len);
  3096. if (p_dev_name == NULL) {
  3097. p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_SHORT, &len);
  3098. }
  3099. if (p_dev_name) {
  3100. memcpy(remname, p_dev_name, len);
  3101. }
  3102. }
  3103. /* allow connection */
  3104. if ((* btm_cb.ble_ctr_cb.p_select_cback)(remote_bda, remname)) {
  3105. /* terminate selective connection, initiate connection */
  3106. btm_ble_initiate_select_conn(remote_bda);
  3107. }
  3108. }
  3109. static void btm_adv_pkt_handler(void *arg)
  3110. {
  3111. UINT8 hci_evt_code, hci_evt_len;
  3112. UINT8 ble_sub_code;
  3113. tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
  3114. size_t pkts_to_process = pkt_queue_length(p_cb->adv_rpt_queue);
  3115. if (pkts_to_process > BTM_BLE_GAP_ADV_RPT_BATCH_SIZE) {
  3116. pkts_to_process = BTM_BLE_GAP_ADV_RPT_BATCH_SIZE;
  3117. }
  3118. for (size_t i = 0; i < pkts_to_process; i++) {
  3119. pkt_linked_item_t *linked_pkt = pkt_queue_dequeue(p_cb->adv_rpt_queue);
  3120. assert(linked_pkt != NULL);
  3121. BT_HDR *packet = (BT_HDR *)linked_pkt->data;
  3122. uint8_t *p = packet->data + packet->offset;
  3123. STREAM_TO_UINT8 (hci_evt_code, p);
  3124. STREAM_TO_UINT8 (hci_evt_len, p);
  3125. STREAM_TO_UINT8 (ble_sub_code, p);
  3126. if (ble_sub_code == HCI_BLE_ADV_PKT_RPT_EVT) {
  3127. btm_ble_process_adv_pkt(p);
  3128. } else if (ble_sub_code == HCI_BLE_ADV_DISCARD_REPORT_EVT) {
  3129. btm_ble_process_adv_discard_evt(p);
  3130. } else if (ble_sub_code == HCI_BLE_DIRECT_ADV_EVT) {
  3131. btm_ble_process_direct_adv_pkt(p);
  3132. } else {
  3133. assert (0);
  3134. }
  3135. osi_free(linked_pkt);
  3136. #if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE)
  3137. hci_adv_credits_try_release(1);
  3138. #endif
  3139. }
  3140. if (pkt_queue_length(p_cb->adv_rpt_queue) != 0) {
  3141. btu_task_post(SIG_BTU_HCI_ADV_RPT_MSG, NULL, OSI_THREAD_MAX_TIMEOUT);
  3142. }
  3143. UNUSED(hci_evt_code);
  3144. UNUSED(hci_evt_len);
  3145. }
  3146. /*******************************************************************************
  3147. **
  3148. ** Function btm_ble_process_adv_pkt
  3149. **
  3150. ** Description This function is called when adv packet report events are
  3151. ** received from the device. It updates the inquiry database.
  3152. ** If the inquiry database is full, the oldest entry is discarded.
  3153. **
  3154. ** Parameters
  3155. **
  3156. ** Returns void
  3157. **
  3158. *******************************************************************************/
  3159. void btm_ble_process_adv_pkt (UINT8 *p_data)
  3160. {
  3161. BD_ADDR bda;
  3162. UINT8 evt_type = 0, *p = p_data;
  3163. UINT8 addr_type = 0;
  3164. UINT8 num_reports;
  3165. UINT8 data_len;
  3166. #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
  3167. BOOLEAN match = FALSE;
  3168. #if (!CONTROLLER_RPA_LIST_ENABLE)
  3169. BD_ADDR temp_bda;
  3170. UINT8 temp_addr_type = 0;
  3171. #endif // (!CONTROLLER_RPA_LIST_ENABLE)
  3172. #endif//(defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
  3173. /* Only process the results if the inquiry is still active */
  3174. if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
  3175. return;
  3176. }
  3177. /* Extract the number of reports in this event. */
  3178. STREAM_TO_UINT8(num_reports, p);
  3179. while (num_reports--) {
  3180. /* Extract inquiry results */
  3181. STREAM_TO_UINT8 (evt_type, p);
  3182. STREAM_TO_UINT8 (addr_type, p);
  3183. STREAM_TO_BDADDR (bda, p);
  3184. //BTM_TRACE_ERROR("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x\n",
  3185. // bda[0],bda[1],bda[2],bda[3],bda[4],bda[5]);
  3186. #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
  3187. #if (!CONTROLLER_RPA_LIST_ENABLE)
  3188. temp_addr_type = addr_type;
  3189. memcpy(temp_bda, bda, BD_ADDR_LEN);
  3190. #endif // (!CONTROLLER_RPA_LIST_ENABLE)
  3191. /* map address to security record */
  3192. match = btm_identity_addr_to_random_pseudo(bda, &addr_type, FALSE);
  3193. // BTM_TRACE_ERROR("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x\n",
  3194. // bda[0],bda[1],bda[2],bda[3],bda[4],bda[5]);
  3195. /* always do RRA resolution on host */
  3196. if (!match && BTM_BLE_IS_RESOLVE_BDA(bda)) {
  3197. btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_adv, p_data);
  3198. } else
  3199. #endif
  3200. btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, p);
  3201. #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE && (!CONTROLLER_RPA_LIST_ENABLE))
  3202. //save current adv addr information if p_dev_rec!= NULL
  3203. tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda);
  3204. if(p_dev_rec) {
  3205. p_dev_rec->ble.current_addr_type = temp_addr_type;
  3206. memcpy(p_dev_rec->ble.current_addr, temp_bda, BD_ADDR_LEN);
  3207. p_dev_rec->ble.current_addr_valid = true;
  3208. }
  3209. #endif
  3210. STREAM_TO_UINT8(data_len, p);
  3211. /* Advance to the next event data_len + rssi byte */
  3212. p += data_len + 1;
  3213. }
  3214. }
  3215. /*******************************************************************************
  3216. **
  3217. ** Function btm_ble_process_last_adv_pkt
  3218. **
  3219. ** Description This function is called to report last adv packet
  3220. **
  3221. ** Parameters
  3222. **
  3223. ** Returns void
  3224. **
  3225. *******************************************************************************/
  3226. static void btm_ble_process_last_adv_pkt(void)
  3227. {
  3228. UINT8 result = 0;
  3229. UINT8 null_bda[6] = {0};
  3230. tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
  3231. tBTM_INQ_RESULTS_CB *p_inq_results_cb = p_inq->p_inq_results_cb;
  3232. tBTM_INQ_RESULTS_CB *p_obs_results_cb = btm_cb.ble_ctr_cb.p_obs_results_cb;
  3233. tBTM_INQ_RESULTS_CB *p_scan_results_cb = btm_cb.ble_ctr_cb.p_scan_results_cb;
  3234. tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
  3235. tINQ_DB_ENT *p_i = btm_inq_db_find (p_le_inq_cb->adv_addr);
  3236. if(memcmp(null_bda, p_le_inq_cb->adv_addr, BD_ADDR_LEN) == 0) {
  3237. return;
  3238. }
  3239. if(p_i == NULL) {
  3240. BTM_TRACE_DEBUG("no last adv");
  3241. return;
  3242. }
  3243. if ((result = btm_ble_is_discoverable(p_le_inq_cb->adv_addr, p_i->inq_info.results.ble_evt_type, NULL)) == 0) {
  3244. BTM_TRACE_WARNING("%s device is no longer discoverable so discarding advertising packet pkt",
  3245. __func__);
  3246. return;
  3247. }
  3248. /* background connection in selective connection mode */
  3249. if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE) {
  3250. //do nothing
  3251. } else {
  3252. if (p_inq_results_cb && (result & BTM_BLE_INQ_RESULT)) {
  3253. (p_inq_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
  3254. p_le_inq_cb->adv_len = 0;
  3255. memset(p_le_inq_cb->adv_addr, 0, BD_ADDR_LEN);
  3256. p_i->inq_info.results.adv_data_len = 0;
  3257. p_i->inq_info.results.scan_rsp_len = 0;
  3258. }
  3259. if (p_obs_results_cb && (result & BTM_BLE_OBS_RESULT)) {
  3260. (p_obs_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
  3261. p_le_inq_cb->adv_len = 0;
  3262. memset(p_le_inq_cb->adv_addr, 0, BD_ADDR_LEN);
  3263. p_i->inq_info.results.adv_data_len = 0;
  3264. p_i->inq_info.results.scan_rsp_len = 0;
  3265. }
  3266. if (p_scan_results_cb && (result & BTM_BLE_DISCO_RESULT)) {
  3267. (p_scan_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
  3268. p_le_inq_cb->adv_len = 0;
  3269. memset(p_le_inq_cb->adv_addr, 0, BD_ADDR_LEN);
  3270. p_i->inq_info.results.adv_data_len = 0;
  3271. p_i->inq_info.results.scan_rsp_len = 0;
  3272. }
  3273. }
  3274. }
  3275. /*******************************************************************************
  3276. **
  3277. ** Function btm_ble_process_adv_pkt_cont
  3278. **
  3279. ** Description This function is called after random address resolution is
  3280. ** done, and proceed to process adv packet.
  3281. **
  3282. ** Parameters
  3283. **
  3284. ** Returns void
  3285. **
  3286. *******************************************************************************/
  3287. static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
  3288. {
  3289. tINQ_DB_ENT *p_i;
  3290. tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
  3291. tBTM_INQ_RESULTS_CB *p_inq_results_cb = p_inq->p_inq_results_cb;
  3292. tBTM_INQ_RESULTS_CB *p_obs_results_cb = btm_cb.ble_ctr_cb.p_obs_results_cb;
  3293. tBTM_INQ_RESULTS_CB *p_scan_results_cb = btm_cb.ble_ctr_cb.p_scan_results_cb;
  3294. tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
  3295. BOOLEAN update = TRUE;
  3296. UINT8 result = 0;
  3297. /* Event_Type:
  3298. 0x00 Connectable undirected advertising (ADV_IND).
  3299. 0x01 Connectable directed advertising (ADV_DIRECT_IND)
  3300. 0x02 Scannable undirected advertising (ADV_SCAN_IND)
  3301. 0x03 Non connectable undirected advertising (ADV_NONCONN_IND)
  3302. 0x04 Scan Response (SCAN_RSP)
  3303. 0x05-0xFF Reserved for future use
  3304. */
  3305. // The adv packet without scan response is allowed to report to higher layer
  3306. /*
  3307. Bluedroid will put the advertising packet and scan response into a packet and send it to the higher layer.
  3308. If two advertising packets are not with the same address, or can't be combined into a packet, then the first advertising
  3309. packet will be discarded. So we added the following judgment:
  3310. 1. For different addresses, send the last advertising packet to higher layer
  3311. 2. For same address and same advertising type (not scan response), send the last advertising packet to higher layer
  3312. 3. For same address and scan response, do nothing
  3313. */
  3314. int same_addr = memcmp(bda, p_le_inq_cb->adv_addr, BD_ADDR_LEN);
  3315. if (same_addr != 0 || (same_addr == 0 && evt_type != BTM_BLE_SCAN_RSP_EVT)) {
  3316. btm_ble_process_last_adv_pkt();
  3317. }
  3318. p_i = btm_inq_db_find (bda);
  3319. /* Check if this address has already been processed for this inquiry */
  3320. if (btm_inq_find_bdaddr(bda)) {
  3321. /* never been report as an LE device */
  3322. if (p_i &&
  3323. (!(p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) ||
  3324. /* scan repsonse to be updated */
  3325. (!p_i->scan_rsp))) {
  3326. update = TRUE;
  3327. } else if (BTM_BLE_IS_DISCO_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
  3328. update = FALSE;
  3329. } else {
  3330. /* if yes, skip it */
  3331. return; /* assumption: one result per event */
  3332. }
  3333. }
  3334. /* If existing entry, use that, else get a new one (possibly reusing the oldest) */
  3335. if (p_i == NULL) {
  3336. if ((p_i = btm_inq_db_new (bda)) != NULL) {
  3337. p_inq->inq_cmpl_info.num_resp++;
  3338. } else {
  3339. return;
  3340. }
  3341. } else if (p_i->inq_count != p_inq->inq_counter) { /* first time seen in this inquiry */
  3342. p_inq->inq_cmpl_info.num_resp++;
  3343. }
  3344. /* update the LE device information in inquiry database */
  3345. if (!btm_ble_update_inq_result(bda, p_i, addr_type, evt_type, p)) {
  3346. return;
  3347. }
  3348. if ((result = btm_ble_is_discoverable(bda, evt_type, p)) == 0) {
  3349. BTM_TRACE_WARNING("%s device is no longer discoverable so discarding advertising packet pkt",
  3350. __func__);
  3351. return;
  3352. }
  3353. if (!update) {
  3354. result &= ~BTM_BLE_INQ_RESULT;
  3355. }
  3356. /* If the number of responses found and limited, issue a cancel inquiry */
  3357. if (p_inq->inqparms.max_resps &&
  3358. p_inq->inq_cmpl_info.num_resp == p_inq->inqparms.max_resps) {
  3359. /* new device */
  3360. if (p_i == NULL ||
  3361. /* assume a DUMO device, BR/EDR inquiry is always active */
  3362. (p_i &&
  3363. (p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE &&
  3364. p_i->scan_rsp)) {
  3365. BTM_TRACE_WARNING("INQ RES: Extra Response Received...cancelling inquiry..");
  3366. /* if is non-periodic inquiry active, cancel now */
  3367. if ((p_inq->inq_active & BTM_BR_INQ_ACTIVE_MASK) != 0 &&
  3368. (p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) == 0) {
  3369. btsnd_hcic_inq_cancel();
  3370. }
  3371. btm_ble_stop_inquiry();
  3372. btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT);
  3373. }
  3374. }
  3375. /* background connection in selective connection mode */
  3376. if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE) {
  3377. if (result & BTM_BLE_SEL_CONN_RESULT) {
  3378. btm_send_sel_conn_callback(bda, evt_type, p, addr_type);
  3379. } else {
  3380. BTM_TRACE_DEBUG("None LE device, can not initiate selective connection\n");
  3381. }
  3382. } else {
  3383. if (p_inq_results_cb && (result & BTM_BLE_INQ_RESULT)) {
  3384. (p_inq_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
  3385. p_le_inq_cb->adv_len = 0;
  3386. memset(p_le_inq_cb->adv_addr, 0, BD_ADDR_LEN);
  3387. p_i->inq_info.results.adv_data_len = 0;
  3388. p_i->inq_info.results.scan_rsp_len = 0;
  3389. }
  3390. if (p_obs_results_cb && (result & BTM_BLE_OBS_RESULT)) {
  3391. (p_obs_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
  3392. p_le_inq_cb->adv_len = 0;
  3393. memset(p_le_inq_cb->adv_addr, 0, BD_ADDR_LEN);
  3394. p_i->inq_info.results.adv_data_len = 0;
  3395. p_i->inq_info.results.scan_rsp_len = 0;
  3396. }
  3397. if (p_scan_results_cb && (result & BTM_BLE_DISCO_RESULT)) {
  3398. (p_scan_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
  3399. p_le_inq_cb->adv_len = 0;
  3400. memset(p_le_inq_cb->adv_addr, 0, BD_ADDR_LEN);
  3401. p_i->inq_info.results.adv_data_len = 0;
  3402. p_i->inq_info.results.scan_rsp_len = 0;
  3403. }
  3404. }
  3405. }
  3406. void btm_ble_process_adv_discard_evt(UINT8 *p)
  3407. {
  3408. #if (BLE_ADV_REPORT_FLOW_CONTROL == TRUE)
  3409. uint32_t num_dis = 0;
  3410. STREAM_TO_UINT32 (num_dis, p);
  3411. tBTM_INQ_DIS_CB *p_obs_discard_cb = btm_cb.ble_ctr_cb.p_obs_discard_cb;
  3412. if(p_obs_discard_cb) {
  3413. (p_obs_discard_cb)(num_dis);
  3414. }
  3415. #endif
  3416. }
  3417. void btm_ble_process_direct_adv_pkt(UINT8 *p)
  3418. {
  3419. // TODO
  3420. }
  3421. /*******************************************************************************
  3422. **
  3423. ** Function btm_ble_start_scan
  3424. **
  3425. ** Description Start the BLE scan.
  3426. **
  3427. ** Returns void
  3428. **
  3429. *******************************************************************************/
  3430. tBTM_STATUS btm_ble_start_scan(void)
  3431. {
  3432. tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
  3433. tBTM_STATUS status = BTM_CMD_STARTED;
  3434. osi_mutex_lock(&scan_enable_lock, OSI_MUTEX_MAX_TIMEOUT);
  3435. if(p_inq->scan_duplicate_filter > BTM_BLE_DUPLICATE_MAX) {
  3436. p_inq->scan_duplicate_filter = BTM_BLE_DUPLICATE_DISABLE;
  3437. }
  3438. /* start scan, disable duplicate filtering */
  3439. if (!btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, p_inq->scan_duplicate_filter)) {
  3440. status = BTM_NO_RESOURCES;
  3441. } else {
  3442. osi_sem_take(&scan_enable_sem, OSI_SEM_MAX_TIMEOUT);
  3443. if(scan_enable_status != BTM_SUCCESS) {
  3444. status = BTM_NO_RESOURCES;
  3445. }
  3446. btm_cb.ble_ctr_cb.inq_var.state |= BTM_BLE_SCANNING;
  3447. if (p_inq->scan_type == BTM_BLE_SCAN_MODE_ACTI) {
  3448. btm_ble_set_topology_mask(BTM_BLE_STATE_ACTIVE_SCAN_BIT);
  3449. } else {
  3450. btm_ble_set_topology_mask(BTM_BLE_STATE_PASSIVE_SCAN_BIT);
  3451. }
  3452. }
  3453. osi_mutex_unlock(&scan_enable_lock);
  3454. return status;
  3455. }
  3456. /*******************************************************************************
  3457. **
  3458. ** Function btm_ble_stop_scan
  3459. **
  3460. ** Description Stop the BLE scan.
  3461. **
  3462. ** Returns void
  3463. **
  3464. *******************************************************************************/
  3465. void btm_ble_stop_scan(void)
  3466. {
  3467. BTM_TRACE_EVENT ("btm_ble_stop_scan ");
  3468. /* Clear the inquiry callback if set */
  3469. btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
  3470. btm_cb.ble_ctr_cb.inq_var.state &= ~BTM_BLE_SCANNING;
  3471. /* stop discovery now */
  3472. btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
  3473. btm_update_scanner_filter_policy(SP_ADV_ALL);
  3474. btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_SCAN;
  3475. }
  3476. /*******************************************************************************
  3477. **
  3478. ** Function btm_ble_stop_inquiry
  3479. **
  3480. ** Description Stop the BLE Inquiry.
  3481. **
  3482. ** Returns void
  3483. **
  3484. *******************************************************************************/
  3485. void btm_ble_stop_inquiry(void)
  3486. {
  3487. tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
  3488. tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
  3489. btu_stop_timer (&p_ble_cb->inq_var.inq_timer_ent);
  3490. p_ble_cb->scan_activity &= ~BTM_BLE_INQUIRY_MASK;
  3491. /* If no more scan activity, stop LE scan now */
  3492. if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) {
  3493. btm_ble_stop_scan();
  3494. } else if ((p_ble_cb->inq_var.scan_interval != BTM_BLE_LOW_LATENCY_SCAN_INT) ||
  3495. (p_ble_cb->inq_var.scan_window != BTM_BLE_LOW_LATENCY_SCAN_WIN)) {
  3496. BTM_TRACE_DEBUG("%s: setting default params for ongoing observe", __FUNCTION__);
  3497. btm_ble_stop_scan();
  3498. btm_ble_start_scan();
  3499. }
  3500. /* If we have a callback registered for inquiry complete, call it */
  3501. BTM_TRACE_DEBUG ("BTM Inq Compl Callback: status 0x%02x, num results %d",
  3502. p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp);
  3503. btm_process_inq_complete(HCI_SUCCESS, (UINT8)(p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK));
  3504. }
  3505. /*******************************************************************************
  3506. **
  3507. ** Function btm_ble_stop_observe
  3508. **
  3509. ** Description Stop the BLE Observe.
  3510. **
  3511. ** Returns void
  3512. **
  3513. *******************************************************************************/
  3514. static void btm_ble_stop_observe(void)
  3515. {
  3516. tBTM_BLE_CB *p_ble_cb = & btm_cb.ble_ctr_cb;
  3517. tBTM_CMPL_CB *p_obs_cb = p_ble_cb->p_obs_cmpl_cb;
  3518. btu_stop_timer (&p_ble_cb->obs_timer_ent);
  3519. p_ble_cb->scan_activity &= ~BTM_LE_OBSERVE_ACTIVE;
  3520. p_ble_cb->p_obs_results_cb = NULL;
  3521. p_ble_cb->p_obs_cmpl_cb = NULL;
  3522. if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) {
  3523. btm_ble_stop_scan();
  3524. }
  3525. if (p_obs_cb) {
  3526. (p_obs_cb)((tBTM_INQUIRY_CMPL *) &btm_cb.btm_inq_vars.inq_cmpl_info);
  3527. }
  3528. }
  3529. /*******************************************************************************
  3530. **
  3531. ** Function btm_ble_stop_observe
  3532. **
  3533. ** Description Stop the BLE Observe.
  3534. **
  3535. ** Returns void
  3536. **
  3537. *******************************************************************************/
  3538. static void btm_ble_stop_discover(void)
  3539. {
  3540. tBTM_BLE_CB *p_ble_cb = & btm_cb.ble_ctr_cb;
  3541. tBTM_CMPL_CB *p_scan_cb = p_ble_cb->p_scan_cmpl_cb;
  3542. btu_stop_timer (&p_ble_cb->scan_timer_ent);
  3543. osi_mutex_lock(&scan_enable_lock, OSI_MUTEX_MAX_TIMEOUT);
  3544. p_ble_cb->scan_activity &= ~BTM_LE_DISCOVER_ACTIVE;
  3545. p_ble_cb->p_scan_results_cb = NULL;
  3546. p_ble_cb->p_scan_cmpl_cb = NULL;
  3547. if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) {
  3548. /* Clear the inquiry callback if set */
  3549. btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
  3550. btm_cb.ble_ctr_cb.inq_var.state &= ~BTM_BLE_SCANNING;
  3551. /* stop discovery now */
  3552. if(btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE)) {
  3553. osi_sem_take(&scan_enable_sem, OSI_SEM_MAX_TIMEOUT);
  3554. }
  3555. }
  3556. if (p_scan_cb) {
  3557. (p_scan_cb)((tBTM_INQUIRY_CMPL *) &btm_cb.btm_inq_vars.inq_cmpl_info);
  3558. }
  3559. osi_mutex_unlock(&scan_enable_lock);
  3560. }
  3561. /*******************************************************************************
  3562. **
  3563. ** Function btm_ble_adv_states_operation
  3564. **
  3565. ** Description Set or clear adv states in topology mask
  3566. **
  3567. ** Returns operation status. TRUE if sucessful, FALSE otherwise.
  3568. **
  3569. *******************************************************************************/
  3570. typedef BOOLEAN (BTM_TOPOLOGY_FUNC_PTR)(tBTM_BLE_STATE_MASK);
  3571. static BOOLEAN btm_ble_adv_states_operation(BTM_TOPOLOGY_FUNC_PTR *p_handler, UINT8 adv_evt)
  3572. {
  3573. BOOLEAN rt = FALSE;
  3574. switch (adv_evt) {
  3575. case BTM_BLE_CONNECT_EVT:
  3576. rt = (*p_handler)(BTM_BLE_STATE_CONN_ADV_BIT);
  3577. break;
  3578. case BTM_BLE_NON_CONNECT_EVT:
  3579. rt = (*p_handler) (BTM_BLE_STATE_NON_CONN_ADV_BIT);
  3580. break;
  3581. case BTM_BLE_CONNECT_DIR_EVT:
  3582. rt = (*p_handler) (BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT);
  3583. break;
  3584. case BTM_BLE_DISCOVER_EVT:
  3585. rt = (*p_handler) (BTM_BLE_STATE_SCAN_ADV_BIT);
  3586. break;
  3587. case BTM_BLE_CONNECT_LO_DUTY_DIR_EVT:
  3588. rt = (*p_handler) (BTM_BLE_STATE_LO_DUTY_DIR_ADV_BIT);
  3589. break;
  3590. default:
  3591. BTM_TRACE_ERROR("unknown adv event : %d", adv_evt);
  3592. break;
  3593. }
  3594. return rt;
  3595. }
  3596. /*******************************************************************************
  3597. **
  3598. ** Function btm_ble_start_adv
  3599. **
  3600. ** Description start the BLE advertising.
  3601. **
  3602. ** Returns void
  3603. **
  3604. *******************************************************************************/
  3605. tBTM_STATUS btm_ble_start_adv(void)
  3606. {
  3607. tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
  3608. tBTM_STATUS rt = BTM_NO_RESOURCES;
  3609. BTM_TRACE_EVENT ("btm_ble_start_adv\n");
  3610. if (!btm_ble_adv_states_operation (btm_ble_topology_check, p_cb->evt_type)) {
  3611. return BTM_WRONG_MODE;
  3612. }
  3613. osi_mutex_lock(&adv_enable_lock, OSI_MUTEX_MAX_TIMEOUT);
  3614. #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
  3615. /* To relax resolving list, always have resolving list enabled, unless directed adv */
  3616. if (p_cb->evt_type != BTM_BLE_CONNECT_LO_DUTY_DIR_EVT &&
  3617. p_cb->evt_type != BTM_BLE_CONNECT_DIR_EVT)
  3618. /* enable resolving list is desired */
  3619. {
  3620. //btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_ADV);
  3621. }
  3622. #endif
  3623. if (p_cb->afp != AP_SCAN_CONN_ALL) {
  3624. //find the device in the btm dev buffer and write it to the controller white list
  3625. btm_execute_wl_dev_operation();
  3626. btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
  3627. }
  3628. /* The complete event comes up immediately after the 'btsnd_hcic_ble_set_adv_enable' being called in dual core,
  3629. this causes the 'adv_mode' and 'state' not be set yet, so we set the state first */
  3630. tBTM_BLE_GAP_STATE temp_state = p_cb->state;
  3631. UINT8 adv_mode = p_cb->adv_mode;
  3632. p_cb->adv_mode = BTM_BLE_ADV_ENABLE;
  3633. p_cb->state |= BTM_BLE_ADVERTISING;
  3634. btm_ble_adv_states_operation(btm_ble_set_topology_mask, p_cb->evt_type);
  3635. if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_ENABLE)) {
  3636. osi_sem_take(&adv_enable_sem, OSI_SEM_MAX_TIMEOUT);
  3637. rt = adv_enable_status;
  3638. BTM_TRACE_EVENT ("BTM_SUCCESS\n");
  3639. } else {
  3640. p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
  3641. p_cb->state = temp_state;
  3642. p_cb->adv_mode = adv_mode;
  3643. btm_ble_adv_states_operation(btm_ble_clear_topology_mask, p_cb->evt_type);
  3644. btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
  3645. }
  3646. if(adv_enable_status != HCI_SUCCESS) {
  3647. p_cb->adv_mode = adv_mode;
  3648. }
  3649. osi_mutex_unlock(&adv_enable_lock);
  3650. return rt;
  3651. }
  3652. /*******************************************************************************
  3653. **
  3654. ** Function btm_ble_stop_adv
  3655. **
  3656. ** Description Stop the BLE advertising.
  3657. **
  3658. ** Returns void
  3659. **
  3660. *******************************************************************************/
  3661. tBTM_STATUS btm_ble_stop_adv(void)
  3662. {
  3663. tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
  3664. tBTM_STATUS rt = BTM_SUCCESS;
  3665. if (p_cb) {
  3666. osi_mutex_lock(&adv_enable_lock, OSI_MUTEX_MAX_TIMEOUT);
  3667. UINT8 temp_adv_mode = p_cb->adv_mode;
  3668. BOOLEAN temp_fast_adv_on = p_cb->fast_adv_on;
  3669. tBTM_BLE_GAP_STATE temp_state = p_cb->state;
  3670. tBTM_BLE_WL_STATE temp_wl_state = btm_cb.ble_ctr_cb.wl_state;
  3671. tBTM_BLE_STATE_MASK temp_mask = btm_ble_get_topology_mask ();
  3672. p_cb->fast_adv_on = FALSE;
  3673. p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
  3674. p_cb->state &= ~BTM_BLE_ADVERTISING;
  3675. btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
  3676. /* clear all adv states */
  3677. btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_ADV_MASK);
  3678. if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE)) {
  3679. osi_sem_take(&adv_enable_sem, OSI_SEM_MAX_TIMEOUT);
  3680. rt = adv_enable_status;
  3681. } else {
  3682. // reset state
  3683. p_cb->fast_adv_on = temp_fast_adv_on;
  3684. p_cb->adv_mode = temp_adv_mode;
  3685. p_cb->state = temp_state;
  3686. btm_cb.ble_ctr_cb.wl_state = temp_wl_state;
  3687. btm_ble_set_topology_mask (temp_mask);
  3688. rt = BTM_NO_RESOURCES;
  3689. }
  3690. if(adv_enable_status != HCI_SUCCESS) {
  3691. p_cb->adv_mode = temp_adv_mode;
  3692. }
  3693. osi_mutex_unlock(&adv_enable_lock);
  3694. }
  3695. return rt;
  3696. }
  3697. tBTM_STATUS btm_ble_set_random_addr(BD_ADDR random_bda)
  3698. {
  3699. tBTM_STATUS rt = BTM_SUCCESS;
  3700. osi_mutex_lock(&adv_enable_lock, OSI_MUTEX_MAX_TIMEOUT);
  3701. osi_mutex_lock(&scan_enable_lock, OSI_MUTEX_MAX_TIMEOUT);
  3702. if (btm_cb.ble_ctr_cb.inq_var.adv_mode == BTM_BLE_ADV_ENABLE) {
  3703. if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE)) {
  3704. osi_sem_take(&adv_enable_sem, OSI_SEM_MAX_TIMEOUT);
  3705. rt = adv_enable_status;
  3706. } else {
  3707. rt = BTM_BAD_VALUE_RET;
  3708. }
  3709. }
  3710. if (BTM_BLE_IS_DISCO_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
  3711. if (btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_SCAN_DUPLICATE_DISABLE)) {
  3712. osi_sem_take(&scan_enable_sem, OSI_SEM_MAX_TIMEOUT);
  3713. rt = scan_enable_status;
  3714. } else {
  3715. rt = BTM_BAD_VALUE_RET;
  3716. }
  3717. }
  3718. if (rt == BTM_SUCCESS) {
  3719. btsnd_hcic_ble_set_random_addr(random_bda);
  3720. }
  3721. if (btm_cb.ble_ctr_cb.inq_var.adv_mode == BTM_BLE_ADV_ENABLE) {
  3722. if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_ENABLE)) {
  3723. osi_sem_take(&adv_enable_sem, OSI_SEM_MAX_TIMEOUT);
  3724. rt = adv_enable_status;
  3725. } else {
  3726. rt = BTM_BAD_VALUE_RET;
  3727. }
  3728. }
  3729. if (BTM_BLE_IS_DISCO_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
  3730. if (btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, btm_cb.ble_ctr_cb.inq_var.scan_duplicate_filter)) {
  3731. osi_sem_take(&scan_enable_sem, OSI_SEM_MAX_TIMEOUT);
  3732. rt = scan_enable_status;
  3733. } else {
  3734. rt = BTM_BAD_VALUE_RET;
  3735. }
  3736. }
  3737. osi_mutex_unlock(&adv_enable_lock);
  3738. osi_mutex_unlock(&scan_enable_lock);
  3739. return rt;
  3740. }
  3741. /*******************************************************************************
  3742. **
  3743. ** Function btm_ble_start_slow_adv
  3744. **
  3745. ** Description Restart adv with slow adv interval
  3746. **
  3747. ** Returns void
  3748. **
  3749. *******************************************************************************/
  3750. static void btm_ble_start_slow_adv (void)
  3751. {
  3752. tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
  3753. if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) {
  3754. tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
  3755. BD_ADDR p_addr_ptr = {0};
  3756. tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC;
  3757. tBLE_ADDR_TYPE own_addr_type = p_addr_cb->own_addr_type;
  3758. btm_ble_stop_adv();
  3759. p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type,
  3760. &own_addr_type);
  3761. /* slow adv mode never goes into directed adv */
  3762. btsnd_hcic_ble_write_adv_params (BTM_BLE_GAP_ADV_SLOW_INT, BTM_BLE_GAP_ADV_SLOW_INT,
  3763. p_cb->evt_type, own_addr_type,
  3764. init_addr_type, p_addr_ptr,
  3765. p_cb->adv_chnl_map, p_cb->afp);
  3766. btm_ble_start_adv();
  3767. }
  3768. }
  3769. /*******************************************************************************
  3770. **
  3771. ** Function btm_ble_timeout
  3772. **
  3773. ** Description Called when BTM BLE inquiry timer expires
  3774. **
  3775. ** Returns void
  3776. **
  3777. *******************************************************************************/
  3778. void btm_ble_timeout(TIMER_LIST_ENT *p_tle)
  3779. {
  3780. BTM_TRACE_EVENT ("btm_ble_timeout");
  3781. switch (p_tle->event) {
  3782. case BTU_TTYPE_BLE_OBSERVE:
  3783. btm_ble_stop_observe();
  3784. break;
  3785. case BTU_TTYPE_BLE_SCAN:
  3786. btm_ble_stop_discover();
  3787. break;
  3788. case BTU_TTYPE_BLE_INQUIRY:
  3789. btm_ble_stop_inquiry();
  3790. break;
  3791. case BTU_TTYPE_BLE_GAP_LIM_DISC:
  3792. /* lim_timeout expiried, limited discovery should exit now */
  3793. btm_cb.btm_inq_vars.discoverable_mode &= ~BTM_BLE_LIMITED_DISCOVERABLE;
  3794. btm_ble_set_adv_flag(btm_cb.btm_inq_vars.connectable_mode, btm_cb.btm_inq_vars.discoverable_mode);
  3795. break;
  3796. case BTU_TTYPE_BLE_RANDOM_ADDR:
  3797. if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM) {
  3798. if (NULL == (void *)(p_tle->param)) {
  3799. #if (CONTROLLER_RPA_LIST_ENABLE == FALSE)
  3800. /* refresh the random addr */
  3801. btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
  3802. #endif
  3803. } else {
  3804. if (BTM_BleMaxMultiAdvInstanceCount() > 0) {
  3805. btm_ble_multi_adv_configure_rpa((tBTM_BLE_MULTI_ADV_INST *)p_tle->param);
  3806. }
  3807. }
  3808. }
  3809. break;
  3810. case BTU_TTYPE_BLE_GAP_FAST_ADV:
  3811. /* fast adv is completed, fall back to slow adv interval */
  3812. btm_ble_start_slow_adv();
  3813. break;
  3814. default:
  3815. break;
  3816. }
  3817. }
  3818. /*******************************************************************************
  3819. **
  3820. ** Function btm_ble_read_remote_features_complete
  3821. **
  3822. ** Description This function is called when the command complete message
  3823. ** is received from the HCI for the read LE remote feature supported
  3824. ** complete event.
  3825. **
  3826. ** Returns void
  3827. **
  3828. *******************************************************************************/
  3829. void btm_ble_read_remote_features_complete(UINT8 *p)
  3830. {
  3831. tACL_CONN *p_acl_cb = NULL;
  3832. UINT16 handle;
  3833. UINT8 status;
  3834. BTM_TRACE_EVENT ("btm_ble_read_remote_features_complete ");
  3835. STREAM_TO_UINT8(status, p);
  3836. // if LE read remote feature failed for HCI_ERR_CONN_FAILED_ESTABLISHMENT,
  3837. // expect disconnect complete to be received
  3838. if (status != HCI_ERR_CONN_FAILED_ESTABLISHMENT) {
  3839. STREAM_TO_UINT16 (handle, p);
  3840. /* Look up the connection by handle and copy features */
  3841. p_acl_cb = btm_handle_to_acl(handle);
  3842. if (p_acl_cb) {
  3843. {
  3844. STREAM_TO_ARRAY(p_acl_cb->peer_le_features, p, BD_FEATURES_LEN);
  3845. #if BLE_INCLUDED == TRUE
  3846. /* In the original Bluedroid version, slave need to send LL_VERSION_IND(call btsnd_hcic_rmt_ver_req)
  3847. * to remote device if it has not received ll_version_ind.
  3848. * Delete it to resolve Android 7.0 incompatible problem. But it may cause that slave host
  3849. * can't get remote device's version.*/
  3850. if (p_acl_cb->link_role == HCI_ROLE_MASTER){
  3851. btsnd_hcic_rmt_ver_req (p_acl_cb->hci_handle);
  3852. }
  3853. else{
  3854. uint16_t data_length = controller_get_interface()->get_ble_default_data_packet_length();
  3855. uint16_t data_txtime = controller_get_interface()->get_ble_default_data_packet_txtime();
  3856. if (p_acl_cb->transport == BT_TRANSPORT_LE) {
  3857. if (HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl_cb->peer_le_features) &&
  3858. (p_acl_cb->data_length_params.tx_len != data_length)) {
  3859. p_acl_cb->data_len_updating = true;
  3860. btsnd_hcic_ble_set_data_length(p_acl_cb->hci_handle, data_length, data_txtime);
  3861. }
  3862. l2cble_notify_le_connection (p_acl_cb->remote_addr);
  3863. }
  3864. }
  3865. #endif
  3866. }
  3867. }
  3868. }
  3869. }
  3870. /*******************************************************************************
  3871. **
  3872. ** Function btm_ble_write_adv_enable_complete
  3873. **
  3874. ** Description This function process the write adv enable command complete.
  3875. **
  3876. ** Returns void
  3877. **
  3878. *******************************************************************************/
  3879. void btm_ble_write_adv_enable_complete(UINT8 *p)
  3880. {
  3881. /* if write adv enable/disable not succeed */
  3882. if (*p != HCI_SUCCESS) {
  3883. BTM_TRACE_ERROR("%s failed", __func__);
  3884. }
  3885. }
  3886. /*******************************************************************************
  3887. **
  3888. ** Function btm_ble_dir_adv_tout
  3889. **
  3890. ** Description when directed adv time out
  3891. **
  3892. ** Returns void
  3893. **
  3894. *******************************************************************************/
  3895. void btm_ble_dir_adv_tout(void)
  3896. {
  3897. btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
  3898. /* make device fall back into undirected adv mode by default */
  3899. btm_cb.ble_ctr_cb.inq_var.directed_conn = FALSE;
  3900. }
  3901. /*******************************************************************************
  3902. **
  3903. ** Function btm_ble_set_topology_mask
  3904. **
  3905. ** Description set BLE topology mask
  3906. **
  3907. ** Returns TRUE is request is allowed, FALSE otherwise.
  3908. **
  3909. *******************************************************************************/
  3910. BOOLEAN btm_ble_set_topology_mask(tBTM_BLE_STATE_MASK request_state_mask)
  3911. {
  3912. request_state_mask &= BTM_BLE_STATE_ALL_MASK;
  3913. btm_cb.ble_ctr_cb.cur_states |= (request_state_mask & BTM_BLE_STATE_ALL_MASK);
  3914. return TRUE;
  3915. }
  3916. /*******************************************************************************
  3917. **
  3918. ** Function btm_ble_clear_topology_mask
  3919. **
  3920. ** Description Clear BLE topology bit mask
  3921. **
  3922. ** Returns TRUE is request is allowed, FALSE otherwise.
  3923. **
  3924. *******************************************************************************/
  3925. BOOLEAN btm_ble_clear_topology_mask (tBTM_BLE_STATE_MASK request_state_mask)
  3926. {
  3927. request_state_mask &= BTM_BLE_STATE_ALL_MASK;
  3928. btm_cb.ble_ctr_cb.cur_states &= ~request_state_mask;
  3929. return TRUE;
  3930. }
  3931. /*******************************************************************************
  3932. **
  3933. ** Function btm_ble_get_topology_mask
  3934. **
  3935. ** Description Get BLE topology bit mask
  3936. **
  3937. ** Returns state mask.
  3938. **
  3939. *******************************************************************************/
  3940. tBTM_BLE_STATE_MASK btm_ble_get_topology_mask (void)
  3941. {
  3942. return btm_cb.ble_ctr_cb.cur_states;
  3943. }
  3944. /*******************************************************************************
  3945. **
  3946. ** Function btm_ble_update_link_topology_mask
  3947. **
  3948. ** Description This function update the link topology mask
  3949. **
  3950. ** Returns void
  3951. **
  3952. *******************************************************************************/
  3953. void btm_ble_update_link_topology_mask(UINT8 link_role, BOOLEAN increase)
  3954. {
  3955. btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_CONN_MASK);
  3956. if (increase) {
  3957. btm_cb.ble_ctr_cb.link_count[link_role]++;
  3958. } else if (btm_cb.ble_ctr_cb.link_count[link_role] > 0) {
  3959. btm_cb.ble_ctr_cb.link_count[link_role]--;
  3960. }
  3961. if (btm_cb.ble_ctr_cb.link_count[HCI_ROLE_MASTER]) {
  3962. btm_ble_set_topology_mask (BTM_BLE_STATE_MASTER_BIT);
  3963. }
  3964. if (btm_cb.ble_ctr_cb.link_count[HCI_ROLE_SLAVE]) {
  3965. btm_ble_set_topology_mask(BTM_BLE_STATE_SLAVE_BIT);
  3966. }
  3967. if (link_role == HCI_ROLE_SLAVE && increase) {
  3968. btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
  3969. /* make device fall back into undirected adv mode by default */
  3970. btm_cb.ble_ctr_cb.inq_var.directed_conn = BTM_BLE_CONNECT_EVT;
  3971. /* clear all adv states */
  3972. btm_ble_clear_topology_mask(BTM_BLE_STATE_ALL_ADV_MASK);
  3973. }
  3974. }
  3975. /*******************************************************************************
  3976. **
  3977. ** Function btm_ble_update_mode_operation
  3978. **
  3979. ** Description This function update the GAP role operation when a link status
  3980. ** is updated.
  3981. **
  3982. ** Returns void
  3983. **
  3984. *******************************************************************************/
  3985. BOOLEAN btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, UINT8 status)
  3986. {
  3987. BOOLEAN bg_con = FALSE;
  3988. if (status == HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT) {
  3989. btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
  3990. /* make device fall back into undirected adv mode by default */
  3991. btm_cb.ble_ctr_cb.inq_var.directed_conn = BTM_BLE_CONNECT_EVT;
  3992. /* clear all adv states */
  3993. btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_ADV_MASK);
  3994. }
  3995. if (btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE) {
  3996. btm_ble_set_connectability(btm_cb.btm_inq_vars.connectable_mode |
  3997. btm_cb.ble_ctr_cb.inq_var.connectable_mode);
  3998. }
  3999. /* when no connection is attempted, and controller is not rejecting last request
  4000. due to resource limitation, start next direct connection or background connection
  4001. now in order */
  4002. if (btm_ble_get_conn_st() == BLE_CONN_IDLE && status != HCI_ERR_HOST_REJECT_RESOURCES &&
  4003. !btm_send_pending_direct_conn()) {
  4004. bg_con = btm_ble_resume_bg_conn();
  4005. }
  4006. return bg_con;
  4007. }
  4008. /*******************************************************************************
  4009. **
  4010. ** Function btm_ble_init
  4011. **
  4012. ** Description Initialize the control block variable values.
  4013. **
  4014. ** Returns void
  4015. **
  4016. *******************************************************************************/
  4017. void btm_ble_init (void)
  4018. {
  4019. BTM_TRACE_DEBUG("%s", __func__);
  4020. #if BTM_DYNAMIC_MEMORY == TRUE
  4021. cmn_ble_gap_vsc_cb_ptr = (tBTM_BLE_VSC_CB *)osi_malloc(sizeof(tBTM_BLE_VSC_CB));
  4022. if (cmn_ble_gap_vsc_cb_ptr == NULL) {
  4023. BTM_TRACE_ERROR("%s malloc failed", __func__);
  4024. return;
  4025. }
  4026. #endif
  4027. tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
  4028. btu_free_timer(&p_cb->obs_timer_ent);
  4029. btu_free_timer(&p_cb->scan_timer_ent);
  4030. btu_free_timer(&p_cb->inq_var.fast_adv_timer);
  4031. memset(p_cb, 0, sizeof(tBTM_BLE_CB));
  4032. memset(&(btm_cb.cmn_ble_vsc_cb), 0 , sizeof(tBTM_BLE_VSC_CB));
  4033. btm_cb.cmn_ble_vsc_cb.values_read = FALSE;
  4034. p_cb->cur_states = 0;
  4035. p_cb->conn_pending_q = fixed_queue_new(QUEUE_SIZE_MAX);
  4036. p_cb->inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
  4037. p_cb->inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
  4038. p_cb->inq_var.adv_chnl_map = BTM_BLE_DEFAULT_ADV_CHNL_MAP;
  4039. p_cb->inq_var.afp = BTM_BLE_DEFAULT_AFP;
  4040. p_cb->inq_var.sfp = BTM_BLE_DEFAULT_SFP;
  4041. p_cb->inq_var.connectable_mode = BTM_BLE_NON_CONNECTABLE;
  4042. p_cb->inq_var.discoverable_mode = BTM_BLE_NON_DISCOVERABLE;
  4043. /* for background connection, reset connection params to be undefined */
  4044. p_cb->scan_int = p_cb->scan_win = BTM_BLE_SCAN_PARAM_UNDEF;
  4045. p_cb->inq_var.evt_type = BTM_BLE_NON_CONNECT_EVT;
  4046. p_cb->adv_rpt_queue = pkt_queue_create();
  4047. assert(p_cb->adv_rpt_queue != NULL);
  4048. p_cb->adv_rpt_ready = osi_event_create(btm_adv_pkt_handler, NULL);
  4049. assert(p_cb->adv_rpt_ready != NULL);
  4050. osi_event_bind(p_cb->adv_rpt_ready, btu_get_current_thread(), 0);
  4051. #if BLE_VND_INCLUDED == FALSE
  4052. btm_ble_adv_filter_init();
  4053. #endif
  4054. }
  4055. /*******************************************************************************
  4056. **
  4057. ** Function btm_ble_free
  4058. **
  4059. ** Description free the control block variable values.
  4060. **
  4061. ** Returns void
  4062. **
  4063. *******************************************************************************/
  4064. void btm_ble_free (void)
  4065. {
  4066. tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
  4067. BTM_TRACE_DEBUG("%s", __func__);
  4068. fixed_queue_free(p_cb->conn_pending_q, osi_free_func);
  4069. pkt_queue_destroy(p_cb->adv_rpt_queue, NULL);
  4070. p_cb->adv_rpt_queue = NULL;
  4071. osi_event_delete(p_cb->adv_rpt_ready);
  4072. p_cb->adv_rpt_ready = NULL;
  4073. #if BTM_DYNAMIC_MEMORY == TRUE
  4074. osi_free(cmn_ble_gap_vsc_cb_ptr);
  4075. cmn_ble_gap_vsc_cb_ptr = NULL;
  4076. #endif
  4077. }
  4078. /*******************************************************************************
  4079. **
  4080. ** Function btm_ble_topology_check
  4081. **
  4082. ** Description check to see requested state is supported. One state check at
  4083. ** a time is supported
  4084. **
  4085. ** Returns TRUE is request is allowed, FALSE otherwise.
  4086. **
  4087. *******************************************************************************/
  4088. BOOLEAN btm_ble_topology_check(tBTM_BLE_STATE_MASK request_state_mask)
  4089. {
  4090. BOOLEAN rt = FALSE;
  4091. UINT8 state_offset = 0;
  4092. UINT16 cur_states = btm_cb.ble_ctr_cb.cur_states;
  4093. UINT8 mask, offset;
  4094. UINT8 request_state = 0;
  4095. /* check only one bit is set and within valid range */
  4096. if (request_state_mask == BTM_BLE_STATE_INVALID ||
  4097. request_state_mask > BTM_BLE_STATE_SCAN_ADV_BIT ||
  4098. (request_state_mask & (request_state_mask - 1 )) != 0) {
  4099. BTM_TRACE_ERROR("illegal state requested: %d", request_state_mask);
  4100. return rt;
  4101. }
  4102. while (request_state_mask) {
  4103. request_state_mask >>= 1;
  4104. request_state ++;
  4105. }
  4106. /* check if the requested state is supported or not */
  4107. mask = btm_le_state_combo_tbl[0][request_state - 1][0];
  4108. offset = btm_le_state_combo_tbl[0][request_state - 1][1];
  4109. const uint8_t *ble_supported_states = controller_get_interface()->get_ble_supported_states();
  4110. if (!BTM_LE_STATES_SUPPORTED(ble_supported_states, mask, offset)) {
  4111. BTM_TRACE_ERROR("state requested not supported: %d", request_state);
  4112. return rt;
  4113. }
  4114. rt = TRUE;
  4115. /* make sure currently active states are all supported in conjunction with the requested
  4116. state. If the bit in table is not set, the combination is not supported */
  4117. while (cur_states != 0) {
  4118. if (cur_states & 0x01) {
  4119. mask = btm_le_state_combo_tbl[request_state][state_offset][0];
  4120. offset = btm_le_state_combo_tbl[request_state][state_offset][1];
  4121. if (mask != 0 && offset != 0) {
  4122. if (!BTM_LE_STATES_SUPPORTED(ble_supported_states, mask, offset)) {
  4123. rt = FALSE;
  4124. break;
  4125. }
  4126. }
  4127. }
  4128. cur_states >>= 1;
  4129. state_offset ++;
  4130. }
  4131. return rt;
  4132. }
  4133. /*******************************************************************************
  4134. **
  4135. ** Function BTM_Ble_Authorization
  4136. **
  4137. ** Description This function is used to authorize a specified device
  4138. **
  4139. ** Returns TRUE or FALSE
  4140. **
  4141. *******************************************************************************/
  4142. BOOLEAN BTM_Ble_Authorization(BD_ADDR bd_addr, BOOLEAN authorize)
  4143. {
  4144. if (bd_addr == NULL) {
  4145. BTM_TRACE_ERROR("bd_addr is NULL");
  4146. return FALSE;
  4147. }
  4148. if (btm_sec_dev_authorization(bd_addr, authorize)) {
  4149. return TRUE;
  4150. }
  4151. BTM_TRACE_ERROR("Authorization fail");
  4152. return FALSE;
  4153. }
  4154. /*******************************************************************************
  4155. **
  4156. ** Function BTM_BleClearAdv
  4157. **
  4158. ** Description This function is called to clear legacy advertising
  4159. **
  4160. ** Parameter p_clear_adv_cback - Command complete callback
  4161. **
  4162. *******************************************************************************/
  4163. BOOLEAN BTM_BleClearAdv(tBTM_CLEAR_ADV_CMPL_CBACK *p_clear_adv_cback)
  4164. {
  4165. tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
  4166. if (btsnd_hcic_ble_clear_adv() == FALSE) {
  4167. BTM_TRACE_ERROR("%s: Unable to Clear Advertising", __FUNCTION__);
  4168. return FALSE;
  4169. }
  4170. p_cb->inq_var.p_clear_adv_cb = p_clear_adv_cback;
  4171. return TRUE;
  4172. }
  4173. bool btm_ble_adv_pkt_ready(void)
  4174. {
  4175. tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
  4176. osi_thread_post_event(p_cb->adv_rpt_ready, OSI_THREAD_MAX_TIMEOUT);
  4177. return true;
  4178. }
  4179. bool btm_ble_adv_pkt_post(pkt_linked_item_t *pkt)
  4180. {
  4181. if (pkt == NULL) {
  4182. return false;
  4183. }
  4184. tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
  4185. pkt_queue_enqueue(p_cb->adv_rpt_queue, pkt);
  4186. return true;
  4187. }
  4188. #endif /* BLE_INCLUDED */