bta_dm_act.c 229 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229
  1. /******************************************************************************
  2. *
  3. * Copyright (C) 2003-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 the action functions for device manager state
  21. * machine.
  22. *
  23. ******************************************************************************/
  24. #include "common/bt_target.h"
  25. #include "stack/bt_types.h"
  26. #include "bta/bta_sys.h"
  27. #include "bta/bta_api.h"
  28. #include "bta_dm_int.h"
  29. #include "bta/bta_dm_co.h"
  30. #include "bta/bta_gattc_co.h"
  31. #include "stack/btm_api.h"
  32. #include "btm_int.h"
  33. #include "stack/btu.h"
  34. #include "stack/sdp_api.h"
  35. #include "stack/l2c_api.h"
  36. #include "bta/utl.h"
  37. #include "stack/gap_api.h" /* For GAP_BleReadPeerPrefConnParams */
  38. #include <string.h>
  39. #include "device/controller.h"
  40. #define LOG_TAG "bt_bta_dm"
  41. // #include "osi/include/log.h"
  42. #if (GAP_INCLUDED == TRUE)
  43. #include "stack/gap_api.h"
  44. #endif
  45. static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
  46. static void bta_dm_inq_cmpl_cb (void *p_result);
  47. static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name);
  48. static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name);
  49. #if (SDP_INCLUDED == TRUE)
  50. static void bta_dm_find_services ( BD_ADDR bd_addr);
  51. #endif ///SDP_INCLUDED == TRUE
  52. static void bta_dm_discover_next_device(void);
  53. #if (SDP_INCLUDED == TRUE)
  54. static void bta_dm_sdp_callback (UINT16 sdp_status);
  55. #endif ///SDP_INCLUDED == TRUE
  56. #if (SMP_INCLUDED == TRUE)
  57. static UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator);
  58. #if (CLASSIC_BT_INCLUDED == TRUE)
  59. static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, BOOLEAN min_16_digit);
  60. #endif /// CLASSIC_BT_INCLUDED == TRUE
  61. static UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, LINK_KEY key, UINT8 key_type, BOOLEAN sc_support);
  62. static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, int result);
  63. #endif ///SMP_INCLUDED == TRUE
  64. static void bta_dm_local_name_cback(BD_ADDR bd_addr);
  65. static BOOLEAN bta_dm_check_av(UINT16 event);
  66. static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data);
  67. static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
  68. /* Extended Inquiry Response */
  69. #if (BT_SSP_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
  70. static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data);
  71. #endif /* (BT_SSP_INCLUDED == TRUE) */
  72. static void bta_dm_set_eir (char *local_name);
  73. #if (SDP_INCLUDED == TRUE)
  74. static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result,
  75. tBTA_SERVICE_MASK *p_services_to_search,
  76. tBTA_SERVICE_MASK *p_services_found);
  77. #endif ///SDP_INCLUDED == TRUE
  78. static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle);
  79. static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle);
  80. static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
  81. static void bta_dm_adjust_roles(BOOLEAN delay_role_switch);
  82. #if (SDP_INCLUDED == TRUE || SMP_INCLUDED == TRUE)
  83. static char *bta_dm_get_remname(void);
  84. #endif ///SDP_INCLUDED == TRUE || SMP_INCLUDED == TRUE
  85. #if (SMP_INCLUDED == TRUE)
  86. static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result);
  87. #endif ///SMP_INCLUDED == TRUE
  88. #if (SDP_INCLUDED == TRUE)
  89. static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr, tBT_TRANSPORT transport);
  90. static void bta_dm_discover_device(BD_ADDR remote_bd_addr);
  91. #endif ///SDP_INCLUDED == TRUE
  92. static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status );
  93. static void bta_dm_disable_search_and_disc(void);
  94. #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
  95. #if ((defined SMP_INCLUDED) && (SMP_INCLUDED == TRUE))
  96. static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data);
  97. static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key);
  98. #endif ///SMP_INCLUDED == TRUE
  99. #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE)
  100. #if (GATTC_INCLUDED == TRUE)
  101. static void bta_dm_gattc_register(void);
  102. static void btm_dm_start_gatt_discovery(BD_ADDR bd_addr);
  103. static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr);
  104. static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data);
  105. #endif // (GATTC_INCLUDED == TRUE)
  106. extern tBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void);
  107. #endif
  108. #if BLE_VND_INCLUDED == TRUE
  109. static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result);
  110. #endif
  111. #ifndef BTA_DM_BLE_ADV_CHNL_MAP
  112. #define BTA_DM_BLE_ADV_CHNL_MAP (BTM_BLE_ADV_CHNL_37|BTM_BLE_ADV_CHNL_38|BTM_BLE_ADV_CHNL_39)
  113. #endif
  114. #endif
  115. #if (SMP_INCLUDED == TRUE)
  116. static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr);
  117. #endif ///SMP_INCLUDED == TRUE
  118. #if (BLE_INCLUDED == TRUE)
  119. static void bta_dm_observe_results_cb(tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
  120. static void bta_dm_observe_cmpl_cb(void *p_result);
  121. static void bta_dm_observe_discard_cb (uint32_t num_dis);
  122. #endif ///BLE_INCLUDED == TRUE
  123. static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle);
  124. extern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8 *p_uuid128);
  125. static void bta_dm_disable_timer_cback(TIMER_LIST_ENT *p_tle);
  126. extern int bredr_txpwr_get(int *min_power_level, int *max_power_level);
  127. const UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] = {
  128. UUID_SERVCLASS_PNP_INFORMATION, /* Reserved */
  129. UUID_SERVCLASS_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */
  130. UUID_SERVCLASS_DIALUP_NETWORKING, /* BTA_DUN_SERVICE_ID */
  131. UUID_SERVCLASS_AUDIO_SOURCE, /* BTA_A2DP_SOURCE_SERVICE_ID */
  132. UUID_SERVCLASS_LAN_ACCESS_USING_PPP, /* BTA_LAP_SERVICE_ID */
  133. UUID_SERVCLASS_HEADSET, /* BTA_HSP_HS_SERVICE_ID */
  134. UUID_SERVCLASS_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */
  135. UUID_SERVCLASS_OBEX_OBJECT_PUSH, /* BTA_OPP_SERVICE_ID */
  136. UUID_SERVCLASS_OBEX_FILE_TRANSFER, /* BTA_FTP_SERVICE_ID */
  137. UUID_SERVCLASS_CORDLESS_TELEPHONY, /* BTA_CTP_SERVICE_ID */
  138. UUID_SERVCLASS_INTERCOM, /* BTA_ICP_SERVICE_ID */
  139. UUID_SERVCLASS_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */
  140. UUID_SERVCLASS_DIRECT_PRINTING, /* BTA_BPP_SERVICE_ID */
  141. UUID_SERVCLASS_IMAGING_RESPONDER, /* BTA_BIP_SERVICE_ID */
  142. UUID_SERVCLASS_PANU, /* BTA_PANU_SERVICE_ID */
  143. UUID_SERVCLASS_NAP, /* BTA_NAP_SERVICE_ID */
  144. UUID_SERVCLASS_GN, /* BTA_GN_SERVICE_ID */
  145. UUID_SERVCLASS_SAP, /* BTA_SAP_SERVICE_ID */
  146. UUID_SERVCLASS_AUDIO_SINK, /* BTA_A2DP_SERVICE_ID */
  147. UUID_SERVCLASS_AV_REMOTE_CONTROL, /* BTA_AVRCP_SERVICE_ID */
  148. UUID_SERVCLASS_HUMAN_INTERFACE, /* BTA_HID_SERVICE_ID */
  149. UUID_SERVCLASS_VIDEO_SINK, /* BTA_VDP_SERVICE_ID */
  150. UUID_SERVCLASS_PBAP_PSE, /* BTA_PBAP_SERVICE_ID */
  151. UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, /* BTA_HSP_SERVICE_ID */
  152. UUID_SERVCLASS_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */
  153. UUID_SERVCLASS_MESSAGE_ACCESS, /* BTA_MAP_SERVICE_ID */
  154. UUID_SERVCLASS_MESSAGE_NOTIFICATION, /* BTA_MN_SERVICE_ID */
  155. UUID_SERVCLASS_HDP_PROFILE, /* BTA_HDP_SERVICE_ID */
  156. UUID_SERVCLASS_PBAP_PCE /* BTA_PCE_SERVICE_ID */
  157. #if BLE_INCLUDED && BTA_GATT_INCLUDED
  158. , UUID_PROTOCOL_ATT /* BTA_GATT_SERVICE_ID */
  159. #endif
  160. };
  161. /*
  162. * NOTE : The number of element in bta_service_id_to_btm_srv_id_lkup_tbl should be matching with
  163. * the value BTA_MAX_SERVICE_ID in bta/bta_api.h
  164. *
  165. * i.e., If you add new Service ID for BTA, the correct security ID of the new service
  166. * from Security service definitions (stack/btm_api.h) should be added to this lookup table.
  167. */
  168. const UINT32 bta_service_id_to_btm_srv_id_lkup_tbl [BTA_MAX_SERVICE_ID] = {
  169. 0, /* Reserved */
  170. BTM_SEC_SERVICE_SERIAL_PORT, /* BTA_SPP_SERVICE_ID */
  171. BTM_SEC_SERVICE_DUN, /* BTA_DUN_SERVICE_ID */
  172. BTM_SEC_SERVICE_AVDTP, /* BTA_AUDIO_SOURCE_SERVICE_ID */
  173. BTM_SEC_SERVICE_LAN_ACCESS, /* BTA_LAP_SERVICE_ID */
  174. BTM_SEC_SERVICE_HEADSET_AG, /* BTA_HSP_SERVICE_ID */
  175. BTM_SEC_SERVICE_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */
  176. BTM_SEC_SERVICE_OBEX, /* BTA_OPP_SERVICE_ID */
  177. BTM_SEC_SERVICE_OBEX_FTP, /* BTA_FTP_SERVICE_ID */
  178. BTM_SEC_SERVICE_CORDLESS, /* BTA_CTP_SERVICE_ID */
  179. BTM_SEC_SERVICE_INTERCOM, /* BTA_ICP_SERVICE_ID */
  180. BTM_SEC_SERVICE_IRMC_SYNC, /* BTA_SYNC_SERVICE_ID */
  181. BTM_SEC_SERVICE_BPP_JOB, /* BTA_BPP_SERVICE_ID */
  182. BTM_SEC_SERVICE_BIP, /* BTA_BIP_SERVICE_ID */
  183. BTM_SEC_SERVICE_BNEP_PANU, /* BTA_PANU_SERVICE_ID */
  184. BTM_SEC_SERVICE_BNEP_NAP, /* BTA_NAP_SERVICE_ID */
  185. BTM_SEC_SERVICE_BNEP_GN, /* BTA_GN_SERVICE_ID */
  186. BTM_SEC_SERVICE_SAP, /* BTA_SAP_SERVICE_ID */
  187. BTM_SEC_SERVICE_AVDTP, /* BTA_A2DP_SERVICE_ID */
  188. BTM_SEC_SERVICE_AVCTP, /* BTA_AVRCP_SERVICE_ID */
  189. BTM_SEC_SERVICE_HIDH_SEC_CTRL, /* BTA_HID_SERVICE_ID */
  190. BTM_SEC_SERVICE_AVDTP, /* BTA_VDP_SERVICE_ID */
  191. BTM_SEC_SERVICE_PBAP, /* BTA_PBAP_SERVICE_ID */
  192. BTM_SEC_SERVICE_HEADSET, /* BTA_HSP_HS_SERVICE_ID */
  193. BTM_SEC_SERVICE_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */
  194. BTM_SEC_SERVICE_MAP, /* BTA_MAP_SERVICE_ID */
  195. BTM_SEC_SERVICE_MAP, /* BTA_MN_SERVICE_ID */
  196. BTM_SEC_SERVICE_HDP_SNK, /* BTA_HDP_SERVICE_ID */
  197. BTM_SEC_SERVICE_PBAP /* BTA_PCE_SERVICE_ID */
  198. #if BLE_INCLUDED && BTA_GATT_INCLUDED
  199. , BTM_SEC_SERVICE_ATT /* BTA_GATT_SERVICE_ID */
  200. #endif
  201. };
  202. /* bta security callback */
  203. #if (SMP_INCLUDED == TRUE)
  204. const tBTM_APPL_INFO bta_security = {
  205. &bta_dm_authorize_cback,
  206. #if (CLASSIC_BT_INCLUDED == TRUE)
  207. &bta_dm_pin_cback,
  208. #else
  209. NULL,
  210. #endif
  211. &bta_dm_new_link_key_cback,
  212. &bta_dm_authentication_complete_cback,
  213. &bta_dm_bond_cancel_complete_cback,
  214. #if (BT_SSP_INCLUDED == TRUE)
  215. &bta_dm_sp_cback,
  216. #else
  217. NULL,
  218. #endif
  219. #if BLE_INCLUDED == TRUE
  220. &bta_dm_ble_smp_cback,
  221. &bta_dm_ble_id_key_cback,
  222. #endif ///BLE_INCLUDED == TRUE
  223. };
  224. #endif ///SMP_INCLUDED == TRUE
  225. #if (SDP_INCLUDED == TRUE)
  226. #if BTA_DYNAMIC_MEMORY == FALSE
  227. UINT8 g_disc_raw_data_buf[MAX_DISC_RAW_DATA_BUF];
  228. #else
  229. UINT8 *g_disc_raw_data_buf;
  230. #endif
  231. #endif ///SDP_INCLUDED == TRUE
  232. /*******************************************************************************
  233. **
  234. ** Function bta_dm_enable
  235. **
  236. ** Description Initialises the BT device manager
  237. **
  238. **
  239. ** Returns void
  240. **
  241. *******************************************************************************/
  242. void bta_dm_enable(tBTA_DM_MSG *p_data)
  243. {
  244. tBTA_SYS_HW_MSG *sys_enable_event;
  245. tBTA_DM_ENABLE enable_event;
  246. /* if already in use, return an error */
  247. if ( bta_dm_cb.is_bta_dm_active == TRUE ) {
  248. APPL_TRACE_WARNING("%s Device already started by another application", __func__);
  249. memset(&enable_event, 0, sizeof(tBTA_DM_ENABLE));
  250. enable_event.status = BTA_FAILURE;
  251. if (p_data->enable.p_sec_cback != NULL) {
  252. p_data->enable.p_sec_cback(BTA_DM_ENABLE_EVT, (tBTA_DM_SEC *)&enable_event);
  253. }
  254. return;
  255. }
  256. /* first, register our callback to SYS HW manager */
  257. bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
  258. /* make sure security callback is saved - if no callback, do not erase the previous one,
  259. it could be an error recovery mechanism */
  260. if ( p_data->enable.p_sec_cback != NULL ) {
  261. bta_dm_cb.p_sec_cback = p_data->enable.p_sec_cback;
  262. }
  263. /* notify BTA DM is now active */
  264. bta_dm_cb.is_bta_dm_active = TRUE;
  265. /* send a message to BTA SYS */
  266. if ((sys_enable_event = (tBTA_SYS_HW_MSG *) osi_malloc(sizeof(tBTA_SYS_HW_MSG))) != NULL) {
  267. sys_enable_event->hdr.event = BTA_SYS_API_ENABLE_EVT;
  268. sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
  269. bta_sys_sendmsg(sys_enable_event);
  270. }
  271. }
  272. /*******************************************************************************
  273. *
  274. * Function bta_dm_init_cb
  275. *
  276. * Description Initializes the bta_dm_cb control block
  277. *
  278. *
  279. * Returns void
  280. *
  281. ******************************************************************************/
  282. void bta_dm_init_cb(void)
  283. {
  284. memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
  285. }
  286. /*******************************************************************************
  287. *
  288. * Function bta_dm_deinit_cb
  289. *
  290. * Description De-initializes the bta_dm_cb control block
  291. *
  292. *
  293. * Returns void
  294. *
  295. ******************************************************************************/
  296. void bta_dm_deinit_cb(void)
  297. {
  298. bta_sys_free_timer(&bta_dm_cb.disable_timer);
  299. #if ( BTA_EIR_CANNED_UUID_LIST != TRUE )
  300. bta_sys_free_timer(&bta_dm_cb.app_ready_timer);
  301. #endif
  302. #if BTM_SSR_INCLUDED == TRUE
  303. for (size_t i = 0; i < BTA_DM_NUM_PM_TIMER; i++) {
  304. for (size_t j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) {
  305. bta_sys_free_timer(&bta_dm_cb.pm_timer[i].timer[j]);
  306. }
  307. }
  308. #endif
  309. memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
  310. #if BTA_DYNAMIC_MEMORY
  311. xSemaphoreGive(deinit_semaphore);
  312. #endif /* #if BTA_DYNAMIC_MEMORY */
  313. }
  314. /*******************************************************************************
  315. *
  316. * Function bta_dm_eir_cfg_init
  317. *
  318. * Description Initializes the p_bta_dm_eir_cfg
  319. *
  320. *
  321. * Returns void
  322. *
  323. ******************************************************************************/
  324. static void bta_dm_eir_cfg_init(void)
  325. {
  326. p_bta_dm_eir_cfg->bta_dm_eir_fec_required = BTM_EIR_DEFAULT_FEC_REQUIRED;
  327. p_bta_dm_eir_cfg->bta_dm_eir_min_name_len = 50;
  328. p_bta_dm_eir_cfg->bta_dm_eir_included_uuid = TRUE;
  329. p_bta_dm_eir_cfg->bta_dm_eir_included_tx_power = FALSE;
  330. p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power = 3;
  331. p_bta_dm_eir_cfg->bta_dm_eir_flags = 0;
  332. p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len = 0;
  333. p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec = NULL;
  334. p_bta_dm_eir_cfg->bta_dm_eir_url_len = 0;
  335. p_bta_dm_eir_cfg->bta_dm_eir_url = NULL;
  336. }
  337. /*******************************************************************************
  338. *
  339. * Function bta_dm_eir_cfg_deinit
  340. *
  341. * Description De-initializes the p_bta_dm_eir_cfg
  342. *
  343. *
  344. * Returns void
  345. *
  346. ******************************************************************************/
  347. static void bta_dm_eir_cfg_deinit(void)
  348. {
  349. p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len = 0;
  350. if (p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec) {
  351. osi_free(p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec);
  352. p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec = NULL;
  353. }
  354. p_bta_dm_eir_cfg->bta_dm_eir_url_len = 0;
  355. if (p_bta_dm_eir_cfg->bta_dm_eir_url) {
  356. osi_free(p_bta_dm_eir_cfg->bta_dm_eir_url);
  357. p_bta_dm_eir_cfg->bta_dm_eir_url = NULL;
  358. }
  359. }
  360. /*******************************************************************************
  361. **
  362. ** Function bta_dm_sys_hw_cback
  363. **
  364. ** Description callback register to SYS to get HW status updates
  365. **
  366. **
  367. ** Returns void
  368. **
  369. *******************************************************************************/
  370. static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status )
  371. {
  372. DEV_CLASS dev_class;
  373. tBTA_DM_SEC_CBACK *temp_cback;
  374. #if BLE_INCLUDED == TRUE
  375. UINT8 key_mask = 0;
  376. BT_OCTET16 er;
  377. tBTA_BLE_LOCAL_ID_KEYS id_key;
  378. #endif
  379. APPL_TRACE_DEBUG("%s with event: %i", __func__, status);
  380. /* On H/W error evt, report to the registered DM application callback */
  381. if (status == BTA_SYS_HW_ERROR_EVT) {
  382. if ( bta_dm_cb.p_sec_cback != NULL ) {
  383. bta_dm_cb.p_sec_cback(BTA_DM_HW_ERROR_EVT, NULL);
  384. }
  385. return;
  386. }
  387. if ( status == BTA_SYS_HW_OFF_EVT ) {
  388. if ( bta_dm_cb.p_sec_cback != NULL ) {
  389. bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
  390. }
  391. /* reinitialize the control block */
  392. bta_dm_deinit_cb();
  393. /* reinitialize the Extended Inquiry Response */
  394. bta_dm_eir_cfg_deinit();
  395. bta_sys_free_timer(&bta_dm_search_cb.search_timer);
  396. #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
  397. #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE)
  398. bta_sys_free_timer(&bta_dm_search_cb.gatt_close_timer);
  399. #endif
  400. #endif
  401. memset(&bta_dm_search_cb, 0x00, sizeof(bta_dm_search_cb));
  402. /* unregister from SYS */
  403. bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH );
  404. /* notify BTA DM is now unactive */
  405. bta_dm_cb.is_bta_dm_active = FALSE;
  406. #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
  407. #if (GATTC_INCLUDED == TRUE && GATTC_CACHE_NVS == TRUE)
  408. /* clear the gattc cache address list */
  409. bta_gattc_co_cache_addr_deinit();
  410. #endif
  411. #endif
  412. } else if ( status == BTA_SYS_HW_ON_EVT ) {
  413. /* FIXME: We should not unregister as the SYS shall invoke this callback on a H/W error.
  414. * We need to revisit when this platform has more than one BLuetooth H/W chip */
  415. //bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH);
  416. /* save security callback */
  417. temp_cback = bta_dm_cb.p_sec_cback;
  418. /* make sure the control block is properly initialized */
  419. bta_dm_init_cb();
  420. /* make sure the Extended Inquiry Response is properly initialized */
  421. bta_dm_eir_cfg_init();
  422. /* and retrieve the callback */
  423. bta_dm_cb.p_sec_cback = temp_cback;
  424. bta_dm_cb.is_bta_dm_active = TRUE;
  425. bta_sys_free_timer(&bta_dm_search_cb.search_timer);
  426. #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
  427. #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE)
  428. bta_sys_free_timer(&bta_dm_search_cb.gatt_close_timer);
  429. #endif
  430. #endif
  431. /* hw is ready, go on with BTA DM initialization */
  432. memset(&bta_dm_search_cb, 0x00, sizeof(bta_dm_search_cb));
  433. memset(&bta_dm_conn_srvcs, 0x00, sizeof(bta_dm_conn_srvcs));
  434. memset(&bta_dm_di_cb, 0, sizeof(tBTA_DM_DI_CB));
  435. memcpy(dev_class, p_bta_dm_cfg->dev_class, sizeof(dev_class));
  436. BTM_SetDeviceClass (dev_class);
  437. #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
  438. #if (GATTC_INCLUDED == TRUE && GATTC_CACHE_NVS == TRUE)
  439. // load the gattc cache address list
  440. bta_gattc_co_cache_addr_init();
  441. #endif /* #if (GATTC_INCLUDED = TRUE) */
  442. /* load BLE local information: ID keys, ER if available */
  443. bta_dm_co_ble_load_local_keys(&key_mask, er, &id_key);
  444. if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ER) {
  445. BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ER, (tBTM_BLE_LOCAL_KEYS *)&er);
  446. }
  447. if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ID) {
  448. BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ID, (tBTM_BLE_LOCAL_KEYS *)&id_key);
  449. }
  450. #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE)
  451. bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
  452. #endif
  453. #endif
  454. #if (SMP_INCLUDED == TRUE)
  455. BTM_SecRegister((tBTM_APPL_INFO *)&bta_security);
  456. #endif ///SMP_INCLUDED == TRUE
  457. BTM_SetDefaultLinkSuperTout(p_bta_dm_cfg->link_timeout);
  458. BTM_WritePageTimeout(p_bta_dm_cfg->page_timeout);
  459. bta_dm_cb.cur_policy = p_bta_dm_cfg->policy_settings;
  460. BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
  461. BTM_RegBusyLevelNotif (bta_dm_bl_change_cback, NULL, BTM_BL_UPDATE_MASK | BTM_BL_ROLE_CHG_MASK);
  462. #if BLE_VND_INCLUDED == TRUE
  463. BTM_BleReadControllerFeatures (bta_dm_ctrl_features_rd_cmpl_cback);
  464. #endif
  465. /* Earlier, we used to invoke BTM_ReadLocalAddr which was just copying the bd_addr
  466. from the control block and invoking the callback which was sending the DM_ENABLE_EVT.
  467. But then we have a few HCI commands being invoked above which were still in progress
  468. when the ENABLE_EVT was sent. So modified this to fetch the local name which forces
  469. the DM_ENABLE_EVT to be sent only after all the init steps are complete */
  470. BTM_ReadLocalDeviceNameFromController((tBTM_CMPL_CB *)bta_dm_local_name_cback);
  471. bta_sys_rm_register((tBTA_SYS_CONN_CBACK *)bta_dm_rm_cback);
  472. #if (BTA_DM_PM_INCLUDED == TRUE)
  473. /* initialize bluetooth low power manager */
  474. bta_dm_init_pm();
  475. #endif /* #if (BTA_DM_PM_INCLUDED == TRUE) */
  476. bta_sys_policy_register((tBTA_SYS_CONN_CBACK *)bta_dm_policy_cback);
  477. #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && SDP_INCLUDED == TRUE) && (GATTC_INCLUDED == TRUE)
  478. bta_dm_gattc_register();
  479. #endif
  480. } else {
  481. APPL_TRACE_DEBUG(" --- ignored event");
  482. }
  483. }
  484. /*******************************************************************************
  485. **
  486. ** Function bta_dm_disable
  487. **
  488. ** Description Disables the BT device manager
  489. **
  490. **
  491. ** Returns void
  492. **
  493. *******************************************************************************/
  494. void bta_dm_disable (tBTA_DM_MSG *p_data)
  495. {
  496. UNUSED(p_data);
  497. /* Set l2cap idle timeout to 0 (so BTE immediately disconnects ACL link after last channel is closed) */
  498. L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0, BT_TRANSPORT_BR_EDR);
  499. L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0, BT_TRANSPORT_LE);
  500. /* disable all active subsystems */
  501. bta_sys_disable(BTA_SYS_HW_BLUETOOTH);
  502. BTM_SetDiscoverability(BTM_NON_DISCOVERABLE, 0, 0);
  503. BTM_SetConnectability(BTM_NON_CONNECTABLE, 0, 0);
  504. #if (BTA_DM_PM_INCLUDED == TRUE)
  505. bta_dm_disable_pm();
  506. #endif /* #if (BTA_DM_PM_INCLUDED == TRUE) */
  507. bta_dm_disable_search_and_disc();
  508. bta_dm_cb.disabling = TRUE;
  509. #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
  510. BTM_BleClearBgConnDev();
  511. #endif
  512. if (BTM_GetNumAclLinks() == 0) {
  513. #if (defined(BTA_DISABLE_DELAY) && BTA_DISABLE_DELAY > 0)
  514. /* If BTA_DISABLE_DELAY is defined and greater than zero, then delay the shutdown by
  515. * BTA_DISABLE_DELAY milliseconds
  516. */
  517. APPL_TRACE_WARNING("%s BTA_DISABLE_DELAY set to %d ms",
  518. __FUNCTION__, BTA_DISABLE_DELAY);
  519. bta_sys_stop_timer(&bta_dm_cb.disable_timer);
  520. bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK *)&bta_dm_disable_conn_down_timer_cback;
  521. bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, BTA_DISABLE_DELAY);
  522. #else
  523. bta_dm_disable_conn_down_timer_cback(NULL);
  524. #endif
  525. } else {
  526. bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK *)&bta_dm_disable_timer_cback;
  527. bta_dm_cb.disable_timer.param = 0;
  528. bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 5000);
  529. }
  530. #if BLE_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE
  531. btm_ble_resolving_list_cleanup (); //by TH, because cmn_ble_vsc_cb.max_filter has something mistake as btm_ble_adv_filter_cleanup
  532. #endif
  533. }
  534. /*******************************************************************************
  535. **
  536. ** Function bta_dm_disable_timer_cback
  537. **
  538. ** Description Called if the disable timer expires
  539. ** Used to close ACL connections which are still active
  540. **
  541. **
  542. **
  543. ** Returns void
  544. **
  545. *******************************************************************************/
  546. static void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle)
  547. {
  548. UNUSED(p_tle);
  549. UINT8 i;
  550. tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
  551. BOOLEAN trigger_disc = FALSE;
  552. APPL_TRACE_EVENT(" bta_dm_disable_timer_cback trial %d ", p_tle->param);
  553. if (BTM_GetNumAclLinks() && p_tle->param == 0) {
  554. for (i = 0; i < bta_dm_cb.device_list.count; i++) {
  555. #if (BLE_INCLUDED == TRUE)
  556. transport = bta_dm_cb.device_list.peer_device[i].transport;
  557. #endif
  558. btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, transport);
  559. trigger_disc = TRUE;
  560. }
  561. /* Retrigger disable timer in case ACL disconnect failed, DISABLE_EVT still need
  562. to be sent out to avoid jave layer disable timeout */
  563. if (trigger_disc) {
  564. bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK *)&bta_dm_disable_timer_cback;
  565. bta_dm_cb.disable_timer.param = 1;
  566. bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1500);
  567. }
  568. } else {
  569. bta_dm_cb.disabling = FALSE;
  570. bta_sys_remove_uuid(UUID_SERVCLASS_PNP_INFORMATION);
  571. bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
  572. }
  573. }
  574. /*******************************************************************************
  575. **
  576. ** Function bta_dm_set_dev_name
  577. **
  578. ** Description Sets local device name
  579. **
  580. **
  581. ** Returns void
  582. **
  583. *******************************************************************************/
  584. void bta_dm_set_dev_name (tBTA_DM_MSG *p_data)
  585. {
  586. BTM_SetLocalDeviceName((char *)p_data->set_name.name);
  587. #if CLASSIC_BT_INCLUDED
  588. bta_dm_set_eir ((char *)p_data->set_name.name);
  589. #endif /// CLASSIC_BT_INCLUDED
  590. }
  591. /*******************************************************************************
  592. **
  593. ** Function bta_dm_set_afh_channels
  594. **
  595. ** Description Sets AFH channels
  596. **
  597. **
  598. ** Returns void
  599. **
  600. *******************************************************************************/
  601. void bta_dm_set_afh_channels (tBTA_DM_MSG *p_data)
  602. {
  603. #if CLASSIC_BT_INCLUDED
  604. BTM_SetAfhChannels (p_data->set_afh_channels.channels, p_data->set_afh_channels.set_afh_cb);
  605. #endif /// CLASSIC_BT_INCLUDED
  606. }
  607. #if (SDP_INCLUDED == TRUE)
  608. /*******************************************************************************
  609. **
  610. ** Function bta_dm_read_remote_device_name
  611. **
  612. ** Description Initiate to get remote device name
  613. **
  614. ** Returns TRUE if started to get remote name
  615. **
  616. *******************************************************************************/
  617. static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr, tBT_TRANSPORT transport)
  618. {
  619. tBTM_STATUS btm_status;
  620. APPL_TRACE_DEBUG("bta_dm_read_remote_device_name");
  621. bdcpy(bta_dm_search_cb.peer_bdaddr, bd_addr);
  622. bta_dm_search_cb.peer_name[0] = 0;
  623. btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
  624. (tBTM_CMPL_CB *) bta_dm_remname_cback,
  625. transport);
  626. if ( btm_status == BTM_CMD_STARTED ) {
  627. APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started");
  628. return (TRUE);
  629. } else if ( btm_status == BTM_BUSY ) {
  630. APPL_TRACE_DEBUG("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy");
  631. /* Remote name discovery is on going now so BTM cannot notify through "bta_dm_remname_cback" */
  632. /* adding callback to get notified that current reading remore name done */
  633. BTM_SecAddRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
  634. return (TRUE);
  635. } else {
  636. APPL_TRACE_WARNING("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
  637. return (FALSE);
  638. }
  639. }
  640. /*******************************************************************************
  641. **
  642. ** Function bta_dm_read_rmt_name
  643. **
  644. ** Description Initiate to get remote device name
  645. **
  646. ** Returns TRUE if started to get remote name
  647. **
  648. *******************************************************************************/
  649. void bta_dm_read_rmt_name(tBTA_DM_MSG *p_data)
  650. {
  651. APPL_TRACE_DEBUG("%s",__func__);
  652. bdcpy(bta_dm_search_cb.peer_bdaddr, p_data->get_rmt_name.rmt_addr);
  653. bta_dm_search_cb.peer_name[0] = 0;
  654. tBTM_STATUS btm_status = BTM_ReadRemoteDeviceName(bta_dm_search_cb.peer_bdaddr,
  655. (tBTM_CMPL_CB *) p_data->get_rmt_name.rmt_name_cb,
  656. bta_dm_search_cb.transport);
  657. if (btm_status == BTM_CMD_STARTED) {
  658. BTM_TRACE_DEBUG("%s: BTM_ReadRemoteDeviceName is started",__func__);
  659. } else if (btm_status == BTM_BUSY) {
  660. BTM_TRACE_DEBUG("%s: BTM_ReadRemoteDeviceName is busy",__func__);
  661. } else {
  662. BTM_TRACE_WARNING("%s: BTM_ReadRemoteDeviceName returns 0x%02X",__func__, btm_status);
  663. }
  664. }
  665. #endif ///SDP_INCLUDED == TRUE
  666. void bta_dm_config_eir (tBTA_DM_MSG *p_data)
  667. {
  668. tBTA_DM_API_CONFIG_EIR *config_eir = &p_data->config_eir;
  669. p_bta_dm_eir_cfg->bta_dm_eir_fec_required = config_eir->eir_fec_required;
  670. p_bta_dm_eir_cfg->bta_dm_eir_included_uuid = config_eir->eir_included_uuid;
  671. p_bta_dm_eir_cfg->bta_dm_eir_included_tx_power = config_eir->eir_included_tx_power;
  672. p_bta_dm_eir_cfg->bta_dm_eir_flags = config_eir->eir_flags;
  673. p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len = config_eir->eir_manufac_spec_len;
  674. p_bta_dm_eir_cfg->bta_dm_eir_url_len = config_eir->eir_url_len;
  675. if (p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec) {
  676. osi_free(p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec);
  677. p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec = NULL;
  678. }
  679. if (config_eir->eir_manufac_spec_len > 0) {
  680. p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec = osi_malloc(config_eir->eir_manufac_spec_len);
  681. if (p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec) {
  682. memcpy(p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec, config_eir->eir_manufac_spec, config_eir->eir_manufac_spec_len);
  683. } else {
  684. APPL_TRACE_ERROR("%s, malloc failed.", __func__);
  685. p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len = 0;
  686. }
  687. }
  688. if (p_bta_dm_eir_cfg->bta_dm_eir_url) {
  689. osi_free(p_bta_dm_eir_cfg->bta_dm_eir_url);
  690. p_bta_dm_eir_cfg->bta_dm_eir_url = NULL;
  691. }
  692. if (config_eir->eir_url_len > 0) {
  693. p_bta_dm_eir_cfg->bta_dm_eir_url = osi_malloc(config_eir->eir_url_len);
  694. if (p_bta_dm_eir_cfg->bta_dm_eir_url) {
  695. memcpy(p_bta_dm_eir_cfg->bta_dm_eir_url, config_eir->eir_url, config_eir->eir_url_len);
  696. } else {
  697. APPL_TRACE_ERROR("%s, malloc failed.", __func__);
  698. p_bta_dm_eir_cfg->bta_dm_eir_url_len = 0;
  699. }
  700. }
  701. bta_dm_set_eir(NULL);
  702. }
  703. /*******************************************************************************
  704. **
  705. ** Function bta_dm_ble_set_channels
  706. **
  707. ** Description Sets AFH channels
  708. **
  709. **
  710. ** Returns void
  711. **
  712. *******************************************************************************/
  713. void bta_dm_ble_set_channels (tBTA_DM_MSG *p_data)
  714. {
  715. #if (BLE_INCLUDED == TRUE)
  716. BTM_BleSetChannels (p_data->ble_set_channels.channels, p_data->ble_set_channels.set_channels_cb);
  717. #endif /// BLE_INCLUDED == TRUE
  718. }
  719. void bta_dm_update_white_list(tBTA_DM_MSG *p_data)
  720. {
  721. #if (BLE_INCLUDED == TRUE)
  722. BTM_BleUpdateAdvWhitelist(p_data->white_list.add_remove, p_data->white_list.remote_addr, p_data->white_list.addr_type, p_data->white_list.add_wl_cb);
  723. #endif ///BLE_INCLUDED == TRUE
  724. }
  725. void bta_dm_ble_read_adv_tx_power(tBTA_DM_MSG *p_data)
  726. {
  727. #if (BLE_INCLUDED == TRUE)
  728. if (p_data->read_tx_power.read_tx_power_cb != NULL) {
  729. BTM_BleReadAdvTxPower(p_data->read_tx_power.read_tx_power_cb);
  730. } else {
  731. APPL_TRACE_ERROR("%s(), the callback function can't be NULL.", __func__);
  732. }
  733. #endif ///BLE_INCLUDED == TRUE
  734. }
  735. void bta_dm_read_rssi(tBTA_DM_MSG *p_data)
  736. {
  737. if (p_data->rssi.read_rssi_cb != NULL) {
  738. BTM_ReadRSSI(p_data->rssi.remote_addr, p_data->rssi.transport, p_data->rssi.read_rssi_cb);
  739. } else {
  740. APPL_TRACE_ERROR("%s(), the callback function can't be NULL.", __func__);
  741. }
  742. }
  743. /*******************************************************************************
  744. **
  745. ** Function bta_dm_set_visibility
  746. **
  747. ** Description Sets discoverability, connectability and pairability
  748. **
  749. **
  750. ** Returns void
  751. **
  752. *******************************************************************************/
  753. void bta_dm_set_visibility(tBTA_DM_MSG *p_data)
  754. {
  755. UINT16 window, interval;
  756. UINT16 disc_mode = BTM_ReadDiscoverability(&window, &interval);
  757. UINT16 conn_mode = BTM_ReadConnectability(&window, &interval);
  758. #if (BLE_INCLUDED == TRUE)
  759. UINT16 le_disc_mode = BTM_BleReadDiscoverability();
  760. UINT16 le_conn_mode = BTM_BleReadConnectability();
  761. #endif ///BLE_INCLUDED == TRUE
  762. /* set modes for Discoverability and connectability if not ignore */
  763. if (p_data->set_visibility.disc_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) {
  764. #if (BLE_INCLUDED == TRUE)
  765. if ((p_data->set_visibility.disc_mode & BTA_DM_LE_IGNORE) == BTA_DM_LE_IGNORE) {
  766. p_data->set_visibility.disc_mode =
  767. ((p_data->set_visibility.disc_mode & ~BTA_DM_LE_IGNORE) | le_disc_mode);
  768. }
  769. #endif ///BLE_INCLUDED == TRUE
  770. if ((p_data->set_visibility.disc_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE) {
  771. p_data->set_visibility.disc_mode =
  772. ((p_data->set_visibility.disc_mode & ~BTA_DM_IGNORE) | disc_mode);
  773. }
  774. #if (CLASSIC_BT_INCLUDED == TRUE)
  775. BTM_SetDiscoverability(p_data->set_visibility.disc_mode,
  776. bta_dm_cb.inquiry_scan_window,
  777. bta_dm_cb.inquiry_scan_interval);
  778. #endif
  779. }
  780. if (p_data->set_visibility.conn_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) {
  781. #if (BLE_INCLUDED == TRUE)
  782. if ((p_data->set_visibility.conn_mode & BTA_DM_LE_IGNORE) == BTA_DM_LE_IGNORE) {
  783. p_data->set_visibility.conn_mode =
  784. ((p_data->set_visibility.conn_mode & ~BTA_DM_LE_IGNORE) | le_conn_mode);
  785. }
  786. #endif ///BLE_INCLUDED == TRUE
  787. if ((p_data->set_visibility.conn_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE) {
  788. p_data->set_visibility.conn_mode =
  789. ((p_data->set_visibility.conn_mode & ~BTA_DM_IGNORE) | conn_mode);
  790. }
  791. #if (CLASSIC_BT_INCLUDED == TRUE)
  792. BTM_SetConnectability(p_data->set_visibility.conn_mode,
  793. bta_dm_cb.page_scan_window,
  794. bta_dm_cb.page_scan_interval);
  795. #endif
  796. }
  797. /* Send False or True if not ignore */
  798. if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE ) {
  799. if (p_data->set_visibility.pair_mode == BTA_DM_NON_PAIRABLE) {
  800. bta_dm_cb.disable_pair_mode = TRUE;
  801. } else {
  802. bta_dm_cb.disable_pair_mode = FALSE;
  803. }
  804. }
  805. /* Send False or True if not ignore */
  806. if (p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) {
  807. if (p_data->set_visibility.conn_paired_only == BTA_DM_CONN_ALL) {
  808. bta_dm_cb.conn_paired_only = FALSE;
  809. } else {
  810. bta_dm_cb.conn_paired_only = TRUE;
  811. }
  812. }
  813. /* Change mode if either mode is not ignore */
  814. if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE || p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE) {
  815. BTM_SetPairableMode((BOOLEAN)(!(bta_dm_cb.disable_pair_mode)), bta_dm_cb.conn_paired_only);
  816. }
  817. }
  818. /*******************************************************************************
  819. **
  820. ** Function bta_dm_process_remove_device
  821. **
  822. ** Description Removes device, Disconnects ACL link if required.
  823. ****
  824. *******************************************************************************/
  825. static void bta_dm_process_remove_device(BD_ADDR bd_addr, tBT_TRANSPORT transport)
  826. {
  827. #if (BLE_INCLUDED == TRUE && GATTC_INCLUDED == TRUE)
  828. /* need to remove all pending background connection before unpair */
  829. BTA_GATTC_CancelOpen(0, bd_addr, FALSE);
  830. #endif
  831. BTM_SecDeleteDevice(bd_addr, transport);
  832. #if (BLE_INCLUDED == TRUE && GATTC_INCLUDED == TRUE)
  833. /* remove all cached GATT information */
  834. BTA_GATTC_Refresh(bd_addr, false);
  835. #endif
  836. if (bta_dm_cb.p_sec_cback) {
  837. tBTA_DM_SEC sec_event;
  838. bdcpy(sec_event.link_down.bd_addr, bd_addr);
  839. sec_event.link_down.status = HCI_SUCCESS;
  840. if (transport == BT_TRANSPORT_LE){
  841. bta_dm_cb.p_sec_cback(BTA_DM_BLE_DEV_UNPAIRED_EVT, &sec_event);
  842. } else {
  843. bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event);
  844. }
  845. }
  846. }
  847. /*******************************************************************************
  848. **
  849. ** Function bta_dm_remove_device
  850. **
  851. ** Description Removes device, disconnects ACL link if required.
  852. ****
  853. *******************************************************************************/
  854. void bta_dm_remove_device(tBTA_DM_MSG *p_data)
  855. {
  856. tBTA_DM_API_REMOVE_DEVICE *p_dev = &p_data->remove_dev;
  857. if (p_dev == NULL) {
  858. return;
  859. }
  860. /* If ACL exists for the device in the remove_bond message*/
  861. BOOLEAN continue_delete_dev = FALSE;
  862. UINT8 transport = p_dev->transport;
  863. if (BTM_IsAclConnectionUp(p_dev->bd_addr, transport)) {
  864. APPL_TRACE_DEBUG("%s: ACL Up count %d", __func__, bta_dm_cb.device_list.count);
  865. continue_delete_dev = FALSE;
  866. /* Take the link down first, and mark the device for removal when disconnected */
  867. for (int i = 0; i < bta_dm_cb.device_list.count; i++) {
  868. if (!bdcmp(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_dev->bd_addr)
  869. #if BLE_INCLUDED == TRUE
  870. && bta_dm_cb.device_list.peer_device[i].transport == transport
  871. #endif
  872. ) {
  873. bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
  874. btm_remove_acl( p_dev->bd_addr, transport);
  875. APPL_TRACE_DEBUG("%s:transport = %d", __func__, transport);
  876. break;
  877. }
  878. }
  879. } else {
  880. continue_delete_dev = TRUE;
  881. }
  882. /* Delete the device mentioned in the msg */
  883. if (continue_delete_dev) {
  884. bta_dm_process_remove_device(p_dev->bd_addr, transport);
  885. }
  886. BTM_ClearInqDb (p_dev->bd_addr);
  887. }
  888. /*******************************************************************************
  889. **
  890. ** Function bta_dm_add_device
  891. **
  892. ** Description This function adds a Link Key to an security database entry.
  893. ** It is normally called during host startup to restore all required information
  894. ** stored in the NVRAM.
  895. ****
  896. *******************************************************************************/
  897. void bta_dm_add_device (tBTA_DM_MSG *p_data)
  898. {
  899. tBTA_DM_API_ADD_DEVICE *p_dev = &p_data->add_dev;
  900. UINT8 *p_dc = NULL;
  901. UINT8 *p_lc = NULL;
  902. UINT32 trusted_services_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
  903. UINT8 index = 0;
  904. UINT8 btm_mask_index = 0;
  905. memset (trusted_services_mask, 0, sizeof(trusted_services_mask));
  906. /* If not all zeros, the device class has been specified */
  907. if (p_dev->dc_known) {
  908. p_dc = (UINT8 *)p_dev->dc;
  909. }
  910. if (p_dev->link_key_known) {
  911. p_lc = (UINT8 *)p_dev->link_key;
  912. }
  913. if (p_dev->is_trusted) {
  914. /* covert BTA service mask to BTM mask */
  915. while (p_dev->tm && (index < BTA_MAX_SERVICE_ID)) {
  916. if (p_dev->tm & (UINT32)(1 << index)) {
  917. btm_mask_index = bta_service_id_to_btm_srv_id_lkup_tbl[index] / BTM_SEC_ARRAY_BITS;
  918. trusted_services_mask[btm_mask_index] |= (UINT32)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[index] - (UINT32)(btm_mask_index * 32)));
  919. p_dev->tm &= (UINT32)(~(1 << index));
  920. }
  921. index++;
  922. }
  923. }
  924. if (!BTM_SecAddDevice (p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features,
  925. trusted_services_mask, p_lc, p_dev->key_type, p_dev->io_cap,
  926. p_dev->pin_length, p_dev->sc_support)) {
  927. APPL_TRACE_ERROR ("BTA_DM: Error adding device %08x%04x",
  928. (p_dev->bd_addr[0] << 24) + (p_dev->bd_addr[1] << 16) + (p_dev->bd_addr[2] << 8) + p_dev->bd_addr[3],
  929. (p_dev->bd_addr[4] << 8) + p_dev->bd_addr[5]);
  930. }
  931. }
  932. /*******************************************************************************
  933. **
  934. ** Function bta_dm_close_acl
  935. **
  936. ** Description This function forces to close the connection to a remote device
  937. ** and optionaly remove the device from security database if
  938. ** required.
  939. ****
  940. *******************************************************************************/
  941. void bta_dm_close_acl(tBTA_DM_MSG *p_data)
  942. {
  943. tBTA_DM_API_REMOVE_ACL *p_remove_acl = &p_data->remove_acl;
  944. UINT8 index;
  945. APPL_TRACE_DEBUG("bta_dm_close_acl");
  946. if (BTM_IsAclConnectionUp(p_remove_acl->bd_addr, p_remove_acl->transport)) {
  947. for (index = 0; index < bta_dm_cb.device_list.count; index ++) {
  948. if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, p_remove_acl->bd_addr)) {
  949. break;
  950. }
  951. }
  952. if (index != bta_dm_cb.device_list.count) {
  953. if (p_remove_acl->remove_dev) {
  954. bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
  955. }
  956. } else {
  957. APPL_TRACE_ERROR("unknown device, remove ACL failed");
  958. }
  959. /* Disconnect the ACL link */
  960. btm_remove_acl(p_remove_acl->bd_addr, p_remove_acl->transport);
  961. }
  962. /* if to remove the device from security database ? do it now */
  963. else if (p_remove_acl->remove_dev) {
  964. if (!BTM_SecDeleteDevice(p_remove_acl->bd_addr, p_remove_acl->transport)) {
  965. APPL_TRACE_ERROR("delete device from security database failed.");
  966. }
  967. #if (BLE_INCLUDED == TRUE && GATTC_INCLUDED == TRUE)
  968. /* need to remove all pending background connection if any */
  969. BTA_GATTC_CancelOpen(0, p_remove_acl->bd_addr, FALSE);
  970. /* remove all cached GATT information */
  971. BTA_GATTC_Refresh(p_remove_acl->bd_addr, false);
  972. #endif
  973. }
  974. /* otherwise, no action needed */
  975. }
  976. /*******************************************************************************
  977. **
  978. ** Function bta_dm_remove_all_acl
  979. **
  980. ** Description This function forces to close all the ACL links specified by link type
  981. ****
  982. *******************************************************************************/
  983. void bta_dm_remove_all_acl(tBTA_DM_MSG *p_data)
  984. {
  985. const tBTA_DM_LINK_TYPE link_type = p_data->remove_all_acl.link_type;
  986. tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
  987. APPL_TRACE_DEBUG("%s link type = %d", __func__, link_type);
  988. for (UINT8 i = 0; i < bta_dm_cb.device_list.count; i++) {
  989. BD_ADDR addr = {0};
  990. bdcpy(addr, bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
  991. #if defined (BLE_INCLUDED) && (BLE_INCLUDED == TRUE)
  992. transport = bta_dm_cb.device_list.peer_device[i].transport;
  993. #endif
  994. if ((link_type == BTA_DM_LINK_TYPE_ALL) ||
  995. ((link_type == BTA_DM_LINK_TYPE_LE) && (transport == BT_TRANSPORT_LE)) ||
  996. ((link_type == BTA_DM_LINK_TYPE_BR_EDR) && (transport == BT_TRANSPORT_BR_EDR))) {
  997. /* Disconnect the ACL link */
  998. btm_remove_acl(addr, transport);
  999. }
  1000. }
  1001. }
  1002. /*******************************************************************************
  1003. **
  1004. ** Function bta_dm_bond
  1005. **
  1006. ** Description Bonds with peer device
  1007. **
  1008. **
  1009. ** Returns void
  1010. **
  1011. *******************************************************************************/
  1012. #if (SMP_INCLUDED == TRUE)
  1013. void bta_dm_bond (tBTA_DM_MSG *p_data)
  1014. {
  1015. tBTM_STATUS status;
  1016. tBTA_DM_SEC sec_event;
  1017. char *p_name;
  1018. if (p_data->bond.transport == BTA_TRANSPORT_UNKNOWN) {
  1019. status = BTM_SecBond ( p_data->bond.bd_addr, 0, NULL, 0 );
  1020. } else {
  1021. status = BTM_SecBondByTransport ( p_data->bond.bd_addr, p_data->bond.transport, 0, NULL, 0 );
  1022. }
  1023. if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED)) {
  1024. memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
  1025. bdcpy(sec_event.auth_cmpl.bd_addr, p_data->bond.bd_addr);
  1026. p_name = BTM_SecReadDevName(p_data->bond.bd_addr);
  1027. if (p_name != NULL) {
  1028. memcpy(sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN - 1));
  1029. sec_event.auth_cmpl.bd_name[BD_NAME_LEN - 1] = 0;
  1030. }
  1031. /* taken care of by memset [above]
  1032. sec_event.auth_cmpl.key_present = FALSE;
  1033. sec_event.auth_cmpl.success = FALSE;
  1034. */
  1035. sec_event.auth_cmpl.fail_reason = HCI_ERR_ILLEGAL_COMMAND;
  1036. if (status == BTM_SUCCESS) {
  1037. sec_event.auth_cmpl.success = TRUE;
  1038. } else {
  1039. /* delete this device entry from Sec Dev DB */
  1040. bta_dm_remove_sec_dev_entry(p_data->bond.bd_addr);
  1041. }
  1042. bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
  1043. }
  1044. }
  1045. /*******************************************************************************
  1046. **
  1047. ** Function bta_dm_bond_cancel
  1048. **
  1049. ** Description Cancels bonding with a peer device
  1050. **
  1051. **
  1052. ** Returns void
  1053. **
  1054. *******************************************************************************/
  1055. void bta_dm_bond_cancel (tBTA_DM_MSG *p_data)
  1056. {
  1057. tBTM_STATUS status;
  1058. tBTA_DM_SEC sec_event;
  1059. APPL_TRACE_EVENT(" bta_dm_bond_cancel ");
  1060. status = BTM_SecBondCancel ( p_data->bond_cancel.bd_addr );
  1061. if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED && status != BTM_SUCCESS)) {
  1062. sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
  1063. bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
  1064. }
  1065. }
  1066. /*******************************************************************************
  1067. **
  1068. ** Function bta_dm_set_pin_type
  1069. **
  1070. ** Description Set the pin type and fixed pin
  1071. **
  1072. **
  1073. ** Returns void
  1074. **
  1075. *******************************************************************************/
  1076. void bta_dm_set_pin_type (tBTA_DM_MSG *p_data)
  1077. {
  1078. #if (CLASSIC_BT_INCLUDED == TRUE)
  1079. BTM_SetPinType (p_data->set_pin_type.pin_type, p_data->set_pin_type.p_pin, p_data->set_pin_type.pin_len);
  1080. #endif ///CLASSIC_BT_INCLUDED == TRUE
  1081. }
  1082. /*******************************************************************************
  1083. **
  1084. ** Function bta_dm_pin_reply
  1085. **
  1086. ** Description Send the pin_reply to a request from BTM
  1087. **
  1088. **
  1089. ** Returns void
  1090. **
  1091. *******************************************************************************/
  1092. void bta_dm_pin_reply (tBTA_DM_MSG *p_data)
  1093. {
  1094. #if (CLASSIC_BT_INCLUDED == TRUE)
  1095. UINT32 trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
  1096. UINT32 *current_trusted_mask;
  1097. current_trusted_mask = BTM_ReadTrustedMask(p_data->pin_reply.bd_addr);
  1098. if (current_trusted_mask) {
  1099. memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask));
  1100. } else {
  1101. memset(trusted_mask, 0, sizeof(trusted_mask));
  1102. }
  1103. if (p_data->pin_reply.accept) {
  1104. BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_SUCCESS, p_data->pin_reply.pin_len, p_data->pin_reply.p_pin, trusted_mask );
  1105. } else {
  1106. BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_NOT_AUTHORIZED, 0, NULL, trusted_mask );
  1107. }
  1108. #endif ///CLASSIC_BT_INCLUDED == TRUE
  1109. }
  1110. #endif ///SMP_INCLUDED == TRUE
  1111. /*******************************************************************************
  1112. **
  1113. ** Function bta_dm_policy_cback
  1114. **
  1115. ** Description process the link policy changes
  1116. **
  1117. ** Returns void
  1118. **
  1119. *******************************************************************************/
  1120. static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
  1121. {
  1122. tBTA_DM_PEER_DEVICE *p_dev = NULL;
  1123. UINT16 policy = app_id;
  1124. UINT32 mask = (UINT32)(1 << id);
  1125. if (peer_addr) {
  1126. p_dev = bta_dm_find_peer_device(peer_addr);
  1127. }
  1128. APPL_TRACE_DEBUG(" bta_dm_policy_cback cmd:%d, policy:0x%x",
  1129. status, policy);
  1130. switch (status) {
  1131. case BTA_SYS_PLCY_SET:
  1132. if (!p_dev) {
  1133. return;
  1134. }
  1135. /* restore the default link policy */
  1136. p_dev->link_policy |= policy;
  1137. BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
  1138. break;
  1139. case BTA_SYS_PLCY_CLR:
  1140. if (!p_dev) {
  1141. return;
  1142. }
  1143. /* clear the policy from the default link policy */
  1144. p_dev->link_policy &= (~policy);
  1145. BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
  1146. #if (BTA_DM_PM_INCLUDED == TRUE)
  1147. if (policy & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE)) {
  1148. /* if clearing sniff/park, wake the link */
  1149. bta_dm_pm_active(p_dev->peer_bdaddr);
  1150. }
  1151. #endif /* #if (BTA_DM_PM_INCLUDED == TRUE) */
  1152. break;
  1153. case BTA_SYS_PLCY_DEF_SET:
  1154. /* want to restore/set the role switch policy */
  1155. bta_dm_cb.role_policy_mask &= ~mask;
  1156. if (0 == bta_dm_cb.role_policy_mask) {
  1157. /* if nobody wants to insist on the role */
  1158. bta_dm_cb.cur_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
  1159. BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
  1160. }
  1161. break;
  1162. case BTA_SYS_PLCY_DEF_CLR:
  1163. /* want to remove the role switch policy */
  1164. bta_dm_cb.role_policy_mask |= mask;
  1165. bta_dm_cb.cur_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
  1166. BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
  1167. break;
  1168. }
  1169. }
  1170. /*******************************************************************************
  1171. **
  1172. ** Function bta_dm_confirm
  1173. **
  1174. ** Description Send the user confirm request reply in response to a
  1175. ** request from BTM
  1176. **
  1177. ** Returns void
  1178. **
  1179. *******************************************************************************/
  1180. #if (SMP_INCLUDED == TRUE)
  1181. void bta_dm_confirm(tBTA_DM_MSG *p_data)
  1182. {
  1183. tBTM_STATUS res = BTM_NOT_AUTHORIZED;
  1184. if (p_data->confirm.accept == TRUE) {
  1185. res = BTM_SUCCESS;
  1186. }
  1187. BTM_ConfirmReqReply(res, p_data->confirm.bd_addr);
  1188. }
  1189. #endif ///SMP_INCLUDED == TRUE
  1190. /*******************************************************************************
  1191. **
  1192. ** Function bta_dm_key_req
  1193. **
  1194. ** Description Send the user passkey request reply in response to a
  1195. ** request from BTM
  1196. **
  1197. ** Returns void
  1198. **
  1199. *******************************************************************************/
  1200. #if (SMP_INCLUDED == TRUE && BT_SSP_INCLUDED)
  1201. void bta_dm_key_req(tBTA_DM_MSG *p_data)
  1202. {
  1203. tBTM_STATUS res = BTM_NOT_AUTHORIZED;
  1204. if (p_data->key_req.accept == TRUE) {
  1205. res = BTM_SUCCESS;
  1206. }
  1207. BTM_PasskeyReqReply(res, p_data->key_req.bd_addr, p_data->key_req.passkey);
  1208. }
  1209. #endif ///SMP_INCLUDED == TRUE && BT_SSP_INCLUDED
  1210. /*******************************************************************************
  1211. **
  1212. ** Function bta_dm_loc_oob
  1213. **
  1214. ** Description Retrieve the OOB data from the local LM
  1215. **
  1216. ** Returns void
  1217. **
  1218. *******************************************************************************/
  1219. #if (BTM_OOB_INCLUDED == TRUE && SMP_INCLUDED == TRUE)
  1220. void bta_dm_loc_oob(tBTA_DM_MSG *p_data)
  1221. {
  1222. UNUSED(p_data);
  1223. BTM_ReadLocalOobData();
  1224. }
  1225. /*******************************************************************************
  1226. **
  1227. ** Function bta_dm_oob_reply
  1228. **
  1229. ** Description This function is called to provide the OOB data for
  1230. ** SMP in response to BLE OOB request.
  1231. **
  1232. ** Returns void
  1233. **
  1234. *******************************************************************************/
  1235. void bta_dm_oob_reply(tBTA_DM_MSG *p_data)
  1236. {
  1237. #if (BLE_INCLUDED)
  1238. BTM_BleOobDataReply(p_data->oob_reply.bd_addr, BTM_SUCCESS, p_data->oob_reply.len, p_data->oob_reply.value);
  1239. #endif
  1240. }
  1241. /*******************************************************************************
  1242. **
  1243. ** Function bta_dm_ci_io_req_act
  1244. **
  1245. ** Description respond to the IO capabilities request from BTM
  1246. **
  1247. ** Returns void
  1248. **
  1249. *******************************************************************************/
  1250. void bta_dm_ci_io_req_act(tBTA_DM_MSG *p_data)
  1251. {
  1252. tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO;
  1253. if (p_data->ci_io_req.auth_req) {
  1254. auth_req = BTM_AUTH_AP_YES;
  1255. }
  1256. BTM_IoCapRsp(p_data->ci_io_req.bd_addr, p_data->ci_io_req.io_cap,
  1257. p_data->ci_io_req.oob_data, auth_req);
  1258. }
  1259. /*******************************************************************************
  1260. **
  1261. ** Function bta_dm_ci_rmt_oob_act
  1262. **
  1263. ** Description respond to the OOB data request for the remote device from BTM
  1264. **
  1265. **
  1266. ** Returns void
  1267. **
  1268. *******************************************************************************/
  1269. void bta_dm_ci_rmt_oob_act(tBTA_DM_MSG *p_data)
  1270. {
  1271. tBTM_STATUS res = BTM_NOT_AUTHORIZED;
  1272. if (p_data->ci_rmt_oob.accept == TRUE) {
  1273. res = BTM_SUCCESS;
  1274. }
  1275. BTM_RemoteOobDataReply(res, p_data->ci_rmt_oob.bd_addr,
  1276. p_data->ci_rmt_oob.c, p_data->ci_rmt_oob.r );
  1277. }
  1278. #endif /* BTM_OOB_INCLUDED == TRUE && SMP_INCLUDED == TRUE */
  1279. /*******************************************************************************
  1280. **
  1281. ** Function bta_dm_search_start
  1282. **
  1283. ** Description Starts an inquiry
  1284. **
  1285. **
  1286. ** Returns void
  1287. **
  1288. *******************************************************************************/
  1289. void bta_dm_search_start (tBTA_DM_MSG *p_data)
  1290. {
  1291. tBTM_INQUIRY_CMPL result;
  1292. #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && SDP_INCLUDED == TRUE) && (GATTC_INCLUDED == TRUE)
  1293. UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->search.num_uuid);
  1294. bta_dm_gattc_register();
  1295. #endif
  1296. APPL_TRACE_DEBUG("%s avoid_scatter=%d", __func__, p_bta_dm_cfg->avoid_scatter);
  1297. if (p_bta_dm_cfg->avoid_scatter &&
  1298. (p_data->search.rs_res == BTA_DM_RS_NONE) && bta_dm_check_av(BTA_DM_API_SEARCH_EVT)) {
  1299. memcpy(&bta_dm_cb.search_msg, &p_data->search, sizeof(tBTA_DM_API_SEARCH));
  1300. return;
  1301. }
  1302. BTM_ClearInqDb(NULL);
  1303. /* save search params */
  1304. bta_dm_search_cb.p_search_cback = p_data->search.p_cback;
  1305. bta_dm_search_cb.services = p_data->search.services;
  1306. #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && SDP_INCLUDED == TRUE) && (GATTC_INCLUDED == TRUE)
  1307. utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
  1308. if ((bta_dm_search_cb.num_uuid = p_data->search.num_uuid) != 0 &&
  1309. p_data->search.p_uuid != NULL) {
  1310. if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)osi_malloc(len)) == NULL) {
  1311. APPL_TRACE_ERROR("%s no resources", __func__);
  1312. result.status = BTA_FAILURE;
  1313. result.num_resp = 0;
  1314. bta_dm_inq_cmpl_cb ((void *)&result);
  1315. return;
  1316. }
  1317. memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->search.p_uuid, len);
  1318. }
  1319. #endif
  1320. result.status = BTM_StartInquiry( (tBTM_INQ_PARMS *)&p_data->search.inq_params,
  1321. bta_dm_inq_results_cb,
  1322. (tBTM_CMPL_CB *) bta_dm_inq_cmpl_cb);
  1323. APPL_TRACE_EVENT("%s status=%d", __func__, result.status);
  1324. if (result.status != BTM_CMD_STARTED) {
  1325. result.num_resp = 0;
  1326. bta_dm_inq_cmpl_cb ((void *)&result);
  1327. }
  1328. }
  1329. /*******************************************************************************
  1330. **
  1331. ** Function bta_dm_search_cancel
  1332. **
  1333. ** Description Cancels an ongoing search for devices
  1334. **
  1335. **
  1336. ** Returns void
  1337. **
  1338. *******************************************************************************/
  1339. void bta_dm_search_cancel (tBTA_DM_MSG *p_data)
  1340. {
  1341. UNUSED(p_data);
  1342. tBTA_DM_MSG *p_msg;
  1343. if (BTM_IsInquiryActive()) {
  1344. if (BTM_CancelInquiry() != BTM_CMD_STARTED) {
  1345. bta_dm_search_cancel_notify(NULL);
  1346. p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG));
  1347. if (p_msg != NULL) {
  1348. p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
  1349. p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
  1350. bta_sys_sendmsg(p_msg);
  1351. }
  1352. } else {
  1353. /* flag a search cancel is pending */
  1354. bta_dm_search_cb.cancel_pending = TRUE;
  1355. }
  1356. }
  1357. /* If no Service Search going on then issue cancel remote name in case it is active */
  1358. else if (!bta_dm_search_cb.name_discover_done) {
  1359. BTM_CancelRemoteDeviceName();
  1360. if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
  1361. p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
  1362. p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
  1363. bta_sys_sendmsg(p_msg);
  1364. }
  1365. } else {
  1366. if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
  1367. p_msg->hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
  1368. p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
  1369. bta_sys_sendmsg(p_msg);
  1370. }
  1371. }
  1372. #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && SDP_INCLUDED == TRUE && GATTC_INCLUDED == TRUE
  1373. if (bta_dm_search_cb.gatt_disc_active) {
  1374. bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
  1375. }
  1376. #endif
  1377. }
  1378. /*******************************************************************************
  1379. **
  1380. ** Function bta_dm_discover
  1381. **
  1382. ** Description Discovers services on a remote device
  1383. **
  1384. **
  1385. ** Returns void
  1386. **
  1387. *******************************************************************************/
  1388. #if (SDP_INCLUDED == TRUE)
  1389. void bta_dm_discover (tBTA_DM_MSG *p_data)
  1390. {
  1391. #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && GATTC_INCLUDED == TRUE
  1392. UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->discover.num_uuid);
  1393. #endif
  1394. APPL_TRACE_EVENT("%s services_to_search=0x%04X, sdp_search=%d", __func__,
  1395. p_data->discover.services, p_data->discover.sdp_search);
  1396. /* save the search condition */
  1397. bta_dm_search_cb.services = p_data->discover.services;
  1398. #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && GATTC_INCLUDED == TRUE
  1399. bta_dm_gattc_register();
  1400. utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
  1401. if ((bta_dm_search_cb.num_uuid = p_data->discover.num_uuid) != 0 &&
  1402. p_data->discover.p_uuid != NULL) {
  1403. if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)osi_malloc(len)) == NULL) {
  1404. p_data->discover.p_cback(BTA_DM_DISC_CMPL_EVT, NULL);
  1405. return;
  1406. }
  1407. memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->discover.p_uuid, len);
  1408. }
  1409. bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
  1410. #endif
  1411. bta_dm_search_cb.p_search_cback = p_data->discover.p_cback;
  1412. bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
  1413. bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
  1414. bta_dm_search_cb.service_index = 0;
  1415. bta_dm_search_cb.services_found = 0;
  1416. bta_dm_search_cb.peer_name[0] = 0;
  1417. bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
  1418. bta_dm_search_cb.p_btm_inq_info = BTM_InqDbRead (p_data->discover.bd_addr);
  1419. bta_dm_search_cb.transport = p_data->discover.transport;
  1420. bta_dm_search_cb.name_discover_done = FALSE;
  1421. memcpy(&bta_dm_search_cb.uuid, &p_data->discover.uuid, sizeof(tSDP_UUID));
  1422. bta_dm_discover_device(p_data->discover.bd_addr);
  1423. }
  1424. /*******************************************************************************
  1425. **
  1426. ** Function bta_dm_di_disc_cmpl
  1427. **
  1428. ** Description Sends event to application when DI discovery complete
  1429. **
  1430. ** Returns void
  1431. **
  1432. *******************************************************************************/
  1433. void bta_dm_di_disc_cmpl(tBTA_DM_MSG *p_data)
  1434. {
  1435. tBTA_DM_DI_DISC_CMPL di_disc;
  1436. memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
  1437. bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
  1438. if ((p_data->hdr.offset == SDP_SUCCESS)
  1439. || (p_data->hdr.offset == SDP_DB_FULL)) {
  1440. di_disc.num_record = SDP_GetNumDiRecords(bta_dm_di_cb.p_di_db);
  1441. } else {
  1442. di_disc.result = BTA_FAILURE;
  1443. }
  1444. bta_dm_di_cb.p_di_db = NULL;
  1445. bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, (tBTA_DM_SEARCH *) &di_disc);
  1446. }
  1447. /*******************************************************************************
  1448. **
  1449. ** Function bta_dm_di_disc_callback
  1450. **
  1451. ** Description This function queries a remote device for DI information.
  1452. **
  1453. **
  1454. ** Returns void
  1455. **
  1456. *******************************************************************************/
  1457. static void bta_dm_di_disc_callback(UINT16 result)
  1458. {
  1459. tBTA_DM_MSG *p_msg;
  1460. if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
  1461. p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
  1462. p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT;
  1463. p_msg->hdr.offset = result;
  1464. bta_sys_sendmsg(p_msg);
  1465. }
  1466. }
  1467. #endif ///SDP_INCLUDED == TRUE
  1468. /*******************************************************************************
  1469. **
  1470. ** Function bta_dm_disable_search_and_disc
  1471. **
  1472. ** Description Cancels an ongoing search or discovery for devices in case of
  1473. ** a Bluetooth disable
  1474. **
  1475. **
  1476. ** Returns void
  1477. **
  1478. *******************************************************************************/
  1479. static void bta_dm_disable_search_and_disc (void)
  1480. {
  1481. #if (SDP_INCLUDED == TRUE)
  1482. tBTA_DM_DI_DISC_CMPL di_disc;
  1483. #endif ///SDP_INCLUDED == TRUE
  1484. if (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) {
  1485. bta_dm_search_cancel(NULL);
  1486. }
  1487. #if (SDP_INCLUDED == TRUE)
  1488. if (bta_dm_di_cb.p_di_db != NULL) {
  1489. memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
  1490. bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
  1491. di_disc.result = BTA_FAILURE;
  1492. bta_dm_di_cb.p_di_db = NULL;
  1493. bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, NULL);
  1494. }
  1495. #endif ///SDP_INCLUDED == TRUE
  1496. }
  1497. /*******************************************************************************
  1498. **
  1499. ** Function bta_dm_di_disc
  1500. **
  1501. ** Description This function queries a remote device for DI information.
  1502. **
  1503. **
  1504. ** Returns void
  1505. **
  1506. *******************************************************************************/
  1507. #if (SDP_INCLUDED == TRUE)
  1508. void bta_dm_di_disc (tBTA_DM_MSG *p_data)
  1509. {
  1510. UINT16 result = BTA_FAILURE;
  1511. tBTA_DM_MSG *p_msg;
  1512. bta_dm_search_cb.p_search_cback = p_data->di_disc.p_cback;
  1513. bdcpy(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.bd_addr);
  1514. bta_dm_di_cb.p_di_db = p_data->di_disc.p_sdp_db;
  1515. if ((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)osi_malloc(BTA_DM_SDP_DB_SIZE)) != NULL) {
  1516. if ( SDP_DiDiscover(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.p_sdp_db,
  1517. p_data->di_disc.len, bta_dm_di_disc_callback) == SDP_SUCCESS) {
  1518. result = BTA_SUCCESS;
  1519. }
  1520. } else {
  1521. APPL_TRACE_ERROR("No buffer to start DI discovery");
  1522. }
  1523. if ( result == BTA_FAILURE &&
  1524. (p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
  1525. p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
  1526. p_msg->hdr.layer_specific = BTA_DM_API_DI_DISCOVER_EVT;
  1527. p_data->hdr.offset = result;
  1528. bta_sys_sendmsg(p_msg);
  1529. }
  1530. }
  1531. #endif ///SDP_INCLUDED == TRUE
  1532. /*******************************************************************************
  1533. **
  1534. ** Function bta_dm_inq_cmpl
  1535. **
  1536. ** Description Process the inquiry complete event from BTM
  1537. **
  1538. ** Returns void
  1539. **
  1540. *******************************************************************************/
  1541. void bta_dm_inq_cmpl (tBTA_DM_MSG *p_data)
  1542. {
  1543. tBTA_DM_MSG *p_msg;
  1544. tBTA_DM_SEARCH data;
  1545. APPL_TRACE_DEBUG("bta_dm_inq_cmpl");
  1546. data.inq_cmpl.num_resps = p_data->inq_cmpl.num;
  1547. bta_dm_search_cb.p_search_cback(BTA_DM_INQ_CMPL_EVT, &data);
  1548. if ((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbFirst()) != NULL) {
  1549. /* start name and service discovery from the first device on inquiry result */
  1550. bta_dm_search_cb.name_discover_done = FALSE;
  1551. bta_dm_search_cb.peer_name[0] = 0;
  1552. #if (SDP_INCLUDED == TRUE)
  1553. bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
  1554. #endif ///SDP_INCLUDED == TRUE
  1555. } else {
  1556. /* no devices, search complete */
  1557. bta_dm_search_cb.services = 0;
  1558. if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
  1559. p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
  1560. p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
  1561. bta_sys_sendmsg(p_msg);
  1562. }
  1563. }
  1564. }
  1565. /*******************************************************************************
  1566. **
  1567. ** Function bta_dm_rmt_name
  1568. **
  1569. ** Description Process the remote name result from BTM
  1570. **
  1571. ** Returns void
  1572. **
  1573. *******************************************************************************/
  1574. void bta_dm_rmt_name (tBTA_DM_MSG *p_data)
  1575. {
  1576. APPL_TRACE_DEBUG("bta_dm_rmt_name");
  1577. if ( p_data->rem_name.result.disc_res.bd_name[0] && bta_dm_search_cb.p_btm_inq_info) {
  1578. bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name = TRUE;
  1579. }
  1580. #if (SDP_INCLUDED == TRUE)
  1581. bta_dm_discover_device(bta_dm_search_cb.peer_bdaddr);
  1582. #endif ///SDP_INCLUDED == TRUE
  1583. }
  1584. /*******************************************************************************
  1585. **
  1586. ** Function bta_dm_disc_rmt_name
  1587. **
  1588. ** Description Process the remote name result from BTM when application
  1589. ** wants to find the name for a bdaddr
  1590. **
  1591. ** Returns void
  1592. **
  1593. *******************************************************************************/
  1594. void bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data)
  1595. {
  1596. tBTM_INQ_INFO *p_btm_inq_info;
  1597. APPL_TRACE_DEBUG("bta_dm_disc_rmt_name");
  1598. p_btm_inq_info = BTM_InqDbRead (p_data->rem_name.result.disc_res.bd_addr);
  1599. if ( p_btm_inq_info ) {
  1600. if ( p_data->rem_name.result.disc_res.bd_name[0] ) {
  1601. p_btm_inq_info->appl_knows_rem_name = TRUE;
  1602. }
  1603. }
  1604. #if (SDP_INCLUDED == TRUE)
  1605. bta_dm_discover_device(p_data->rem_name.result.disc_res.bd_addr);
  1606. #endif ///SDP_INCLUDED == TRUE
  1607. }
  1608. /*******************************************************************************
  1609. **
  1610. ** Function bta_dm_sdp_result
  1611. **
  1612. ** Description Process the discovery result from sdp
  1613. **
  1614. ** Returns void
  1615. **
  1616. *******************************************************************************/
  1617. #if (SDP_INCLUDED == TRUE)
  1618. void bta_dm_sdp_result (tBTA_DM_MSG *p_data)
  1619. {
  1620. tSDP_DISC_REC *p_sdp_rec = NULL;
  1621. tBTA_DM_MSG *p_msg;
  1622. BOOLEAN scn_found = FALSE;
  1623. UINT16 service = 0xFFFF;
  1624. tSDP_PROTOCOL_ELEM pe;
  1625. #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
  1626. tBT_UUID *p_uuid = bta_dm_search_cb.p_srvc_uuid;
  1627. tBTA_DM_SEARCH result;
  1628. tBT_UUID service_uuid;
  1629. #endif
  1630. UINT32 num_uuids = 0;
  1631. UINT8 uuid_list[32][MAX_UUID_SIZE]; // assuming a max of 32 services
  1632. if ((p_data->sdp_event.sdp_result == SDP_SUCCESS)
  1633. || (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH)
  1634. || (p_data->sdp_event.sdp_result == SDP_DB_FULL)) {
  1635. APPL_TRACE_DEBUG("sdp_result::0x%x", p_data->sdp_event.sdp_result);
  1636. do {
  1637. p_sdp_rec = NULL;
  1638. if ( bta_dm_search_cb.service_index == (BTA_USER_SERVICE_ID + 1) ) {
  1639. p_sdp_rec = SDP_FindServiceUUIDInDb(bta_dm_search_cb.p_sdp_db, &bta_dm_search_cb.uuid, p_sdp_rec);
  1640. if (p_sdp_rec && SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe)) {
  1641. bta_dm_search_cb.peer_scn = (UINT8) pe.params[0];
  1642. scn_found = TRUE;
  1643. }
  1644. } else {
  1645. service = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index - 1];
  1646. p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, service, p_sdp_rec);
  1647. }
  1648. #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
  1649. /* finished with BR/EDR services, now we check the result for GATT based service UUID */
  1650. if (bta_dm_search_cb.service_index == BTA_MAX_SERVICE_ID) {
  1651. if (bta_dm_search_cb.uuid_to_search != 0 && p_uuid != NULL) {
  1652. p_uuid += (bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search);
  1653. /* only support 16 bits UUID for now */
  1654. service = p_uuid->uu.uuid16;
  1655. }
  1656. /* all GATT based services */
  1657. do {
  1658. /* find a service record, report it */
  1659. p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db,
  1660. 0, p_sdp_rec);
  1661. if (p_sdp_rec) {
  1662. if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid)) {
  1663. /* send result back to app now, one by one */
  1664. bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
  1665. BCM_STRNCPY_S((char *)result.disc_ble_res.bd_name, bta_dm_get_remname(), (BD_NAME_LEN));
  1666. result.disc_ble_res.bd_name[BD_NAME_LEN] = 0;
  1667. result.disc_ble_res.service.len = service_uuid.len;
  1668. result.disc_ble_res.service.uu.uuid16 = service_uuid.uu.uuid16;
  1669. bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
  1670. }
  1671. }
  1672. if (bta_dm_search_cb.uuid_to_search > 0) {
  1673. break;
  1674. }
  1675. } while (p_sdp_rec);
  1676. } else
  1677. #endif
  1678. {
  1679. /* SDP_DB_FULL means some records with the
  1680. required attributes were received */
  1681. if (((p_data->sdp_event.sdp_result == SDP_DB_FULL) &&
  1682. bta_dm_search_cb.services != BTA_ALL_SERVICE_MASK) ||
  1683. (p_sdp_rec != NULL)) {
  1684. if (service != UUID_SERVCLASS_PNP_INFORMATION && service != 0) {
  1685. UINT16 tmp_svc = 0xFFFF;
  1686. bta_dm_search_cb.services_found |=
  1687. (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index - 1));
  1688. tmp_svc = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index - 1];
  1689. /* Add to the list of UUIDs */
  1690. sdpu_uuid16_to_uuid128(tmp_svc, uuid_list[num_uuids]);
  1691. num_uuids++;
  1692. }
  1693. }
  1694. }
  1695. if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK &&
  1696. bta_dm_search_cb.services_to_search == 0) {
  1697. #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
  1698. if ( bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
  1699. bta_dm_search_cb.uuid_to_search > 0) {
  1700. bta_dm_search_cb.uuid_to_search --;
  1701. }
  1702. if (bta_dm_search_cb.uuid_to_search == 0 ||
  1703. bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
  1704. #endif
  1705. bta_dm_search_cb.service_index++;
  1706. } else { /* regular one service per search or PNP search */
  1707. break;
  1708. }
  1709. } while (bta_dm_search_cb.service_index <= BTA_MAX_SERVICE_ID);
  1710. APPL_TRACE_DEBUG("%s services_found = %04x", __FUNCTION__,
  1711. bta_dm_search_cb.services_found);
  1712. /* Collect the 128-bit services here and put them into the list */
  1713. if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK) {
  1714. p_sdp_rec = NULL;
  1715. do {
  1716. tBT_UUID temp_uuid;
  1717. /* find a service record, report it */
  1718. p_sdp_rec = SDP_FindServiceInDb_128bit(bta_dm_search_cb.p_sdp_db, p_sdp_rec);
  1719. if (p_sdp_rec) {
  1720. if (SDP_FindServiceUUIDInRec_128bit(p_sdp_rec, &temp_uuid)) {
  1721. memcpy(uuid_list[num_uuids], temp_uuid.uu.uuid128, MAX_UUID_SIZE);
  1722. num_uuids++;
  1723. }
  1724. }
  1725. } while (p_sdp_rec);
  1726. }
  1727. /* if there are more services to search for */
  1728. if (bta_dm_search_cb.services_to_search) {
  1729. /* Free up the p_sdp_db before checking the next one */
  1730. bta_dm_free_sdp_db(NULL);
  1731. bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
  1732. } else {
  1733. /* callbacks */
  1734. /* start next bd_addr if necessary */
  1735. BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
  1736. if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
  1737. p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
  1738. p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
  1739. p_msg->disc_result.result.disc_res.p_raw_data = NULL;
  1740. p_msg->disc_result.result.disc_res.raw_data_size = 0;
  1741. p_msg->disc_result.result.disc_res.num_uuids = num_uuids;
  1742. p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
  1743. if (num_uuids > 0) {
  1744. p_msg->disc_result.result.disc_res.p_uuid_list = (UINT8 *)osi_malloc(num_uuids * MAX_UUID_SIZE);
  1745. if (p_msg->disc_result.result.disc_res.p_uuid_list) {
  1746. memcpy(p_msg->disc_result.result.disc_res.p_uuid_list, uuid_list,
  1747. num_uuids * MAX_UUID_SIZE);
  1748. } else {
  1749. p_msg->disc_result.result.disc_res.num_uuids = 0;
  1750. APPL_TRACE_ERROR("%s: Unable to allocate memory for uuid_list", __func__);
  1751. }
  1752. }
  1753. //copy the raw_data to the discovery result structure
  1754. //
  1755. if ( bta_dm_search_cb.p_sdp_db != NULL && bta_dm_search_cb.p_sdp_db->raw_used != 0 &&
  1756. bta_dm_search_cb.p_sdp_db->raw_data != NULL) {
  1757. APPL_TRACE_DEBUG(
  1758. "%s raw_data used = 0x%x raw_data_ptr = %p", __func__,
  1759. bta_dm_search_cb.p_sdp_db->raw_used,
  1760. bta_dm_search_cb.p_sdp_db->raw_data);
  1761. p_msg->disc_result.result.disc_res.p_raw_data = osi_malloc(bta_dm_search_cb.p_sdp_db->raw_used);
  1762. if ( NULL != p_msg->disc_result.result.disc_res.p_raw_data ) {
  1763. memcpy( p_msg->disc_result.result.disc_res.p_raw_data,
  1764. bta_dm_search_cb.p_sdp_db->raw_data,
  1765. bta_dm_search_cb.p_sdp_db->raw_used );
  1766. p_msg->disc_result.result.disc_res.raw_data_size =
  1767. bta_dm_search_cb.p_sdp_db->raw_used;
  1768. } else {
  1769. APPL_TRACE_DEBUG("%s Alloc failed to allocate %d bytes !!", __func__,
  1770. bta_dm_search_cb.p_sdp_db->raw_used);
  1771. }
  1772. bta_dm_search_cb.p_sdp_db->raw_data = NULL; //no need to free this - it is a global assigned.
  1773. bta_dm_search_cb.p_sdp_db->raw_used = 0;
  1774. bta_dm_search_cb.p_sdp_db->raw_size = 0;
  1775. } else {
  1776. APPL_TRACE_DEBUG("%s raw data size is 0 or raw_data is null!!", __func__);
  1777. }
  1778. /* Done with p_sdp_db. Free it */
  1779. bta_dm_free_sdp_db(NULL);
  1780. p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
  1781. //Piggy back the SCN over result field
  1782. if ( scn_found ) {
  1783. p_msg->disc_result.result.disc_res.result = (3 + bta_dm_search_cb.peer_scn);
  1784. p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK;
  1785. APPL_TRACE_EVENT(" Piggy back the SCN over result field SCN=%d", bta_dm_search_cb.peer_scn);
  1786. }
  1787. bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
  1788. BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name, bta_dm_get_remname(), (BD_NAME_LEN - 1));
  1789. /* make sure the string is null terminated */
  1790. p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN - 1] = 0;
  1791. bta_sys_sendmsg(p_msg);
  1792. }
  1793. }
  1794. } else {
  1795. /* conn failed. No need for timer */
  1796. if (p_data->sdp_event.sdp_result == SDP_CONN_FAILED || p_data->sdp_event.sdp_result == SDP_CONN_REJECTED
  1797. || p_data->sdp_event.sdp_result == SDP_SECURITY_ERR) {
  1798. bta_dm_search_cb.wait_disc = FALSE;
  1799. }
  1800. /* not able to connect go to next device */
  1801. osi_free(bta_dm_search_cb.p_sdp_db);
  1802. bta_dm_search_cb.p_sdp_db = NULL;
  1803. BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
  1804. if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
  1805. p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
  1806. p_msg->disc_result.result.disc_res.result = BTA_FAILURE;
  1807. p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
  1808. bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
  1809. BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name,bta_dm_get_remname(), (BD_NAME_LEN - 1));
  1810. /* make sure the string is null terminated */
  1811. p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN - 1] = 0;
  1812. bta_sys_sendmsg(p_msg);
  1813. }
  1814. }
  1815. }
  1816. #endif ///SDP_INCLUDE == TRUE
  1817. /*******************************************************************************
  1818. **
  1819. ** Function bta_dm_search_cmpl
  1820. **
  1821. ** Description Sends event to application
  1822. **
  1823. ** Returns void
  1824. **
  1825. *******************************************************************************/
  1826. void bta_dm_search_cmpl (tBTA_DM_MSG *p_data)
  1827. {
  1828. APPL_TRACE_EVENT("%s", __func__);
  1829. #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && SDP_INCLUDED == TRUE)
  1830. utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
  1831. #endif
  1832. if (p_data->hdr.layer_specific == BTA_DM_API_DI_DISCOVER_EVT) {
  1833. #if (SDP_INCLUDED == TRUE)
  1834. bta_dm_di_disc_cmpl(p_data);
  1835. #endif ///SDP_INCLUDED == TRUE
  1836. } else {
  1837. bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, NULL);
  1838. }
  1839. }
  1840. /*******************************************************************************
  1841. **
  1842. ** Function bta_dm_disc_result
  1843. **
  1844. ** Description Service discovery result when discovering services on a device
  1845. **
  1846. ** Returns void
  1847. **
  1848. *******************************************************************************/
  1849. void bta_dm_disc_result (tBTA_DM_MSG *p_data)
  1850. {
  1851. APPL_TRACE_EVENT("%s", __func__);
  1852. #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
  1853. /* if any BR/EDR service discovery has been done, report the event */
  1854. if ((bta_dm_search_cb.services & ((BTA_ALL_SERVICE_MASK | BTA_USER_SERVICE_MASK ) & ~BTA_BLE_SERVICE_MASK))) {
  1855. bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
  1856. }
  1857. #else
  1858. bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
  1859. #endif
  1860. tBTA_DM_MSG *p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG));
  1861. /* send a message to change state */
  1862. if (p_msg != NULL) {
  1863. p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
  1864. p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
  1865. bta_sys_sendmsg(p_msg);
  1866. }
  1867. }
  1868. /*******************************************************************************
  1869. **
  1870. ** Function bta_dm_search_result
  1871. **
  1872. ** Description Service discovery result while searching for devices
  1873. **
  1874. ** Returns void
  1875. **
  1876. *******************************************************************************/
  1877. void bta_dm_search_result (tBTA_DM_MSG *p_data)
  1878. {
  1879. APPL_TRACE_DEBUG("%s searching:0x%04x, result:0x%04x", __func__,
  1880. bta_dm_search_cb.services,
  1881. p_data->disc_result.result.disc_res.services);
  1882. /* call back if application wants name discovery or found services that application is searching */
  1883. if (( !bta_dm_search_cb.services )
  1884. || (( bta_dm_search_cb.services ) && ( p_data->disc_result.result.disc_res.services ))) {
  1885. bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
  1886. }
  1887. /* if searching did not initiate to create link */
  1888. if (!bta_dm_search_cb.wait_disc ) {
  1889. /* if service searching is done with EIR, don't search next device */
  1890. if ( bta_dm_search_cb.p_btm_inq_info ) {
  1891. bta_dm_discover_next_device();
  1892. }
  1893. } else {
  1894. /* wait until link is disconnected or timeout */
  1895. bta_dm_search_cb.sdp_results = TRUE;
  1896. bta_dm_search_cb.search_timer.p_cback = (TIMER_CBACK *)&bta_dm_search_timer_cback;
  1897. bta_sys_start_timer(&bta_dm_search_cb.search_timer, 0, 1000 * (L2CAP_LINK_INACTIVITY_TOUT + 1) );
  1898. }
  1899. }
  1900. /*******************************************************************************
  1901. **
  1902. ** Function bta_dm_search_timer_cback
  1903. **
  1904. ** Description Called when ACL disconnect time is over
  1905. **
  1906. **
  1907. ** Returns void
  1908. **
  1909. *******************************************************************************/
  1910. static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle)
  1911. {
  1912. UNUSED(p_tle);
  1913. APPL_TRACE_EVENT("%s", __func__);
  1914. bta_dm_search_cb.wait_disc = FALSE;
  1915. /* proceed with next device */
  1916. bta_dm_discover_next_device();
  1917. }
  1918. /*******************************************************************************
  1919. **
  1920. ** Function bta_dm_free_sdp_db
  1921. **
  1922. ** Description Frees SDP data base
  1923. **
  1924. ** Returns void
  1925. **
  1926. *******************************************************************************/
  1927. #if (SDP_INCLUDED == TRUE)
  1928. void bta_dm_free_sdp_db (tBTA_DM_MSG *p_data)
  1929. {
  1930. UNUSED(p_data);
  1931. if (bta_dm_search_cb.p_sdp_db) {
  1932. osi_free(bta_dm_search_cb.p_sdp_db);
  1933. bta_dm_search_cb.p_sdp_db = NULL;
  1934. }
  1935. }
  1936. #endif ///SDP_INCLUDED == TRUE
  1937. /*******************************************************************************
  1938. **
  1939. ** Function bta_dm_queue_search
  1940. **
  1941. ** Description Queues search command while search is being cancelled
  1942. **
  1943. ** Returns void
  1944. **
  1945. *******************************************************************************/
  1946. void bta_dm_queue_search (tBTA_DM_MSG *p_data)
  1947. {
  1948. if (bta_dm_search_cb.p_search_queue) {
  1949. osi_free(bta_dm_search_cb.p_search_queue);
  1950. }
  1951. bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)osi_malloc(sizeof(tBTA_DM_API_SEARCH));
  1952. memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_SEARCH));
  1953. }
  1954. /*******************************************************************************
  1955. **
  1956. ** Function bta_dm_queue_disc
  1957. **
  1958. ** Description Queues discovery command while search is being cancelled
  1959. **
  1960. ** Returns void
  1961. **
  1962. *******************************************************************************/
  1963. #if (SDP_INCLUDED == TRUE)
  1964. void bta_dm_queue_disc (tBTA_DM_MSG *p_data)
  1965. {
  1966. if (bta_dm_search_cb.p_search_queue) {
  1967. osi_free(bta_dm_search_cb.p_search_queue);
  1968. }
  1969. bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)osi_malloc(sizeof(tBTA_DM_API_DISCOVER));
  1970. memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_DISCOVER));
  1971. }
  1972. #endif ///SDP_INCLUDED == TRUE
  1973. /*******************************************************************************
  1974. **
  1975. ** Function bta_dm_search_clear_queue
  1976. **
  1977. ** Description Clears the queue if API search cancel is called
  1978. **
  1979. ** Returns void
  1980. **
  1981. *******************************************************************************/
  1982. void bta_dm_search_clear_queue (tBTA_DM_MSG *p_data)
  1983. {
  1984. UNUSED(p_data);
  1985. if (bta_dm_search_cb.p_search_queue) {
  1986. osi_free(bta_dm_search_cb.p_search_queue);
  1987. bta_dm_search_cb.p_search_queue = NULL;
  1988. }
  1989. }
  1990. /*******************************************************************************
  1991. **
  1992. ** Function bta_dm_search_cancel_cmpl
  1993. **
  1994. ** Description Search cancel is complete
  1995. **
  1996. ** Returns void
  1997. **
  1998. *******************************************************************************/
  1999. void bta_dm_search_cancel_cmpl (tBTA_DM_MSG *p_data)
  2000. {
  2001. UNUSED(p_data);
  2002. if (bta_dm_search_cb.p_search_queue) {
  2003. bta_sys_sendmsg(bta_dm_search_cb.p_search_queue);
  2004. bta_dm_search_cb.p_search_queue = NULL;
  2005. }
  2006. }
  2007. /*******************************************************************************
  2008. **
  2009. ** Function bta_dm_search_cancel_transac_cmpl
  2010. **
  2011. ** Description Current Service Discovery or remote name procedure is
  2012. ** completed after search cancellation
  2013. **
  2014. ** Returns void
  2015. **
  2016. *******************************************************************************/
  2017. #if (SDP_INCLUDED == TRUE)
  2018. void bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data)
  2019. {
  2020. UNUSED(p_data);
  2021. if (bta_dm_search_cb.p_sdp_db) {
  2022. osi_free(bta_dm_search_cb.p_sdp_db);
  2023. bta_dm_search_cb.p_sdp_db = NULL;
  2024. }
  2025. bta_dm_search_cancel_notify(NULL);
  2026. }
  2027. #endif ///SDP_INCLUDED == TRUE
  2028. /*******************************************************************************
  2029. **
  2030. ** Function bta_dm_search_cancel_notify
  2031. **
  2032. ** Description Notify application that search has been cancelled
  2033. **
  2034. ** Returns void
  2035. **
  2036. *******************************************************************************/
  2037. void bta_dm_search_cancel_notify (tBTA_DM_MSG *p_data)
  2038. {
  2039. UNUSED(p_data);
  2040. if (bta_dm_search_cb.p_search_cback) {
  2041. bta_dm_search_cb.p_search_cback(BTA_DM_SEARCH_CANCEL_CMPL_EVT, NULL);
  2042. }
  2043. if (!bta_dm_search_cb.name_discover_done) {
  2044. BTM_CancelRemoteDeviceName();
  2045. }
  2046. #if (BLE_INCLUDED == TRUE) && (BTA_GATT_INCLUDED == TRUE) && (SDP_INCLUDED == TRUE) && (GATTC_INCLUDED) == TRUE
  2047. if (bta_dm_search_cb.gatt_disc_active) {
  2048. bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
  2049. }
  2050. #endif
  2051. }
  2052. /*******************************************************************************
  2053. **
  2054. ** Function bta_dm_find_services
  2055. **
  2056. ** Description Starts discovery on a device
  2057. **
  2058. ** Returns void
  2059. **
  2060. *******************************************************************************/
  2061. #if (SDP_INCLUDED == TRUE)
  2062. static void bta_dm_find_services ( BD_ADDR bd_addr)
  2063. {
  2064. tSDP_UUID uuid;
  2065. tBTA_DM_MSG *p_msg;
  2066. memset (&uuid, 0, sizeof(tSDP_UUID));
  2067. while (bta_dm_search_cb.service_index < BTA_MAX_SERVICE_ID) {
  2068. tBTA_SERVICE_MASK this_service_mask = (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index));
  2069. if ( bta_dm_search_cb.services_to_search & this_service_mask) {
  2070. if ((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)osi_malloc(BTA_DM_SDP_DB_SIZE)) != NULL) {
  2071. APPL_TRACE_DEBUG("bta_dm_search_cb.services = %04x***********", bta_dm_search_cb.services);
  2072. /* try to search all services by search based on L2CAP UUID */
  2073. if (bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK ) {
  2074. APPL_TRACE_DEBUG("%s services_to_search=%08x", __func__, bta_dm_search_cb.services_to_search);
  2075. if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK) {
  2076. uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[0];
  2077. bta_dm_search_cb.services_to_search &= ~BTA_RES_SERVICE_MASK;
  2078. } else {
  2079. uuid.uu.uuid16 = UUID_PROTOCOL_L2CAP;
  2080. bta_dm_search_cb.services_to_search = 0;
  2081. }
  2082. } else {
  2083. #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
  2084. /* for LE only profile */
  2085. if (this_service_mask == BTA_BLE_SERVICE_MASK) {
  2086. if (bta_dm_search_cb.uuid_to_search > 0 && bta_dm_search_cb.p_srvc_uuid) {
  2087. memcpy(&uuid,
  2088. (const void *)(bta_dm_search_cb.p_srvc_uuid + \
  2089. bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search),
  2090. sizeof(tBT_UUID));
  2091. bta_dm_search_cb.uuid_to_search -- ;
  2092. } else {
  2093. uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
  2094. }
  2095. /* last one? clear the BLE service bit if all discovery has been done */
  2096. if (bta_dm_search_cb.uuid_to_search == 0) {
  2097. bta_dm_search_cb.services_to_search &=
  2098. (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
  2099. }
  2100. } else
  2101. #endif
  2102. {
  2103. /* remove the service from services to be searched */
  2104. bta_dm_search_cb.services_to_search &=
  2105. (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
  2106. uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
  2107. }
  2108. }
  2109. if (uuid.len == 0) {
  2110. uuid.len = LEN_UUID_16;
  2111. }
  2112. if (this_service_mask == BTA_USER_SERVICE_MASK) {
  2113. memcpy(&uuid, &bta_dm_search_cb.uuid, sizeof(tSDP_UUID));
  2114. }
  2115. APPL_TRACE_DEBUG("%s search UUID = %04x", __func__, uuid.uu.uuid16);
  2116. SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, 0, NULL);
  2117. memset(g_disc_raw_data_buf, 0, MAX_DISC_RAW_DATA_BUF);
  2118. bta_dm_search_cb.p_sdp_db->raw_data = g_disc_raw_data_buf;
  2119. bta_dm_search_cb.p_sdp_db->raw_size = MAX_DISC_RAW_DATA_BUF;
  2120. if (!SDP_ServiceSearchAttributeRequest (bd_addr, bta_dm_search_cb.p_sdp_db, &bta_dm_sdp_callback)) {
  2121. /* if discovery not successful with this device
  2122. proceed to next one */
  2123. osi_free(bta_dm_search_cb.p_sdp_db);
  2124. bta_dm_search_cb.p_sdp_db = NULL;
  2125. bta_dm_search_cb.service_index = BTA_MAX_SERVICE_ID;
  2126. } else {
  2127. #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
  2128. if ((this_service_mask == BTA_BLE_SERVICE_MASK &&
  2129. bta_dm_search_cb.uuid_to_search == 0) ||
  2130. this_service_mask != BTA_BLE_SERVICE_MASK)
  2131. #endif
  2132. bta_dm_search_cb.service_index++;
  2133. return;
  2134. }
  2135. } else {
  2136. APPL_TRACE_ERROR("#### Failed to allocate SDP DB buffer! ####");
  2137. }
  2138. }
  2139. bta_dm_search_cb.service_index++;
  2140. }
  2141. /* no more services to be discovered */
  2142. if (bta_dm_search_cb.service_index >= BTA_MAX_SERVICE_ID) {
  2143. if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
  2144. p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
  2145. p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
  2146. bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
  2147. BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name,bta_dm_get_remname(), (BD_NAME_LEN - 1));
  2148. /* make sure the string is terminated */
  2149. p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN - 1] = 0;
  2150. bta_sys_sendmsg(p_msg);
  2151. }
  2152. }
  2153. }
  2154. #endif ///SDP_INCLUDED == TRUE
  2155. /*******************************************************************************
  2156. **
  2157. ** Function bta_dm_discover_next_device
  2158. **
  2159. ** Description Starts discovery on the next device in Inquiry data base
  2160. **
  2161. ** Returns void
  2162. **
  2163. *******************************************************************************/
  2164. static void bta_dm_discover_next_device(void)
  2165. {
  2166. tBTA_DM_MSG *p_msg;
  2167. APPL_TRACE_DEBUG("bta_dm_discover_next_device");
  2168. /* searching next device on inquiry result */
  2169. if ((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info)) != NULL) {
  2170. bta_dm_search_cb.name_discover_done = FALSE;
  2171. bta_dm_search_cb.peer_name[0] = 0;
  2172. #if (SDP_INCLUDED == TRUE)
  2173. bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
  2174. #endif ///SDP_INCLUDED == TRUE
  2175. } else {
  2176. /* no devices, search complete */
  2177. bta_dm_search_cb.services = 0;
  2178. if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
  2179. p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
  2180. p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
  2181. bta_sys_sendmsg(p_msg);
  2182. }
  2183. }
  2184. }
  2185. /*******************************************************************************
  2186. **
  2187. ** Function bta_dm_discover_device
  2188. **
  2189. ** Description Starts name and service discovery on the device
  2190. **
  2191. ** Returns void
  2192. **
  2193. *******************************************************************************/
  2194. #if (SDP_INCLUDED == TRUE)
  2195. static void bta_dm_discover_device(BD_ADDR remote_bd_addr)
  2196. {
  2197. tBTA_DM_MSG *p_msg;
  2198. tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
  2199. #if BLE_INCLUDED == TRUE
  2200. if (bta_dm_search_cb.transport == BTA_TRANSPORT_UNKNOWN) {
  2201. tBT_DEVICE_TYPE dev_type;
  2202. tBLE_ADDR_TYPE addr_type;
  2203. BTM_ReadDevInfo(remote_bd_addr, &dev_type, &addr_type);
  2204. if (dev_type == BT_DEVICE_TYPE_BLE || addr_type == BLE_ADDR_RANDOM) {
  2205. transport = BT_TRANSPORT_LE;
  2206. }
  2207. } else {
  2208. transport = bta_dm_search_cb.transport;
  2209. }
  2210. #endif
  2211. /* Reset transport state for next discovery */
  2212. bta_dm_search_cb.transport = BTA_TRANSPORT_UNKNOWN;
  2213. APPL_TRACE_DEBUG("%s BDA:0x%02X%02X%02X%02X%02X%02X", __func__,
  2214. remote_bd_addr[0], remote_bd_addr[1],
  2215. remote_bd_addr[2], remote_bd_addr[3],
  2216. remote_bd_addr[4], remote_bd_addr[5]);
  2217. bdcpy(bta_dm_search_cb.peer_bdaddr, remote_bd_addr);
  2218. APPL_TRACE_DEBUG("%s name_discover_done = %d p_btm_inq_info %p state = %d, transport=%d",
  2219. __func__,
  2220. bta_dm_search_cb.name_discover_done,
  2221. bta_dm_search_cb.p_btm_inq_info,
  2222. bta_dm_search_cb.state,
  2223. transport);
  2224. if (bta_dm_search_cb.p_btm_inq_info) {
  2225. APPL_TRACE_DEBUG("%s appl_knows_rem_name %d", __func__,
  2226. bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name);
  2227. }
  2228. if ((bta_dm_search_cb.p_btm_inq_info)
  2229. && (bta_dm_search_cb.p_btm_inq_info->results.device_type == BT_DEVICE_TYPE_BLE)
  2230. && (bta_dm_search_cb.state == BTA_DM_SEARCH_ACTIVE)) {
  2231. /* Do not perform RNR for LE devices at inquiry complete*/
  2232. bta_dm_search_cb.name_discover_done = TRUE;
  2233. }
  2234. /* if name discovery is not done and application needs remote name */
  2235. if ((!bta_dm_search_cb.name_discover_done)
  2236. && (( bta_dm_search_cb.p_btm_inq_info == NULL )
  2237. || (bta_dm_search_cb.p_btm_inq_info && (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name)))) {
  2238. if (bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr, transport) == TRUE) {
  2239. return;
  2240. }
  2241. /* starting name discovery failed */
  2242. bta_dm_search_cb.name_discover_done = TRUE;
  2243. }
  2244. /* if application wants to discover service */
  2245. if ( bta_dm_search_cb.services ) {
  2246. /* initialize variables */
  2247. bta_dm_search_cb.service_index = 0;
  2248. bta_dm_search_cb.services_found = 0;
  2249. bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
  2250. #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE && SDP_INCLUDED == TRUE
  2251. bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
  2252. #endif
  2253. if ((bta_dm_search_cb.p_btm_inq_info != NULL) &&
  2254. bta_dm_search_cb.services != BTA_USER_SERVICE_MASK
  2255. && (bta_dm_search_cb.sdp_search == FALSE)) {
  2256. /* check if EIR provides the information of supported services */
  2257. bta_dm_eir_search_services( &bta_dm_search_cb.p_btm_inq_info->results,
  2258. &bta_dm_search_cb.services_to_search,
  2259. &bta_dm_search_cb.services_found );
  2260. }
  2261. /* if seaching with EIR is not completed */
  2262. if (bta_dm_search_cb.services_to_search) {
  2263. /* check whether connection already exists to the device
  2264. if connection exists, we don't have to wait for ACL
  2265. link to go down to start search on next device */
  2266. if (BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr, BT_TRANSPORT_BR_EDR)) {
  2267. bta_dm_search_cb.wait_disc = FALSE;
  2268. } else {
  2269. bta_dm_search_cb.wait_disc = TRUE;
  2270. }
  2271. #if (BLE_INCLUDED == TRUE && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE) && (GATTC_INCLUDED == TRUE)
  2272. if ( bta_dm_search_cb.p_btm_inq_info ) {
  2273. APPL_TRACE_DEBUG("%s p_btm_inq_info %p results.device_type 0x%x services_to_search 0x%x",
  2274. __func__,
  2275. bta_dm_search_cb.p_btm_inq_info,
  2276. bta_dm_search_cb.p_btm_inq_info->results.device_type,
  2277. bta_dm_search_cb.services_to_search);
  2278. }
  2279. if (transport == BT_TRANSPORT_LE) {
  2280. if (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK) {
  2281. //set the raw data buffer here
  2282. memset(g_disc_raw_data_buf, 0, MAX_DISC_RAW_DATA_BUF);
  2283. bta_dm_search_cb.p_ble_rawdata = g_disc_raw_data_buf;
  2284. bta_dm_search_cb.ble_raw_size = MAX_DISC_RAW_DATA_BUF;
  2285. bta_dm_search_cb.ble_raw_used = 0;
  2286. /* start GATT for service discovery */
  2287. btm_dm_start_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
  2288. return;
  2289. }
  2290. } else
  2291. #endif
  2292. {
  2293. bta_dm_search_cb.sdp_results = FALSE;
  2294. bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
  2295. return;
  2296. }
  2297. }
  2298. }
  2299. /* name discovery and service discovery are done for this device */
  2300. if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
  2301. p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
  2302. /* initialize the data structure - includes p_raw_data and raw_data_size */
  2303. memset(&(p_msg->disc_result.result), 0, sizeof(tBTA_DM_DISC_RES));
  2304. p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
  2305. p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
  2306. bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
  2307. BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name,(char *)bta_dm_search_cb.peer_name, (BD_NAME_LEN - 1));
  2308. /* make sure the string is terminated */
  2309. p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN - 1] = 0;
  2310. bta_sys_sendmsg(p_msg);
  2311. }
  2312. }
  2313. /*******************************************************************************
  2314. **
  2315. ** Function bta_dm_sdp_callback
  2316. **
  2317. ** Description Callback from sdp with discovery status
  2318. **
  2319. ** Returns void
  2320. **
  2321. *******************************************************************************/
  2322. static void bta_dm_sdp_callback (UINT16 sdp_status)
  2323. {
  2324. tBTA_DM_SDP_RESULT *p_msg;
  2325. if ((p_msg = (tBTA_DM_SDP_RESULT *) osi_malloc(sizeof(tBTA_DM_SDP_RESULT))) != NULL) {
  2326. p_msg->hdr.event = BTA_DM_SDP_RESULT_EVT;
  2327. p_msg->sdp_result = sdp_status;
  2328. bta_sys_sendmsg(p_msg);
  2329. }
  2330. }
  2331. #endif ///SDP_INCLUDED == TRUE
  2332. /*******************************************************************************
  2333. **
  2334. ** Function bta_dm_inq_results_cb
  2335. **
  2336. ** Description Inquiry results callback from BTM
  2337. **
  2338. ** Returns void
  2339. **
  2340. *******************************************************************************/
  2341. static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
  2342. {
  2343. tBTA_DM_SEARCH result;
  2344. tBTM_INQ_INFO *p_inq_info;
  2345. UINT16 service_class;
  2346. bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
  2347. memcpy(result.inq_res.dev_class, p_inq->dev_class, DEV_CLASS_LEN);
  2348. BTM_COD_SERVICE_CLASS(service_class, p_inq->dev_class);
  2349. result.inq_res.is_limited = (service_class & BTM_COD_SERVICE_LMTD_DISCOVER) ? TRUE : FALSE;
  2350. result.inq_res.rssi = p_inq->rssi;
  2351. #if (BLE_INCLUDED == TRUE)
  2352. result.inq_res.ble_addr_type = p_inq->ble_addr_type;
  2353. result.inq_res.inq_result_type = p_inq->inq_result_type;
  2354. result.inq_res.device_type = p_inq->device_type;
  2355. result.inq_res.flag = p_inq->flag;
  2356. #endif
  2357. /* application will parse EIR to find out remote device name */
  2358. result.inq_res.p_eir = p_eir;
  2359. if ((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL) {
  2360. /* initialize remt_name_not_required to FALSE so that we get the name by default */
  2361. result.inq_res.remt_name_not_required = FALSE;
  2362. }
  2363. if (bta_dm_search_cb.p_search_cback) {
  2364. bta_dm_search_cb.p_search_cback(BTA_DM_INQ_RES_EVT, &result);
  2365. }
  2366. if (p_inq_info) {
  2367. /* application indicates if it knows the remote name, inside the callback
  2368. copy that to the inquiry data base*/
  2369. if (result.inq_res.remt_name_not_required) {
  2370. p_inq_info->appl_knows_rem_name = TRUE;
  2371. }
  2372. }
  2373. }
  2374. /*******************************************************************************
  2375. **
  2376. ** Function bta_dm_inq_cmpl_cb
  2377. **
  2378. ** Description Inquiry complete callback from BTM
  2379. **
  2380. ** Returns void
  2381. **
  2382. *******************************************************************************/
  2383. static void bta_dm_inq_cmpl_cb (void *p_result)
  2384. {
  2385. tBTA_DM_MSG *p_msg;
  2386. if (bta_dm_search_cb.cancel_pending == FALSE) {
  2387. APPL_TRACE_DEBUG("%s", __FUNCTION__);
  2388. p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG));
  2389. if (p_msg != NULL) {
  2390. p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
  2391. p_msg->inq_cmpl.num = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
  2392. bta_sys_sendmsg(p_msg);
  2393. }
  2394. } else {
  2395. bta_dm_search_cb.cancel_pending = FALSE;
  2396. bta_dm_search_cancel_notify(NULL);
  2397. p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG));
  2398. if (p_msg != NULL) {
  2399. p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
  2400. p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
  2401. bta_sys_sendmsg(p_msg);
  2402. }
  2403. }
  2404. }
  2405. /*******************************************************************************
  2406. **
  2407. ** Function bta_dm_service_search_remname_cback
  2408. **
  2409. ** Description Remote name call back from BTM during service discovery
  2410. **
  2411. ** Returns void
  2412. **
  2413. *******************************************************************************/
  2414. static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name)
  2415. {
  2416. tBTM_REMOTE_DEV_NAME rem_name;
  2417. tBTM_STATUS btm_status;
  2418. UNUSED(dc);
  2419. APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback name=<%s>", bd_name);
  2420. /* if this is what we are looking for */
  2421. if (!bdcmp( bta_dm_search_cb.peer_bdaddr, bd_addr)) {
  2422. rem_name.length = strlen((char *)bd_name);
  2423. if (rem_name.length > (BD_NAME_LEN - 1)) {
  2424. rem_name.length = (BD_NAME_LEN - 1);
  2425. rem_name.remote_bd_name[(BD_NAME_LEN - 1)] = 0;
  2426. }
  2427. BCM_STRNCPY_S((char *)rem_name.remote_bd_name, (char *)bd_name, (BD_NAME_LEN - 1));
  2428. rem_name.status = BTM_SUCCESS;
  2429. bta_dm_remname_cback(&rem_name);
  2430. } else {
  2431. /* get name of device */
  2432. btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
  2433. (tBTM_CMPL_CB *) bta_dm_remname_cback,
  2434. BT_TRANSPORT_BR_EDR);
  2435. if ( btm_status == BTM_BUSY ) {
  2436. /* wait for next chance(notification of remote name discovery done) */
  2437. APPL_TRACE_DEBUG("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is busy");
  2438. } else if ( btm_status != BTM_CMD_STARTED ) {
  2439. /* if failed to start getting remote name then continue */
  2440. APPL_TRACE_WARNING("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
  2441. rem_name.length = 0;
  2442. rem_name.remote_bd_name[0] = 0;
  2443. rem_name.status = btm_status;
  2444. bta_dm_remname_cback(&rem_name);
  2445. }
  2446. }
  2447. }
  2448. /*******************************************************************************
  2449. **
  2450. ** Function bta_dm_remname_cback
  2451. **
  2452. ** Description Remote name complete call back from BTM
  2453. **
  2454. ** Returns void
  2455. **
  2456. *******************************************************************************/
  2457. static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name)
  2458. {
  2459. tBTA_DM_REM_NAME *p_msg;
  2460. APPL_TRACE_DEBUG("bta_dm_remname_cback len = %d name=<%s>", p_remote_name->length,
  2461. p_remote_name->remote_bd_name);
  2462. /* remote name discovery is done but it could be failed */
  2463. bta_dm_search_cb.name_discover_done = TRUE;
  2464. BCM_STRNCPY_S((char *)bta_dm_search_cb.peer_name, (char *)p_remote_name->remote_bd_name, (BD_NAME_LEN));
  2465. bta_dm_search_cb.peer_name[BD_NAME_LEN] = 0;
  2466. BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
  2467. #if BLE_INCLUDED == TRUE && GATTS_INCLUDED == TRUE
  2468. if (bta_dm_search_cb.transport == BT_TRANSPORT_LE ) {
  2469. GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr);
  2470. }
  2471. #endif
  2472. if ((p_msg = (tBTA_DM_REM_NAME *) osi_malloc(sizeof(tBTA_DM_REM_NAME))) != NULL) {
  2473. bdcpy (p_msg->result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
  2474. BCM_STRNCPY_S((char *)p_msg->result.disc_res.bd_name, (char *)p_remote_name->remote_bd_name, (BD_NAME_LEN));
  2475. /* make sure the string is null terminated */
  2476. p_msg->result.disc_res.bd_name[BD_NAME_LEN] = 0;
  2477. p_msg->hdr.event = BTA_DM_REMT_NAME_EVT;
  2478. bta_sys_sendmsg(p_msg);
  2479. }
  2480. }
  2481. /*******************************************************************************
  2482. **
  2483. ** Function bta_dm_authorize_cback
  2484. **
  2485. ** Description cback requesting authorization
  2486. **
  2487. ** Returns void
  2488. **
  2489. *******************************************************************************/
  2490. #if (SMP_INCLUDED == TRUE)
  2491. static UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name,
  2492. UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator)
  2493. {
  2494. tBTA_DM_SEC sec_event;
  2495. UINT8 index = 1;
  2496. UNUSED(service_name);
  2497. UNUSED(is_originator);
  2498. bdcpy(sec_event.authorize.bd_addr, bd_addr);
  2499. memcpy(sec_event.authorize.dev_class, dev_class, DEV_CLASS_LEN);
  2500. BCM_STRNCPY_S((char *)sec_event.authorize.bd_name, (char *)bd_name, (BD_NAME_LEN - 1));
  2501. /* make sure the string is null terminated */
  2502. sec_event.authorize.bd_name[BD_NAME_LEN - 1] = 0;
  2503. #if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
  2504. sec_event.authorize.service = service_id;
  2505. #endif
  2506. while (index < BTA_MAX_SERVICE_ID) {
  2507. /* get the BTA service id corresponding to BTM id */
  2508. if (bta_service_id_to_btm_srv_id_lkup_tbl[index] == service_id) {
  2509. sec_event.authorize.service = index;
  2510. break;
  2511. }
  2512. index++;
  2513. }
  2514. /* if supported service callback otherwise not authorized */
  2515. if (bta_dm_cb.p_sec_cback && (index < BTA_MAX_SERVICE_ID
  2516. #if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
  2517. /* pass through JV service ID */
  2518. || (service_id >= BTA_FIRST_JV_SERVICE_ID && service_id <= BTA_LAST_JV_SERVICE_ID)
  2519. #endif
  2520. )) {
  2521. bta_dm_cb.p_sec_cback(BTA_DM_AUTHORIZE_EVT, &sec_event);
  2522. return BTM_CMD_STARTED;
  2523. } else {
  2524. return BTM_NOT_AUTHORIZED;
  2525. }
  2526. }
  2527. #if (CLASSIC_BT_INCLUDED == TRUE)
  2528. #if (BT_SSP_INCLUDED == TRUE)
  2529. /*******************************************************************************
  2530. **
  2531. ** Function bta_dm_pinname_cback
  2532. **
  2533. ** Description Callback requesting pin_key
  2534. **
  2535. ** Returns void
  2536. **
  2537. *******************************************************************************/
  2538. static void bta_dm_pinname_cback (void *p_data)
  2539. {
  2540. tBTM_REMOTE_DEV_NAME *p_result = (tBTM_REMOTE_DEV_NAME *)p_data;
  2541. tBTA_DM_SEC sec_event;
  2542. UINT32 bytes_to_copy;
  2543. tBTA_DM_SEC_EVT event = bta_dm_cb.pin_evt;
  2544. if (BTA_DM_SP_CFM_REQ_EVT == event) {
  2545. /* Retrieved saved device class and bd_addr */
  2546. bdcpy(sec_event.cfm_req.bd_addr, bta_dm_cb.pin_bd_addr);
  2547. BTA_COPY_DEVICE_CLASS(sec_event.cfm_req.dev_class, bta_dm_cb.pin_dev_class);
  2548. if (p_result && p_result->status == BTM_SUCCESS) {
  2549. bytes_to_copy = (p_result->length < (BD_NAME_LEN - 1))
  2550. ? p_result->length : (BD_NAME_LEN - 1);
  2551. memcpy(sec_event.cfm_req.bd_name, p_result->remote_bd_name, bytes_to_copy);
  2552. sec_event.pin_req.bd_name[BD_NAME_LEN - 1] = 0;
  2553. } else { /* No name found */
  2554. sec_event.cfm_req.bd_name[0] = 0;
  2555. }
  2556. sec_event.key_notif.passkey = bta_dm_cb.num_val; /* get PIN code numeric number */
  2557. /* 1 additional event data fields for this event */
  2558. sec_event.cfm_req.just_works = bta_dm_cb.just_works;
  2559. } else {
  2560. /* Retrieved saved device class and bd_addr */
  2561. bdcpy(sec_event.pin_req.bd_addr, bta_dm_cb.pin_bd_addr);
  2562. BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, bta_dm_cb.pin_dev_class);
  2563. if (p_result && p_result->status == BTM_SUCCESS) {
  2564. bytes_to_copy = (p_result->length < (BD_NAME_LEN - 1))
  2565. ? p_result->length : (BD_NAME_LEN - 1);
  2566. memcpy(sec_event.pin_req.bd_name, p_result->remote_bd_name, bytes_to_copy);
  2567. sec_event.pin_req.bd_name[BD_NAME_LEN - 1] = 0;
  2568. } else { /* No name found */
  2569. sec_event.pin_req.bd_name[0] = 0;
  2570. }
  2571. event = bta_dm_cb.pin_evt;
  2572. sec_event.key_notif.passkey = bta_dm_cb.num_val; /* get PIN code numeric number */
  2573. }
  2574. if ( bta_dm_cb.p_sec_cback ) {
  2575. bta_dm_cb.p_sec_cback(event, &sec_event);
  2576. }
  2577. }
  2578. #endif /// BT_SSP_INCLUDED == TRUE
  2579. /*******************************************************************************
  2580. **
  2581. ** Function bta_dm_pin_cback
  2582. **
  2583. ** Description Callback requesting pin_key
  2584. **
  2585. ** Returns void
  2586. **
  2587. *******************************************************************************/
  2588. static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name,
  2589. BOOLEAN min_16_digit)
  2590. {
  2591. tBTA_DM_SEC sec_event;
  2592. if (!bta_dm_cb.p_sec_cback) {
  2593. return BTM_NOT_AUTHORIZED;
  2594. }
  2595. bdcpy(sec_event.pin_req.bd_addr, bd_addr);
  2596. BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class);
  2597. BCM_STRNCPY_S((char *)sec_event.pin_req.bd_name, (char *)bd_name, (BD_NAME_LEN - 1));
  2598. sec_event.pin_req.bd_name[BD_NAME_LEN - 1] = 0;
  2599. sec_event.pin_req.min_16_digit = min_16_digit;
  2600. bta_dm_cb.p_sec_cback(BTA_DM_PIN_REQ_EVT, &sec_event);
  2601. return BTM_CMD_STARTED;
  2602. }
  2603. #endif ///CLASSIC_BT_INCLUDED == TRUE
  2604. /*******************************************************************************
  2605. **
  2606. ** Function bta_dm_new_link_key_cback
  2607. **
  2608. ** Description Callback from BTM to notify new link key
  2609. **
  2610. ** Returns void
  2611. **
  2612. *******************************************************************************/
  2613. static UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,
  2614. BD_NAME bd_name, LINK_KEY key, UINT8 key_type,
  2615. BOOLEAN sc_support)
  2616. {
  2617. tBTA_DM_SEC sec_event;
  2618. tBTA_DM_AUTH_CMPL *p_auth_cmpl;
  2619. UINT8 event;
  2620. UNUSED(dev_class);
  2621. memset (&sec_event, 0, sizeof(tBTA_DM_SEC));
  2622. /* Not AMP Key type */
  2623. if (key_type != HCI_LKEY_TYPE_AMP_WIFI && key_type != HCI_LKEY_TYPE_AMP_UWB) {
  2624. event = BTA_DM_AUTH_CMPL_EVT;
  2625. p_auth_cmpl = &sec_event.auth_cmpl;
  2626. bdcpy(p_auth_cmpl->bd_addr, bd_addr);
  2627. memcpy(p_auth_cmpl->bd_name, bd_name, (BD_NAME_LEN - 1));
  2628. p_auth_cmpl->bd_name[BD_NAME_LEN - 1] = 0;
  2629. p_auth_cmpl->key_present = TRUE;
  2630. p_auth_cmpl->key_type = key_type;
  2631. p_auth_cmpl->success = TRUE;
  2632. p_auth_cmpl->sc_support = sc_support;
  2633. memcpy(p_auth_cmpl->key, key, LINK_KEY_LEN);
  2634. sec_event.auth_cmpl.fail_reason = HCI_SUCCESS;
  2635. #if BLE_INCLUDED == TRUE
  2636. // Report the BR link key based on the BR/EDR address and type
  2637. BTM_ReadDevInfo(bd_addr, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type);
  2638. #endif
  2639. if (bta_dm_cb.p_sec_cback) {
  2640. bta_dm_cb.p_sec_cback(event, &sec_event);
  2641. }
  2642. } else {
  2643. APPL_TRACE_WARNING("%s() Received AMP Key", __func__);
  2644. }
  2645. return BTM_CMD_STARTED;
  2646. }
  2647. /*******************************************************************************
  2648. **
  2649. ** Function bta_dm_authentication_complete_cback
  2650. **
  2651. ** Description Authentication complete callback from BTM
  2652. **
  2653. ** Returns void
  2654. **
  2655. *******************************************************************************/
  2656. static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, int result)
  2657. {
  2658. tBTA_DM_SEC sec_event;
  2659. UNUSED(dev_class);
  2660. if (result != BTM_SUCCESS) {
  2661. memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
  2662. bdcpy(sec_event.auth_cmpl.bd_addr, bd_addr);
  2663. memcpy(sec_event.auth_cmpl.bd_name, bd_name, (BD_NAME_LEN - 1));
  2664. sec_event.auth_cmpl.bd_name[BD_NAME_LEN - 1] = 0;
  2665. #if BLE_INCLUDED == TRUE
  2666. // Report the BR link key based on the BR/EDR address and type
  2667. BTM_ReadDevInfo(bd_addr, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type);
  2668. #endif
  2669. sec_event.auth_cmpl.fail_reason = (UINT8)result;
  2670. if (bta_dm_cb.p_sec_cback) {
  2671. bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
  2672. }
  2673. bta_dm_remove_sec_dev_entry(bd_addr);
  2674. }
  2675. return BTM_SUCCESS;
  2676. }
  2677. #if (BT_SSP_INCLUDED == TRUE)
  2678. /*******************************************************************************
  2679. **
  2680. ** Function bta_dm_sp_cback
  2681. **
  2682. ** Description simple pairing callback from BTM
  2683. **
  2684. ** Returns void
  2685. **
  2686. *******************************************************************************/
  2687. static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data)
  2688. {
  2689. tBTM_STATUS status = BTM_CMD_STARTED;
  2690. tBTA_DM_SEC sec_event;
  2691. tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT;
  2692. APPL_TRACE_EVENT("bta_dm_sp_cback: %d", event);
  2693. if (!bta_dm_cb.p_sec_cback) {
  2694. return BTM_NOT_AUTHORIZED;
  2695. }
  2696. /* TODO_SP */
  2697. switch (event) {
  2698. case BTM_SP_IO_REQ_EVT:
  2699. #if (BT_SSP_INCLUDED == TRUE)
  2700. /* translate auth_req */
  2701. bta_dm_co_io_req(p_data->io_req.bd_addr, &p_data->io_req.io_cap,
  2702. &p_data->io_req.oob_data, &p_data->io_req.auth_req, p_data->io_req.is_orig);
  2703. #endif
  2704. #if BTM_OOB_INCLUDED == FALSE
  2705. status = BTM_SUCCESS;
  2706. #endif
  2707. APPL_TRACE_EVENT("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
  2708. break;
  2709. case BTM_SP_IO_RSP_EVT:
  2710. #if (BT_SSP_INCLUDED == TRUE)
  2711. bta_dm_co_io_rsp(p_data->io_rsp.bd_addr, p_data->io_rsp.io_cap,
  2712. p_data->io_rsp.oob_data, p_data->io_rsp.auth_req );
  2713. #endif
  2714. break;
  2715. case BTM_SP_CFM_REQ_EVT:
  2716. pin_evt = BTA_DM_SP_CFM_REQ_EVT;
  2717. bta_dm_cb.just_works = sec_event.cfm_req.just_works = p_data->cfm_req.just_works;
  2718. sec_event.cfm_req.loc_auth_req = p_data->cfm_req.loc_auth_req;
  2719. sec_event.cfm_req.rmt_auth_req = p_data->cfm_req.rmt_auth_req;
  2720. sec_event.cfm_req.loc_io_caps = p_data->cfm_req.loc_io_caps;
  2721. sec_event.cfm_req.rmt_io_caps = p_data->cfm_req.rmt_io_caps;
  2722. /* continue to next case */
  2723. #if (BT_SSP_INCLUDED == TRUE)
  2724. /* Passkey entry mode, mobile device with output capability is very
  2725. unlikely to receive key request, so skip this event */
  2726. case BTM_SP_KEY_REQ_EVT:
  2727. case BTM_SP_KEY_NOTIF_EVT:
  2728. #endif
  2729. if (BTM_SP_CFM_REQ_EVT == event) {
  2730. /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
  2731. call remote name request using values from cfm_req */
  2732. if (p_data->cfm_req.bd_name[0] == 0) {
  2733. bta_dm_cb.pin_evt = pin_evt;
  2734. bdcpy(bta_dm_cb.pin_bd_addr, p_data->cfm_req.bd_addr);
  2735. BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->cfm_req.dev_class);
  2736. if ((BTM_ReadRemoteDeviceName(p_data->cfm_req.bd_addr, bta_dm_pinname_cback,
  2737. BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) {
  2738. return BTM_CMD_STARTED;
  2739. }
  2740. APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
  2741. } else {
  2742. /* Due to the switch case falling through below to BTM_SP_KEY_NOTIF_EVT,
  2743. copy these values into key_notif from cfm_req */
  2744. bdcpy(sec_event.key_notif.bd_addr, p_data->cfm_req.bd_addr);
  2745. BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->cfm_req.dev_class);
  2746. BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name, (char *)p_data->cfm_req.bd_name, (BD_NAME_LEN - 1));
  2747. sec_event.key_notif.bd_name[BD_NAME_LEN - 1] = 0;
  2748. }
  2749. }
  2750. bta_dm_cb.num_val = sec_event.key_notif.passkey = p_data->key_notif.passkey;
  2751. if (BTM_SP_KEY_NOTIF_EVT == event) {
  2752. /* If the device name is not known, save bdaddr and devclass
  2753. and initiate a name request with values from key_notif */
  2754. if (p_data->key_notif.bd_name[0] == 0) {
  2755. bta_dm_cb.pin_evt = pin_evt;
  2756. bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr);
  2757. BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class);
  2758. if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback,
  2759. BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) {
  2760. return BTM_CMD_STARTED;
  2761. }
  2762. APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
  2763. } else {
  2764. bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr);
  2765. BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class);
  2766. BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name, (char *)p_data->key_notif.bd_name, (BD_NAME_LEN - 1));
  2767. sec_event.key_notif.bd_name[BD_NAME_LEN - 1] = 0;
  2768. }
  2769. }
  2770. if (BTM_SP_KEY_REQ_EVT == event) {
  2771. pin_evt = BTA_DM_SP_KEY_REQ_EVT;
  2772. /* If the device name is not known, save bdaddr and devclass
  2773. and initiate a name request with values from key_notif */
  2774. if (p_data->key_notif.bd_name[0] == 0) {
  2775. bta_dm_cb.pin_evt = pin_evt;
  2776. bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr);
  2777. BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class);
  2778. if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback,
  2779. BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) {
  2780. return BTM_CMD_STARTED;
  2781. }
  2782. APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
  2783. } else {
  2784. bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr);
  2785. BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class);
  2786. BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name,(char *)p_data->key_notif.bd_name, (BD_NAME_LEN - 1));
  2787. sec_event.key_notif.bd_name[BD_NAME_LEN - 1] = 0;
  2788. }
  2789. }
  2790. bta_dm_cb.p_sec_cback(pin_evt, &sec_event);
  2791. break;
  2792. #if BTM_OOB_INCLUDED == TRUE
  2793. case BTM_SP_LOC_OOB_EVT:
  2794. bta_dm_co_loc_oob((BOOLEAN)(p_data->loc_oob.status == BTM_SUCCESS),
  2795. p_data->loc_oob.c, p_data->loc_oob.r);
  2796. break;
  2797. case BTM_SP_RMT_OOB_EVT:
  2798. /* If the device name is not known, save bdaddr and devclass and initiate a name request */
  2799. if (p_data->rmt_oob.bd_name[0] == 0) {
  2800. bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT;
  2801. bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr);
  2802. BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class);
  2803. if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback,
  2804. BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) {
  2805. return BTM_CMD_STARTED;
  2806. }
  2807. APPL_TRACE_WARNING(" bta_dm_sp_cback() -> Failed to start Remote Name Request ");
  2808. }
  2809. bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr);
  2810. BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class);
  2811. BCM_STRNCPY_S((char *)sec_event.rmt_oob.bd_name, (char *)p_data->rmt_oob.bd_name, (BD_NAME_LEN - 1));
  2812. sec_event.rmt_oob.bd_name[BD_NAME_LEN - 1] = 0;
  2813. bta_dm_cb.p_sec_cback(BTA_DM_SP_RMT_OOB_EVT, &sec_event);
  2814. bta_dm_co_rmt_oob(p_data->rmt_oob.bd_addr);
  2815. break;
  2816. #endif
  2817. case BTM_SP_COMPLT_EVT:
  2818. /* do not report this event - handled by link_key_callback or auth_complete_callback */
  2819. break;
  2820. case BTM_SP_KEYPRESS_EVT:
  2821. memcpy(&sec_event.key_press, &p_data->key_press, sizeof(tBTM_SP_KEYPRESS));
  2822. bta_dm_cb.p_sec_cback(BTA_DM_SP_KEYPRESS_EVT, &sec_event);
  2823. break;
  2824. case BTM_SP_UPGRADE_EVT:
  2825. bta_dm_co_lk_upgrade(p_data->upgrade.bd_addr, &p_data->upgrade.upgrade );
  2826. break;
  2827. default:
  2828. status = BTM_NOT_AUTHORIZED;
  2829. break;
  2830. }
  2831. APPL_TRACE_EVENT("dm status: %d", status);
  2832. return status;
  2833. }
  2834. #endif /* (BT_SSP_INCLUDED == TRUE) */
  2835. #endif ///SMP_INCLUDED == TRUE
  2836. /*******************************************************************************
  2837. **
  2838. ** Function bta_dm_local_name_cback
  2839. **
  2840. ** Description Callback from btm after local name is read
  2841. **
  2842. **
  2843. ** Returns void
  2844. **
  2845. *******************************************************************************/
  2846. static void bta_dm_local_name_cback(UINT8 *p_name)
  2847. {
  2848. tBTA_DM_SEC sec_event;
  2849. UNUSED(p_name);
  2850. sec_event.enable.status = BTA_SUCCESS;
  2851. if (bta_dm_cb.p_sec_cback) {
  2852. bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event);
  2853. }
  2854. }
  2855. /*******************************************************************************
  2856. **
  2857. ** Function bta_dm_bl_change_cback
  2858. **
  2859. ** Description Callback from btm when acl connection goes up or down
  2860. **
  2861. **
  2862. ** Returns void
  2863. **
  2864. *******************************************************************************/
  2865. static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data)
  2866. {
  2867. tBTA_DM_ACL_CHANGE *p_msg;
  2868. if ((p_msg = (tBTA_DM_ACL_CHANGE *) osi_malloc(sizeof(tBTA_DM_ACL_CHANGE))) != NULL) {
  2869. p_msg->event = p_data->event;
  2870. p_msg->is_new = FALSE;
  2871. switch (p_msg->event) {
  2872. case BTM_BL_CONN_EVT:
  2873. p_msg->sc_downgrade = p_data->conn.sc_downgrade;
  2874. p_msg->is_new = TRUE;
  2875. bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
  2876. #if BLE_INCLUDED == TRUE
  2877. p_msg->transport = p_data->conn.transport;
  2878. p_msg->handle = p_data->conn.handle;
  2879. #endif
  2880. break;
  2881. case BTM_BL_DISCN_EVT:
  2882. bdcpy(p_msg->bd_addr, p_data->discn.p_bda);
  2883. #if BLE_INCLUDED == TRUE
  2884. p_msg->transport = p_data->discn.transport;
  2885. p_msg->handle = p_data->discn.handle;
  2886. #endif
  2887. break;
  2888. case BTM_BL_UPDATE_EVT:
  2889. p_msg->busy_level = p_data->update.busy_level;
  2890. p_msg->busy_level_flags = p_data->update.busy_level_flags;
  2891. break;
  2892. case BTM_BL_ROLE_CHG_EVT:
  2893. p_msg->new_role = p_data->role_chg.new_role;
  2894. p_msg->hci_status = p_data->role_chg.hci_status;
  2895. bdcpy(p_msg->bd_addr, p_data->role_chg.p_bda);
  2896. break;
  2897. case BTM_BL_COLLISION_EVT:
  2898. bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
  2899. break;
  2900. }
  2901. p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
  2902. bta_sys_sendmsg(p_msg);
  2903. }
  2904. }
  2905. /*******************************************************************************
  2906. **
  2907. ** Function bta_dm_rs_cback
  2908. **
  2909. ** Description Receives the role switch complete event
  2910. **
  2911. ** Returns
  2912. **
  2913. *******************************************************************************/
  2914. static void bta_dm_rs_cback (tBTM_ROLE_SWITCH_CMPL *p1)
  2915. {
  2916. UNUSED(p1);
  2917. APPL_TRACE_WARNING("bta_dm_rs_cback:%d", bta_dm_cb.rs_event);
  2918. if (bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT) {
  2919. bta_dm_cb.search_msg.rs_res = BTA_DM_RS_OK; /* do not care about the result for now */
  2920. bta_dm_cb.rs_event = 0;
  2921. bta_dm_search_start((tBTA_DM_MSG *)&bta_dm_cb.search_msg);
  2922. }
  2923. }
  2924. /*******************************************************************************
  2925. **
  2926. ** Function bta_dm_check_av
  2927. **
  2928. ** Description This function checks if AV is active
  2929. ** if yes, make sure the AV link is master
  2930. **
  2931. ** Returns BOOLEAN - TRUE, if switch is in progress
  2932. **
  2933. *******************************************************************************/
  2934. static BOOLEAN bta_dm_check_av(UINT16 event)
  2935. {
  2936. BOOLEAN avoid_roleswitch = FALSE;
  2937. BOOLEAN switching = FALSE;
  2938. UINT8 i;
  2939. tBTA_DM_PEER_DEVICE *p_dev;
  2940. #if defined(BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY) && (BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY == TRUE)
  2941. /* avoid role switch upon inquiry if a2dp is actively streaming as it
  2942. introduces an audioglitch due to FW scheduling delays (unavoidable) */
  2943. if (event == BTA_DM_API_SEARCH_EVT) {
  2944. avoid_roleswitch = TRUE;
  2945. }
  2946. #endif
  2947. APPL_TRACE_EVENT("bta_dm_check_av:%d", bta_dm_cb.cur_av_count);
  2948. if (bta_dm_cb.cur_av_count) {
  2949. for (i = 0; i < bta_dm_cb.device_list.count; i++) {
  2950. p_dev = &bta_dm_cb.device_list.peer_device[i];
  2951. APPL_TRACE_WARNING("[%d]: state:%d, info:x%x, avoid_rs %d",
  2952. i, p_dev->conn_state, p_dev->info, avoid_roleswitch);
  2953. if ((p_dev->conn_state == BTA_DM_CONNECTED) && (p_dev->info & BTA_DM_DI_AV_ACTIVE) &&
  2954. (avoid_roleswitch == FALSE)) {
  2955. /* make master and take away the role switch policy */
  2956. if (BTM_CMD_STARTED == BTM_SwitchRole (p_dev->peer_bdaddr, HCI_ROLE_MASTER, (tBTM_CMPL_CB *)bta_dm_rs_cback)) {
  2957. /* the role switch command is actually sent */
  2958. bta_dm_cb.rs_event = event;
  2959. switching = TRUE;
  2960. }
  2961. /* else either already master or can not switch for some reasons */
  2962. bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
  2963. break;
  2964. }
  2965. }
  2966. }
  2967. return switching;
  2968. }
  2969. /*******************************************************************************
  2970. **
  2971. ** Function bta_dm_acl_change
  2972. **
  2973. ** Description Process BTA_DM_ACL_CHANGE_EVT
  2974. **
  2975. **
  2976. ** Returns void
  2977. **
  2978. *******************************************************************************/
  2979. void bta_dm_acl_change(tBTA_DM_MSG *p_data)
  2980. {
  2981. UINT8 i;
  2982. UINT8 *p;
  2983. tBTA_DM_SEC conn;
  2984. BOOLEAN is_new = p_data->acl_change.is_new;
  2985. BD_ADDR_PTR p_bda = p_data->acl_change.bd_addr;
  2986. BOOLEAN need_policy_change = FALSE;
  2987. BOOLEAN issue_unpair_cb = FALSE;
  2988. tBTA_DM_PEER_DEVICE *p_dev;
  2989. memset(&conn, 0, sizeof(tBTA_DM_SEC));
  2990. switch (p_data->acl_change.event) {
  2991. case BTM_BL_UPDATE_EVT: /* busy level update */
  2992. if ( bta_dm_cb.p_sec_cback ) {
  2993. conn.busy_level.level = p_data->acl_change.busy_level;
  2994. conn.busy_level.level_flags = p_data->acl_change.busy_level_flags;
  2995. bta_dm_cb.p_sec_cback(BTA_DM_BUSY_LEVEL_EVT, &conn);
  2996. }
  2997. return;
  2998. case BTM_BL_ROLE_CHG_EVT: /* role change event */
  2999. p_dev = bta_dm_find_peer_device(p_bda);
  3000. if (p_dev) {
  3001. APPL_TRACE_DEBUG("bta_dm_acl_change role chg info:x%x new_role:%d dev count:%d",
  3002. p_dev->info, p_data->acl_change.new_role, bta_dm_cb.device_list.count);
  3003. if (p_dev->info & BTA_DM_DI_AV_ACTIVE) {
  3004. /* there's AV activity on this link */
  3005. if (p_data->acl_change.new_role == HCI_ROLE_SLAVE && bta_dm_cb.device_list.count > 1
  3006. && p_data->acl_change.hci_status == HCI_SUCCESS) {
  3007. /* more than one connections and the AV connection is role switched to slave
  3008. * switch it back to master and remove the switch policy */
  3009. BTM_SwitchRole(p_bda, BTM_ROLE_MASTER, NULL);
  3010. need_policy_change = TRUE;
  3011. } else if (p_bta_dm_cfg->avoid_scatter && (p_data->acl_change.new_role == HCI_ROLE_MASTER)) {
  3012. /* if the link updated to be master include AV activities, remove the switch policy */
  3013. need_policy_change = TRUE;
  3014. }
  3015. if (need_policy_change) {
  3016. bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
  3017. }
  3018. } else {
  3019. /* there's AV no activity on this link and role switch happened
  3020. * check if AV is active
  3021. * if so, make sure the AV link is master */
  3022. bta_dm_check_av(0);
  3023. }
  3024. bta_sys_notify_role_chg(p_data->acl_change.bd_addr, p_data->acl_change.new_role, p_data->acl_change.hci_status);
  3025. bdcpy(conn.role_chg.bd_addr, p_bda);
  3026. conn.role_chg.new_role = (UINT8) p_data->acl_change.new_role;
  3027. if ( bta_dm_cb.p_sec_cback ) {
  3028. bta_dm_cb.p_sec_cback(BTA_DM_ROLE_CHG_EVT, (tBTA_DM_SEC *)&conn);
  3029. }
  3030. }
  3031. return;
  3032. }
  3033. /* Collision report from Stack: Notify profiles */
  3034. if (p_data->acl_change.event == BTM_BL_COLLISION_EVT) {
  3035. bta_sys_notify_collision (p_bda);
  3036. return;
  3037. }
  3038. if (is_new) {
  3039. for (i = 0; i < bta_dm_cb.device_list.count; i++) {
  3040. if (!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
  3041. #if BLE_INCLUDED == TRUE
  3042. && bta_dm_cb.device_list.peer_device[i].conn_handle == p_data->acl_change.handle
  3043. #endif
  3044. ) {
  3045. break;
  3046. }
  3047. }
  3048. if (i == bta_dm_cb.device_list.count) {
  3049. if (bta_dm_cb.device_list.count < BTA_DM_NUM_PEER_DEVICE) {
  3050. bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].peer_bdaddr, p_bda);
  3051. bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].link_policy = bta_dm_cb.cur_policy;
  3052. bta_dm_cb.device_list.count++;
  3053. #if BLE_INCLUDED == TRUE
  3054. bta_dm_cb.device_list.peer_device[i].conn_handle = p_data->acl_change.handle;
  3055. if (p_data->acl_change.transport == BT_TRANSPORT_LE) {
  3056. bta_dm_cb.device_list.le_count++;
  3057. }
  3058. #endif
  3059. } else {
  3060. APPL_TRACE_ERROR("%s max active connection reached, no resources", __func__);
  3061. return;
  3062. }
  3063. }
  3064. bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_CONNECTED;
  3065. bta_dm_cb.device_list.peer_device[i].pref_role = BTA_ANY_ROLE;
  3066. bdcpy(conn.link_up.bd_addr, p_bda);
  3067. bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_NONE;
  3068. #if BLE_INCLUDED == TRUE
  3069. conn.link_up.link_type = p_data->acl_change.transport;
  3070. bta_dm_cb.device_list.peer_device[i].transport = p_data->acl_change.transport;
  3071. #endif
  3072. if (((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
  3073. ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p))) {
  3074. /* both local and remote devices support SSR */
  3075. bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR;
  3076. }
  3077. APPL_TRACE_DEBUG("%s info: 0x%x", __func__, bta_dm_cb.device_list.peer_device[i].info);
  3078. if (bta_dm_cb.p_sec_cback) {
  3079. conn.link_up.sc_downgrade = p_data->acl_change.sc_downgrade;
  3080. bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, (tBTA_DM_SEC *)&conn);
  3081. }
  3082. } else {
  3083. for (i = 0; i < bta_dm_cb.device_list.count; i++) {
  3084. if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
  3085. #if BLE_INCLUDED == TRUE
  3086. || bta_dm_cb.device_list.peer_device[i].transport != p_data->acl_change.transport
  3087. #endif
  3088. ) {
  3089. continue;
  3090. }
  3091. if ( bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING ) {
  3092. if (BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr, bta_dm_cb.device_list.peer_device[i].transport)) {
  3093. issue_unpair_cb = TRUE;
  3094. }
  3095. APPL_TRACE_DEBUG("%s: Unpairing: issue unpair CB = %d ", __FUNCTION__, issue_unpair_cb);
  3096. }
  3097. conn.link_down.is_removed = bta_dm_cb.device_list.peer_device[i].remove_dev_pending;
  3098. for (; i < bta_dm_cb.device_list.count ; i++) {
  3099. memcpy(&bta_dm_cb.device_list.peer_device[i], &bta_dm_cb.device_list.peer_device[i + 1], sizeof(bta_dm_cb.device_list.peer_device[i]));
  3100. }
  3101. break;
  3102. }
  3103. if (bta_dm_cb.device_list.count) {
  3104. bta_dm_cb.device_list.count--;
  3105. }
  3106. #if BLE_INCLUDED == TRUE
  3107. if ((p_data->acl_change.transport == BT_TRANSPORT_LE) &&
  3108. (bta_dm_cb.device_list.le_count)) {
  3109. bta_dm_cb.device_list.le_count--;
  3110. }
  3111. conn.link_down.link_type = p_data->acl_change.transport;
  3112. #endif
  3113. if (bta_dm_search_cb.wait_disc && !bdcmp(bta_dm_search_cb.peer_bdaddr, p_bda)) {
  3114. bta_dm_search_cb.wait_disc = FALSE;
  3115. if (bta_dm_search_cb.sdp_results) {
  3116. APPL_TRACE_EVENT(" timer stopped ");
  3117. bta_sys_stop_timer(&bta_dm_search_cb.search_timer);
  3118. bta_dm_discover_next_device();
  3119. }
  3120. }
  3121. if (bta_dm_cb.disabling) {
  3122. if (!BTM_GetNumAclLinks()) {
  3123. bta_sys_stop_timer(&bta_dm_cb.disable_timer);
  3124. bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK *)&bta_dm_disable_conn_down_timer_cback;
  3125. /*
  3126. * Start a timer to make sure that the profiles
  3127. * get the disconnect event.
  3128. */
  3129. bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1000);
  3130. }
  3131. }
  3132. if (conn.link_down.is_removed) {
  3133. BTM_SecDeleteDevice(p_bda, p_data->acl_change.transport);
  3134. #if (BLE_INCLUDED == TRUE && GATTC_INCLUDED == TRUE)
  3135. /* need to remove all pending background connection */
  3136. BTA_GATTC_CancelOpen(0, p_bda, FALSE);
  3137. /* remove all cached GATT information */
  3138. BTA_GATTC_Refresh(p_bda, false);
  3139. #endif
  3140. }
  3141. bdcpy(conn.link_down.bd_addr, p_bda);
  3142. conn.link_down.reason = (UINT8) btm_get_acl_disc_reason_code();
  3143. if ( bta_dm_cb.p_sec_cback ) {
  3144. bta_dm_cb.p_sec_cback(BTA_DM_LINK_DOWN_EVT, &conn);
  3145. if ( issue_unpair_cb ) {
  3146. if (p_data->acl_change.transport == BT_TRANSPORT_LE) {
  3147. bta_dm_cb.p_sec_cback(BTA_DM_BLE_DEV_UNPAIRED_EVT, &conn);
  3148. } else {
  3149. bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn);
  3150. }
  3151. }
  3152. }
  3153. }
  3154. bta_dm_adjust_roles(TRUE);
  3155. }
  3156. /*******************************************************************************
  3157. **
  3158. ** Function bta_dm_disable_conn_down_timer_cback
  3159. **
  3160. ** Description Sends disable event to application
  3161. **
  3162. **
  3163. ** Returns void
  3164. **
  3165. *******************************************************************************/
  3166. static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle)
  3167. {
  3168. UNUSED(p_tle);
  3169. tBTA_SYS_HW_MSG *sys_enable_event;
  3170. #if (BTA_DM_PM_INCLUDED == TRUE)
  3171. /* disable the power managment module */
  3172. bta_dm_disable_pm();
  3173. #endif /* #if (BTA_DM_PM_INCLUDED == TRUE) */
  3174. /* register our callback to SYS HW manager */
  3175. bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
  3176. /* send a message to BTA SYS */
  3177. if ((sys_enable_event = (tBTA_SYS_HW_MSG *) osi_malloc(sizeof(tBTA_SYS_HW_MSG))) != NULL) {
  3178. sys_enable_event->hdr.event = BTA_SYS_API_DISABLE_EVT;
  3179. sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
  3180. bta_sys_sendmsg(sys_enable_event);
  3181. }
  3182. bta_dm_cb.disabling = FALSE;
  3183. }
  3184. /*******************************************************************************
  3185. **
  3186. ** Function bta_dm_rm_cback
  3187. **
  3188. ** Description Role management callback from sys
  3189. **
  3190. **
  3191. ** Returns void
  3192. **
  3193. *******************************************************************************/
  3194. static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
  3195. {
  3196. UINT8 j;
  3197. tBTA_PREF_ROLES role;
  3198. tBTA_DM_PEER_DEVICE *p_dev;
  3199. p_dev = bta_dm_find_peer_device(peer_addr);
  3200. if ( status == BTA_SYS_CONN_OPEN) {
  3201. if (p_dev) {
  3202. /* Do not set to connected if we are in the middle of unpairing. When AV stream is
  3203. * started it fakes out a SYS_CONN_OPEN to potentially trigger a role switch command.
  3204. * But this should not be done if we are in the middle of unpairing.
  3205. */
  3206. if (p_dev->conn_state != BTA_DM_UNPAIRING) {
  3207. p_dev->conn_state = BTA_DM_CONNECTED;
  3208. }
  3209. for (j = 1; j <= p_bta_dm_rm_cfg[0].app_id; j++) {
  3210. if (((p_bta_dm_rm_cfg[j].app_id == app_id) || (p_bta_dm_rm_cfg[j].app_id == BTA_ALL_APP_ID))
  3211. && (p_bta_dm_rm_cfg[j].id == id)) {
  3212. role = p_bta_dm_rm_cfg[j].cfg;
  3213. if (role > p_dev->pref_role ) {
  3214. p_dev->pref_role = role;
  3215. }
  3216. break;
  3217. }
  3218. }
  3219. }
  3220. }
  3221. if ((BTA_ID_AV == id) || (BTA_ID_AVK == id)) {
  3222. if ( status == BTA_SYS_CONN_BUSY) {
  3223. if (p_dev) {
  3224. p_dev->info |= BTA_DM_DI_AV_ACTIVE;
  3225. }
  3226. /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */
  3227. if (BTA_ID_AV == id) {
  3228. bta_dm_cb.cur_av_count = bta_dm_get_av_count();
  3229. }
  3230. } else if ( status == BTA_SYS_CONN_IDLE) {
  3231. if (p_dev) {
  3232. p_dev->info &= ~BTA_DM_DI_AV_ACTIVE;
  3233. }
  3234. /* get cur_av_count from connected services */
  3235. if (BTA_ID_AV == id) {
  3236. bta_dm_cb.cur_av_count = bta_dm_get_av_count();
  3237. }
  3238. }
  3239. APPL_TRACE_EVENT("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count, status);
  3240. }
  3241. /* Don't adjust roles for each busy/idle state transition to avoid
  3242. excessive switch requests when individual profile busy/idle status
  3243. changes */
  3244. if ((status != BTA_SYS_CONN_BUSY) && (status != BTA_SYS_CONN_IDLE)) {
  3245. bta_dm_adjust_roles(FALSE);
  3246. }
  3247. }
  3248. /*******************************************************************************
  3249. **
  3250. ** Function bta_dm_delay_role_switch_cback
  3251. **
  3252. ** Description Callback from btm to delay a role switch
  3253. **
  3254. ** Returns void
  3255. **
  3256. *******************************************************************************/
  3257. static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle)
  3258. {
  3259. UNUSED(p_tle);
  3260. APPL_TRACE_EVENT("bta_dm_delay_role_switch_cback: initiating Delayed RS");
  3261. bta_dm_adjust_roles (FALSE);
  3262. }
  3263. /*******************************************************************************
  3264. **
  3265. ** Function bta_dm_remove_sec_dev_entry
  3266. **
  3267. ** Description Removes device entry from Security device DB if ACL connection with
  3268. ** remtoe device does not exist, else schedule for dev entry removal upon
  3269. ACL close
  3270. **
  3271. ** Returns void
  3272. **
  3273. *******************************************************************************/
  3274. #if (SMP_INCLUDED == TRUE)
  3275. static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr)
  3276. {
  3277. UINT16 index = 0;
  3278. if ( BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_LE) ||
  3279. BTM_IsAclConnectionUp(remote_bd_addr, BT_TRANSPORT_BR_EDR)) {
  3280. APPL_TRACE_DEBUG("%s ACL is not down. Schedule for Dev Removal when ACL closes",
  3281. __FUNCTION__);
  3282. BTM_SecClearSecurityFlags (remote_bd_addr);
  3283. for (index = 0; index < bta_dm_cb.device_list.count; index ++) {
  3284. if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, remote_bd_addr)) {
  3285. break;
  3286. }
  3287. }
  3288. if (index != bta_dm_cb.device_list.count) {
  3289. bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
  3290. } else {
  3291. APPL_TRACE_ERROR(" %s Device does not exist in DB", __FUNCTION__);
  3292. }
  3293. } else {
  3294. BTM_SecDeleteDevice (remote_bd_addr, bta_dm_cb.device_list.peer_device[index].transport);
  3295. #if (BLE_INCLUDED == TRUE && GATTC_INCLUDED == TRUE)
  3296. /* need to remove all pending background connection */
  3297. BTA_GATTC_CancelOpen(0, remote_bd_addr, FALSE);
  3298. /* remove all cached GATT information */
  3299. BTA_GATTC_Refresh(remote_bd_addr, false);
  3300. #endif
  3301. }
  3302. }
  3303. #endif ///SMP_INCLUDED == TRUE
  3304. /*******************************************************************************
  3305. **
  3306. ** Function bta_dm_adjust_roles
  3307. **
  3308. ** Description Adjust roles
  3309. **
  3310. **
  3311. ** Returns void
  3312. **
  3313. *******************************************************************************/
  3314. static void bta_dm_adjust_roles(BOOLEAN delay_role_switch)
  3315. {
  3316. UINT8 i;
  3317. BOOLEAN set_master_role = FALSE;
  3318. #if BLE_INCLUDED == TRUE
  3319. UINT8 br_count = bta_dm_cb.device_list.count - bta_dm_cb.device_list.le_count;
  3320. #else
  3321. UINT8 br_count = bta_dm_cb.device_list.count;
  3322. #endif
  3323. if (br_count) {
  3324. /* the configuration is no scatternet
  3325. * or AV connection exists and there are more than one ACL link */
  3326. if ( (p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) ||
  3327. (bta_dm_cb.cur_av_count && br_count > 1) ) {
  3328. L2CA_SetDesireRole (HCI_ROLE_MASTER);
  3329. set_master_role = TRUE;
  3330. }
  3331. for (i = 0; i < bta_dm_cb.device_list.count; i++) {
  3332. if (bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED
  3333. #if BLE_INCLUDED == TRUE
  3334. && bta_dm_cb.device_list.peer_device[i].transport == BT_TRANSPORT_BR_EDR
  3335. #endif
  3336. ) {
  3337. if (!set_master_role && (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_ANY_ROLE)
  3338. && (p_bta_dm_rm_cfg[0].cfg == BTA_DM_PARTIAL_SCATTERNET)) {
  3339. L2CA_SetDesireRole (HCI_ROLE_MASTER);
  3340. set_master_role = TRUE;
  3341. }
  3342. if ((bta_dm_cb.device_list.peer_device[i].pref_role == BTA_MASTER_ROLE_ONLY)
  3343. || (br_count > 1)) {
  3344. /* Initiating immediate role switch with certain remote devices
  3345. has caused issues due to role switch colliding with link encryption setup and
  3346. causing encryption (and in turn the link) to fail . These device . Firmware
  3347. versions are stored in a blacklist and role switch with these devices are
  3348. delayed to avoid the collision with link encryption setup */
  3349. if (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_SLAVE_ROLE_ONLY &&
  3350. delay_role_switch == FALSE) {
  3351. BTM_SwitchRole (bta_dm_cb.device_list.peer_device[i].peer_bdaddr,
  3352. HCI_ROLE_MASTER, NULL);
  3353. } else {
  3354. bta_dm_cb.switch_delay_timer[i].p_cback =
  3355. (TIMER_CBACK *)&bta_dm_delay_role_switch_cback;
  3356. bta_sys_start_timer(&bta_dm_cb.switch_delay_timer[i], 0, 500);
  3357. }
  3358. }
  3359. }
  3360. }
  3361. if (!set_master_role) {
  3362. L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
  3363. }
  3364. } else {
  3365. L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
  3366. }
  3367. }
  3368. /*******************************************************************************
  3369. **
  3370. ** Function bta_dm_get_remname
  3371. **
  3372. ** Description Returns a pointer to the remote name stored in the DM control
  3373. ** block if it exists, or from the BTM memory.
  3374. **
  3375. ** Returns char * - Pointer to the remote device name
  3376. *******************************************************************************/
  3377. #if (SDP_INCLUDED == TRUE || SMP_INCLUDED == TRUE)
  3378. static char *bta_dm_get_remname(void)
  3379. {
  3380. char *p_name = (char *)bta_dm_search_cb.peer_name;
  3381. char *p_temp;
  3382. /* If the name isn't already stored, try retrieving from BTM */
  3383. if (*p_name == '\0') {
  3384. if ((p_temp = BTM_SecReadDevName(bta_dm_search_cb.peer_bdaddr)) != NULL) {
  3385. p_name = p_temp;
  3386. }
  3387. }
  3388. return p_name;
  3389. }
  3390. #endif ///SDP_INCLUDED == TRUE || SMP_INCLUDED == TRUE
  3391. /*******************************************************************************
  3392. **
  3393. ** Function bta_dm_bond_cancel_complete_cback
  3394. **
  3395. ** Description Authentication complete callback from BTM
  3396. **
  3397. ** Returns void
  3398. **
  3399. *******************************************************************************/
  3400. #if (SMP_INCLUDED == TRUE)
  3401. static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result)
  3402. {
  3403. tBTA_DM_SEC sec_event;
  3404. if (result == BTM_SUCCESS) {
  3405. sec_event.bond_cancel_cmpl.result = BTA_SUCCESS;
  3406. } else {
  3407. sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
  3408. }
  3409. if (bta_dm_cb.p_sec_cback) {
  3410. bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
  3411. }
  3412. }
  3413. #endif ///SMP_INCLUDED == TRUE
  3414. /*******************************************************************************
  3415. **
  3416. ** Function bta_dm_set_eir
  3417. **
  3418. ** Description This function creates EIR tagged data and writes it to controller.
  3419. **
  3420. ** Returns None
  3421. **
  3422. *******************************************************************************/
  3423. static void bta_dm_set_eir (char *local_name)
  3424. {
  3425. BT_HDR *p_buf;
  3426. UINT8 *p;
  3427. UINT8 *p_length;
  3428. #if (BTA_EIR_CANNED_UUID_LIST != TRUE)
  3429. UINT8 *p_type;
  3430. UINT8 max_num_uuid;
  3431. #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
  3432. UINT8 custom_uuid_idx;
  3433. #endif // BTA_EIR_SERVER_NUM_CUSTOM_UUID
  3434. #endif // BTA_EIR_CANNED_UUID_LIST
  3435. UINT8 free_eir_length;
  3436. if (p_bta_dm_eir_cfg->bta_dm_eir_fec_required) {
  3437. free_eir_length = HCI_DM5_PACKET_SIZE;
  3438. } else {
  3439. free_eir_length = HCI_EXT_INQ_RESPONSE_LEN;
  3440. }
  3441. UINT8 num_uuid;
  3442. UINT8 data_type;
  3443. UINT8 local_name_len;
  3444. UINT8 eir_type[BTM_EIR_TYPE_MAX_NUM];
  3445. UINT8 eir_type_num = 0;
  3446. tBTA_STATUS status = BTA_SUCCESS;
  3447. /* wait until complete to disable */
  3448. if (bta_dm_cb.disable_timer.in_use) {
  3449. if (p_bta_dm_eir_cfg->config_eir_callback) {
  3450. p_bta_dm_eir_cfg->config_eir_callback(BTA_WRONG_MODE, eir_type_num , eir_type);
  3451. }
  3452. return;
  3453. }
  3454. #if ( BTA_EIR_CANNED_UUID_LIST != TRUE )
  3455. /* wait until App is ready */
  3456. if (bta_dm_cb.app_ready_timer.in_use) {
  3457. if (p_bta_dm_eir_cfg->config_eir_callback) {
  3458. p_bta_dm_eir_cfg->config_eir_callback(BTA_WRONG_MODE, eir_type_num , eir_type);
  3459. }
  3460. return;
  3461. }
  3462. /* if local name is not provided, get it from controller */
  3463. if ( local_name == NULL ) {
  3464. if ( BTM_ReadLocalDeviceName( &local_name ) != BTM_SUCCESS ) {
  3465. APPL_TRACE_ERROR("Fail to read local device name for EIR");
  3466. }
  3467. }
  3468. #endif // BTA_EIR_CANNED_UUID_LIST
  3469. /* Allocate a buffer to hold HCI command */
  3470. if ((p_buf = (BT_HDR *)osi_malloc(BTM_CMD_BUF_SIZE)) == NULL) {
  3471. APPL_TRACE_ERROR("bta_dm_set_eir couldn't allocate buffer");
  3472. if (p_bta_dm_eir_cfg->config_eir_callback) {
  3473. p_bta_dm_eir_cfg->config_eir_callback(BTA_NO_RESOURCES, eir_type_num , eir_type);
  3474. }
  3475. return;
  3476. }
  3477. p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET;
  3478. memset(p, 0x00, HCI_EXT_INQ_RESPONSE_LEN );
  3479. APPL_TRACE_DEBUG("BTA is generating EIR");
  3480. if ( local_name ) {
  3481. local_name_len = strlen( local_name );
  3482. } else {
  3483. local_name_len = 0;
  3484. }
  3485. data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
  3486. /* if local name is longer than minimum length of shortened name */
  3487. /* check whether it needs to be shortened or not */
  3488. if ( local_name_len > p_bta_dm_eir_cfg->bta_dm_eir_min_name_len ) {
  3489. /* get number of UUID 16-bit list */
  3490. #if (BTA_EIR_CANNED_UUID_LIST == TRUE)
  3491. num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16;
  3492. #else // BTA_EIR_CANNED_UUID_LIST
  3493. max_num_uuid = (free_eir_length - 2) / LEN_UUID_16;
  3494. data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p,
  3495. max_num_uuid, &num_uuid );
  3496. p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET; /* reset p */
  3497. #endif // BTA_EIR_CANNED_UUID_LIST
  3498. /* if UUID doesn't fit remaing space, shorten local name */
  3499. if ( local_name_len > (free_eir_length - 4 - num_uuid * LEN_UUID_16)) {
  3500. APPL_TRACE_WARNING("BTA EIR: local name is shortened");
  3501. local_name_len = p_bta_dm_eir_cfg->bta_dm_eir_min_name_len;
  3502. data_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
  3503. } else {
  3504. data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
  3505. }
  3506. }
  3507. UINT8_TO_STREAM(p, local_name_len + 1);
  3508. UINT8_TO_STREAM(p, data_type);
  3509. eir_type[eir_type_num++] = data_type;
  3510. if (local_name != NULL) {
  3511. memcpy(p, local_name, local_name_len);
  3512. p += local_name_len;
  3513. }
  3514. free_eir_length -= local_name_len + 2;
  3515. /* if UUIDs are provided in configuration */
  3516. if (p_bta_dm_eir_cfg->bta_dm_eir_included_uuid) {
  3517. #if (BTA_EIR_CANNED_UUID_LIST == TRUE)
  3518. /* if UUID list is provided as static data in configuration */
  3519. if (( p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len > 0 )
  3520. && (p_bta_dm_eir_cfg->bta_dm_eir_uuid16)) {
  3521. if ( free_eir_length > LEN_UUID_16 + 2) {
  3522. free_eir_length -= 2;
  3523. if ( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len) {
  3524. num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16;
  3525. data_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE;
  3526. } else { /* not enough room for all UUIDs */
  3527. APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
  3528. num_uuid = free_eir_length / LEN_UUID_16;
  3529. data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
  3530. }
  3531. UINT8_TO_STREAM(p, num_uuid * LEN_UUID_16 + 1);
  3532. UINT8_TO_STREAM(p, data_type);
  3533. eir_type[eir_type_num++] = data_type;
  3534. memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_uuid16, num_uuid * LEN_UUID_16 );
  3535. p += num_uuid * LEN_UUID_16;
  3536. free_eir_length -= num_uuid * LEN_UUID_16;
  3537. } else {
  3538. status = BTA_EIR_TOO_LARGE;
  3539. }
  3540. }
  3541. #else /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
  3542. /* if UUID list is dynamic */
  3543. if ( free_eir_length >= 2) {
  3544. p_length = p++;
  3545. p_type = p++;
  3546. num_uuid = 0;
  3547. max_num_uuid = (free_eir_length - 2) / LEN_UUID_16;
  3548. data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p, max_num_uuid, &num_uuid );
  3549. if ( data_type == BTM_EIR_MORE_16BITS_UUID_TYPE ) {
  3550. APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
  3551. }
  3552. #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
  3553. else {
  3554. for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) {
  3555. if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_16) {
  3556. if ( num_uuid < max_num_uuid ) {
  3557. UINT16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid16);
  3558. num_uuid++;
  3559. } else {
  3560. data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
  3561. APPL_TRACE_WARNING("BTA EIR: UUID 16-bit list is truncated");
  3562. break;
  3563. }
  3564. }
  3565. }
  3566. }
  3567. #endif /* (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
  3568. UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_16 + 1);
  3569. UINT8_TO_STREAM(p_type, data_type);
  3570. eir_type[eir_type_num++] = data_type;
  3571. free_eir_length -= num_uuid * LEN_UUID_16 + 2;
  3572. } else {
  3573. status = BTA_EIR_TOO_LARGE;
  3574. }
  3575. #endif /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
  3576. #if ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
  3577. /* Adding 32-bit UUID list */
  3578. if ( free_eir_length >= 2) {
  3579. p_length = p++;
  3580. p_type = p++;
  3581. num_uuid = 0;
  3582. data_type = BTM_EIR_COMPLETE_32BITS_UUID_TYPE;
  3583. max_num_uuid = (free_eir_length - 2) / LEN_UUID_32;
  3584. for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) {
  3585. if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_32) {
  3586. if ( num_uuid < max_num_uuid ) {
  3587. UINT32_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid32);
  3588. num_uuid++;
  3589. } else {
  3590. data_type = BTM_EIR_MORE_32BITS_UUID_TYPE;
  3591. APPL_TRACE_WARNING("BTA EIR: UUID 32-bit list is truncated");
  3592. break;
  3593. }
  3594. }
  3595. }
  3596. UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_32 + 1);
  3597. UINT8_TO_STREAM(p_type, data_type);
  3598. eir_type[eir_type_num++] = data_type;
  3599. free_eir_length -= num_uuid * LEN_UUID_32 + 2;
  3600. } else {
  3601. status = BTA_EIR_TOO_LARGE;
  3602. }
  3603. /* Adding 128-bit UUID list */
  3604. if ( free_eir_length >= 2) {
  3605. p_length = p++;
  3606. p_type = p++;
  3607. num_uuid = 0;
  3608. data_type = BTM_EIR_COMPLETE_128BITS_UUID_TYPE;
  3609. max_num_uuid = (free_eir_length - 2) / LEN_UUID_128;
  3610. for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++) {
  3611. if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_128) {
  3612. if ( num_uuid < max_num_uuid ) {
  3613. ARRAY16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid128);
  3614. num_uuid++;
  3615. } else {
  3616. data_type = BTM_EIR_MORE_128BITS_UUID_TYPE;
  3617. APPL_TRACE_WARNING("BTA EIR: UUID 128-bit list is truncated");
  3618. break;
  3619. }
  3620. }
  3621. }
  3622. UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_128 + 1);
  3623. UINT8_TO_STREAM(p_type, data_type);
  3624. eir_type[eir_type_num++] = data_type;
  3625. free_eir_length -= num_uuid * LEN_UUID_128 + 2;
  3626. }
  3627. else {
  3628. status = BTA_EIR_TOO_LARGE;
  3629. }
  3630. #endif /* ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
  3631. }
  3632. /* if Flags are provided in configuration */
  3633. if ( p_bta_dm_eir_cfg->bta_dm_eir_flags != 0 ) {
  3634. if ( free_eir_length >= 3 ) {
  3635. UINT8_TO_STREAM(p, 2);
  3636. UINT8_TO_STREAM(p, BTM_EIR_FLAGS_TYPE);
  3637. eir_type[eir_type_num++] = BTM_EIR_FLAGS_TYPE;
  3638. UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_flags);
  3639. free_eir_length -= 3;
  3640. } else {
  3641. status = BTA_EIR_TOO_LARGE;
  3642. }
  3643. }
  3644. /* if Manufacturer Specific are provided in configuration */
  3645. if (( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len > 0 )
  3646. && ( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec )) {
  3647. if ( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2) {
  3648. p_length = p;
  3649. UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 1);
  3650. UINT8_TO_STREAM(p, BTM_EIR_MANUFACTURER_SPECIFIC_TYPE);
  3651. eir_type[eir_type_num++] = BTM_EIR_MANUFACTURER_SPECIFIC_TYPE;
  3652. memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec,
  3653. p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len);
  3654. p += p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len;
  3655. free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2;
  3656. } else {
  3657. status = BTA_EIR_TOO_LARGE;
  3658. }
  3659. } else {
  3660. p_length = NULL;
  3661. }
  3662. /* if Inquiry Tx Resp Power compiled */
  3663. if (p_bta_dm_eir_cfg->bta_dm_eir_included_tx_power) {
  3664. if (free_eir_length >= 3) {
  3665. int min_power_level, max_power_level;
  3666. if (bredr_txpwr_get(&min_power_level, &max_power_level) == 0) {
  3667. INT8 btm_tx_power[BTM_TX_POWER_LEVEL_MAX + 1] = BTM_TX_POWER;
  3668. p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power = btm_tx_power[max_power_level];
  3669. UINT8_TO_STREAM(p, 2); /* Length field */
  3670. UINT8_TO_STREAM(p, BTM_EIR_TX_POWER_LEVEL_TYPE);
  3671. eir_type[eir_type_num++] = BTM_EIR_TX_POWER_LEVEL_TYPE;
  3672. UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power);
  3673. free_eir_length -= 3;
  3674. }
  3675. } else {
  3676. status = BTA_EIR_TOO_LARGE;
  3677. }
  3678. }
  3679. /* if URL are provided in configuration */
  3680. if (( p_bta_dm_eir_cfg->bta_dm_eir_url_len > 0 )
  3681. && ( p_bta_dm_eir_cfg->bta_dm_eir_url )) {
  3682. if ( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_url_len + 2 ) {
  3683. UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_url_len + 1);
  3684. UINT8_TO_STREAM(p, BTM_EIR_URL_TYPE);
  3685. eir_type[eir_type_num++] = BTM_EIR_URL_TYPE;
  3686. memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_url,
  3687. p_bta_dm_eir_cfg->bta_dm_eir_url_len);
  3688. p += p_bta_dm_eir_cfg->bta_dm_eir_url_len;
  3689. free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_url_len + 2;
  3690. } else {
  3691. status = BTA_EIR_TOO_LARGE;
  3692. }
  3693. }
  3694. if ( free_eir_length ) {
  3695. UINT8_TO_STREAM(p, 0); /* terminator of significant part */
  3696. }
  3697. tBTM_STATUS btm_status = BTM_WriteEIR( p_buf, p_bta_dm_eir_cfg->bta_dm_eir_fec_required );
  3698. if ( btm_status == BTM_MODE_UNSUPPORTED) {
  3699. status = BTA_WRONG_MODE;
  3700. } else if (btm_status != BTM_SUCCESS) {
  3701. status = BTA_FAILURE;
  3702. }
  3703. if (p_bta_dm_eir_cfg->config_eir_callback) {
  3704. p_bta_dm_eir_cfg->config_eir_callback(status, eir_type_num, eir_type);
  3705. }
  3706. }
  3707. /*******************************************************************************
  3708. **
  3709. ** Function bta_dm_eir_search_services
  3710. **
  3711. ** Description This function searches services in received EIR
  3712. **
  3713. ** Returns None
  3714. **
  3715. *******************************************************************************/
  3716. #if (SDP_INCLUDED == TRUE)
  3717. static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result,
  3718. tBTA_SERVICE_MASK *p_services_to_search,
  3719. tBTA_SERVICE_MASK *p_services_found)
  3720. {
  3721. tBTA_SERVICE_MASK service_index = 0;
  3722. tBTM_EIR_SEARCH_RESULT result;
  3723. APPL_TRACE_DEBUG("BTA searching services in EIR of BDA:0x%02X%02X%02X%02X%02X%02X",
  3724. p_result->remote_bd_addr[0], p_result->remote_bd_addr[1],
  3725. p_result->remote_bd_addr[2], p_result->remote_bd_addr[3],
  3726. p_result->remote_bd_addr[4], p_result->remote_bd_addr[5]);
  3727. APPL_TRACE_DEBUG(" with services_to_search=0x%08X", *p_services_to_search);
  3728. #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
  3729. /* always do GATT based service discovery by SDP instead of from EIR */
  3730. /* if GATT based service is also to be put in EIR, need to modify this */
  3731. while (service_index < (BTA_MAX_SERVICE_ID - 1))
  3732. #else
  3733. while (service_index < BTA_MAX_SERVICE_ID)
  3734. #endif
  3735. {
  3736. if ( *p_services_to_search
  3737. & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index))) {
  3738. result = BTM_HasInquiryEirService( p_result,
  3739. bta_service_id_to_uuid_lkup_tbl[service_index] );
  3740. /* Searching for HSP v1.2 only device */
  3741. if ((result != BTM_EIR_FOUND) &&
  3742. (bta_service_id_to_uuid_lkup_tbl[service_index] == UUID_SERVCLASS_HEADSET)) {
  3743. result = BTM_HasInquiryEirService (p_result, UUID_SERVCLASS_HEADSET_HS);
  3744. }
  3745. if ( result == BTM_EIR_FOUND ) {
  3746. /* If Plug and Play service record, need to check to see if Broadcom stack */
  3747. /* However, EIR data doesn't have EXT_BRCM_VERSION so just skip it */
  3748. if ( bta_service_id_to_uuid_lkup_tbl[service_index]
  3749. != UUID_SERVCLASS_PNP_INFORMATION ) {
  3750. *p_services_found |=
  3751. (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index));
  3752. /* remove the service from services to be searched */
  3753. *p_services_to_search &=
  3754. (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
  3755. }
  3756. } else if ( result == BTM_EIR_NOT_FOUND ) {
  3757. /* remove the service from services to be searched */
  3758. *p_services_to_search &=
  3759. (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
  3760. }
  3761. }
  3762. service_index++;
  3763. }
  3764. APPL_TRACE_ERROR("BTA EIR search result, services_to_search=0x%08X, services_found=0x%08X",
  3765. *p_services_to_search, *p_services_found);
  3766. }
  3767. #endif ///SDP_INCLUDED == TRUE
  3768. #if (BTA_EIR_CANNED_UUID_LIST != TRUE)
  3769. /*******************************************************************************
  3770. **
  3771. ** Function bta_dm_eir_update_uuid
  3772. **
  3773. ** Description This function adds or removes service UUID in EIR database.
  3774. **
  3775. ** Returns None
  3776. **
  3777. *******************************************************************************/
  3778. void bta_dm_eir_update_uuid(UINT16 uuid16, BOOLEAN adding)
  3779. {
  3780. /* if this UUID is not advertised in EIR */
  3781. if ( !BTM_HasEirService( p_bta_dm_eir_cfg->uuid_mask, uuid16 )) {
  3782. return;
  3783. }
  3784. if ( adding ) {
  3785. APPL_TRACE_EVENT("Adding UUID=0x%04X into EIR", uuid16);
  3786. BTM_AddEirService( bta_dm_cb.eir_uuid, uuid16 );
  3787. } else {
  3788. APPL_TRACE_EVENT("Removing UUID=0x%04X from EIR", uuid16);
  3789. BTM_RemoveEirService( bta_dm_cb.eir_uuid, uuid16 );
  3790. }
  3791. bta_dm_set_eir (NULL);
  3792. APPL_TRACE_EVENT("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X",
  3793. bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0] );
  3794. }
  3795. #endif
  3796. /*******************************************************************************
  3797. **
  3798. ** Function bta_dm_enable_test_mode
  3799. **
  3800. ** Description enable test mode
  3801. **
  3802. **
  3803. ** Returns void
  3804. **
  3805. *******************************************************************************/
  3806. void bta_dm_enable_test_mode(tBTA_DM_MSG *p_data)
  3807. {
  3808. UNUSED(p_data);
  3809. BTM_EnableTestMode();
  3810. }
  3811. /*******************************************************************************
  3812. **
  3813. ** Function bta_dm_disable_test_mode
  3814. **
  3815. ** Description disable test mode
  3816. **
  3817. **
  3818. ** Returns void
  3819. **
  3820. *******************************************************************************/
  3821. void bta_dm_disable_test_mode(tBTA_DM_MSG *p_data)
  3822. {
  3823. UNUSED(p_data);
  3824. BTM_DeviceReset(NULL);
  3825. }
  3826. /*******************************************************************************
  3827. **
  3828. ** Function bta_dm_execute_callback
  3829. **
  3830. ** Description Just execute a generic call back in the context of the BTU/BTA tack
  3831. **
  3832. **
  3833. ** Returns void
  3834. **
  3835. *******************************************************************************/
  3836. void bta_dm_execute_callback(tBTA_DM_MSG *p_data)
  3837. {
  3838. /* sanity check */
  3839. if (p_data->exec_cback.p_exec_cback == NULL) {
  3840. return;
  3841. }
  3842. p_data->exec_cback.p_exec_cback(p_data->exec_cback.p_param);
  3843. }
  3844. /*******************************************************************************
  3845. **
  3846. ** Function bta_dm_encrypt_cback
  3847. **
  3848. ** Description link encryption complete callback.
  3849. **
  3850. ** Returns None
  3851. **
  3852. *******************************************************************************/
  3853. void bta_dm_encrypt_cback(BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, tBTM_STATUS result)
  3854. {
  3855. tBTA_STATUS bta_status = BTA_SUCCESS;
  3856. tBTA_DM_ENCRYPT_CBACK *p_callback = NULL;
  3857. UINT8 i ;
  3858. UNUSED(p_ref_data);
  3859. for (i = 0; i < bta_dm_cb.device_list.count; i++) {
  3860. if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, bd_addr) == 0 &&
  3861. bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED) {
  3862. break;
  3863. }
  3864. }
  3865. if (i < bta_dm_cb.device_list.count) {
  3866. p_callback = bta_dm_cb.device_list.peer_device[i].p_encrypt_cback;
  3867. bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = NULL;
  3868. }
  3869. switch (result) {
  3870. case BTM_SUCCESS:
  3871. break;
  3872. case BTM_WRONG_MODE:
  3873. bta_status = BTA_WRONG_MODE;
  3874. break;
  3875. case BTM_NO_RESOURCES:
  3876. bta_status = BTA_NO_RESOURCES;
  3877. break;
  3878. case BTM_BUSY:
  3879. bta_status = BTA_BUSY;
  3880. break;
  3881. default:
  3882. bta_status = BTA_FAILURE;
  3883. break;
  3884. }
  3885. APPL_TRACE_DEBUG("bta_dm_encrypt_cback status =%d p_callback=%p", bta_status, p_callback);
  3886. if (p_callback) {
  3887. (*p_callback)(bd_addr, transport, bta_status);
  3888. }
  3889. }
  3890. /*******************************************************************************
  3891. **
  3892. ** Function bta_dm_set_encryption
  3893. **
  3894. ** Description This function to encrypt the link
  3895. **
  3896. ** Returns None
  3897. **
  3898. *******************************************************************************/
  3899. #if (SMP_INCLUDED == TRUE)
  3900. void bta_dm_set_encryption (tBTA_DM_MSG *p_data)
  3901. {
  3902. UINT8 i ;
  3903. APPL_TRACE_DEBUG("bta_dm_set_encryption\n"); //todo
  3904. if (!p_data->set_encryption.p_callback) {
  3905. APPL_TRACE_ERROR("bta_dm_set_encryption callback is not provided\n");
  3906. return;
  3907. }
  3908. for (i = 0; i < bta_dm_cb.device_list.count; i++) {
  3909. if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_data->set_encryption.bd_addr) == 0 &&
  3910. bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED) {
  3911. break;
  3912. }
  3913. }
  3914. if (i < bta_dm_cb.device_list.count) {
  3915. if (bta_dm_cb.device_list.peer_device[i].p_encrypt_cback) {
  3916. APPL_TRACE_ERROR("earlier enc was not done for same device\n");
  3917. (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr,
  3918. p_data->set_encryption.transport,
  3919. BTA_BUSY);
  3920. return;
  3921. }
  3922. if (BTM_SetEncryption(p_data->set_encryption.bd_addr, p_data->set_encryption.transport,
  3923. bta_dm_encrypt_cback, &p_data->set_encryption.sec_act)
  3924. == BTM_CMD_STARTED) {
  3925. bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = p_data->set_encryption.p_callback;
  3926. }
  3927. }else{
  3928. APPL_TRACE_ERROR("%s, not find peer_bdaddr or peer_bdaddr connection state error", __func__);
  3929. }
  3930. }
  3931. #endif ///SMP_INCLUDED == TRUE
  3932. #if (BLE_INCLUDED == TRUE)
  3933. /*******************************************************************************
  3934. **
  3935. ** Function bta_dm_observe_results_cb
  3936. **
  3937. ** Description Callback for BLE Observe result
  3938. **
  3939. **
  3940. ** Returns void
  3941. **
  3942. *******************************************************************************/
  3943. static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
  3944. {
  3945. tBTA_DM_SEARCH result;
  3946. tBTM_INQ_INFO *p_inq_info;
  3947. APPL_TRACE_DEBUG("bta_dm_observe_results_cb")
  3948. bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
  3949. result.inq_res.rssi = p_inq->rssi;
  3950. result.inq_res.ble_addr_type = p_inq->ble_addr_type;
  3951. result.inq_res.inq_result_type = p_inq->inq_result_type;
  3952. result.inq_res.device_type = p_inq->device_type;
  3953. result.inq_res.flag = p_inq->flag;
  3954. result.inq_res.adv_data_len = p_inq->adv_data_len;
  3955. result.inq_res.scan_rsp_len = p_inq->scan_rsp_len;
  3956. memcpy(result.inq_res.dev_class, p_inq->dev_class, sizeof(DEV_CLASS));
  3957. result.inq_res.ble_evt_type = p_inq->ble_evt_type;
  3958. /* application will parse EIR to find out remote device name */
  3959. result.inq_res.p_eir = p_eir;
  3960. if ((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL) {
  3961. /* initialize remt_name_not_required to FALSE so that we get the name by default */
  3962. result.inq_res.remt_name_not_required = FALSE;
  3963. }
  3964. if (bta_dm_search_cb.p_scan_cback) {
  3965. bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_RES_EVT, &result);
  3966. }
  3967. if (p_inq_info) {
  3968. /* application indicates if it knows the remote name, inside the callback
  3969. copy that to the inquiry data base*/
  3970. if (result.inq_res.remt_name_not_required) {
  3971. p_inq_info->appl_knows_rem_name = TRUE;
  3972. }
  3973. }
  3974. }
  3975. /*******************************************************************************
  3976. **
  3977. ** Function bta_dm_observe_cmpl_cb
  3978. **
  3979. ** Description Callback for BLE Observe complete
  3980. **
  3981. **
  3982. ** Returns void
  3983. **
  3984. *******************************************************************************/
  3985. static void bta_dm_observe_cmpl_cb (void *p_result)
  3986. {
  3987. tBTA_DM_SEARCH data;
  3988. APPL_TRACE_DEBUG("bta_dm_observe_cmpl_cb");
  3989. data.inq_cmpl.num_resps = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
  3990. if (bta_dm_search_cb.p_scan_cback) {
  3991. bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
  3992. }
  3993. }
  3994. /*******************************************************************************
  3995. **
  3996. ** Function bta_dm_observe_discard_cb
  3997. **
  3998. ** Description Callback for BLE Observe lost
  3999. **
  4000. **
  4001. ** Returns void
  4002. **
  4003. *******************************************************************************/
  4004. static void bta_dm_observe_discard_cb (uint32_t num_dis)
  4005. {
  4006. tBTA_DM_SEARCH data;
  4007. APPL_TRACE_DEBUG("bta_dm_observe_discard_cb");
  4008. data.inq_dis.num_dis = num_dis;
  4009. if (bta_dm_search_cb.p_scan_cback) {
  4010. bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_DISCARD_NUM_EVT, &data);
  4011. }
  4012. }
  4013. #if (SMP_INCLUDED == TRUE)
  4014. /*******************************************************************************
  4015. **
  4016. ** Function bta_dm_ble_smp_cback
  4017. **
  4018. ** Description Callback for BLE SMP
  4019. **
  4020. **
  4021. ** Returns void
  4022. **
  4023. *******************************************************************************/
  4024. static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data)
  4025. {
  4026. tBTM_STATUS status = BTM_SUCCESS;
  4027. tBTA_DM_SEC sec_event;
  4028. char *p_name = NULL;
  4029. if (!bta_dm_cb.p_sec_cback) {
  4030. return BTM_NOT_AUTHORIZED;
  4031. }
  4032. memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
  4033. switch (event) {
  4034. case BTM_LE_IO_REQ_EVT: {
  4035. // #if (BT_SSP_INCLUDED == TRUE)
  4036. bta_dm_co_ble_io_req(bda,
  4037. &p_data->io_req.io_cap,
  4038. &p_data->io_req.oob_data,
  4039. &p_data->io_req.auth_req,
  4040. &p_data->io_req.max_key_size,
  4041. &p_data->io_req.init_keys,
  4042. &p_data->io_req.resp_keys);
  4043. // #endif
  4044. #if BTM_OOB_INCLUDED == FALSE
  4045. status = BTM_SUCCESS;
  4046. #endif
  4047. APPL_TRACE_EVENT("io mitm: %d oob_data:%d\n", p_data->io_req.auth_req, p_data->io_req.oob_data);
  4048. break;
  4049. }
  4050. case BTM_LE_SEC_REQUEST_EVT:
  4051. bdcpy(sec_event.ble_req.bd_addr, bda);
  4052. p_name = BTM_SecReadDevName(bda);
  4053. if (p_name != NULL) {
  4054. BCM_STRNCPY_S((char *)sec_event.ble_req.bd_name,p_name, (BD_NAME_LEN));
  4055. } else {
  4056. sec_event.ble_req.bd_name[0] = 0;
  4057. }
  4058. sec_event.ble_req.bd_name[BD_NAME_LEN] = 0;
  4059. bta_dm_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event);
  4060. break;
  4061. case BTM_LE_KEY_NOTIF_EVT:
  4062. bdcpy(sec_event.key_notif.bd_addr, bda);
  4063. p_name = BTM_SecReadDevName(bda);
  4064. if (p_name != NULL) {
  4065. BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name, p_name, (BD_NAME_LEN));
  4066. } else {
  4067. sec_event.key_notif.bd_name[0] = 0;
  4068. }
  4069. sec_event.ble_req.bd_name[BD_NAME_LEN] = 0;
  4070. sec_event.key_notif.passkey = p_data->key_notif;
  4071. bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event);
  4072. break;
  4073. case BTM_LE_KEY_REQ_EVT:
  4074. bdcpy(sec_event.ble_req.bd_addr, bda);
  4075. bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_REQ_EVT, &sec_event);
  4076. break;
  4077. case BTM_LE_OOB_REQ_EVT:
  4078. bdcpy(sec_event.ble_req.bd_addr, bda);
  4079. bta_dm_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event);
  4080. break;
  4081. case BTM_LE_NC_REQ_EVT:
  4082. bdcpy(sec_event.key_notif.bd_addr, bda);
  4083. BCM_STRNCPY_S((char *)sec_event.key_notif.bd_name,bta_dm_get_remname(), (BD_NAME_LEN));
  4084. sec_event.ble_req.bd_name[BD_NAME_LEN] = 0;
  4085. sec_event.key_notif.passkey = p_data->key_notif;
  4086. bta_dm_cb.p_sec_cback(BTA_DM_BLE_NC_REQ_EVT, &sec_event);
  4087. break;
  4088. case BTM_LE_KEY_EVT:
  4089. bdcpy(sec_event.ble_key.bd_addr, bda);
  4090. sec_event.ble_key.key_type = p_data->key.key_type;
  4091. sec_event.ble_key.p_key_value = p_data->key.p_key_value;
  4092. bta_dm_cb.p_sec_cback(BTA_DM_BLE_KEY_EVT, &sec_event);
  4093. break;
  4094. case BTM_LE_COMPLT_EVT:
  4095. bdcpy(sec_event.auth_cmpl.bd_addr, bda);
  4096. #if BLE_INCLUDED == TRUE
  4097. BTM_ReadDevInfo(bda, &sec_event.auth_cmpl.dev_type, &sec_event.auth_cmpl.addr_type);
  4098. #endif
  4099. p_name = BTM_SecReadDevName(bda);
  4100. if (p_name != NULL) {
  4101. BCM_STRNCPY_S((char *)sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN));
  4102. } else {
  4103. sec_event.auth_cmpl.bd_name[0] = 0;
  4104. }
  4105. if (p_data->complt.reason != 0) {
  4106. sec_event.auth_cmpl.fail_reason = BTA_DM_AUTH_CONVERT_SMP_CODE(((UINT8)p_data->complt.reason));
  4107. /* delete this device entry from Sec Dev DB */
  4108. bta_dm_remove_sec_dev_entry (bda);
  4109. } else {
  4110. sec_event.auth_cmpl.success = TRUE;
  4111. if (!p_data->complt.smp_over_br) {
  4112. }
  4113. }
  4114. sec_event.auth_cmpl.auth_mode = p_data->complt.auth_mode;
  4115. if (bta_dm_cb.p_sec_cback) {
  4116. //bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
  4117. bta_dm_cb.p_sec_cback(BTA_DM_BLE_AUTH_CMPL_EVT, &sec_event);
  4118. }
  4119. break;
  4120. default:
  4121. status = BTM_NOT_AUTHORIZED;
  4122. break;
  4123. }
  4124. return status;
  4125. }
  4126. /*******************************************************************************
  4127. **
  4128. ** Function bta_dm_ble_id_key_cback
  4129. **
  4130. ** Description Callback for BLE local ID keys
  4131. **
  4132. **
  4133. ** Returns void
  4134. **
  4135. *******************************************************************************/
  4136. static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key)
  4137. {
  4138. UINT8 evt;
  4139. tBTA_DM_SEC dm_key;
  4140. switch (key_type) {
  4141. case BTM_BLE_KEY_TYPE_ID:
  4142. case BTM_BLE_KEY_TYPE_ER:
  4143. if (bta_dm_cb.p_sec_cback) {
  4144. memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS));
  4145. evt = (key_type == BTM_BLE_KEY_TYPE_ID) ? BTA_DM_BLE_LOCAL_IR_EVT : \
  4146. BTA_DM_BLE_LOCAL_ER_EVT;
  4147. bta_dm_cb.p_sec_cback(evt, &dm_key);
  4148. }
  4149. break;
  4150. default:
  4151. APPL_TRACE_DEBUG("Unknown key type %d", key_type);
  4152. break;
  4153. }
  4154. return;
  4155. }
  4156. /*******************************************************************************
  4157. **
  4158. ** Function bta_dm_add_blekey
  4159. **
  4160. ** Description This function adds an BLE Key to an security database entry.
  4161. ** This function shall only be called AFTER BTA_DmAddBleDevice has been called.
  4162. ** It is normally called during host startup to restore all required information
  4163. ** stored in the NVRAM.
  4164. **
  4165. ** Parameters:
  4166. **
  4167. *******************************************************************************/
  4168. void bta_dm_add_blekey (tBTA_DM_MSG *p_data)
  4169. {
  4170. if (!BTM_SecAddBleKey (p_data->add_ble_key.bd_addr,
  4171. (tBTM_LE_KEY_VALUE *)&p_data->add_ble_key.blekey,
  4172. p_data->add_ble_key.key_type)) {
  4173. APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Key for device %08x%04x",
  4174. (p_data->add_ble_key.bd_addr[0] << 24) + (p_data->add_ble_key.bd_addr[1] << 16) + \
  4175. (p_data->add_ble_key.bd_addr[2] << 8) + p_data->add_ble_key.bd_addr[3],
  4176. (p_data->add_ble_key.bd_addr[4] << 8) + p_data->add_ble_key.bd_addr[5]);
  4177. }
  4178. }
  4179. /*******************************************************************************
  4180. **
  4181. ** Function bta_dm_add_ble_device
  4182. **
  4183. ** Description This function adds an BLE device to an security database entry.
  4184. ** It is normally called during host startup to restore all required information
  4185. ** stored in the NVRAM.
  4186. **
  4187. ** Parameters:
  4188. **
  4189. *******************************************************************************/
  4190. void bta_dm_add_ble_device (tBTA_DM_MSG *p_data)
  4191. {
  4192. if (!BTM_SecAddBleDevice (p_data->add_ble_device.bd_addr, NULL,
  4193. p_data->add_ble_device.dev_type ,
  4194. p_data->add_ble_device.addr_type,
  4195. p_data->add_ble_device.auth_mode)) {
  4196. APPL_TRACE_ERROR ("BTA_DM: Error adding BLE Device for device %08x%04x",
  4197. (p_data->add_ble_device.bd_addr[0] << 24) + (p_data->add_ble_device.bd_addr[1] << 16) + \
  4198. (p_data->add_ble_device.bd_addr[2] << 8) + p_data->add_ble_device.bd_addr[3],
  4199. (p_data->add_ble_device.bd_addr[4] << 8) + p_data->add_ble_device.bd_addr[5]);
  4200. }
  4201. }
  4202. /*******************************************************************************
  4203. **
  4204. ** Function bta_dm_add_ble_device
  4205. **
  4206. ** Description This function adds an BLE device to an security database entry.
  4207. ** It is normally called during host startup to restore all required information
  4208. ** stored in the NVRAM.
  4209. **
  4210. ** Parameters:
  4211. **
  4212. *******************************************************************************/
  4213. void bta_dm_ble_passkey_reply (tBTA_DM_MSG *p_data)
  4214. {
  4215. if (p_data->pin_reply.accept) {
  4216. BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_SUCCESS, p_data->ble_passkey_reply.passkey);
  4217. } else {
  4218. BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED, p_data->ble_passkey_reply.passkey);
  4219. }
  4220. }
  4221. void bta_dm_ble_set_static_passkey(tBTA_DM_MSG *p_data)
  4222. {
  4223. BTM_BleSetStaticPasskey(p_data->ble_set_static_passkey.add, p_data->ble_set_static_passkey.static_passkey);
  4224. }
  4225. /*******************************************************************************
  4226. **
  4227. ** Function bta_dm_ble_confirm_reply
  4228. **
  4229. ** Description This is response to SM numeric comparison request submitted
  4230. ** to application.
  4231. **
  4232. ** Parameters:
  4233. **
  4234. *******************************************************************************/
  4235. void bta_dm_ble_confirm_reply (tBTA_DM_MSG *p_data)
  4236. {
  4237. if (p_data->confirm.accept) {
  4238. BTM_BleConfirmReply(p_data->confirm.bd_addr, BTM_SUCCESS);
  4239. } else {
  4240. BTM_BleConfirmReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED);
  4241. }
  4242. }
  4243. /*******************************************************************************
  4244. **
  4245. ** Function bta_dm_security_grant
  4246. **
  4247. ** Description This function grant SMP security request access.
  4248. **
  4249. ** Parameters:
  4250. **
  4251. *******************************************************************************/
  4252. void bta_dm_security_grant (tBTA_DM_MSG *p_data)
  4253. {
  4254. BTM_SecurityGrant(p_data->ble_sec_grant.bd_addr, p_data->ble_sec_grant.res);
  4255. }
  4256. #endif ///SMP_INCLUDED == TRUE
  4257. /*******************************************************************************
  4258. **
  4259. ** Function bta_dm_ble_set_bg_conn_type
  4260. **
  4261. ** Description This function set the BLE background connection type
  4262. **
  4263. ** Parameters:
  4264. **
  4265. *******************************************************************************/
  4266. void bta_dm_ble_set_bg_conn_type (tBTA_DM_MSG *p_data)
  4267. {
  4268. BTM_BleSetBgConnType(p_data->ble_set_bd_conn_type.bg_conn_type,
  4269. p_data->ble_set_bd_conn_type.p_select_cback);
  4270. }
  4271. /*******************************************************************************
  4272. **
  4273. ** Function bta_dm_ble_set_conn_params
  4274. **
  4275. ** Description This function set the preferred connection parameters.
  4276. **
  4277. ** Parameters:
  4278. **
  4279. *******************************************************************************/
  4280. void bta_dm_ble_set_conn_params (tBTA_DM_MSG *p_data)
  4281. {
  4282. BTM_BleSetPrefConnParams(p_data->ble_set_conn_params.peer_bda,
  4283. p_data->ble_set_conn_params.conn_int_min,
  4284. p_data->ble_set_conn_params.conn_int_max,
  4285. p_data->ble_set_conn_params.slave_latency,
  4286. p_data->ble_set_conn_params.supervision_tout);
  4287. BTM_BleConfigConnParams(p_data->ble_set_conn_params.conn_int_min, p_data->ble_set_conn_params.conn_int_max,
  4288. p_data->ble_set_conn_params.slave_latency, p_data->ble_set_conn_params.supervision_tout);
  4289. }
  4290. /*******************************************************************************
  4291. **
  4292. ** Function bta_dm_ble_set_conn_scan_params
  4293. **
  4294. ** Description This function sets BLE scan parameters.
  4295. **
  4296. ** Parameters:
  4297. **
  4298. *******************************************************************************/
  4299. void bta_dm_ble_set_scan_params(tBTA_DM_MSG *p_data)
  4300. {
  4301. BTM_BleSetScanParams(p_data->ble_set_scan_params.client_if,
  4302. p_data->ble_set_scan_params.scan_int,
  4303. p_data->ble_set_scan_params.scan_window,
  4304. p_data->ble_set_scan_params.scan_mode,
  4305. p_data->ble_set_scan_params.scan_param_setup_cback);
  4306. }
  4307. /*******************************************************************************
  4308. **
  4309. ** Function bta_dm_ble_set_scan_fil_params
  4310. **
  4311. ** Description This function sets BLE scan filter & parameters.
  4312. **
  4313. ** Parameters:
  4314. **
  4315. *******************************************************************************/
  4316. void bta_dm_ble_set_scan_fil_params(tBTA_DM_MSG *p_data)
  4317. {
  4318. tBTA_STATUS status = BTA_FAILURE;
  4319. if (BTM_BleSetScanFilterParams (p_data->ble_set_scan_fil_params.client_if,
  4320. p_data->ble_set_scan_fil_params.scan_int,
  4321. p_data->ble_set_scan_fil_params.scan_window,
  4322. p_data->ble_set_scan_fil_params.scan_mode,
  4323. p_data->ble_set_scan_fil_params.addr_type_own,
  4324. p_data->ble_set_scan_fil_params.scan_duplicate_filter,
  4325. p_data->ble_set_scan_fil_params.scan_filter_policy,
  4326. p_data->ble_set_scan_fil_params.scan_param_setup_cback) == BTM_SUCCESS) {
  4327. status = BTA_SUCCESS;
  4328. } else {
  4329. APPL_TRACE_ERROR("%s(), fail to set scan params.", __func__);
  4330. }
  4331. if (p_data->ble_set_scan_fil_params.scan_param_setup_cback != NULL) {
  4332. p_data->ble_set_scan_fil_params.scan_param_setup_cback(p_data->ble_set_scan_fil_params.client_if, status);
  4333. }
  4334. }
  4335. /*******************************************************************************
  4336. **
  4337. ** Function bta_dm_ble_set_conn_scan_params
  4338. **
  4339. ** Description This function set the preferred connection scan parameters.
  4340. **
  4341. ** Parameters:
  4342. **
  4343. *******************************************************************************/
  4344. void bta_dm_ble_set_conn_scan_params (tBTA_DM_MSG *p_data)
  4345. {
  4346. BTM_BleSetConnScanParams(p_data->ble_set_conn_scan_params.scan_int,
  4347. p_data->ble_set_conn_scan_params.scan_window);
  4348. }
  4349. /*******************************************************************************
  4350. **
  4351. ** Function bta_dm_ble_update_conn_params
  4352. **
  4353. ** Description This function update LE connection parameters.
  4354. **
  4355. ** Parameters:
  4356. **
  4357. *******************************************************************************/
  4358. void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data)
  4359. {
  4360. if (!L2CA_UpdateBleConnParams(p_data->ble_update_conn_params.bd_addr,
  4361. p_data->ble_update_conn_params.min_int,
  4362. p_data->ble_update_conn_params.max_int,
  4363. p_data->ble_update_conn_params.latency,
  4364. p_data->ble_update_conn_params.timeout)) {
  4365. APPL_TRACE_ERROR("Update connection parameters failed!");
  4366. } else {
  4367. BTM_BleConfigConnParams(p_data->ble_update_conn_params.min_int, p_data->ble_update_conn_params.max_int,
  4368. p_data->ble_update_conn_params.latency, p_data->ble_update_conn_params.timeout);
  4369. }
  4370. }
  4371. /*******************************************************************************
  4372. **
  4373. ** Function bta_dm_ble_disconnect
  4374. **
  4375. ** Description This function disconnect the ble connection.
  4376. **
  4377. ** Parameters:
  4378. **
  4379. *******************************************************************************/
  4380. void bta_dm_ble_disconnect (tBTA_DM_MSG *p_data)
  4381. {
  4382. L2CA_RemoveFixedChnl(L2CAP_ATT_CID, p_data->ble_disconnect.remote_bda);
  4383. }
  4384. /*******************************************************************************
  4385. **
  4386. ** Function bta_dm_ble_set_rand_address
  4387. **
  4388. ** Description This function set the LE random address for the device.
  4389. **
  4390. ** Parameters: rand_addr:the random address whitch should be setting
  4391. ** Explanation: This function added by Yulong at 2016/9/9
  4392. *******************************************************************************/
  4393. void bta_dm_ble_set_rand_address(tBTA_DM_MSG *p_data)
  4394. {
  4395. tBTM_STATUS status = BTM_SET_STATIC_RAND_ADDR_FAIL;
  4396. if (p_data->set_addr.addr_type != BLE_ADDR_RANDOM) {
  4397. APPL_TRACE_ERROR("Invalid random adress type = %d\n", p_data->set_addr.addr_type);
  4398. if(p_data->set_addr.p_set_rand_addr_cback) {
  4399. (*p_data->set_addr.p_set_rand_addr_cback)(status);
  4400. }
  4401. return;
  4402. }
  4403. //send the setting random address to BTM layer
  4404. status = BTM_BleSetRandAddress(p_data->set_addr.address);
  4405. if(p_data->set_addr.p_set_rand_addr_cback) {
  4406. (*p_data->set_addr.p_set_rand_addr_cback)(status);
  4407. }
  4408. }
  4409. void bta_dm_ble_clear_rand_address(tBTA_DM_MSG *p_data)
  4410. {
  4411. UNUSED(p_data);
  4412. BTM_BleClearRandAddress();
  4413. }
  4414. /*******************************************************************************
  4415. **
  4416. ** Function bta_dm_ble_stop_advertising
  4417. **
  4418. ** Description This function stop the BLE avdertising for the device.
  4419. **
  4420. ** Parameters: void
  4421. ** Explanation: This function added by Yulong at 2016/10/19
  4422. *******************************************************************************/
  4423. void bta_dm_ble_stop_advertising(tBTA_DM_MSG *p_data)
  4424. {
  4425. if (p_data->hdr.event != BTA_DM_API_BLE_STOP_ADV_EVT) {
  4426. APPL_TRACE_ERROR("Invalid BTA event,can't stop the BLE adverting\n");
  4427. }
  4428. btm_ble_stop_adv();
  4429. }
  4430. #if BLE_PRIVACY_SPT == TRUE
  4431. /*******************************************************************************
  4432. **
  4433. ** Function bta_dm_ble_config_local_privacy
  4434. **
  4435. ** Description This function set the local device LE privacy settings.
  4436. **
  4437. ** Parameters:
  4438. **
  4439. *******************************************************************************/
  4440. void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data)
  4441. {
  4442. BTM_BleConfigPrivacy (p_data->ble_local_privacy.privacy_enable, p_data->ble_local_privacy.set_local_privacy_cback);
  4443. }
  4444. #endif
  4445. /*******************************************************************************
  4446. **
  4447. ** Function bta_dm_ble_config_local_icon
  4448. **
  4449. ** Description This function sets the local icon value.
  4450. **
  4451. **
  4452. *******************************************************************************/
  4453. void bta_dm_ble_config_local_icon (tBTA_DM_MSG *p_data)
  4454. {
  4455. BTM_BleConfigLocalIcon (p_data->ble_local_icon.icon);
  4456. }
  4457. /*******************************************************************************
  4458. **
  4459. ** Function bta_dm_ble_observe
  4460. **
  4461. ** Description This function set the preferred connection scan parameters.
  4462. **
  4463. ** Parameters:
  4464. **
  4465. *******************************************************************************/
  4466. void bta_dm_ble_observe (tBTA_DM_MSG *p_data)
  4467. {
  4468. tBTM_STATUS status;
  4469. if (p_data->ble_observe.start) {
  4470. /*Save the callback to be called when a scan results are available */
  4471. bta_dm_search_cb.p_scan_cback = p_data->ble_observe.p_cback;
  4472. if ((status = BTM_BleObserve(TRUE, p_data->ble_observe.duration,
  4473. bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb)) != BTM_CMD_STARTED) {
  4474. APPL_TRACE_WARNING(" %s start observe failed. status=0x%x\n", __FUNCTION__, status);
  4475. }
  4476. if (p_data->ble_observe.p_start_scan_cback) {
  4477. status = (status == BTM_CMD_STARTED ? BTA_SUCCESS : BTA_FAILURE);
  4478. p_data->ble_observe.p_start_scan_cback(status);
  4479. }
  4480. } else {
  4481. bta_dm_search_cb.p_scan_cback = NULL;
  4482. status = BTM_BleObserve(FALSE, 0, NULL, NULL);
  4483. if (status != BTM_CMD_STARTED){
  4484. APPL_TRACE_WARNING(" %s stop observe failed, status=0x%x\n", __FUNCTION__, status);
  4485. }
  4486. if (p_data->ble_observe.p_stop_scan_cback) {
  4487. status = (status == BTM_CMD_STARTED ? BTA_SUCCESS : BTA_FAILURE);
  4488. p_data->ble_observe.p_stop_scan_cback(status);
  4489. }
  4490. }
  4491. }
  4492. /*******************************************************************************
  4493. **
  4494. ** Function bta_dm_ble_scan
  4495. **
  4496. ** Description This function set the preferred connection scan parameters.
  4497. **
  4498. ** Parameters:
  4499. **
  4500. *******************************************************************************/
  4501. void bta_dm_ble_scan (tBTA_DM_MSG *p_data)
  4502. {
  4503. tBTM_STATUS status;
  4504. if (p_data->ble_scan.start) {
  4505. /*Save the callback to be called when a scan results are available */
  4506. bta_dm_search_cb.p_scan_cback = p_data->ble_scan.p_cback;
  4507. if ((status = BTM_BleScan(TRUE, p_data->ble_scan.duration,
  4508. bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb, bta_dm_observe_discard_cb)) != BTM_CMD_STARTED) {
  4509. APPL_TRACE_WARNING(" %s start scan failed. status=0x%x\n", __FUNCTION__, status);
  4510. }
  4511. if (p_data->ble_scan.p_start_scan_cback) {
  4512. status = (status == BTM_CMD_STARTED ? BTA_SUCCESS : BTA_FAILURE);
  4513. p_data->ble_scan.p_start_scan_cback(status);
  4514. }
  4515. } else {
  4516. bta_dm_search_cb.p_scan_cback = NULL;
  4517. status = BTM_BleScan(FALSE, 0, NULL, NULL, NULL);
  4518. if (status != BTM_CMD_STARTED){
  4519. APPL_TRACE_WARNING(" %s stop scan failed, status=0x%x\n", __FUNCTION__, status);
  4520. }
  4521. if (p_data->ble_scan.p_stop_scan_cback) {
  4522. status = (status == BTM_CMD_STARTED ? BTA_SUCCESS : BTA_FAILURE);
  4523. p_data->ble_scan.p_stop_scan_cback(status);
  4524. }
  4525. }
  4526. }
  4527. /*******************************************************************************
  4528. **
  4529. ** Function bta_dm_ble_set_adv_params
  4530. **
  4531. ** Description This function set the adv parameters.
  4532. **
  4533. ** Parameters:
  4534. **
  4535. *******************************************************************************/
  4536. void bta_dm_ble_set_adv_params (tBTA_DM_MSG *p_data)
  4537. {
  4538. BTM_BleSetAdvParams(p_data->ble_set_adv_params.adv_int_min,
  4539. p_data->ble_set_adv_params.adv_int_max,
  4540. p_data->ble_set_adv_params.p_dir_bda,
  4541. BTA_DM_BLE_ADV_CHNL_MAP);
  4542. }
  4543. /*******************************************************************************
  4544. **
  4545. ** Function bta_dm_ble_set_adv_params_all
  4546. **
  4547. ** Description This function is called to set all of the advertising parameters.
  4548. **
  4549. ** Parameters: None.
  4550. **
  4551. ** Returns void
  4552. **
  4553. *******************************************************************************/
  4554. void bta_dm_ble_set_adv_params_all (tBTA_DM_MSG *p_data)
  4555. {
  4556. tBTA_STATUS status = BTA_FAILURE;
  4557. if (BTM_BleSetAdvParamsAll(p_data->ble_set_adv_params_all.adv_int_min,
  4558. p_data->ble_set_adv_params_all.adv_int_max,
  4559. p_data->ble_set_adv_params_all.adv_type,
  4560. p_data->ble_set_adv_params_all.addr_type_own,
  4561. p_data->ble_set_adv_params_all.p_dir_bda,
  4562. p_data->ble_set_adv_params_all.channel_map,
  4563. p_data->ble_set_adv_params_all.adv_filter_policy,
  4564. p_data->ble_set_adv_params_all.p_start_adv_cback) == BTM_SUCCESS) {
  4565. APPL_TRACE_DEBUG("%s(), success to set ble adv params.", __func__);
  4566. } else {
  4567. APPL_TRACE_ERROR("%s(), fail to set ble adv params.", __func__);
  4568. if(p_data->ble_set_adv_params_all.p_start_adv_cback) {
  4569. (*p_data->ble_set_adv_params_all.p_start_adv_cback)(status);
  4570. }
  4571. return;
  4572. }
  4573. if(BTM_BleStartAdv() == BTM_SUCCESS) {
  4574. status = BTA_SUCCESS;
  4575. }
  4576. if(p_data->ble_set_adv_params_all.p_start_adv_cback) {
  4577. (*p_data->ble_set_adv_params_all.p_start_adv_cback)(status);
  4578. }
  4579. }
  4580. /*******************************************************************************
  4581. **
  4582. ** Function bta_dm_ble_update_duplicate_exceptional_list
  4583. **
  4584. ** Description This function is to update duplicate scan exceptional list
  4585. **
  4586. **
  4587. *******************************************************************************/
  4588. void bta_dm_ble_update_duplicate_exceptional_list(tBTA_DM_MSG *p_data)
  4589. {
  4590. BTM_UpdateBleDuplicateExceptionalList(p_data->ble_duplicate_exceptional_list.subcode,
  4591. p_data->ble_duplicate_exceptional_list.type,
  4592. p_data->ble_duplicate_exceptional_list.device_info,
  4593. p_data->ble_duplicate_exceptional_list.exceptional_list_cb);
  4594. }
  4595. /*******************************************************************************
  4596. **
  4597. ** Function bta_dm_ble_set_adv_config
  4598. **
  4599. ** Description This function set the customized ADV data configuration
  4600. **
  4601. ** Parameters:
  4602. **
  4603. *******************************************************************************/
  4604. void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data)
  4605. {
  4606. tBTA_STATUS status = BTA_FAILURE;
  4607. if (BTM_BleWriteAdvData(p_data->ble_set_adv_data.data_mask,
  4608. (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS) {
  4609. status = BTA_SUCCESS;
  4610. }
  4611. if (p_data->ble_set_adv_data.p_adv_data_cback) {
  4612. (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
  4613. }
  4614. }
  4615. /*******************************************************************************
  4616. **
  4617. ** Function bta_dm_ble_set_long_adv
  4618. **
  4619. ** Description This function set the long ADV data
  4620. **
  4621. ** Parameters:
  4622. **
  4623. *******************************************************************************/
  4624. void bta_dm_ble_set_long_adv (tBTA_DM_MSG *p_data)
  4625. {
  4626. tBTA_STATUS status = BTA_FAILURE;
  4627. if (BTM_BleWriteLongAdvData(p_data->ble_set_long_adv_data.adv_data,
  4628. p_data->ble_set_long_adv_data.adv_data_len) == BTM_SUCCESS) {
  4629. status = BTA_SUCCESS;
  4630. }
  4631. if (p_data->ble_set_adv_data.p_adv_data_cback) {
  4632. (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
  4633. }
  4634. }
  4635. /*******************************************************************************
  4636. **
  4637. ** Function bta_dm_ble_set_adv_config_raw
  4638. **
  4639. ** Description This function set the customized ADV data configuration
  4640. **
  4641. ** Parameters:
  4642. **
  4643. *******************************************************************************/
  4644. void bta_dm_ble_set_adv_config_raw (tBTA_DM_MSG *p_data)
  4645. {
  4646. tBTA_STATUS status = BTA_FAILURE;
  4647. if (BTM_BleWriteAdvDataRaw(p_data->ble_set_adv_data_raw.p_raw_adv,
  4648. p_data->ble_set_adv_data_raw.raw_adv_len) == BTM_SUCCESS) {
  4649. status = BTA_SUCCESS;
  4650. }
  4651. if (p_data->ble_set_adv_data_raw.p_adv_data_cback) {
  4652. (*p_data->ble_set_adv_data_raw.p_adv_data_cback)(status);
  4653. }
  4654. }
  4655. /*******************************************************************************
  4656. **
  4657. ** Function bta_dm_ble_set_scan_rsp
  4658. **
  4659. ** Description This function set the customized ADV scan resp. configuration
  4660. **
  4661. ** Parameters:
  4662. **
  4663. *******************************************************************************/
  4664. void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data)
  4665. {
  4666. tBTA_STATUS status = BTA_FAILURE;
  4667. if (BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask,
  4668. (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg) == BTM_SUCCESS) {
  4669. status = BTA_SUCCESS;
  4670. }
  4671. if (p_data->ble_set_adv_data.p_adv_data_cback) {
  4672. (*p_data->ble_set_adv_data.p_adv_data_cback)(status);
  4673. }
  4674. }
  4675. /*******************************************************************************
  4676. **
  4677. ** Function bta_dm_ble_set_scan_rsp_raw
  4678. **
  4679. ** Description This function set the raw scan response data
  4680. **
  4681. ** Parameters:
  4682. **
  4683. *******************************************************************************/
  4684. void bta_dm_ble_set_scan_rsp_raw (tBTA_DM_MSG *p_data)
  4685. {
  4686. tBTA_STATUS status = BTA_FAILURE;
  4687. if (BTM_BleWriteScanRspRaw(p_data->ble_set_adv_data_raw.p_raw_adv,
  4688. p_data->ble_set_adv_data_raw.raw_adv_len) == BTM_SUCCESS) {
  4689. status = BTA_SUCCESS;
  4690. }
  4691. if (p_data->ble_set_adv_data_raw.p_adv_data_cback) {
  4692. (*p_data->ble_set_adv_data_raw.p_adv_data_cback)(status);
  4693. }
  4694. }
  4695. /*******************************************************************************
  4696. **
  4697. ** Function bta_dm_ble_set_data_length
  4698. **
  4699. ** Description This function set the maximum transmission packet size
  4700. **
  4701. ** Parameters
  4702. **
  4703. *******************************************************************************/
  4704. void bta_dm_ble_set_data_length(tBTA_DM_MSG *p_data)
  4705. {
  4706. tACL_CONN *p_acl_cb = btm_bda_to_acl(p_data->ble_set_data_length.remote_bda, BT_TRANSPORT_LE);
  4707. if (p_acl_cb == NULL) {
  4708. APPL_TRACE_ERROR("%s error: Invalid connection remote_bda.", __func__);
  4709. return;
  4710. } else {
  4711. p_acl_cb->p_set_pkt_data_cback = p_data->ble_set_data_length.p_set_pkt_data_cback;
  4712. }
  4713. UINT8 status = BTM_SetBleDataLength(p_data->ble_set_data_length.remote_bda,
  4714. p_data->ble_set_data_length.tx_data_length);
  4715. if (status != BTM_SUCCESS) {
  4716. APPL_TRACE_ERROR("%s failed\n", __FUNCTION__);
  4717. }
  4718. if (p_data->ble_set_data_length.p_set_pkt_data_cback) {
  4719. if (p_acl_cb->data_length_params.tx_len == 0){
  4720. uint16_t length = controller_get_interface()->get_acl_data_size_ble();
  4721. p_acl_cb->data_length_params.rx_len = length;
  4722. p_acl_cb->data_length_params.tx_len = length;
  4723. }
  4724. (*p_data->ble_set_data_length.p_set_pkt_data_cback)(status, &p_acl_cb->data_length_params);
  4725. }
  4726. }
  4727. /*******************************************************************************
  4728. **
  4729. ** Function bta_dm_ble_broadcast
  4730. **
  4731. ** Description Starts or stops LE broadcasts
  4732. **
  4733. ** Parameters:
  4734. **
  4735. *******************************************************************************/
  4736. void bta_dm_ble_broadcast (tBTA_DM_MSG *p_data)
  4737. {
  4738. tBTA_STATUS status = BTA_FAILURE;
  4739. BOOLEAN start = p_data->ble_observe.start;
  4740. if (BTM_BleBroadcast(start, p_data->ble_observe.p_stop_adv_cback) == BTM_SUCCESS) {
  4741. status = BTA_SUCCESS;
  4742. } else {
  4743. APPL_TRACE_ERROR("%s failed\n", __FUNCTION__);
  4744. }
  4745. if (p_data->ble_observe.p_stop_adv_cback){
  4746. (*p_data->ble_observe.p_stop_adv_cback)(status);
  4747. }
  4748. }
  4749. /*******************************************************************************
  4750. **
  4751. ** Function bta_dm_ble_multi_adv_enb
  4752. **
  4753. ** Description This function enables a single advertising instance
  4754. **
  4755. ** Parameters:
  4756. **
  4757. *******************************************************************************/
  4758. void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data)
  4759. {
  4760. tBTM_STATUS btm_status = 0;
  4761. bta_dm_cb.p_multi_adv_cback = p_data->ble_multi_adv_enb.p_cback;
  4762. if (BTM_BleMaxMultiAdvInstanceCount() > 0 && NULL != p_data->ble_multi_adv_enb.p_ref) {
  4763. btm_status = BTM_BleEnableAdvInstance((tBTM_BLE_ADV_PARAMS *)
  4764. p_data->ble_multi_adv_enb.p_params,
  4765. p_data->ble_multi_adv_enb.p_cback,
  4766. p_data->ble_multi_adv_enb.p_ref);
  4767. }
  4768. if (BTM_CMD_STARTED != btm_status) {
  4769. bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_ENB_EVT, 0xFF,
  4770. p_data->ble_multi_adv_enb.p_ref, BTA_FAILURE);
  4771. }
  4772. }
  4773. /*******************************************************************************
  4774. **
  4775. ** Function bta_dm_ble_multi_adv_param_upd
  4776. **
  4777. ** Description This function updates multiple advertising instance parameters
  4778. **
  4779. ** Parameters:
  4780. **
  4781. *******************************************************************************/
  4782. void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data)
  4783. {
  4784. tBTM_STATUS btm_status = 0;
  4785. void *p_ref = NULL;
  4786. if (BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_param.inst_id > 0
  4787. && p_data->ble_multi_adv_param.inst_id < BTM_BleMaxMultiAdvInstanceCount()) {
  4788. btm_status = BTM_BleUpdateAdvInstParam(p_data->ble_multi_adv_param.inst_id,
  4789. (tBTM_BLE_ADV_PARAMS *)p_data->ble_multi_adv_param.p_params);
  4790. }
  4791. if (BTM_CMD_STARTED != btm_status) {
  4792. p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_param.inst_id);
  4793. bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_PARAM_EVT,
  4794. p_data->ble_multi_adv_param.inst_id, p_ref, BTA_FAILURE);
  4795. }
  4796. }
  4797. /*******************************************************************************
  4798. **
  4799. ** Function bta_dm_ble_multi_adv_data
  4800. **
  4801. ** Description This function write multiple advertising instance adv data
  4802. ** or scan response data
  4803. **
  4804. ** Parameters:
  4805. **
  4806. *******************************************************************************/
  4807. void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data)
  4808. {
  4809. tBTM_STATUS btm_status = 0;
  4810. void *p_ref = NULL;
  4811. if (BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_data.inst_id > 0
  4812. && p_data->ble_multi_adv_data.inst_id < BTM_BleMaxMultiAdvInstanceCount()) {
  4813. btm_status = BTM_BleCfgAdvInstData(p_data->ble_multi_adv_data.inst_id,
  4814. p_data->ble_multi_adv_data.is_scan_rsp,
  4815. p_data->ble_multi_adv_data.data_mask,
  4816. (tBTM_BLE_ADV_DATA *)p_data->ble_multi_adv_data.p_data);
  4817. }
  4818. if (BTM_CMD_STARTED != btm_status) {
  4819. p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_data.inst_id);
  4820. bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DATA_EVT,
  4821. p_data->ble_multi_adv_data.inst_id, p_ref, BTA_FAILURE);
  4822. }
  4823. }
  4824. /*******************************************************************************
  4825. **
  4826. ** Function btm_dm_ble_multi_adv_disable
  4827. **
  4828. ** Description This function disable a single adv instance
  4829. **
  4830. ** Parameters:
  4831. **
  4832. *******************************************************************************/
  4833. void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data)
  4834. {
  4835. tBTM_STATUS btm_status = 0;
  4836. void *p_ref = NULL;
  4837. if (BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_disable.inst_id > 0
  4838. && p_data->ble_multi_adv_disable.inst_id < BTM_BleMaxMultiAdvInstanceCount()) {
  4839. btm_status = BTM_BleDisableAdvInstance(p_data->ble_multi_adv_disable.inst_id);
  4840. }
  4841. if (BTM_CMD_STARTED != btm_status) {
  4842. p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_disable.inst_id);
  4843. bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DISABLE_EVT,
  4844. p_data->ble_multi_adv_disable.inst_id, p_ref, BTA_FAILURE);
  4845. }
  4846. }
  4847. /*******************************************************************************
  4848. **
  4849. ** Function bta_dm_ble_setup_storage
  4850. **
  4851. ** Description This function configures up the storage parameters for ADV batch scanning
  4852. **
  4853. ** Parameters:
  4854. **
  4855. *******************************************************************************/
  4856. void bta_dm_ble_setup_storage (tBTA_DM_MSG *p_data)
  4857. {
  4858. tBTM_STATUS btm_status = 0;
  4859. tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
  4860. BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
  4861. if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) {
  4862. btm_status = BTM_BleSetStorageConfig(p_data->ble_set_storage.batch_scan_full_max,
  4863. p_data->ble_set_storage.batch_scan_trunc_max,
  4864. p_data->ble_set_storage.batch_scan_notify_threshold,
  4865. p_data->ble_set_storage.p_setup_cback,
  4866. p_data->ble_set_storage.p_thres_cback,
  4867. p_data->ble_set_storage.p_read_rep_cback,
  4868. p_data->ble_set_storage.ref_value);
  4869. }
  4870. if (BTM_CMD_STARTED != btm_status) {
  4871. bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, p_data->ble_set_storage.ref_value,
  4872. btm_status);
  4873. }
  4874. }
  4875. /*******************************************************************************
  4876. **
  4877. ** Function bta_dm_ble_enable_batch_scan
  4878. **
  4879. ** Description This function sets up the parameters and enables batch scan
  4880. **
  4881. ** Parameters:
  4882. **
  4883. *******************************************************************************/
  4884. void bta_dm_ble_enable_batch_scan (tBTA_DM_MSG *p_data)
  4885. {
  4886. tBTM_STATUS btm_status = 0;
  4887. tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
  4888. BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
  4889. if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) {
  4890. btm_status = BTM_BleEnableBatchScan(p_data->ble_enable_scan.scan_mode,
  4891. p_data->ble_enable_scan.scan_int,
  4892. p_data->ble_enable_scan.scan_window,
  4893. p_data->ble_enable_scan.discard_rule,
  4894. p_data->ble_enable_scan.addr_type,
  4895. p_data->ble_enable_scan.ref_value);
  4896. }
  4897. if (BTM_CMD_STARTED != btm_status) {
  4898. bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_ENABLE_EVT, p_data->ble_enable_scan.ref_value,
  4899. btm_status);
  4900. }
  4901. }
  4902. /*******************************************************************************
  4903. **
  4904. ** Function bta_dm_ble_disable_batch_scan
  4905. **
  4906. ** Description This function disables the batch scan
  4907. **
  4908. ** Parameters:
  4909. **
  4910. *******************************************************************************/
  4911. void bta_dm_ble_disable_batch_scan (tBTA_DM_MSG *p_data)
  4912. {
  4913. UNUSED(p_data);
  4914. tBTM_STATUS btm_status = 0;
  4915. tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
  4916. BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
  4917. if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) {
  4918. btm_status = BTM_BleDisableBatchScan(p_data->ble_disable_scan.ref_value);
  4919. }
  4920. if (BTM_CMD_STARTED != btm_status) {
  4921. bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_DISABLE_EVT, p_data->ble_enable_scan.ref_value,
  4922. btm_status);
  4923. }
  4924. }
  4925. /*******************************************************************************
  4926. **
  4927. ** Function bta_dm_ble_read_scan_reports
  4928. **
  4929. ** Description This function reads the batch scan reports
  4930. **
  4931. ** Parameters:
  4932. **
  4933. *******************************************************************************/
  4934. void bta_dm_ble_read_scan_reports(tBTA_DM_MSG *p_data)
  4935. {
  4936. tBTM_STATUS btm_status = 0;
  4937. tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
  4938. BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
  4939. if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) {
  4940. btm_status = BTM_BleReadScanReports(p_data->ble_read_reports.scan_type,
  4941. p_data->ble_read_reports.ref_value);
  4942. }
  4943. if (BTM_CMD_STARTED != btm_status) {
  4944. bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, p_data->ble_enable_scan.ref_value,
  4945. btm_status);
  4946. }
  4947. }
  4948. /*******************************************************************************
  4949. **
  4950. ** Function bta_dm_ble_track_advertiser
  4951. **
  4952. ** Description This function tracks the specific advertiser
  4953. **
  4954. ** Parameters:
  4955. **
  4956. *******************************************************************************/
  4957. void bta_dm_ble_track_advertiser(tBTA_DM_MSG *p_data)
  4958. {
  4959. tBTM_STATUS btm_status = 0;
  4960. BD_ADDR bda;
  4961. memset(&bda, 0 , sizeof(BD_ADDR));
  4962. tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
  4963. tBTA_DM_BLE_TRACK_ADV_DATA track_adv_data;
  4964. BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
  4965. if (0 != cmn_ble_vsc_cb.tot_scan_results_strg) {
  4966. btm_status = BTM_BleTrackAdvertiser((tBTM_BLE_TRACK_ADV_CBACK *)
  4967. p_data->ble_track_advert.p_track_adv_cback,
  4968. p_data->ble_track_advert.ref_value);
  4969. }
  4970. if (BTM_CMD_STARTED != btm_status) {
  4971. memset(&track_adv_data, 0, sizeof(tBTA_DM_BLE_TRACK_ADV_DATA));
  4972. track_adv_data.advertiser_info_present = NO_ADV_INFO_PRESENT; /* Indicates failure */
  4973. track_adv_data.client_if = (UINT8)p_data->ble_track_advert.ref_value;
  4974. p_data->ble_track_advert.p_track_adv_cback(&track_adv_data);
  4975. }
  4976. }
  4977. /*******************************************************************************
  4978. **
  4979. ** Function bta_ble_scan_setup_cb
  4980. **
  4981. ** Description Handle the setup callback from BTM layer and forward it to app layer
  4982. **
  4983. ** Parameters:
  4984. **
  4985. *******************************************************************************/
  4986. void bta_ble_scan_setup_cb(tBTM_BLE_BATCH_SCAN_EVT evt, tBTM_BLE_REF_VALUE ref_value,
  4987. tBTM_STATUS status)
  4988. {
  4989. tBTA_BLE_BATCH_SCAN_EVT bta_evt = 0;
  4990. APPL_TRACE_DEBUG("bta_ble_scan_setup_cb : evt: %d, ref_value: %d, status:%d", evt,
  4991. ref_value, status);
  4992. switch (evt) {
  4993. case BTM_BLE_BATCH_SCAN_ENABLE_EVT:
  4994. bta_evt = BTA_BLE_BATCH_SCAN_ENB_EVT;
  4995. break;
  4996. case BTM_BLE_BATCH_SCAN_CFG_STRG_EVT:
  4997. bta_evt = BTA_BLE_BATCH_SCAN_CFG_STRG_EVT;
  4998. break;
  4999. case BTM_BLE_BATCH_SCAN_DISABLE_EVT:
  5000. bta_evt = BTA_BLE_BATCH_SCAN_DIS_EVT;
  5001. break;
  5002. case BTM_BLE_BATCH_SCAN_PARAM_EVT:
  5003. bta_evt = BTA_BLE_BATCH_SCAN_PARAM_EVT;
  5004. break;
  5005. default:
  5006. break;
  5007. }
  5008. if (NULL != bta_dm_cb.p_setup_cback) {
  5009. bta_dm_cb.p_setup_cback(bta_evt, ref_value, status);
  5010. }
  5011. }
  5012. #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
  5013. /*******************************************************************************
  5014. **
  5015. ** Function bta_ble_scan_pf_cmpl
  5016. **
  5017. ** Description ADV payload filtering operation complete callback
  5018. **
  5019. **
  5020. ** Returns TRUE if handled, otherwise FALSE.
  5021. **
  5022. *******************************************************************************/
  5023. static void bta_ble_scan_cfg_cmpl(tBTM_BLE_PF_ACTION action, tBTM_BLE_SCAN_COND_OP cfg_op,
  5024. tBTM_BLE_PF_AVBL_SPACE avbl_space, tBTM_STATUS status,
  5025. tBTM_BLE_REF_VALUE ref_value)
  5026. {
  5027. tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS : BTA_FAILURE;
  5028. APPL_TRACE_DEBUG("bta_ble_scan_cfg_cmpl: %d, %d, %d, %d", action, cfg_op, avbl_space, status);
  5029. if (bta_dm_cb.p_scan_filt_cfg_cback) {
  5030. bta_dm_cb.p_scan_filt_cfg_cback(action, cfg_op, avbl_space, st, ref_value);
  5031. }
  5032. }
  5033. /*******************************************************************************
  5034. **
  5035. ** Function bta_dm_cfg_filter_cond
  5036. **
  5037. ** Description This function configure adv payload filtering condition
  5038. **
  5039. ** Parameters:
  5040. **
  5041. *******************************************************************************/
  5042. void bta_dm_cfg_filter_cond (tBTA_DM_MSG *p_data)
  5043. {
  5044. tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
  5045. tBTA_STATUS status = BTA_FAILURE;
  5046. tBTM_BLE_VSC_CB cmn_vsc_cb;
  5047. APPL_TRACE_DEBUG("bta_dm_cfg_filter_cond");
  5048. BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
  5049. if (0 != cmn_vsc_cb.filter_support) {
  5050. if ((st = BTM_BleCfgFilterCondition(p_data->ble_cfg_filter_cond.action,
  5051. p_data->ble_cfg_filter_cond.cond_type,
  5052. (tBTM_BLE_PF_FILT_INDEX)p_data->ble_cfg_filter_cond.filt_index,
  5053. (tBTM_BLE_PF_COND_PARAM *)p_data->ble_cfg_filter_cond.p_cond_param,
  5054. bta_ble_scan_cfg_cmpl, p_data->ble_cfg_filter_cond.ref_value))
  5055. == BTM_CMD_STARTED) {
  5056. bta_dm_cb.p_scan_filt_cfg_cback = p_data->ble_cfg_filter_cond.p_filt_cfg_cback;
  5057. return;
  5058. }
  5059. }
  5060. if (p_data->ble_cfg_filter_cond.p_filt_cfg_cback) {
  5061. p_data->ble_cfg_filter_cond.p_filt_cfg_cback(BTA_DM_BLE_PF_CONFIG_EVT,
  5062. p_data->ble_cfg_filter_cond.cond_type, 0, status,
  5063. p_data->ble_cfg_filter_cond.ref_value);
  5064. }
  5065. return;
  5066. }
  5067. /*******************************************************************************
  5068. **
  5069. ** Function bta_dm_enable_scan_filter
  5070. **
  5071. ** Description This function enable/disable adv payload filtering condition
  5072. **
  5073. ** Parameters:
  5074. **
  5075. *******************************************************************************/
  5076. void bta_dm_enable_scan_filter(tBTA_DM_MSG *p_data)
  5077. {
  5078. tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
  5079. tBTA_STATUS status = BTA_FAILURE;
  5080. tBTM_BLE_VSC_CB cmn_vsc_cb;
  5081. APPL_TRACE_DEBUG("bta_dm_enable_scan_filter");
  5082. BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
  5083. if (0 != cmn_vsc_cb.filter_support) {
  5084. if ((st = BTM_BleEnableDisableFilterFeature(p_data->ble_enable_scan_filt.action,
  5085. p_data->ble_enable_scan_filt.p_filt_status_cback,
  5086. (tBTM_BLE_REF_VALUE)p_data->ble_enable_scan_filt.ref_value)) == BTM_CMD_STARTED) {
  5087. bta_dm_cb.p_scan_filt_status_cback = p_data->ble_enable_scan_filt.p_filt_status_cback;
  5088. }
  5089. return;
  5090. }
  5091. if (p_data->ble_enable_scan_filt.p_filt_status_cback) {
  5092. p_data->ble_enable_scan_filt.p_filt_status_cback (BTA_DM_BLE_PF_ENABLE_EVT,
  5093. p_data->ble_enable_scan_filt.ref_value, status);
  5094. }
  5095. }
  5096. /*******************************************************************************
  5097. **
  5098. ** Function bta_dm_scan_filter_param_setup
  5099. **
  5100. ** Description This function sets up scan filter params
  5101. **
  5102. ** Parameters:
  5103. **
  5104. *******************************************************************************/
  5105. void bta_dm_scan_filter_param_setup (tBTA_DM_MSG *p_data)
  5106. {
  5107. tBTM_STATUS st = BTM_MODE_UNSUPPORTED;
  5108. tBTA_STATUS status = BTA_FAILURE;
  5109. tBTM_BLE_VSC_CB cmn_vsc_cb;
  5110. APPL_TRACE_DEBUG("bta_dm_scan_filter_param_setup");
  5111. BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
  5112. if (0 != cmn_vsc_cb.filter_support) {
  5113. if ((st = BTM_BleAdvFilterParamSetup(p_data->ble_scan_filt_param_setup.action,
  5114. p_data->ble_scan_filt_param_setup.filt_index,
  5115. (tBTM_BLE_PF_FILT_PARAMS *)&p_data->ble_scan_filt_param_setup.filt_params,
  5116. p_data->ble_scan_filt_param_setup.p_target,
  5117. p_data->ble_scan_filt_param_setup.p_filt_param_cback,
  5118. p_data->ble_scan_filt_param_setup.ref_value)) == BTM_CMD_STARTED) {
  5119. bta_dm_cb.p_scan_filt_param_cback = p_data->ble_scan_filt_param_setup.p_filt_param_cback;
  5120. return;
  5121. }
  5122. }
  5123. if (p_data->ble_scan_filt_param_setup.p_filt_param_cback) {
  5124. p_data->ble_scan_filt_param_setup.p_filt_param_cback (BTA_DM_BLE_PF_ENABLE_EVT, 0,
  5125. p_data->ble_scan_filt_param_setup.ref_value, status);
  5126. }
  5127. return;
  5128. }
  5129. #endif
  5130. /*******************************************************************************
  5131. **
  5132. ** Function bta_ble_enable_scan_cmpl
  5133. **
  5134. ** Description ADV payload filtering enable / disable complete callback
  5135. **
  5136. **
  5137. ** Returns None
  5138. **
  5139. *******************************************************************************/
  5140. static void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time,
  5141. tBTM_BLE_RX_TIME_MS rx_time,
  5142. tBTM_BLE_IDLE_TIME_MS idle_time,
  5143. tBTM_BLE_ENERGY_USED energy_used,
  5144. tBTM_STATUS status)
  5145. {
  5146. tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS : BTA_FAILURE;
  5147. tBTA_DM_CONTRL_STATE ctrl_state = 0;
  5148. #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE)
  5149. if (BTA_SUCCESS == st) {
  5150. ctrl_state = bta_dm_pm_obtain_controller_state();
  5151. }
  5152. #endif
  5153. if (bta_dm_cb.p_energy_info_cback) {
  5154. bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used, ctrl_state, st);
  5155. }
  5156. }
  5157. /*******************************************************************************
  5158. **
  5159. ** Function bta_dm_ble_get_energy_info
  5160. **
  5161. ** Description This function obtains the energy info
  5162. **
  5163. ** Parameters:
  5164. **
  5165. *******************************************************************************/
  5166. void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data)
  5167. {
  5168. tBTM_STATUS btm_status = 0;
  5169. bta_dm_cb.p_energy_info_cback = p_data->ble_energy_info.p_energy_info_cback;
  5170. btm_status = BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl);
  5171. if (BTM_CMD_STARTED != btm_status) {
  5172. bta_ble_energy_info_cmpl(0, 0, 0, 0, btm_status);
  5173. }
  5174. }
  5175. #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE) && SDP_INCLUDED == TRUE)
  5176. #ifndef BTA_DM_GATT_CLOSE_DELAY_TOUT
  5177. #define BTA_DM_GATT_CLOSE_DELAY_TOUT 1000
  5178. #endif
  5179. /*******************************************************************************
  5180. **
  5181. ** Function bta_dm_gattc_register
  5182. **
  5183. ** Description Register with GATTC in DM if BLE is needed.
  5184. **
  5185. **
  5186. ** Returns void
  5187. **
  5188. *******************************************************************************/
  5189. #if (GATTC_INCLUDED == TRUE)
  5190. static void bta_dm_gattc_register(void)
  5191. {
  5192. tBT_UUID app_uuid = {LEN_UUID_128, {0}};
  5193. if (bta_dm_search_cb.client_if == BTA_GATTS_INVALID_IF) {
  5194. memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128);
  5195. BTA_GATTC_AppRegister(&app_uuid, bta_dm_gattc_callback);
  5196. }
  5197. }
  5198. #endif /* GATTC_INCLUDED == TRUE */
  5199. /*******************************************************************************
  5200. **
  5201. ** Function btm_dm_start_disc_gatt_services
  5202. **
  5203. ** Description This function starts a GATT service search request.
  5204. **
  5205. ** Parameters:
  5206. **
  5207. *******************************************************************************/
  5208. #if (GATTC_INCLUDED == TRUE)
  5209. static void btm_dm_start_disc_gatt_services (UINT16 conn_id)
  5210. {
  5211. tBT_UUID *p_uuid = bta_dm_search_cb.p_srvc_uuid +
  5212. bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
  5213. p_uuid = bta_dm_search_cb.p_srvc_uuid +
  5214. bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
  5215. /* always search for all services */
  5216. BTA_GATTC_ServiceSearchRequest(conn_id, p_uuid);
  5217. }
  5218. #endif /* GATTC_INCLUDED == TRUE */
  5219. /*******************************************************************************
  5220. **
  5221. ** Function bta_dm_gatt_disc_result
  5222. **
  5223. ** Description This function process the GATT service search result.
  5224. **
  5225. ** Parameters:
  5226. **
  5227. *******************************************************************************/
  5228. #if (GATTC_INCLUDED == TRUE)
  5229. static void bta_dm_gatt_disc_result(tBTA_GATT_ID service_id)
  5230. {
  5231. tBTA_DM_SEARCH result;
  5232. /*
  5233. * This logic will not work for gatt case. We are checking against the bluetooth profiles here
  5234. * just copy the GATTID in raw data field and send it across.
  5235. */
  5236. if ( bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < bta_dm_search_cb.ble_raw_size ) {
  5237. APPL_TRACE_DEBUG("ADDING BLE SERVICE uuid=0x%x, ble_ptr = %p, ble_raw_used = 0x%x",
  5238. service_id.uuid.uu.uuid16, bta_dm_search_cb.p_ble_rawdata, bta_dm_search_cb.ble_raw_used);
  5239. if (bta_dm_search_cb.p_ble_rawdata) {
  5240. memcpy((bta_dm_search_cb.p_ble_rawdata + bta_dm_search_cb.ble_raw_used), &service_id,
  5241. sizeof(service_id) );
  5242. bta_dm_search_cb.ble_raw_used += sizeof(service_id);
  5243. } else {
  5244. APPL_TRACE_ERROR("p_ble_rawdata is NULL");
  5245. }
  5246. } else {
  5247. APPL_TRACE_ERROR("%s out of room to accomodate more service ids ble_raw_size = %d ble_raw_used = %d", __FUNCTION__, bta_dm_search_cb.ble_raw_size, bta_dm_search_cb.ble_raw_used );
  5248. }
  5249. APPL_TRACE_API("%s service_id_uuid_len=%d ", __func__, service_id.uuid.len);
  5250. if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) {
  5251. /* send result back to app now, one by one */
  5252. bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
  5253. BCM_STRNCPY_S((char *)result.disc_ble_res.bd_name, bta_dm_get_remname(), (BD_NAME_LEN - 1));
  5254. result.disc_ble_res.bd_name[BD_NAME_LEN] = 0;
  5255. memcpy(&result.disc_ble_res.service, &service_id.uuid, sizeof(tBT_UUID));
  5256. bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
  5257. }
  5258. }
  5259. #endif /* #if (GATTC_INCLUDED == TRUE) */
  5260. /*******************************************************************************
  5261. **
  5262. ** Function bta_dm_gatt_disc_complete
  5263. **
  5264. ** Description This function process the GATT service search complete.
  5265. **
  5266. ** Parameters:
  5267. **
  5268. *******************************************************************************/
  5269. #if (GATTC_INCLUDED == TRUE)
  5270. static void bta_dm_gatt_disc_complete(UINT16 conn_id, tBTA_GATT_STATUS status)
  5271. {
  5272. tBTA_DM_MSG *p_msg;
  5273. APPL_TRACE_DEBUG("bta_dm_gatt_disc_complete conn_id = %d", conn_id);
  5274. if (bta_dm_search_cb.uuid_to_search > 0) {
  5275. bta_dm_search_cb.uuid_to_search --;
  5276. }
  5277. if (status == BTA_GATT_OK && bta_dm_search_cb.uuid_to_search > 0) {
  5278. btm_dm_start_disc_gatt_services(conn_id);
  5279. } else {
  5280. bta_dm_search_cb.uuid_to_search = 0;
  5281. /* no more services to be discovered */
  5282. if ((p_msg = (tBTA_DM_MSG *) osi_malloc(sizeof(tBTA_DM_MSG))) != NULL) {
  5283. p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
  5284. p_msg->disc_result.result.disc_res.result = (status == BTA_GATT_OK) ? BTA_SUCCESS : BTA_FAILURE;
  5285. APPL_TRACE_DEBUG("%s service found: 0x%08x", __FUNCTION__,
  5286. bta_dm_search_cb.services_found);
  5287. p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
  5288. p_msg->disc_result.result.disc_res.num_uuids = 0;
  5289. p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
  5290. bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
  5291. BCM_STRNCPY_S((char *)p_msg->disc_result.result.disc_res.bd_name,bta_dm_get_remname(), (BD_NAME_LEN - 1));
  5292. /* make sure the string is terminated */
  5293. p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN - 1] = 0;
  5294. p_msg->disc_result.result.disc_res.device_type |= BT_DEVICE_TYPE_BLE;
  5295. if ( bta_dm_search_cb.ble_raw_used > 0 ) {
  5296. p_msg->disc_result.result.disc_res.p_raw_data = osi_malloc(bta_dm_search_cb.ble_raw_used);
  5297. memcpy( p_msg->disc_result.result.disc_res.p_raw_data,
  5298. bta_dm_search_cb.p_ble_rawdata,
  5299. bta_dm_search_cb.ble_raw_used );
  5300. p_msg->disc_result.result.disc_res.raw_data_size = bta_dm_search_cb.ble_raw_used;
  5301. } else {
  5302. p_msg->disc_result.result.disc_res.p_raw_data = NULL;
  5303. bta_dm_search_cb.p_ble_rawdata = 0;
  5304. }
  5305. bta_sys_sendmsg(p_msg);
  5306. }
  5307. if (conn_id != BTA_GATT_INVALID_CONN_ID) {
  5308. /* start a GATT channel close delay timer */
  5309. bta_sys_start_timer(&bta_dm_search_cb.gatt_close_timer, BTA_DM_DISC_CLOSE_TOUT_EVT,
  5310. BTA_DM_GATT_CLOSE_DELAY_TOUT);
  5311. bdcpy(bta_dm_search_cb.pending_close_bda, bta_dm_search_cb.peer_bdaddr);
  5312. }
  5313. bta_dm_search_cb.gatt_disc_active = FALSE;
  5314. }
  5315. }
  5316. #endif /* #if (GATTC_INCLUDED == TRUE) */
  5317. /*******************************************************************************
  5318. **
  5319. ** Function bta_dm_close_gatt_conn
  5320. **
  5321. ** Description This function close the GATT connection after delay timeout.
  5322. **
  5323. ** Parameters:
  5324. **
  5325. *******************************************************************************/
  5326. #if (GATTC_INCLUDED == TRUE)
  5327. void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data)
  5328. {
  5329. UNUSED(p_data);
  5330. if (bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID) {
  5331. BTA_GATTC_Close(bta_dm_search_cb.conn_id);
  5332. }
  5333. memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN);
  5334. bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
  5335. }
  5336. #endif /* #if (GATTC_INCLUDED == TRUE) */
  5337. /*******************************************************************************
  5338. **
  5339. ** Function btm_dm_start_gatt_discovery
  5340. **
  5341. ** Description This is GATT initiate the service search by open a GATT connection
  5342. ** first.
  5343. **
  5344. ** Parameters:
  5345. **
  5346. *******************************************************************************/
  5347. #if (GATTC_INCLUDED == TRUE)
  5348. void btm_dm_start_gatt_discovery (BD_ADDR bd_addr)
  5349. {
  5350. bta_dm_search_cb.gatt_disc_active = TRUE;
  5351. /* connection is already open */
  5352. if (bdcmp(bta_dm_search_cb.pending_close_bda, bd_addr) == 0 &&
  5353. bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID) {
  5354. memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN);
  5355. bta_sys_stop_timer(&bta_dm_search_cb.gatt_close_timer);
  5356. btm_dm_start_disc_gatt_services(bta_dm_search_cb.conn_id);
  5357. } else {
  5358. //TODO need to add addr_type in future
  5359. BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, BLE_ADDR_UNKNOWN_TYPE, TRUE, BTA_GATT_TRANSPORT_LE);
  5360. }
  5361. }
  5362. #endif /* #if (GATTC_INCLUDED == TRUE) */
  5363. /*******************************************************************************
  5364. **
  5365. ** Function bta_dm_cancel_gatt_discovery
  5366. **
  5367. ** Description This is GATT cancel the GATT service search.
  5368. **
  5369. ** Parameters:
  5370. **
  5371. *******************************************************************************/
  5372. #if (GATTC_INCLUDED == TRUE)
  5373. static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr)
  5374. {
  5375. if (bta_dm_search_cb.conn_id == BTA_GATT_INVALID_CONN_ID) {
  5376. BTA_GATTC_CancelOpen(bta_dm_search_cb.client_if, bd_addr, TRUE);
  5377. }
  5378. bta_dm_gatt_disc_complete(bta_dm_search_cb.conn_id, (tBTA_GATT_STATUS) BTA_GATT_ERROR);
  5379. }
  5380. #endif /* #if (GATTC_INCLUDED == TRUE) */
  5381. /*******************************************************************************
  5382. **
  5383. ** Function bta_dm_proc_open_evt
  5384. **
  5385. ** Description process BTA_GATTC_OPEN_EVT in DM.
  5386. **
  5387. ** Parameters:
  5388. **
  5389. *******************************************************************************/
  5390. #if (GATTC_INCLUDED == TRUE)
  5391. void bta_dm_proc_open_evt(tBTA_GATTC_OPEN *p_data)
  5392. {
  5393. UINT8 *p1;
  5394. UINT8 *p2;
  5395. p1 = bta_dm_search_cb.peer_bdaddr;
  5396. p2 = p_data->remote_bda;
  5397. APPL_TRACE_DEBUG("DM Search state= %d search_cb.peer_dbaddr: [%08x%04x] connected_bda= [%08x%04x] ",
  5398. bta_dm_search_cb.state,
  5399. ((p1[0]) << 24) + ((p1[1]) << 16) + ((p1[2]) << 8) + (p1[3]),
  5400. ((p1[4]) << 8) + p1[5],
  5401. ((p2[0]) << 24) + ((p2[1]) << 16) + ((p2[2]) << 8) + (p2[3]),
  5402. ((p2[4]) << 8) + p2[5]);
  5403. UNUSED(p1);
  5404. UNUSED(p2);
  5405. APPL_TRACE_DEBUG("BTA_GATTC_OPEN_EVT conn_id = %d client_if=%d status = %d" ,
  5406. p_data->conn_id,
  5407. p_data->client_if,
  5408. p_data->status);
  5409. bta_dm_search_cb.conn_id = p_data->conn_id;
  5410. if (p_data->status == BTA_GATT_OK) {
  5411. btm_dm_start_disc_gatt_services(p_data->conn_id);
  5412. } else {
  5413. bta_dm_gatt_disc_complete(BTA_GATT_INVALID_CONN_ID, p_data->status);
  5414. }
  5415. }
  5416. #endif /* #if (GATTC_INCLUDED == TRUE) */
  5417. /*******************************************************************************
  5418. **
  5419. ** Function bta_dm_gattc_callback
  5420. **
  5421. ** Description This is GATT client callback function used in DM.
  5422. **
  5423. ** Parameters:
  5424. **
  5425. *******************************************************************************/
  5426. #if (GATTC_INCLUDED == TRUE)
  5427. static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
  5428. {
  5429. APPL_TRACE_DEBUG("bta_dm_gattc_callback event = %d", event);
  5430. switch (event) {
  5431. case BTA_GATTC_REG_EVT:
  5432. APPL_TRACE_DEBUG("BTA_GATTC_REG_EVT client_if = %d", p_data->reg_oper.client_if);
  5433. if (p_data->reg_oper.status == BTA_GATT_OK) {
  5434. bta_dm_search_cb.client_if = p_data->reg_oper.client_if;
  5435. } else {
  5436. bta_dm_search_cb.client_if = BTA_GATTS_INVALID_IF;
  5437. }
  5438. break;
  5439. case BTA_GATTC_OPEN_EVT:
  5440. bta_dm_proc_open_evt(&p_data->open);
  5441. break;
  5442. case BTA_GATTC_SEARCH_RES_EVT:
  5443. bta_dm_gatt_disc_result(p_data->srvc_res.service_uuid);
  5444. break;
  5445. case BTA_GATTC_SEARCH_CMPL_EVT:
  5446. if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) {
  5447. bta_dm_gatt_disc_complete(p_data->search_cmpl.conn_id, p_data->search_cmpl.status);
  5448. }
  5449. break;
  5450. case BTA_GATTC_CLOSE_EVT:
  5451. APPL_TRACE_DEBUG("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason);
  5452. /* in case of disconnect before search is completed */
  5453. if ( (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) &&
  5454. (bta_dm_search_cb.state != BTA_DM_SEARCH_ACTIVE) &&
  5455. !memcmp(p_data->close.remote_bda, bta_dm_search_cb.peer_bdaddr, BD_ADDR_LEN)) {
  5456. bta_dm_gatt_disc_complete((UINT16)BTA_GATT_INVALID_CONN_ID, (tBTA_GATT_STATUS) BTA_GATT_ERROR);
  5457. }
  5458. break;
  5459. default:
  5460. break;
  5461. }
  5462. }
  5463. #endif /* #if (GATTC_INCLUDED == TRUE) */
  5464. #endif /* BTA_GATT_INCLUDED */
  5465. #if BLE_VND_INCLUDED == TRUE
  5466. /*******************************************************************************
  5467. **
  5468. ** Function bta_dm_ctrl_features_rd_cmpl_cback
  5469. **
  5470. ** Description callback to handle controller feature read complete
  5471. **
  5472. ** Parameters:
  5473. **
  5474. *******************************************************************************/
  5475. static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result)
  5476. {
  5477. APPL_TRACE_DEBUG("%s status = %d ", __FUNCTION__, result);
  5478. if (result == BTM_SUCCESS) {
  5479. if (bta_dm_cb.p_sec_cback) {
  5480. bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL);
  5481. }
  5482. } else {
  5483. APPL_TRACE_ERROR("%s Ctrl BLE feature read failed: status :%d", __FUNCTION__, result);
  5484. }
  5485. }
  5486. #endif /* BLE_VND_INCLUDED */
  5487. #endif /* BLE_INCLUDED */