hal-gatt.c 56 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093
  1. // SPDX-License-Identifier: Apache-2.0
  2. /*
  3. * Copyright (C) 2014 Intel Corporation
  4. *
  5. */
  6. #define _GNU_SOURCE
  7. #include <stdbool.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include "hal-log.h"
  11. #include "hal.h"
  12. #include "hal-msg.h"
  13. #include "ipc-common.h"
  14. #include "hal-ipc.h"
  15. #include "hal-utils.h"
  16. static const btgatt_callbacks_t *cbs = NULL;
  17. static bool interface_ready(void)
  18. {
  19. return cbs != NULL;
  20. }
  21. static void gatt_id_from_hal(btgatt_gatt_id_t *to,
  22. struct hal_gatt_gatt_id *from)
  23. {
  24. memcpy(&to->uuid, from->uuid, sizeof(to->uuid));
  25. to->inst_id = from->inst_id;
  26. }
  27. static void gatt_id_to_hal(struct hal_gatt_gatt_id *to, btgatt_gatt_id_t *from)
  28. {
  29. memcpy(to->uuid, &from->uuid, sizeof(from->uuid));
  30. to->inst_id = from->inst_id;
  31. }
  32. static void srvc_id_from_hal(btgatt_srvc_id_t *to,
  33. struct hal_gatt_srvc_id *from)
  34. {
  35. memcpy(&to->id.uuid, from->uuid, sizeof(to->id.uuid));
  36. to->id.inst_id = from->inst_id;
  37. to->is_primary = from->is_primary;
  38. }
  39. static void srvc_id_to_hal(struct hal_gatt_srvc_id *to, btgatt_srvc_id_t *from)
  40. {
  41. memcpy(to->uuid, &from->id.uuid, sizeof(from->id.uuid));
  42. to->inst_id = from->id.inst_id;
  43. to->is_primary = from->is_primary;
  44. }
  45. /* Client Event Handlers */
  46. static void handle_register_client(void *buf, uint16_t len, int fd)
  47. {
  48. struct hal_ev_gatt_client_register_client *ev = buf;
  49. if (cbs->client->register_client_cb)
  50. cbs->client->register_client_cb(ev->status, ev->client_if,
  51. (bt_uuid_t *) ev->app_uuid);
  52. }
  53. static void handle_scan_result(void *buf, uint16_t len, int fd)
  54. {
  55. struct hal_ev_gatt_client_scan_result *ev = buf;
  56. uint8_t ad[62];
  57. if (len != sizeof(*ev) + ev->len) {
  58. error("gatt: invalid scan result event, aborting");
  59. exit(EXIT_FAILURE);
  60. }
  61. /* Java assumes that passed data has 62 bytes */
  62. memset(ad, 0, sizeof(ad));
  63. memcpy(ad, ev->adv_data, ev->len > sizeof(ad) ? sizeof(ad) : ev->len);
  64. if (cbs->client->scan_result_cb)
  65. cbs->client->scan_result_cb((bt_bdaddr_t *) ev->bda, ev->rssi,
  66. ad);
  67. }
  68. static void handle_connect(void *buf, uint16_t len, int fd)
  69. {
  70. struct hal_ev_gatt_client_connect *ev = buf;
  71. if (cbs->client->open_cb)
  72. cbs->client->open_cb(ev->conn_id, ev->status, ev->client_if,
  73. (bt_bdaddr_t *) ev->bda);
  74. }
  75. static void handle_disconnect(void *buf, uint16_t len, int fd)
  76. {
  77. struct hal_ev_gatt_client_disconnect *ev = buf;
  78. if (cbs->client->close_cb)
  79. cbs->client->close_cb(ev->conn_id, ev->status, ev->client_if,
  80. (bt_bdaddr_t *) ev->bda);
  81. }
  82. static void handle_search_complete(void *buf, uint16_t len, int fd)
  83. {
  84. struct hal_ev_gatt_client_search_complete *ev = buf;
  85. if (cbs->client->search_complete_cb)
  86. cbs->client->search_complete_cb(ev->conn_id, ev->status);
  87. }
  88. static void handle_search_result(void *buf, uint16_t len, int fd)
  89. {
  90. struct hal_ev_gatt_client_search_result *ev = buf;
  91. btgatt_srvc_id_t srvc_id;
  92. srvc_id_from_hal(&srvc_id, &ev->srvc_id);
  93. if (cbs->client->search_result_cb)
  94. cbs->client->search_result_cb(ev->conn_id, &srvc_id);
  95. }
  96. static void handle_get_characteristic(void *buf, uint16_t len, int fd)
  97. {
  98. struct hal_ev_gatt_client_get_characteristic *ev = buf;
  99. btgatt_gatt_id_t char_id;
  100. btgatt_srvc_id_t srvc_id;
  101. srvc_id_from_hal(&srvc_id, &ev->srvc_id);
  102. gatt_id_from_hal(&char_id, &ev->char_id);
  103. if (cbs->client->get_characteristic_cb)
  104. cbs->client->get_characteristic_cb(ev->conn_id, ev->status,
  105. &srvc_id, &char_id,
  106. ev->char_prop);
  107. }
  108. static void handle_get_descriptor(void *buf, uint16_t len, int fd)
  109. {
  110. struct hal_ev_gatt_client_get_descriptor *ev = buf;
  111. btgatt_gatt_id_t descr_id;
  112. btgatt_gatt_id_t char_id;
  113. btgatt_srvc_id_t srvc_id;
  114. srvc_id_from_hal(&srvc_id, &ev->srvc_id);
  115. gatt_id_from_hal(&char_id, &ev->char_id);
  116. gatt_id_from_hal(&descr_id, &ev->descr_id);
  117. if (cbs->client->get_descriptor_cb)
  118. cbs->client->get_descriptor_cb(ev->conn_id, ev->status,
  119. &srvc_id, &char_id, &descr_id);
  120. }
  121. static void handle_get_included_service(void *buf, uint16_t len, int fd)
  122. {
  123. struct hal_ev_gatt_client_get_inc_service *ev = buf;
  124. btgatt_srvc_id_t srvc_id;
  125. btgatt_srvc_id_t incl_srvc_id;
  126. srvc_id_from_hal(&srvc_id, &ev->srvc_id);
  127. srvc_id_from_hal(&incl_srvc_id, &ev->incl_srvc_id);
  128. if (cbs->client->get_included_service_cb)
  129. cbs->client->get_included_service_cb(ev->conn_id, ev->status,
  130. &srvc_id,
  131. &incl_srvc_id);
  132. }
  133. static void handle_register_for_notification(void *buf, uint16_t len, int fd)
  134. {
  135. struct hal_ev_gatt_client_reg_for_notif *ev = buf;
  136. btgatt_gatt_id_t char_id;
  137. btgatt_srvc_id_t srvc_id;
  138. srvc_id_from_hal(&srvc_id, &ev->srvc_id);
  139. gatt_id_from_hal(&char_id, &ev->char_id);
  140. if (cbs->client->register_for_notification_cb)
  141. cbs->client->register_for_notification_cb(ev->conn_id,
  142. ev->registered,
  143. ev->status,
  144. &srvc_id,
  145. &char_id);
  146. }
  147. static void handle_notify(void *buf, uint16_t len, int fd)
  148. {
  149. struct hal_ev_gatt_client_notify *ev = buf;
  150. btgatt_notify_params_t params;
  151. if (len != sizeof(*ev) + ev->len) {
  152. error("gatt: invalid notify event, aborting");
  153. exit(EXIT_FAILURE);
  154. }
  155. memset(&params, 0, sizeof(params));
  156. memcpy(params.value, ev->value, ev->len);
  157. memcpy(&params.bda, ev->bda, sizeof(params.bda));
  158. srvc_id_from_hal(&params.srvc_id, &ev->srvc_id);
  159. gatt_id_from_hal(&params.char_id, &ev->char_id);
  160. params.len = ev->len;
  161. params.is_notify = ev->is_notify;
  162. if (cbs->client->notify_cb)
  163. cbs->client->notify_cb(ev->conn_id, &params);
  164. }
  165. static void handle_read_characteristic(void *buf, uint16_t len, int fd)
  166. {
  167. struct hal_ev_gatt_client_read_characteristic *ev = buf;
  168. btgatt_read_params_t params;
  169. if (len != sizeof(*ev) + ev->data.len) {
  170. error("gatt: invalid read characteristic event, aborting");
  171. exit(EXIT_FAILURE);
  172. }
  173. memset(&params, 0, sizeof(params));
  174. srvc_id_from_hal(&params.srvc_id, &ev->data.srvc_id);
  175. gatt_id_from_hal(&params.char_id, &ev->data.char_id);
  176. gatt_id_from_hal(&params.descr_id, &ev->data.descr_id);
  177. memcpy(&params.value.value, ev->data.value, ev->data.len);
  178. params.value_type = ev->data.value_type;
  179. params.value.len = ev->data.len;
  180. params.status = ev->data.status;
  181. if (cbs->client->read_characteristic_cb)
  182. cbs->client->read_characteristic_cb(ev->conn_id, ev->status,
  183. &params);
  184. }
  185. static void handle_write_characteristic(void *buf, uint16_t len, int fd)
  186. {
  187. struct hal_ev_gatt_client_write_characteristic *ev = buf;
  188. btgatt_write_params_t params;
  189. memset(&params, 0, sizeof(params));
  190. srvc_id_from_hal(&params.srvc_id, &ev->data.srvc_id);
  191. gatt_id_from_hal(&params.char_id, &ev->data.char_id);
  192. gatt_id_from_hal(&params.descr_id, &ev->data.descr_id);
  193. params.status = ev->data.status;
  194. if (cbs->client->write_characteristic_cb)
  195. cbs->client->write_characteristic_cb(ev->conn_id, ev->status,
  196. &params);
  197. }
  198. static void handle_read_descriptor(void *buf, uint16_t len, int fd)
  199. {
  200. struct hal_ev_gatt_client_read_descriptor *ev = buf;
  201. btgatt_read_params_t params;
  202. if (len != sizeof(*ev) + ev->data.len) {
  203. error("gatt: invalid read descriptor event, aborting");
  204. exit(EXIT_FAILURE);
  205. }
  206. memset(&params, 0, sizeof(params));
  207. srvc_id_from_hal(&params.srvc_id, &ev->data.srvc_id);
  208. gatt_id_from_hal(&params.char_id, &ev->data.char_id);
  209. gatt_id_from_hal(&params.descr_id, &ev->data.descr_id);
  210. memcpy(&params.value.value, ev->data.value, ev->data.len);
  211. params.value_type = ev->data.value_type;
  212. params.value.len = ev->data.len;
  213. params.status = ev->data.status;
  214. if (cbs->client->read_descriptor_cb)
  215. cbs->client->read_descriptor_cb(ev->conn_id, ev->status,
  216. &params);
  217. }
  218. static void handle_write_descriptor(void *buf, uint16_t len, int fd)
  219. {
  220. struct hal_ev_gatt_client_write_descriptor *ev = buf;
  221. btgatt_write_params_t params;
  222. memset(&params, 0, sizeof(params));
  223. srvc_id_from_hal(&params.srvc_id, &ev->data.srvc_id);
  224. gatt_id_from_hal(&params.char_id, &ev->data.char_id);
  225. gatt_id_from_hal(&params.descr_id, &ev->data.descr_id);
  226. params.status = ev->data.status;
  227. if (cbs->client->write_descriptor_cb)
  228. cbs->client->write_descriptor_cb(ev->conn_id, ev->status,
  229. &params);
  230. }
  231. static void handle_execute_write(void *buf, uint16_t len, int fd)
  232. {
  233. struct hal_ev_gatt_client_exec_write *ev = buf;
  234. if (cbs->client->execute_write_cb)
  235. cbs->client->execute_write_cb(ev->conn_id, ev->status);
  236. }
  237. static void handle_read_remote_rssi(void *buf, uint16_t len, int fd)
  238. {
  239. struct hal_ev_gatt_client_read_remote_rssi *ev = buf;
  240. if (cbs->client->read_remote_rssi_cb)
  241. cbs->client->read_remote_rssi_cb(ev->client_if,
  242. (bt_bdaddr_t *) ev->address,
  243. ev->rssi, ev->status);
  244. }
  245. static void handle_listen(void *buf, uint16_t len, int fd)
  246. {
  247. struct hal_ev_gatt_client_listen *ev = buf;
  248. if (cbs->client->listen_cb)
  249. cbs->client->listen_cb(ev->status, ev->server_if);
  250. }
  251. /* Server Event Handlers */
  252. static void handle_register_server(void *buf, uint16_t len, int fd)
  253. {
  254. struct hal_ev_gatt_server_register *ev = buf;
  255. if (cbs->server->register_server_cb)
  256. cbs->server->register_server_cb(ev->status, ev->server_if,
  257. (bt_uuid_t *) &ev->uuid);
  258. }
  259. static void handle_connection(void *buf, uint16_t len, int fd)
  260. {
  261. struct hal_ev_gatt_server_connection *ev = buf;
  262. if (cbs->server->connection_cb)
  263. cbs->server->connection_cb(ev->conn_id, ev->server_if,
  264. ev->connected,
  265. (bt_bdaddr_t *) &ev->bdaddr);
  266. }
  267. static void handle_service_added(void *buf, uint16_t len, int fd)
  268. {
  269. struct hal_ev_gatt_server_service_added *ev = buf;
  270. btgatt_srvc_id_t srvc_id;
  271. srvc_id_from_hal(&srvc_id, &ev->srvc_id);
  272. if (cbs->server->service_added_cb)
  273. cbs->server->service_added_cb(ev->status, ev->server_if,
  274. &srvc_id, ev->srvc_handle);
  275. }
  276. static void handle_included_service_added(void *buf, uint16_t len, int fd)
  277. {
  278. struct hal_ev_gatt_server_inc_srvc_added *ev = buf;
  279. if (cbs->server->included_service_added_cb)
  280. cbs->server->included_service_added_cb(ev->status,
  281. ev->server_if,
  282. ev->srvc_handle,
  283. ev->incl_srvc_handle);
  284. }
  285. static void handle_characteristic_added(void *buf, uint16_t len, int fd)
  286. {
  287. struct hal_ev_gatt_server_characteristic_added *ev = buf;
  288. if (cbs->server->characteristic_added_cb)
  289. cbs->server->characteristic_added_cb(ev->status, ev->server_if,
  290. (bt_uuid_t *) &ev->uuid,
  291. ev->srvc_handle,
  292. ev->char_handle);
  293. }
  294. static void handle_descriptor_added(void *buf, uint16_t len, int fd)
  295. {
  296. struct hal_ev_gatt_server_descriptor_added *ev = buf;
  297. if (cbs->server->descriptor_added_cb)
  298. cbs->server->descriptor_added_cb(ev->status, ev->server_if,
  299. (bt_uuid_t *) &ev->uuid,
  300. ev->srvc_handle,
  301. ev->descr_handle);
  302. }
  303. static void handle_service_started(void *buf, uint16_t len, int fd)
  304. {
  305. struct hal_ev_gatt_server_service_started *ev = buf;
  306. if (cbs->server->service_started_cb)
  307. cbs->server->service_started_cb(ev->status, ev->server_if,
  308. ev->srvc_handle);
  309. }
  310. static void handle_service_stopped(void *buf, uint16_t len, int fd)
  311. {
  312. struct hal_ev_gatt_server_service_stopped *ev = buf;
  313. if (cbs->server->service_stopped_cb)
  314. cbs->server->service_stopped_cb(ev->status, ev->server_if,
  315. ev->srvc_handle);
  316. }
  317. static void handle_service_deleted(void *buf, uint16_t len, int fd)
  318. {
  319. struct hal_ev_gatt_server_service_deleted *ev = buf;
  320. if (cbs->server->service_deleted_cb)
  321. cbs->server->service_deleted_cb(ev->status, ev->server_if,
  322. ev->srvc_handle);
  323. }
  324. static void handle_request_read(void *buf, uint16_t len, int fd)
  325. {
  326. struct hal_ev_gatt_server_request_read *ev = buf;
  327. if (cbs->server->request_read_cb)
  328. cbs->server->request_read_cb(ev->conn_id, ev->trans_id,
  329. (bt_bdaddr_t *) &ev->bdaddr,
  330. ev->attr_handle, ev->offset,
  331. ev->is_long);
  332. }
  333. static void handle_request_write(void *buf, uint16_t len, int fd)
  334. {
  335. struct hal_ev_gatt_server_request_write *ev = buf;
  336. if (len != sizeof(*ev) + ev->length) {
  337. error("gatt: invalid request write event, aborting");
  338. exit(EXIT_FAILURE);
  339. }
  340. if (cbs->server->request_write_cb)
  341. cbs->server->request_write_cb(ev->conn_id, ev->trans_id,
  342. (bt_bdaddr_t *) ev->bdaddr,
  343. ev->attr_handle, ev->offset,
  344. ev->length, ev->need_rsp,
  345. ev->is_prep, ev->value);
  346. }
  347. static void handle_request_exec_write(void *buf, uint16_t len, int fd)
  348. {
  349. struct hal_ev_gatt_server_request_exec_write *ev = buf;
  350. if (cbs->server->request_exec_write_cb)
  351. cbs->server->request_exec_write_cb(ev->conn_id, ev->trans_id,
  352. (bt_bdaddr_t *) ev->bdaddr,
  353. ev->exec_write);
  354. }
  355. static void handle_response_confirmation(void *buf, uint16_t len, int fd)
  356. {
  357. struct hal_ev_gatt_server_rsp_confirmation *ev = buf;
  358. if (cbs->server->response_confirmation_cb)
  359. cbs->server->response_confirmation_cb(ev->status, ev->handle);
  360. }
  361. static void handle_configure_mtu(void *buf, uint16_t len, int fd)
  362. {
  363. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  364. struct hal_ev_gatt_client_configure_mtu *ev = buf;
  365. if (cbs->client->configure_mtu_cb)
  366. cbs->client->configure_mtu_cb(ev->conn_id, ev->status, ev->mtu);
  367. #endif
  368. }
  369. static void handle_filter_config(void *buf, uint16_t len, int fd)
  370. {
  371. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  372. struct hal_ev_gatt_client_filter_config *ev = buf;
  373. if (cbs->client->scan_filter_cfg_cb)
  374. cbs->client->scan_filter_cfg_cb(ev->action, ev->client_if,
  375. ev->status, ev->type,
  376. ev->space);
  377. #endif
  378. }
  379. static void handle_filter_params(void *buf, uint16_t len, int fd)
  380. {
  381. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  382. struct hal_ev_gatt_client_filter_params *ev = buf;
  383. if (cbs->client->scan_filter_param_cb)
  384. cbs->client->scan_filter_param_cb(ev->action, ev->client_if,
  385. ev->status, ev->space);
  386. #endif
  387. }
  388. static void handle_filter_status(void *buf, uint16_t len, int fd)
  389. {
  390. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  391. struct hal_ev_gatt_client_filter_status *ev = buf;
  392. if (cbs->client->scan_filter_status_cb)
  393. cbs->client->scan_filter_status_cb(ev->enable, ev->client_if,
  394. ev->status);
  395. #endif
  396. }
  397. static void handle__multi_adv_enable(void *buf, uint16_t len, int fd)
  398. {
  399. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  400. struct hal_ev_gatt_client_multi_adv_enable *ev = buf;
  401. if (cbs->client->multi_adv_enable_cb)
  402. cbs->client->multi_adv_enable_cb(ev->client_if, ev->status);
  403. #endif
  404. }
  405. static void handle_multi_adv_update(void *buf, uint16_t len, int fd)
  406. {
  407. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  408. struct hal_ev_gatt_client_multi_adv_update *ev = buf;
  409. if (cbs->client->multi_adv_update_cb)
  410. cbs->client->multi_adv_update_cb(ev->client_if, ev->status);
  411. #endif
  412. }
  413. static void handle_multi_adv_data(void *buf, uint16_t len, int fd)
  414. {
  415. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  416. struct hal_ev_gatt_client_multi_adv_data *ev = buf;
  417. if (cbs->client->multi_adv_data_cb)
  418. cbs->client->multi_adv_data_cb(ev->client_if, ev->status);
  419. #endif
  420. }
  421. static void handle_multi_adv_disable(void *buf, uint16_t len, int fd)
  422. {
  423. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  424. struct hal_ev_gatt_client_multi_adv_disable *ev = buf;
  425. if (cbs->client->multi_adv_disable_cb)
  426. cbs->client->multi_adv_disable_cb(ev->client_if, ev->status);
  427. #endif
  428. }
  429. static void handle_client_congestion(void *buf, uint16_t len, int fd)
  430. {
  431. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  432. struct hal_ev_gatt_client_congestion *ev = buf;
  433. if (cbs->client->congestion_cb)
  434. cbs->client->congestion_cb(ev->conn_id, ev->congested);
  435. #endif
  436. }
  437. static void handle_config_batchscan(void *buf, uint16_t len, int fd)
  438. {
  439. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  440. struct hal_ev_gatt_client_config_batchscan *ev = buf;
  441. if (cbs->client->batchscan_cfg_storage_cb)
  442. cbs->client->batchscan_cfg_storage_cb(ev->client_if,
  443. ev->status);
  444. #endif
  445. }
  446. static void handle_enable_batchscan(void *buf, uint16_t len, int fd)
  447. {
  448. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  449. struct hal_ev_gatt_client_enable_batchscan *ev = buf;
  450. if (cbs->client->batchscan_enb_disable_cb)
  451. cbs->client->batchscan_enb_disable_cb(ev->action, ev->client_if,
  452. ev->status);
  453. #endif
  454. }
  455. static void handle_client_batchscan_reports(void *buf, uint16_t len, int fd)
  456. {
  457. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  458. struct hal_ev_gatt_client_batchscan_reports *ev = buf;
  459. if (cbs->client->batchscan_reports_cb)
  460. cbs->client->batchscan_reports_cb(ev->client_if, ev->status,
  461. ev->format, ev->num,
  462. ev->data_len, ev->data);
  463. #endif
  464. }
  465. static void handle_batchscan_threshold(void *buf, uint16_t len, int fd)
  466. {
  467. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  468. struct hal_ev_gatt_client_batchscan_threshold *ev = buf;
  469. if (cbs->client->batchscan_threshold_cb)
  470. cbs->client->batchscan_threshold_cb(ev->client_if);
  471. #endif
  472. }
  473. static void handle_track_adv(void *buf, uint16_t len, int fd)
  474. {
  475. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  476. struct hal_ev_gatt_client_track_adv *ev = buf;
  477. if (cbs->client->track_adv_event_cb)
  478. cbs->client->track_adv_event_cb(ev->client_if, ev->filetr_index,
  479. ev->address_type,
  480. (bt_bdaddr_t *) ev->address,
  481. ev->state);
  482. #endif
  483. }
  484. static void handle_indication_send(void *buf, uint16_t len, int fd)
  485. {
  486. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  487. struct hal_ev_gatt_server_indication_sent *ev = buf;
  488. if (cbs->server->indication_sent_cb)
  489. cbs->server->indication_sent_cb(ev->conn_id, ev->status);
  490. #endif
  491. }
  492. static void handle_server_congestion(void *buf, uint16_t len, int fd)
  493. {
  494. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  495. struct hal_ev_gatt_server_congestion *ev = buf;
  496. if (cbs->server->congestion_cb)
  497. cbs->server->congestion_cb(ev->conn_id, ev->congested);
  498. #endif
  499. }
  500. static void handle_server_mtu_changed(void *buf, uint16_t len, int fd)
  501. {
  502. #if ANDROID_VERSION >= PLATFORM_VER(5, 1, 0)
  503. struct hal_ev_gatt_server_mtu_changed *ev = buf;
  504. if (cbs->server->mtu_changed_cb)
  505. cbs->server->mtu_changed_cb(ev->conn_id, ev->mtu);
  506. #endif
  507. }
  508. /*
  509. * handlers will be called from notification thread context,
  510. * index in table equals to 'opcode - HAL_MINIMUM_EVENT'
  511. */
  512. static const struct hal_ipc_handler ev_handlers[] = {
  513. /* HAL_EV_GATT_CLIENT_REGISTER_CLIENT */
  514. { handle_register_client, false,
  515. sizeof(struct hal_ev_gatt_client_register_client) },
  516. /* HAL_EV_GATT_CLIENT_SCAN_RESULT */
  517. { handle_scan_result, true,
  518. sizeof(struct hal_ev_gatt_client_scan_result) },
  519. /* HAL_EV_GATT_CLIENT_CONNECT */
  520. { handle_connect, false, sizeof(struct hal_ev_gatt_client_connect) },
  521. /* HAL_EV_GATT_CLIENT_DISCONNECT */
  522. { handle_disconnect, false,
  523. sizeof(struct hal_ev_gatt_client_disconnect) },
  524. /* HAL_EV_GATT_CLIENT_SEARCH_COMPLETE */
  525. { handle_search_complete, false,
  526. sizeof(struct hal_ev_gatt_client_search_complete) },
  527. /* HAL_EV_GATT_CLIENT_SEARCH_RESULT */
  528. { handle_search_result, false,
  529. sizeof(struct hal_ev_gatt_client_search_result) },
  530. /* HAL_EV_GATT_CLIENT_GET_CHARACTERISTIC */
  531. { handle_get_characteristic, false,
  532. sizeof(struct hal_ev_gatt_client_get_characteristic) },
  533. /* HAL_EV_GATT_CLIENT_GET_DESCRIPTOR */
  534. { handle_get_descriptor, false,
  535. sizeof(struct hal_ev_gatt_client_get_descriptor) },
  536. /* HAL_EV_GATT_CLIENT_GET_INC_SERVICE */
  537. { handle_get_included_service, false,
  538. sizeof(struct hal_ev_gatt_client_get_inc_service) },
  539. /* HAL_EV_GATT_CLIENT_REGISTER_FOR_NOTIF */
  540. { handle_register_for_notification, false,
  541. sizeof(struct hal_ev_gatt_client_reg_for_notif) },
  542. /* HAL_EV_GATT_CLIENT_NOTIFY */
  543. { handle_notify, true, sizeof(struct hal_ev_gatt_client_notify) },
  544. /* HAL_EV_GATT_CLIENT_READ_CHARACTERISTIC */
  545. { handle_read_characteristic, true,
  546. sizeof(struct hal_ev_gatt_client_read_characteristic) },
  547. /* HAL_EV_GATT_CLIENT_WRITE_CHARACTERISTIC */
  548. { handle_write_characteristic, false,
  549. sizeof(struct hal_ev_gatt_client_write_characteristic) },
  550. /* HAL_EV_GATT_CLIENT_READ_DESCRIPTOR */
  551. { handle_read_descriptor, true,
  552. sizeof(struct hal_ev_gatt_client_read_descriptor) },
  553. /* HAL_EV_GATT_CLIENT_WRITE_DESCRIPTOR */
  554. { handle_write_descriptor, false,
  555. sizeof(struct hal_ev_gatt_client_write_descriptor) },
  556. /* HAL_EV_GATT_CLIENT_EXEC_WRITE */
  557. { handle_execute_write, false,
  558. sizeof(struct hal_ev_gatt_client_exec_write) },
  559. /* HAL_EV_GATT_CLIENT_READ_REMOTE_RSSI */
  560. { handle_read_remote_rssi, false,
  561. sizeof(struct hal_ev_gatt_client_read_remote_rssi) },
  562. /* HAL_EV_GATT_CLIENT_LISTEN */
  563. { handle_listen, false, sizeof(struct hal_ev_gatt_client_listen) },
  564. /* HAL_EV_GATT_SERVER_REGISTER */
  565. { handle_register_server, false,
  566. sizeof(struct hal_ev_gatt_server_register) },
  567. /* HAL_EV_GATT_SERVER_CONNECTION */
  568. { handle_connection, false,
  569. sizeof(struct hal_ev_gatt_server_connection) },
  570. /* HAL_EV_GATT_SERVER_SERVICE_ADDED */
  571. { handle_service_added, false,
  572. sizeof(struct hal_ev_gatt_server_service_added) },
  573. /* HAL_EV_GATT_SERVER_INC_SRVC_ADDED */
  574. { handle_included_service_added, false,
  575. sizeof(struct hal_ev_gatt_server_inc_srvc_added) },
  576. /* HAL_EV_GATT_SERVER_CHAR_ADDED */
  577. { handle_characteristic_added, false,
  578. sizeof(struct hal_ev_gatt_server_characteristic_added) },
  579. /* HAL_EV_GATT_SERVER_DESCRIPTOR_ADDED */
  580. { handle_descriptor_added, false,
  581. sizeof(struct hal_ev_gatt_server_descriptor_added) },
  582. /* HAL_EV_GATT_SERVER_SERVICE_STARTED */
  583. { handle_service_started, false,
  584. sizeof(struct hal_ev_gatt_server_service_started) },
  585. /* HAL_EV_GATT_SERVER_SERVICE_STOPPED */
  586. { handle_service_stopped, false,
  587. sizeof(struct hal_ev_gatt_server_service_stopped) },
  588. /* HAL_EV_GATT_SERVER_SERVICE_DELETED */
  589. { handle_service_deleted, false,
  590. sizeof(struct hal_ev_gatt_server_service_deleted) },
  591. /* HAL_EV_GATT_SERVER_REQUEST_READ */
  592. { handle_request_read, false,
  593. sizeof(struct hal_ev_gatt_server_request_read) },
  594. /* HAL_EV_GATT_SERVER_REQUEST_WRITE */
  595. { handle_request_write, true,
  596. sizeof(struct hal_ev_gatt_server_request_write) },
  597. /* HAL_EV_GATT_SERVER_REQUEST_EXEC_WRITE */
  598. { handle_request_exec_write, false,
  599. sizeof(struct hal_ev_gatt_server_request_exec_write) },
  600. /* HAL_EV_GATT_SERVER_RSP_CONFIRMATION */
  601. { handle_response_confirmation, false,
  602. sizeof(struct hal_ev_gatt_server_rsp_confirmation) },
  603. /* HAL_EV_GATT_CLIENT_CONFIGURE_MTU */
  604. { handle_configure_mtu, false,
  605. sizeof(struct hal_ev_gatt_client_configure_mtu) },
  606. /* HAL_EV_GATT_CLIENT_FILTER_CONFIG */
  607. { handle_filter_config, false,
  608. sizeof(struct hal_ev_gatt_client_filter_config) },
  609. /* HAL_EV_GATT_CLIENT_FILTER_PARAMS */
  610. { handle_filter_params, false,
  611. sizeof(struct hal_ev_gatt_client_filter_params) },
  612. /* HAL_EV_GATT_CLIENT_FILTER_STATUS */
  613. { handle_filter_status, false,
  614. sizeof(struct hal_ev_gatt_client_filter_status) },
  615. /* HAL_EV_GATT_CLIENT_MULTI_ADV_ENABLE */
  616. { handle__multi_adv_enable, false,
  617. sizeof(struct hal_ev_gatt_client_multi_adv_enable) },
  618. /* HAL_EV_GATT_CLIENT_MULTI_ADV_UPDATE */
  619. { handle_multi_adv_update, false,
  620. sizeof(struct hal_ev_gatt_client_multi_adv_update) },
  621. /* HAL_EV_GATT_CLIENT_MULTI_ADV_DATA */
  622. { handle_multi_adv_data, false,
  623. sizeof(struct hal_ev_gatt_client_multi_adv_data) },
  624. /* HAL_EV_GATT_CLIENT_MULTI_ADV_DISABLE */
  625. { handle_multi_adv_disable, false,
  626. sizeof(struct hal_ev_gatt_client_multi_adv_disable) },
  627. /* HAL_EV_GATT_CLIENT_CONGESTION */
  628. { handle_client_congestion, false,
  629. sizeof(struct hal_ev_gatt_client_congestion) },
  630. /* HAL_EV_GATT_CLIENT_CONFIG_BATCHSCAN */
  631. { handle_config_batchscan, false,
  632. sizeof(struct hal_ev_gatt_client_config_batchscan) },
  633. /* HAL_EV_GATT_CLIENT_ENABLE_BATCHSCAN */
  634. { handle_enable_batchscan, false,
  635. sizeof(struct hal_ev_gatt_client_enable_batchscan) },
  636. /* HAL_EV_GATT_CLIENT_BATCHSCAN_REPORTS */
  637. { handle_client_batchscan_reports, true,
  638. sizeof(struct hal_ev_gatt_client_batchscan_reports) },
  639. /* HAL_EV_GATT_CLIENT_BATCHSCAN_THRESHOLD */
  640. { handle_batchscan_threshold, false,
  641. sizeof(struct hal_ev_gatt_client_batchscan_threshold) },
  642. /* HAL_EV_GATT_CLIENT_TRACK_ADV */
  643. { handle_track_adv, false,
  644. sizeof(struct hal_ev_gatt_client_track_adv) },
  645. /* HAL_EV_GATT_SERVER_INDICATION_SENT */
  646. { handle_indication_send, false,
  647. sizeof(struct hal_ev_gatt_server_indication_sent) },
  648. /* HAL_EV_GATT_SERVER_CONGESTION */
  649. { handle_server_congestion, false,
  650. sizeof(struct hal_ev_gatt_server_congestion) },
  651. /* HAL_EV_GATT_SERVER_MTU_CHANGED */
  652. { handle_server_mtu_changed, false,
  653. sizeof(struct hal_ev_gatt_server_mtu_changed) },
  654. };
  655. /* Client API */
  656. static bt_status_t register_client(bt_uuid_t *uuid)
  657. {
  658. struct hal_cmd_gatt_client_register cmd;
  659. if (!interface_ready())
  660. return BT_STATUS_NOT_READY;
  661. memcpy(cmd.uuid, uuid, sizeof(*uuid));
  662. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_CLIENT_REGISTER,
  663. sizeof(cmd), &cmd, NULL, NULL, NULL);
  664. }
  665. static bt_status_t unregister_client(int client_if)
  666. {
  667. struct hal_cmd_gatt_client_unregister cmd;
  668. if (!interface_ready())
  669. return BT_STATUS_NOT_READY;
  670. cmd.client_if = client_if;
  671. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_CLIENT_UNREGISTER,
  672. sizeof(cmd), &cmd, NULL, NULL, NULL);
  673. }
  674. static bt_status_t scan_real(int client_if, bool start)
  675. {
  676. struct hal_cmd_gatt_client_scan cmd;
  677. if (!interface_ready())
  678. return BT_STATUS_NOT_READY;
  679. cmd.client_if = client_if;
  680. cmd.start = start;
  681. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_CLIENT_SCAN,
  682. sizeof(cmd), &cmd, NULL, NULL, NULL);
  683. }
  684. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  685. static bt_status_t scan(bool start)
  686. {
  687. return scan_real(0, start);
  688. }
  689. #else
  690. static bt_status_t scan(int client_if, bool start)
  691. {
  692. return scan_real(client_if, start);
  693. }
  694. #endif
  695. static bt_status_t connect_real(int client_if, const bt_bdaddr_t *bd_addr,
  696. bool is_direct, int transport)
  697. {
  698. struct hal_cmd_gatt_client_connect cmd;
  699. if (!interface_ready())
  700. return BT_STATUS_NOT_READY;
  701. cmd.client_if = client_if;
  702. cmd.is_direct = is_direct;
  703. cmd.transport = transport;
  704. memcpy(cmd.bdaddr, bd_addr, sizeof(*bd_addr));
  705. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_CLIENT_CONNECT,
  706. sizeof(cmd), &cmd, NULL, NULL, NULL);
  707. }
  708. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  709. static bt_status_t connect(int client_if, const bt_bdaddr_t *bd_addr,
  710. bool is_direct, int transport)
  711. {
  712. return connect_real(client_if, bd_addr, is_direct, transport);
  713. }
  714. #else
  715. static bt_status_t connect(int client_if, const bt_bdaddr_t *bd_addr,
  716. bool is_direct)
  717. {
  718. return connect_real(client_if, bd_addr, is_direct,
  719. BT_TRANSPORT_UNKNOWN);
  720. }
  721. #endif
  722. static bt_status_t disconnect(int client_if, const bt_bdaddr_t *bd_addr,
  723. int conn_id)
  724. {
  725. struct hal_cmd_gatt_client_disconnect cmd;
  726. if (!interface_ready())
  727. return BT_STATUS_NOT_READY;
  728. cmd.client_if = client_if;
  729. cmd.conn_id = conn_id;
  730. memcpy(cmd.bdaddr, bd_addr, sizeof(*bd_addr));
  731. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_CLIENT_DISCONNECT,
  732. sizeof(cmd), &cmd, NULL, NULL, NULL);
  733. }
  734. static bt_status_t listen(int client_if, bool start)
  735. {
  736. struct hal_cmd_gatt_client_listen cmd;
  737. if (!interface_ready())
  738. return BT_STATUS_NOT_READY;
  739. cmd.client_if = client_if;
  740. cmd.start = start;
  741. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_CLIENT_LISTEN,
  742. sizeof(cmd), &cmd, NULL, NULL, NULL);
  743. }
  744. static bt_status_t refresh(int client_if, const bt_bdaddr_t *bd_addr)
  745. {
  746. struct hal_cmd_gatt_client_refresh cmd;
  747. if (!interface_ready())
  748. return BT_STATUS_NOT_READY;
  749. cmd.client_if = client_if;
  750. memcpy(cmd.bdaddr, bd_addr, sizeof(*bd_addr));
  751. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_CLIENT_REFRESH,
  752. sizeof(cmd), &cmd, NULL, NULL, NULL);
  753. }
  754. static bt_status_t search_service(int conn_id, bt_uuid_t *filter_uuid)
  755. {
  756. char buf[IPC_MTU];
  757. struct hal_cmd_gatt_client_search_service *cmd = (void *) buf;
  758. size_t len = sizeof(*cmd);
  759. if (!interface_ready())
  760. return BT_STATUS_NOT_READY;
  761. memset(cmd, 0, sizeof(*cmd));
  762. cmd->conn_id = conn_id;
  763. if (filter_uuid) {
  764. memcpy(cmd->filter_uuid, filter_uuid, sizeof(*filter_uuid));
  765. len += sizeof(*filter_uuid);
  766. cmd->filtered = 1;
  767. }
  768. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  769. HAL_OP_GATT_CLIENT_SEARCH_SERVICE,
  770. len, cmd, NULL, NULL, NULL);
  771. }
  772. static bt_status_t get_included_service(int conn_id, btgatt_srvc_id_t *srvc_id,
  773. btgatt_srvc_id_t *start_incl_srvc_id)
  774. {
  775. char buf[IPC_MTU];
  776. struct hal_cmd_gatt_client_get_included_service *cmd = (void *) buf;
  777. size_t len = sizeof(*cmd);
  778. if (!interface_ready())
  779. return BT_STATUS_NOT_READY;
  780. cmd->conn_id = conn_id;
  781. srvc_id_to_hal(&cmd->srvc_id, srvc_id);
  782. cmd->continuation = 0;
  783. if (start_incl_srvc_id) {
  784. srvc_id_to_hal(&cmd->incl_srvc_id[0], start_incl_srvc_id);
  785. len += sizeof(cmd->incl_srvc_id[0]);
  786. cmd->continuation = 1;
  787. }
  788. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  789. HAL_OP_GATT_CLIENT_GET_INCLUDED_SERVICE,
  790. len, cmd, NULL, NULL, NULL);
  791. }
  792. static bt_status_t get_characteristic(int conn_id, btgatt_srvc_id_t *srvc_id,
  793. btgatt_gatt_id_t *start_char_id)
  794. {
  795. char buf[IPC_MTU];
  796. struct hal_cmd_gatt_client_get_characteristic *cmd = (void *) buf;
  797. size_t len = sizeof(*cmd);
  798. if (!interface_ready())
  799. return BT_STATUS_NOT_READY;
  800. cmd->conn_id = conn_id;
  801. srvc_id_to_hal(&cmd->srvc_id, srvc_id);
  802. cmd->continuation = 0;
  803. if (start_char_id) {
  804. gatt_id_to_hal(&cmd->char_id[0], start_char_id);
  805. len += sizeof(cmd->char_id[0]);
  806. cmd->continuation = 1;
  807. }
  808. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  809. HAL_OP_GATT_CLIENT_GET_CHARACTERISTIC,
  810. len, cmd, NULL, NULL, NULL);
  811. }
  812. static bt_status_t get_descriptor(int conn_id, btgatt_srvc_id_t *srvc_id,
  813. btgatt_gatt_id_t *char_id,
  814. btgatt_gatt_id_t *start_descr_id)
  815. {
  816. char buf[IPC_MTU];
  817. struct hal_cmd_gatt_client_get_descriptor *cmd = (void *) buf;
  818. size_t len = sizeof(*cmd);
  819. if (!interface_ready())
  820. return BT_STATUS_NOT_READY;
  821. cmd->conn_id = conn_id;
  822. srvc_id_to_hal(&cmd->srvc_id, srvc_id);
  823. gatt_id_to_hal(&cmd->char_id, char_id);
  824. cmd->continuation = 0;
  825. if (start_descr_id) {
  826. gatt_id_to_hal(&cmd->descr_id[0], start_descr_id);
  827. len += sizeof(cmd->descr_id[0]);
  828. cmd->continuation = 1;
  829. }
  830. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  831. HAL_OP_GATT_CLIENT_GET_DESCRIPTOR,
  832. len, cmd, NULL , NULL, NULL);
  833. }
  834. static bt_status_t read_characteristic(int conn_id, btgatt_srvc_id_t *srvc_id,
  835. btgatt_gatt_id_t *char_id,
  836. int auth_req)
  837. {
  838. struct hal_cmd_gatt_client_read_characteristic cmd;
  839. if (!interface_ready())
  840. return BT_STATUS_NOT_READY;
  841. cmd.conn_id = conn_id;
  842. cmd.auth_req = auth_req;
  843. srvc_id_to_hal(&cmd.srvc_id, srvc_id);
  844. gatt_id_to_hal(&cmd.char_id, char_id);
  845. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  846. HAL_OP_GATT_CLIENT_READ_CHARACTERISTIC,
  847. sizeof(cmd), &cmd, NULL, NULL, NULL);
  848. }
  849. static bt_status_t write_characteristic(int conn_id, btgatt_srvc_id_t *srvc_id,
  850. btgatt_gatt_id_t *char_id,
  851. int write_type, int len, int auth_req,
  852. char *p_value)
  853. {
  854. char buf[IPC_MTU];
  855. struct hal_cmd_gatt_client_write_characteristic *cmd = (void *) buf;
  856. size_t cmd_len = sizeof(*cmd) + len;
  857. if (!interface_ready())
  858. return BT_STATUS_NOT_READY;
  859. cmd->conn_id = conn_id;
  860. cmd->write_type = write_type;
  861. cmd->len = len;
  862. cmd->auth_req = auth_req;
  863. srvc_id_to_hal(&cmd->srvc_id, srvc_id);
  864. gatt_id_to_hal(&cmd->char_id, char_id);
  865. memcpy(cmd->value, p_value, len);
  866. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  867. HAL_OP_GATT_CLIENT_WRITE_CHARACTERISTIC,
  868. cmd_len, cmd, NULL, NULL, NULL);
  869. }
  870. static bt_status_t read_descriptor(int conn_id, btgatt_srvc_id_t *srvc_id,
  871. btgatt_gatt_id_t *char_id,
  872. btgatt_gatt_id_t *descr_id,
  873. int auth_req)
  874. {
  875. struct hal_cmd_gatt_client_read_descriptor cmd;
  876. if (!interface_ready())
  877. return BT_STATUS_NOT_READY;
  878. cmd.conn_id = conn_id;
  879. cmd.auth_req = auth_req;
  880. srvc_id_to_hal(&cmd.srvc_id, srvc_id);
  881. gatt_id_to_hal(&cmd.char_id, char_id);
  882. gatt_id_to_hal(&cmd.descr_id, descr_id);
  883. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  884. HAL_OP_GATT_CLIENT_READ_DESCRIPTOR,
  885. sizeof(cmd), &cmd, NULL, NULL, NULL);
  886. }
  887. static bt_status_t write_descriptor(int conn_id, btgatt_srvc_id_t *srvc_id,
  888. btgatt_gatt_id_t *char_id,
  889. btgatt_gatt_id_t *descr_id,
  890. int write_type, int len, int auth_req,
  891. char *p_value)
  892. {
  893. char buf[IPC_MTU];
  894. struct hal_cmd_gatt_client_write_descriptor *cmd = (void *) buf;
  895. size_t cmd_len = sizeof(*cmd) + len;
  896. if (!interface_ready())
  897. return BT_STATUS_NOT_READY;
  898. cmd->conn_id = conn_id;
  899. cmd->write_type = write_type;
  900. cmd->len = len;
  901. cmd->auth_req = auth_req;
  902. srvc_id_to_hal(&cmd->srvc_id, srvc_id);
  903. gatt_id_to_hal(&cmd->char_id, char_id);
  904. gatt_id_to_hal(&cmd->descr_id, descr_id);
  905. memcpy(cmd->value, p_value, len);
  906. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  907. HAL_OP_GATT_CLIENT_WRITE_DESCRIPTOR,
  908. cmd_len, cmd, NULL, NULL, NULL);
  909. }
  910. static bt_status_t execute_write(int conn_id, int execute)
  911. {
  912. struct hal_cmd_gatt_client_execute_write cmd;
  913. if (!interface_ready())
  914. return BT_STATUS_NOT_READY;
  915. cmd.conn_id = conn_id;
  916. cmd.execute = execute;
  917. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  918. HAL_OP_GATT_CLIENT_EXECUTE_WRITE,
  919. sizeof(cmd), &cmd, NULL, NULL, NULL);
  920. }
  921. static bt_status_t register_for_notification(int client_if,
  922. const bt_bdaddr_t *bd_addr,
  923. btgatt_srvc_id_t *srvc_id,
  924. btgatt_gatt_id_t *char_id)
  925. {
  926. struct hal_cmd_gatt_client_register_for_notification cmd;
  927. if (!interface_ready())
  928. return BT_STATUS_NOT_READY;
  929. cmd.client_if = client_if;
  930. memcpy(cmd.bdaddr, bd_addr, sizeof(*bd_addr));
  931. srvc_id_to_hal(&cmd.srvc_id, srvc_id);
  932. gatt_id_to_hal(&cmd.char_id, char_id);
  933. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  934. HAL_OP_GATT_CLIENT_REGISTER_FOR_NOTIFICATION,
  935. sizeof(cmd), &cmd, NULL, NULL, NULL);
  936. }
  937. static bt_status_t deregister_for_notification(int client_if,
  938. const bt_bdaddr_t *bd_addr,
  939. btgatt_srvc_id_t *srvc_id,
  940. btgatt_gatt_id_t *char_id)
  941. {
  942. struct hal_cmd_gatt_client_deregister_for_notification cmd;
  943. if (!interface_ready())
  944. return BT_STATUS_NOT_READY;
  945. cmd.client_if = client_if;
  946. memcpy(cmd.bdaddr, bd_addr, sizeof(*bd_addr));
  947. srvc_id_to_hal(&cmd.srvc_id, srvc_id);
  948. gatt_id_to_hal(&cmd.char_id, char_id);
  949. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  950. HAL_OP_GATT_CLIENT_DEREGISTER_FOR_NOTIFICATION,
  951. sizeof(cmd), &cmd, NULL, NULL, NULL);
  952. }
  953. static bt_status_t read_remote_rssi(int client_if, const bt_bdaddr_t *bd_addr)
  954. {
  955. struct hal_cmd_gatt_client_read_remote_rssi cmd;
  956. if (!interface_ready())
  957. return BT_STATUS_NOT_READY;
  958. cmd.client_if = client_if;
  959. memcpy(cmd.bdaddr, bd_addr, sizeof(*bd_addr));
  960. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  961. HAL_OP_GATT_CLIENT_READ_REMOTE_RSSI,
  962. sizeof(cmd), &cmd, NULL, NULL, NULL);
  963. }
  964. static int get_device_type(const bt_bdaddr_t *bd_addr)
  965. {
  966. struct hal_cmd_gatt_client_get_device_type cmd;
  967. uint8_t dev_type;
  968. size_t resp_len = sizeof(dev_type);
  969. bt_status_t status;
  970. if (!interface_ready())
  971. return BT_STATUS_NOT_READY;
  972. memcpy(cmd.bdaddr, bd_addr, sizeof(*bd_addr));
  973. status = hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  974. HAL_OP_GATT_CLIENT_GET_DEVICE_TYPE,
  975. sizeof(cmd), &cmd, &resp_len, &dev_type, NULL);
  976. if (status != BT_STATUS_SUCCESS || resp_len != sizeof(dev_type))
  977. return 0;
  978. return dev_type;
  979. }
  980. static bt_status_t set_adv_data_real(int server_if, bool set_scan_rsp,
  981. bool include_name, bool include_txpower,
  982. int min_interval, int max_interval,
  983. int appearance, uint16_t manufacturer_len,
  984. char *manufacturer_data,
  985. uint16_t service_data_len, char *service_data,
  986. uint16_t service_uuid_len, char *service_uuid)
  987. {
  988. char buf[IPC_MTU];
  989. struct hal_cmd_gatt_client_set_adv_data *cmd = (void *) buf;
  990. size_t cmd_len;
  991. uint8_t *data;
  992. if (!interface_ready())
  993. return BT_STATUS_NOT_READY;
  994. cmd_len = sizeof(*cmd) + manufacturer_len + service_data_len +
  995. service_uuid_len;
  996. if (cmd_len > IPC_MTU)
  997. return BT_STATUS_FAIL;
  998. cmd->server_if = server_if;
  999. cmd->set_scan_rsp = set_scan_rsp;
  1000. cmd->include_name = include_name;
  1001. cmd->include_txpower = include_txpower;
  1002. cmd->min_interval = min_interval;
  1003. cmd->max_interval = max_interval;
  1004. cmd->appearance = appearance;
  1005. cmd->manufacturer_len = manufacturer_len;
  1006. cmd->service_data_len = service_data_len;
  1007. cmd->service_uuid_len = service_uuid_len;
  1008. data = cmd->data;
  1009. if (manufacturer_data && manufacturer_len) {
  1010. memcpy(data, manufacturer_data, manufacturer_len);
  1011. data += manufacturer_len;
  1012. }
  1013. if (service_data && service_data_len) {
  1014. memcpy(data, service_data, service_data_len);
  1015. data += service_data_len;
  1016. }
  1017. if (service_uuid && service_uuid_len)
  1018. memcpy(data, service_uuid, service_uuid_len);
  1019. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_CLIENT_SET_ADV_DATA,
  1020. cmd_len, cmd, NULL, NULL, NULL);
  1021. }
  1022. /*
  1023. * This is temporary solution and support for older Android versions might
  1024. * be removed at any time.
  1025. */
  1026. #if ANDROID_VERSION < PLATFORM_VER(4, 4, 3)
  1027. static bt_status_t set_adv_data(int server_if, bool set_scan_rsp,
  1028. bool include_name, bool include_txpower,
  1029. int min_interval, int max_interval,
  1030. int appearance, uint16_t manufacturer_len,
  1031. char *manufacturer_data)
  1032. {
  1033. return set_adv_data_real(server_if, set_scan_rsp, include_name,
  1034. include_txpower, min_interval,
  1035. max_interval, appearance,
  1036. manufacturer_len, manufacturer_data,
  1037. 0, NULL, 0, NULL);
  1038. }
  1039. #else
  1040. static bt_status_t set_adv_data(int server_if, bool set_scan_rsp,
  1041. bool include_name, bool include_txpower,
  1042. int min_interval, int max_interval,
  1043. int appearance, uint16_t manufacturer_len,
  1044. char *manufacturer_data,
  1045. uint16_t service_data_len, char *service_data,
  1046. uint16_t service_uuid_len, char *service_uuid)
  1047. {
  1048. return set_adv_data_real(server_if, set_scan_rsp, include_name,
  1049. include_txpower, min_interval,
  1050. max_interval, appearance,
  1051. manufacturer_len, manufacturer_data,
  1052. service_data_len, service_data,
  1053. service_uuid_len, service_uuid);
  1054. }
  1055. #endif
  1056. static bt_status_t test_command(int command, btgatt_test_params_t *params)
  1057. {
  1058. struct hal_cmd_gatt_client_test_command cmd;
  1059. if (!interface_ready())
  1060. return BT_STATUS_NOT_READY;
  1061. cmd.command = command;
  1062. memcpy(cmd.bda1, params->bda1, sizeof(*params->bda1));
  1063. memcpy(cmd.uuid1, params->uuid1, sizeof(*params->uuid1));
  1064. cmd.u1 = params->u1;
  1065. cmd.u2 = params->u2;
  1066. cmd.u3 = params->u3;
  1067. cmd.u4 = params->u4;
  1068. cmd.u5 = params->u5;
  1069. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_CLIENT_TEST_COMMAND,
  1070. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1071. }
  1072. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  1073. static bt_status_t scan_filter_param_setup(int client_if, int action,
  1074. int filt_index, int feat_seln,
  1075. int list_logic_type,
  1076. int filt_logic_type,
  1077. int rssi_high_thres,
  1078. int rssi_low_thres,
  1079. int dely_mode,
  1080. int found_timeout,
  1081. int lost_timeout,
  1082. int found_timeout_cnt)
  1083. {
  1084. struct hal_cmd_gatt_client_scan_filter_setup cmd;
  1085. if (!interface_ready())
  1086. return BT_STATUS_NOT_READY;
  1087. cmd.client_if = client_if;
  1088. cmd.action = action;
  1089. cmd.filter_index = filt_index;
  1090. cmd.features = feat_seln;
  1091. cmd.list_type = list_logic_type;
  1092. cmd.filter_type = filt_logic_type;
  1093. cmd.rssi_hi = rssi_high_thres;
  1094. cmd.rssi_lo = rssi_low_thres;
  1095. cmd.delivery_mode = dely_mode;
  1096. cmd.found_timeout = found_timeout;
  1097. cmd.lost_timeout = lost_timeout;
  1098. cmd.found_timeout_cnt = found_timeout_cnt;
  1099. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1100. HAL_OP_GATT_CLIENT_SCAN_FILTER_SETUP,
  1101. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1102. }
  1103. static bt_status_t scan_filter_add_remove(int client_if, int action,
  1104. int filt_type, int filt_index,
  1105. int company_id,
  1106. int company_id_mask,
  1107. const bt_uuid_t *p_uuid,
  1108. const bt_uuid_t *p_uuid_mask,
  1109. const bt_bdaddr_t *bd_addr,
  1110. char addr_type,
  1111. int data_len, char *p_data,
  1112. int mask_len, char *p_mask)
  1113. {
  1114. char buf[IPC_MTU];
  1115. struct hal_cmd_gatt_client_scan_filter_add_remove *cmd = (void *) buf;
  1116. size_t cmd_len;
  1117. if (!interface_ready())
  1118. return BT_STATUS_NOT_READY;
  1119. if (!p_uuid || !p_uuid_mask || !bd_addr)
  1120. return BT_STATUS_PARM_INVALID;
  1121. cmd_len = sizeof(*cmd) + data_len + mask_len;
  1122. if (cmd_len > IPC_MTU)
  1123. return BT_STATUS_FAIL;
  1124. cmd->client_if = client_if;
  1125. cmd->action = action;
  1126. cmd->filter_type = filt_type;
  1127. cmd->filter_index = filt_index;
  1128. cmd->company_id = company_id;
  1129. cmd->company_id_mask = company_id_mask;
  1130. memcpy(cmd->uuid, p_uuid, sizeof(*p_uuid));
  1131. memcpy(cmd->uuid_mask, p_uuid_mask, sizeof(*p_uuid_mask));
  1132. memcpy(cmd->address, bd_addr, sizeof(*bd_addr));
  1133. cmd->address_type = addr_type;
  1134. cmd->data_len = data_len;
  1135. memcpy(cmd->data_mask, p_data, data_len);
  1136. cmd->mask_len = mask_len;
  1137. memcpy(cmd->data_mask + data_len, p_mask, mask_len);
  1138. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1139. HAL_OP_GATT_CLIENT_SCAN_FILTER_ADD_REMOVE,
  1140. cmd_len, cmd, NULL, NULL, NULL);
  1141. }
  1142. static bt_status_t scan_filter_clear(int client_if, int filt_index)
  1143. {
  1144. struct hal_cmd_gatt_client_scan_filter_clear cmd;
  1145. if (!interface_ready())
  1146. return BT_STATUS_NOT_READY;
  1147. cmd.client_if = client_if;
  1148. cmd.index = filt_index;
  1149. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1150. HAL_OP_GATT_CLIENT_SCAN_FILTER_CLEAR,
  1151. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1152. }
  1153. static bt_status_t scan_filter_enable(int client_if, bool enable)
  1154. {
  1155. struct hal_cmd_gatt_client_scan_filter_enable cmd;
  1156. if (!interface_ready())
  1157. return BT_STATUS_NOT_READY;
  1158. cmd.client_if = client_if;
  1159. cmd.enable = enable;
  1160. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1161. HAL_OP_GATT_CLIENT_SCAN_FILTER_ENABLE,
  1162. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1163. }
  1164. static bt_status_t configure_mtu(int conn_id, int mtu)
  1165. {
  1166. struct hal_cmd_gatt_client_configure_mtu cmd;
  1167. if (!interface_ready())
  1168. return BT_STATUS_NOT_READY;
  1169. cmd.conn_id = conn_id;
  1170. cmd.mtu = mtu;
  1171. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1172. HAL_OP_GATT_CLIENT_CONFIGURE_MTU,
  1173. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1174. }
  1175. static bt_status_t conn_parameter_update(const bt_bdaddr_t *bd_addr,
  1176. int min_interval,
  1177. int max_interval, int latency,
  1178. int timeout)
  1179. {
  1180. struct hal_cmd_gatt_client_conn_param_update cmd;
  1181. if (!interface_ready())
  1182. return BT_STATUS_NOT_READY;
  1183. if (!bd_addr)
  1184. return BT_STATUS_PARM_INVALID;
  1185. memcpy(cmd.address, bd_addr, sizeof(*bd_addr));
  1186. cmd.min_interval = min_interval;
  1187. cmd.max_interval = max_interval;
  1188. cmd.latency = latency;
  1189. cmd.timeout = timeout;
  1190. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1191. HAL_OP_GATT_CLIENT_CONN_PARAM_UPDATE,
  1192. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1193. }
  1194. static bt_status_t set_scan_parameters(int scan_interval, int scan_window)
  1195. {
  1196. struct hal_cmd_gatt_client_set_scan_param cmd;
  1197. if (!interface_ready())
  1198. return BT_STATUS_NOT_READY;
  1199. cmd.interval = scan_interval;
  1200. cmd.window = scan_window;
  1201. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1202. HAL_OP_GATT_CLIENT_SET_SCAN_PARAM,
  1203. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1204. }
  1205. static bt_status_t multi_adv_enable(int client_if, int min_interval,
  1206. int max_interval, int adv_type,
  1207. int chnl_map, int tx_power,
  1208. int timeout_s)
  1209. {
  1210. struct hal_cmd_gatt_client_setup_multi_adv cmd;
  1211. if (!interface_ready())
  1212. return BT_STATUS_NOT_READY;
  1213. cmd.client_if = client_if;
  1214. cmd.min_interval = min_interval;
  1215. cmd.max_interval = max_interval;
  1216. cmd.type = adv_type;
  1217. cmd.channel_map = chnl_map;
  1218. cmd.tx_power = tx_power;
  1219. cmd.timeout = timeout_s;
  1220. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1221. HAL_OP_GATT_CLIENT_SETUP_MULTI_ADV,
  1222. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1223. }
  1224. static bt_status_t multi_adv_update(int client_if, int min_interval,
  1225. int max_interval, int adv_type,
  1226. int chnl_map, int tx_power,
  1227. int timeout_s)
  1228. {
  1229. struct hal_cmd_gatt_client_update_multi_adv cmd;
  1230. if (!interface_ready())
  1231. return BT_STATUS_NOT_READY;
  1232. cmd.client_if = client_if;
  1233. cmd.min_interval = min_interval;
  1234. cmd.max_interval = max_interval;
  1235. cmd.type = adv_type;
  1236. cmd.channel_map = chnl_map;
  1237. cmd.tx_power = tx_power;
  1238. cmd.timeout = timeout_s;
  1239. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1240. HAL_OP_GATT_CLIENT_UPDATE_MULTI_ADV,
  1241. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1242. }
  1243. static bt_status_t multi_adv_set_inst_data(int client_if, bool set_scan_rsp,
  1244. bool include_name,
  1245. bool incl_txpower,
  1246. int appearance,
  1247. int manufacturer_len,
  1248. char *manufacturer_data,
  1249. int service_data_len,
  1250. char *service_data,
  1251. int service_uuid_len,
  1252. char *service_uuid)
  1253. {
  1254. char buf[IPC_MTU];
  1255. struct hal_cmd_gatt_client_setup_multi_adv_inst *cmd = (void *) buf;
  1256. int off = 0;
  1257. if (!interface_ready())
  1258. return BT_STATUS_NOT_READY;
  1259. if (manufacturer_len > 0 && !manufacturer_data)
  1260. return BT_STATUS_PARM_INVALID;
  1261. if (service_data_len > 0 && !service_data)
  1262. return BT_STATUS_PARM_INVALID;
  1263. if (service_uuid_len > 0 && !service_uuid)
  1264. return BT_STATUS_PARM_INVALID;
  1265. if (sizeof(*cmd) + manufacturer_len + service_data_len
  1266. + service_uuid_len > IPC_MTU)
  1267. return BT_STATUS_FAIL;
  1268. cmd->client_if = client_if;
  1269. cmd->set_scan_rsp = set_scan_rsp;
  1270. cmd->include_name = include_name;
  1271. cmd->include_tx_power = incl_txpower;
  1272. cmd->appearance = appearance;
  1273. cmd->manufacturer_data_len = manufacturer_len;
  1274. cmd->service_data_len = service_data_len;
  1275. cmd->service_uuid_len = service_uuid_len;
  1276. if (manufacturer_len > 0) {
  1277. memcpy(cmd->data_service_uuid, manufacturer_data,
  1278. manufacturer_len);
  1279. off += manufacturer_len;
  1280. }
  1281. if (service_data_len > 0) {
  1282. memcpy(cmd->data_service_uuid + off, service_data,
  1283. service_data_len);
  1284. off += service_data_len;
  1285. }
  1286. if (service_uuid_len > 0) {
  1287. memcpy(cmd->data_service_uuid + off, service_uuid,
  1288. service_uuid_len);
  1289. off += service_uuid_len;
  1290. }
  1291. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1292. HAL_OP_GATT_CLIENT_SETUP_MULTI_ADV_INST,
  1293. sizeof(*cmd) + off, cmd, NULL, NULL, NULL);
  1294. }
  1295. static bt_status_t multi_adv_disable(int client_if)
  1296. {
  1297. struct hal_cmd_gatt_client_disable_multi_adv_inst cmd;
  1298. if (!interface_ready())
  1299. return BT_STATUS_NOT_READY;
  1300. cmd.client_if = client_if;
  1301. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1302. HAL_OP_GATT_CLIENT_DISABLE_MULTI_ADV_INST,
  1303. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1304. }
  1305. static bt_status_t batchscan_cfg_storage(int client_if, int batch_scan_full_max,
  1306. int batch_scan_trunc_max,
  1307. int batch_scan_notify_threshold)
  1308. {
  1309. struct hal_cmd_gatt_client_configure_batchscan cmd;
  1310. if (!interface_ready())
  1311. return BT_STATUS_NOT_READY;
  1312. cmd.client_if = client_if;
  1313. cmd.full_max = batch_scan_full_max;
  1314. cmd.trunc_max = batch_scan_trunc_max;
  1315. cmd.notify_threshold = batch_scan_notify_threshold;
  1316. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1317. HAL_OP_GATT_CLIENT_CONFIGURE_BATCHSCAN,
  1318. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1319. }
  1320. static bt_status_t batchscan_enb_batch_scan(int client_if, int scan_mode,
  1321. int scan_interval,
  1322. int scan_window, int addr_type,
  1323. int discard_rule)
  1324. {
  1325. struct hal_cmd_gatt_client_enable_batchscan cmd;
  1326. if (!interface_ready())
  1327. return BT_STATUS_NOT_READY;
  1328. cmd.client_if = client_if;
  1329. cmd.mode = scan_mode;
  1330. cmd.interval = scan_interval;
  1331. cmd.window = scan_window;
  1332. cmd.address_type = addr_type;
  1333. cmd.discard_rule = discard_rule;
  1334. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1335. HAL_OP_GATT_CLIENT_ENABLE_BATCHSCAN,
  1336. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1337. }
  1338. static bt_status_t batchscan_dis_batch_scan(int client_if)
  1339. {
  1340. struct hal_cmd_gatt_client_disable_batchscan cmd;
  1341. if (!interface_ready())
  1342. return BT_STATUS_NOT_READY;
  1343. cmd.client_if = client_if;
  1344. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1345. HAL_OP_GATT_CLIENT_DISABLE_BATCHSCAN,
  1346. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1347. }
  1348. static bt_status_t batchscan_read_reports(int client_if, int scan_mode)
  1349. {
  1350. struct hal_cmd_gatt_client_read_batchscan_reports cmd;
  1351. if (!interface_ready())
  1352. return BT_STATUS_NOT_READY;
  1353. cmd.client_if = client_if;
  1354. cmd.scan_mode = scan_mode;
  1355. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1356. HAL_OP_GATT_CLIENT_READ_BATCHSCAN_REPORTS,
  1357. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1358. }
  1359. #endif
  1360. /* Server API */
  1361. static bt_status_t register_server(bt_uuid_t *uuid)
  1362. {
  1363. struct hal_cmd_gatt_server_register cmd;
  1364. if (!interface_ready())
  1365. return BT_STATUS_NOT_READY;
  1366. memcpy(cmd.uuid, uuid, sizeof(*uuid));
  1367. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_SERVER_REGISTER,
  1368. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1369. }
  1370. static bt_status_t unregister_server(int server_if)
  1371. {
  1372. struct hal_cmd_gatt_server_unregister cmd;
  1373. if (!interface_ready())
  1374. return BT_STATUS_NOT_READY;
  1375. cmd.server_if = server_if;
  1376. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_SERVER_UNREGISTER,
  1377. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1378. }
  1379. static bt_status_t server_connect_real(int server_if,
  1380. const bt_bdaddr_t *bd_addr,
  1381. bool is_direct, int transport)
  1382. {
  1383. struct hal_cmd_gatt_server_connect cmd;
  1384. if (!interface_ready())
  1385. return BT_STATUS_NOT_READY;
  1386. cmd.server_if = server_if;
  1387. cmd.is_direct = is_direct;
  1388. cmd.transport = transport;
  1389. memcpy(cmd.bdaddr, bd_addr, sizeof(*bd_addr));
  1390. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_SERVER_CONNECT,
  1391. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1392. }
  1393. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  1394. static bt_status_t server_connect(int server_if, const bt_bdaddr_t *bd_addr,
  1395. bool is_direct, int transport)
  1396. {
  1397. return server_connect_real(server_if, bd_addr, is_direct, transport);
  1398. }
  1399. #else
  1400. static bt_status_t server_connect(int server_if, const bt_bdaddr_t *bd_addr,
  1401. bool is_direct)
  1402. {
  1403. return server_connect_real(server_if, bd_addr, is_direct,
  1404. BT_TRANSPORT_UNKNOWN);
  1405. }
  1406. #endif
  1407. static bt_status_t server_disconnect(int server_if, const bt_bdaddr_t *bd_addr,
  1408. int conn_id)
  1409. {
  1410. struct hal_cmd_gatt_server_disconnect cmd;
  1411. if (!interface_ready())
  1412. return BT_STATUS_NOT_READY;
  1413. cmd.server_if = server_if;
  1414. cmd.conn_id = conn_id;
  1415. memcpy(cmd.bdaddr, bd_addr, sizeof(*bd_addr));
  1416. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_SERVER_DISCONNECT,
  1417. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1418. }
  1419. static bt_status_t add_service(int server_if, btgatt_srvc_id_t *srvc_id,
  1420. int num_handles)
  1421. {
  1422. struct hal_cmd_gatt_server_add_service cmd;
  1423. if (!interface_ready())
  1424. return BT_STATUS_NOT_READY;
  1425. cmd.server_if = server_if;
  1426. cmd.num_handles = num_handles;
  1427. srvc_id_to_hal(&cmd.srvc_id, srvc_id);
  1428. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_SERVER_ADD_SERVICE,
  1429. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1430. }
  1431. static bt_status_t add_included_service(int server_if, int service_handle,
  1432. int included_handle)
  1433. {
  1434. struct hal_cmd_gatt_server_add_inc_service cmd;
  1435. if (!interface_ready())
  1436. return BT_STATUS_NOT_READY;
  1437. cmd.server_if = server_if;
  1438. cmd.service_handle = service_handle;
  1439. cmd.included_handle = included_handle;
  1440. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1441. HAL_OP_GATT_SERVER_ADD_INC_SERVICE,
  1442. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1443. }
  1444. static bt_status_t add_characteristic(int server_if, int service_handle,
  1445. bt_uuid_t *uuid, int properties,
  1446. int permissions)
  1447. {
  1448. struct hal_cmd_gatt_server_add_characteristic cmd;
  1449. if (!interface_ready())
  1450. return BT_STATUS_NOT_READY;
  1451. cmd.server_if = server_if;
  1452. cmd.service_handle = service_handle;
  1453. cmd.properties = properties;
  1454. cmd.permissions = permissions;
  1455. memcpy(cmd.uuid, uuid, sizeof(*uuid));
  1456. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1457. HAL_OP_GATT_SERVER_ADD_CHARACTERISTIC,
  1458. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1459. }
  1460. static bt_status_t add_descriptor(int server_if, int service_handle,
  1461. bt_uuid_t *uuid, int permissions)
  1462. {
  1463. struct hal_cmd_gatt_server_add_descriptor cmd;
  1464. if (!interface_ready())
  1465. return BT_STATUS_NOT_READY;
  1466. cmd.server_if = server_if;
  1467. cmd.service_handle = service_handle;
  1468. cmd.permissions = permissions;
  1469. memcpy(cmd.uuid, uuid, sizeof(*uuid));
  1470. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1471. HAL_OP_GATT_SERVER_ADD_DESCRIPTOR,
  1472. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1473. }
  1474. static bt_status_t start_service_real(int server_if, int service_handle,
  1475. int transport)
  1476. {
  1477. struct hal_cmd_gatt_server_start_service cmd;
  1478. if (!interface_ready())
  1479. return BT_STATUS_NOT_READY;
  1480. cmd.server_if = server_if;
  1481. cmd.service_handle = service_handle;
  1482. cmd.transport = transport;
  1483. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1484. HAL_OP_GATT_SERVER_START_SERVICE,
  1485. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1486. }
  1487. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  1488. static bt_status_t start_service(int server_if, int service_handle,
  1489. int transport)
  1490. {
  1491. return start_service_real(server_if, service_handle, transport);
  1492. }
  1493. #else
  1494. static bt_status_t start_service(int server_if, int service_handle,
  1495. int transport)
  1496. {
  1497. int transport_mask = 0;
  1498. /* Android 5 changes transport enum to bit mask. */
  1499. switch (transport) {
  1500. case 0:
  1501. transport_mask = GATT_SERVER_TRANSPORT_LE_BIT;
  1502. break;
  1503. case 1:
  1504. transport_mask = GATT_SERVER_TRANSPORT_BREDR_BIT;
  1505. break;
  1506. case 2:
  1507. transport_mask = GATT_SERVER_TRANSPORT_LE_BIT |
  1508. GATT_SERVER_TRANSPORT_BREDR_BIT;
  1509. break;
  1510. }
  1511. return start_service_real(server_if, service_handle, transport_mask);
  1512. }
  1513. #endif
  1514. static bt_status_t stop_service(int server_if, int service_handle)
  1515. {
  1516. struct hal_cmd_gatt_server_stop_service cmd;
  1517. if (!interface_ready())
  1518. return BT_STATUS_NOT_READY;
  1519. cmd.server_if = server_if;
  1520. cmd.service_handle = service_handle;
  1521. return hal_ipc_cmd(HAL_SERVICE_ID_GATT, HAL_OP_GATT_SERVER_STOP_SERVICE,
  1522. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1523. }
  1524. static bt_status_t delete_service(int server_if, int service_handle)
  1525. {
  1526. struct hal_cmd_gatt_server_delete_service cmd;
  1527. if (!interface_ready())
  1528. return BT_STATUS_NOT_READY;
  1529. cmd.server_if = server_if;
  1530. cmd.service_handle = service_handle;
  1531. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1532. HAL_OP_GATT_SERVER_DELETE_SERVICE,
  1533. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1534. }
  1535. static bt_status_t send_indication(int server_if, int attribute_handle,
  1536. int conn_id, int len, int confirm,
  1537. char *p_value)
  1538. {
  1539. char buf[IPC_MTU];
  1540. struct hal_cmd_gatt_server_send_indication *cmd = (void *) buf;
  1541. size_t cmd_len = sizeof(*cmd) + len;
  1542. if (!interface_ready())
  1543. return BT_STATUS_NOT_READY;
  1544. cmd->server_if = server_if;
  1545. cmd->attribute_handle = attribute_handle;
  1546. cmd->conn_id = conn_id;
  1547. cmd->len = len;
  1548. cmd->confirm = confirm;
  1549. memcpy(cmd->value, p_value, len);
  1550. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1551. HAL_OP_GATT_SERVER_SEND_INDICATION,
  1552. cmd_len, cmd, NULL, NULL, NULL);
  1553. }
  1554. static bt_status_t send_response(int conn_id, int trans_id, int status,
  1555. btgatt_response_t *response)
  1556. {
  1557. char buf[IPC_MTU];
  1558. struct hal_cmd_gatt_server_send_response *cmd = (void *) buf;
  1559. size_t cmd_len = sizeof(*cmd) + sizeof(*response);
  1560. memset(buf, 0 , IPC_MTU);
  1561. if (!interface_ready())
  1562. return BT_STATUS_NOT_READY;
  1563. cmd->conn_id = conn_id;
  1564. cmd->trans_id = trans_id;
  1565. cmd->status = status;
  1566. cmd->handle = response->attr_value.handle;
  1567. cmd->offset = response->attr_value.offset;
  1568. cmd->auth_req = response->attr_value.auth_req;
  1569. cmd->len = response->attr_value.len;
  1570. memcpy(cmd->data, response->attr_value.value, cmd->len);
  1571. return hal_ipc_cmd(HAL_SERVICE_ID_GATT,
  1572. HAL_OP_GATT_SERVER_SEND_RESPONSE,
  1573. cmd_len, cmd, NULL, NULL, NULL);
  1574. }
  1575. static bt_status_t init(const btgatt_callbacks_t *callbacks)
  1576. {
  1577. struct hal_cmd_register_module cmd;
  1578. int ret;
  1579. DBG("");
  1580. if (interface_ready())
  1581. return BT_STATUS_DONE;
  1582. cbs = callbacks;
  1583. hal_ipc_register(HAL_SERVICE_ID_GATT, ev_handlers,
  1584. sizeof(ev_handlers)/sizeof(ev_handlers[0]));
  1585. cmd.service_id = HAL_SERVICE_ID_GATT;
  1586. cmd.mode = HAL_MODE_DEFAULT;
  1587. cmd.max_clients = 1;
  1588. ret = hal_ipc_cmd(HAL_SERVICE_ID_CORE, HAL_OP_REGISTER_MODULE,
  1589. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1590. if (ret != BT_STATUS_SUCCESS) {
  1591. cbs = NULL;
  1592. hal_ipc_unregister(HAL_SERVICE_ID_GATT);
  1593. }
  1594. return ret;
  1595. }
  1596. static void cleanup(void)
  1597. {
  1598. struct hal_cmd_unregister_module cmd;
  1599. DBG("");
  1600. if (!interface_ready())
  1601. return;
  1602. cmd.service_id = HAL_SERVICE_ID_GATT;
  1603. hal_ipc_cmd(HAL_SERVICE_ID_CORE, HAL_OP_UNREGISTER_MODULE,
  1604. sizeof(cmd), &cmd, NULL, NULL, NULL);
  1605. hal_ipc_unregister(HAL_SERVICE_ID_GATT);
  1606. cbs = NULL;
  1607. }
  1608. static btgatt_client_interface_t client_iface = {
  1609. .register_client = register_client,
  1610. .unregister_client = unregister_client,
  1611. .scan = scan,
  1612. .connect = connect,
  1613. .disconnect = disconnect,
  1614. .listen = listen,
  1615. .refresh = refresh,
  1616. .search_service = search_service,
  1617. .get_included_service = get_included_service,
  1618. .get_characteristic = get_characteristic,
  1619. .get_descriptor = get_descriptor,
  1620. .read_characteristic = read_characteristic,
  1621. .write_characteristic = write_characteristic,
  1622. .read_descriptor = read_descriptor,
  1623. .write_descriptor = write_descriptor,
  1624. .execute_write = execute_write,
  1625. .register_for_notification = register_for_notification,
  1626. .deregister_for_notification = deregister_for_notification,
  1627. .read_remote_rssi = read_remote_rssi,
  1628. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  1629. .scan_filter_param_setup = scan_filter_param_setup,
  1630. .scan_filter_add_remove = scan_filter_add_remove,
  1631. .scan_filter_clear = scan_filter_clear,
  1632. .scan_filter_enable = scan_filter_enable,
  1633. #endif
  1634. .get_device_type = get_device_type,
  1635. .set_adv_data = set_adv_data,
  1636. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  1637. .configure_mtu = configure_mtu,
  1638. .conn_parameter_update = conn_parameter_update,
  1639. .set_scan_parameters = set_scan_parameters,
  1640. .multi_adv_enable = multi_adv_enable,
  1641. .multi_adv_update = multi_adv_update,
  1642. .multi_adv_set_inst_data = multi_adv_set_inst_data,
  1643. .multi_adv_disable = multi_adv_disable,
  1644. .batchscan_cfg_storage = batchscan_cfg_storage,
  1645. .batchscan_enb_batch_scan = batchscan_enb_batch_scan,
  1646. .batchscan_dis_batch_scan = batchscan_dis_batch_scan,
  1647. .batchscan_read_reports = batchscan_read_reports,
  1648. #endif
  1649. .test_command = test_command,
  1650. };
  1651. static btgatt_server_interface_t server_iface = {
  1652. .register_server = register_server,
  1653. .unregister_server = unregister_server,
  1654. .connect = server_connect,
  1655. .disconnect = server_disconnect,
  1656. .add_service = add_service,
  1657. .add_included_service = add_included_service,
  1658. .add_characteristic = add_characteristic,
  1659. .add_descriptor = add_descriptor,
  1660. .start_service = start_service,
  1661. .stop_service = stop_service,
  1662. .delete_service = delete_service,
  1663. .send_indication = send_indication,
  1664. .send_response = send_response,
  1665. };
  1666. static btgatt_interface_t iface = {
  1667. .size = sizeof(iface),
  1668. .init = init,
  1669. .cleanup = cleanup,
  1670. .client = &client_iface,
  1671. .server = &server_iface,
  1672. };
  1673. btgatt_interface_t *bt_get_gatt_interface(void)
  1674. {
  1675. return &iface;
  1676. }