tester-main.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. /* SPDX-License-Identifier: LGPL-2.1-or-later */
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2014 Intel Corporation. All rights reserved.
  7. *
  8. *
  9. */
  10. #include <glib.h>
  11. #include <hardware/audio.h>
  12. #include <hardware/bluetooth.h>
  13. #include <hardware/bt_sock.h>
  14. #include <hardware/bt_hh.h>
  15. #include <hardware/bt_pan.h>
  16. #include <hardware/bt_hl.h>
  17. #include <hardware/bt_av.h>
  18. #include <hardware/bt_rc.h>
  19. #include <hardware/bt_gatt.h>
  20. #include "emulator/hciemu.h"
  21. #include <hardware/bt_mce.h>
  22. struct pdu_set {
  23. struct iovec req;
  24. struct iovec rsp;
  25. };
  26. #define raw_data(args...) ((unsigned char[]) { args })
  27. #define raw_pdu(args...) \
  28. { \
  29. .iov_base = raw_data(args), \
  30. .iov_len = sizeof(raw_data(args)), \
  31. }
  32. #define end_pdu { .iov_base = NULL }
  33. #define TEST_CASE_BREDR(text, ...) { \
  34. HCIEMU_TYPE_BREDR, \
  35. text, \
  36. sizeof((struct step[]) {__VA_ARGS__}) / sizeof(struct step), \
  37. (struct step[]) {__VA_ARGS__}, \
  38. }
  39. #define TEST_CASE_BREDRLE(text, ...) { \
  40. HCIEMU_TYPE_BREDRLE, \
  41. text, \
  42. sizeof((struct step[]) {__VA_ARGS__}) / sizeof(struct step), \
  43. (struct step[]) {__VA_ARGS__}, \
  44. }
  45. #define MODIFY_DATA(status, modif_fun, from, to, len) { \
  46. .action_status = status, \
  47. .action = modif_fun, \
  48. .set_data = from, \
  49. .set_data_2 = to, \
  50. .set_data_len = len, \
  51. }
  52. #define PROCESS_DATA(status, proc_fun, data1, data2, data3) { \
  53. .action_status = status, \
  54. .action = proc_fun, \
  55. .set_data = data1, \
  56. .set_data_2 = data2, \
  57. .set_data_3 = data3, \
  58. }
  59. #define ACTION(status, act_fun, data_set) { \
  60. .action_status = status, \
  61. .action = act_fun, \
  62. .set_data = data_set, \
  63. }
  64. #define ACTION_FAIL(act_fun, data_set) \
  65. ACTION(BT_STATUS_FAIL, act_fun, data_set)
  66. #define ACTION_SUCCESS(act_fun, data_set) \
  67. ACTION(BT_STATUS_SUCCESS, act_fun, data_set)
  68. #define CALLBACK(cb) { \
  69. .callback = cb, \
  70. }
  71. #define CALLBACK_STATE(cb, cb_res) { \
  72. .callback = cb, \
  73. .callback_result.state = cb_res, \
  74. }
  75. #define CALLBACK_STATUS(cb, cb_res) { \
  76. .callback = cb, \
  77. .callback_result.status = cb_res, \
  78. }
  79. #define CALLBACK_ERROR(cb, cb_err) { \
  80. .callback = cb, \
  81. .callback_result.error = cb_err, \
  82. }
  83. #define CALLBACK_ADAPTER_PROPS(props, prop_cnt) { \
  84. .callback = CB_BT_ADAPTER_PROPERTIES, \
  85. .callback_result.properties = props, \
  86. .callback_result.num_properties = prop_cnt, \
  87. }
  88. #define CALLBACK_PROPS(cb, props, prop_cnt) { \
  89. .callback = cb, \
  90. .callback_result.properties = props, \
  91. .callback_result.num_properties = prop_cnt, \
  92. }
  93. #define CALLBACK_HH_MODE(cb, cb_res, cb_mode) { \
  94. .callback = cb, \
  95. .callback_result.status = cb_res, \
  96. .callback_result.mode = cb_mode, \
  97. }
  98. #define CALLBACK_HHREPORT(cb, cb_res, cb_rep_size) { \
  99. .callback = cb, \
  100. .callback_result.status = cb_res, \
  101. .callback_result.report_size = cb_rep_size, \
  102. }
  103. #define CLLBACK_GATTC_SCAN_RES(props, prop_cnt, cb_adv_data) {\
  104. .callback = CB_GATTC_SCAN_RESULT, \
  105. .callback_result.properties = props, \
  106. .callback_result.num_properties = prop_cnt, \
  107. .callback_result.adv_data = cb_adv_data, \
  108. }
  109. #define CALLBACK_GATTC_CONNECT(cb_res, cb_prop, cb_conn_id, cb_client_id) { \
  110. .callback = CB_GATTC_OPEN, \
  111. .callback_result.status = cb_res, \
  112. .callback_result.properties = cb_prop, \
  113. .callback_result.num_properties = 1, \
  114. .callback_result.conn_id = cb_conn_id, \
  115. .callback_result.gatt_app_id = cb_client_id, \
  116. }
  117. #define CALLBACK_GATTC_SEARCH_RESULT(cb_conn_id, cb_service) { \
  118. .callback = CB_GATTC_SEARCH_RESULT, \
  119. .callback_result.conn_id = cb_conn_id, \
  120. .callback_result.service = cb_service \
  121. }
  122. #define CALLBACK_GATTC_SEARCH_COMPLETE(cb_res, cb_conn_id) { \
  123. .callback = CB_GATTC_SEARCH_COMPLETE, \
  124. .callback_result.conn_id = cb_conn_id \
  125. }
  126. #define CALLBACK_GATTC_GET_CHARACTERISTIC_CB(cb_res, cb_conn_id, cb_service, \
  127. cb_char, cb_char_prop) { \
  128. .callback = CB_GATTC_GET_CHARACTERISTIC, \
  129. .callback_result.conn_id = cb_conn_id, \
  130. .callback_result.status = cb_res, \
  131. .callback_result.service = cb_service, \
  132. .callback_result.characteristic = cb_char, \
  133. .callback_result.char_prop = cb_char_prop \
  134. }
  135. #define CALLBACK_GATTC_GET_DESCRIPTOR(cb_res, cb_conn_id, cb_service, \
  136. cb_char, cb_desc) { \
  137. .callback = CB_GATTC_GET_DESCRIPTOR, \
  138. .callback_result.conn_id = cb_conn_id, \
  139. .callback_result.status = cb_res, \
  140. .callback_result.service = cb_service, \
  141. .callback_result.characteristic = cb_char, \
  142. .callback_result.descriptor = cb_desc \
  143. }
  144. #define CALLBACK_GATTC_GET_INCLUDED(cb_res, cb_conn_id, cb_service, \
  145. cb_incl) { \
  146. .callback = CB_GATTC_GET_INCLUDED_SERVICE, \
  147. .callback_result.conn_id = cb_conn_id, \
  148. .callback_result.status = cb_res, \
  149. .callback_result.service = cb_service, \
  150. .callback_result.included = cb_incl, \
  151. }
  152. #define CALLBACK_GATTC_READ_CHARACTERISTIC(cb_res, cb_conn_id, cb_read_data) { \
  153. .callback = CB_GATTC_READ_CHARACTERISTIC, \
  154. .callback_result.conn_id = cb_conn_id, \
  155. .callback_result.status = cb_res, \
  156. .callback_result.read_params = cb_read_data, \
  157. }
  158. #define CALLBACK_GATTC_READ_DESCRIPTOR(cb_res, cb_conn_id, cb_read_data) { \
  159. .callback = CB_GATTC_READ_DESCRIPTOR, \
  160. .callback_result.conn_id = cb_conn_id, \
  161. .callback_result.status = cb_res, \
  162. .callback_result.read_params = cb_read_data, \
  163. }
  164. #define CALLBACK_GATTC_WRITE_DESCRIPTOR(cb_res, cb_conn_id, cb_write_data) { \
  165. .callback = CB_GATTC_WRITE_DESCRIPTOR, \
  166. .callback_result.conn_id = cb_conn_id, \
  167. .callback_result.status = cb_res, \
  168. .callback_result.write_params = cb_write_data, \
  169. }
  170. #define CALLBACK_GATTC_WRITE_CHARACTERISTIC(cb_res, cb_conn_id, \
  171. cb_write_data) { \
  172. .callback = CB_GATTC_WRITE_CHARACTERISTIC, \
  173. .callback_result.conn_id = cb_conn_id, \
  174. .callback_result.status = cb_res, \
  175. .callback_result.write_params = cb_write_data, \
  176. }
  177. #define CALLBACK_GATTC_REGISTER_FOR_NOTIF(cb_res, cb_conn_id, cb_char,\
  178. cb_service, cb_registered) { \
  179. .callback = CB_GATTC_REGISTER_FOR_NOTIFICATION, \
  180. .callback_result.conn_id = cb_conn_id, \
  181. .callback_result.status = cb_res, \
  182. .callback_result.service = cb_service, \
  183. .callback_result.characteristic = cb_char, \
  184. .callback_result.notification_registered = cb_registered \
  185. }
  186. #define CALLBACK_GATTC_NOTIFY(cb_conn_id, cb_notify) { \
  187. .callback = CB_GATTC_NOTIFY, \
  188. .callback_result.conn_id = cb_conn_id, \
  189. .callback_result.notify_params = cb_notify \
  190. }
  191. #define CALLBACK_GATTC_DISCONNECT(cb_res, cb_prop, cb_conn_id, cb_client_id) { \
  192. .callback = CB_GATTC_CLOSE, \
  193. .callback_result.status = cb_res, \
  194. .callback_result.properties = cb_prop, \
  195. .callback_result.num_properties = 1, \
  196. .callback_result.conn_id = cb_conn_id, \
  197. .callback_result.gatt_app_id = cb_client_id, \
  198. }
  199. #define CALLBACK_GATTS_CONNECTION(cb_res, cb_prop, cb_conn_id, cb_server_id) { \
  200. .callback = CB_GATTS_CONNECTION, \
  201. .callback_result.connected = cb_res, \
  202. .callback_result.properties = cb_prop, \
  203. .callback_result.num_properties = 1, \
  204. .callback_result.conn_id = cb_conn_id, \
  205. .callback_result.gatt_app_id = cb_server_id, \
  206. }
  207. #define CALLBACK_GATTS_NOTIF_CONF(cb_conn_id, cb_status) { \
  208. .callback = CB_GATTS_INDICATION_SEND, \
  209. .callback_result.conn_id = cb_conn_id, \
  210. .callback_result.status = cb_status, \
  211. }
  212. #define CALLBACK_GATTS_SERVICE_ADDED(cb_res, cb_server_id, cb_service, \
  213. cb_srvc_handle, \
  214. cb_store_srvc_handle) { \
  215. .callback = CB_GATTS_SERVICE_ADDED, \
  216. .callback_result.status = cb_res, \
  217. .callback_result.gatt_app_id = cb_server_id, \
  218. .callback_result.service = cb_service, \
  219. .callback_result.srvc_handle = cb_srvc_handle, \
  220. .store_srvc_handle = cb_store_srvc_handle, \
  221. }
  222. #define CALLBACK_GATTS_INC_SERVICE_ADDED(cb_res, cb_server_id, cb_srvc_handle, \
  223. cb_inc_srvc_handle) { \
  224. .callback = CB_GATTS_INCLUDED_SERVICE_ADDED, \
  225. .callback_result.status = cb_res, \
  226. .callback_result.gatt_app_id = cb_server_id, \
  227. .callback_result.srvc_handle = cb_srvc_handle, \
  228. .callback_result.inc_srvc_handle = cb_inc_srvc_handle, \
  229. }
  230. #define CALLBACK_GATTS_CHARACTERISTIC_ADDED(cb_res, cb_server_id, cb_uuid, \
  231. cb_srvc_handle, \
  232. cb_char_handle, \
  233. cb_store_char_handle) { \
  234. .callback = CB_GATTS_CHARACTERISTIC_ADDED, \
  235. .callback_result.status = cb_res, \
  236. .callback_result.gatt_app_id = cb_server_id, \
  237. .callback_result.uuid = cb_uuid, \
  238. .callback_result.srvc_handle = cb_srvc_handle, \
  239. .callback_result.char_handle = cb_char_handle, \
  240. .store_char_handle = cb_store_char_handle, \
  241. }
  242. #define CALLBACK_GATTS_DESCRIPTOR_ADDED(cb_res, cb_server_id, cb_uuid, \
  243. cb_srvc_handle, cb_desc_handle, \
  244. cb_store_desc_handle) { \
  245. .callback = CB_GATTS_DESCRIPTOR_ADDED, \
  246. .callback_result.status = cb_res, \
  247. .callback_result.gatt_app_id = cb_server_id, \
  248. .callback_result.uuid = cb_uuid, \
  249. .callback_result.srvc_handle = cb_srvc_handle, \
  250. .callback_result.desc_handle = cb_desc_handle, \
  251. .store_desc_handle = cb_store_desc_handle, \
  252. }
  253. #define CALLBACK_GATTS_SERVICE_STARTED(cb_res, cb_server_id, cb_srvc_handle) { \
  254. .callback = CB_GATTS_SERVICE_STARTED, \
  255. .callback_result.status = cb_res, \
  256. .callback_result.gatt_app_id = cb_server_id, \
  257. .callback_result.srvc_handle = cb_srvc_handle, \
  258. }
  259. #define CALLBACK_GATTS_SERVICE_STOPPED(cb_res, cb_server_id, cb_srvc_handle) { \
  260. .callback = CB_GATTS_SERVICE_STOPPED, \
  261. .callback_result.status = cb_res, \
  262. .callback_result.gatt_app_id = cb_server_id, \
  263. .callback_result.srvc_handle = cb_srvc_handle, \
  264. }
  265. #define CALLBACK_GATTS_SERVICE_DELETED(cb_res, cb_server_id, cb_srvc_handle) { \
  266. .callback = CB_GATTS_SERVICE_DELETED, \
  267. .callback_result.status = cb_res, \
  268. .callback_result.gatt_app_id = cb_server_id, \
  269. .callback_result.srvc_handle = cb_srvc_handle, \
  270. }
  271. #define CALLBACK_GATTS_REQUEST_READ(cb_conn_id, cb_trans_id, cb_prop, \
  272. cb_attr_handle, cb_offset, \
  273. cb_is_long) { \
  274. .callback = CB_GATTS_REQUEST_READ, \
  275. .callback_result.conn_id = cb_conn_id, \
  276. .callback_result.trans_id = cb_trans_id, \
  277. .callback_result.properties = cb_prop, \
  278. .callback_result.num_properties = 1, \
  279. .callback_result.attr_handle = cb_attr_handle, \
  280. .callback_result.offset = cb_offset, \
  281. .callback_result.is_long = cb_is_long, \
  282. }
  283. #define CALLBACK_GATTS_REQUEST_WRITE(cb_conn_id, cb_trans_id, cb_prop, \
  284. cb_attr_handle, cb_offset, \
  285. cb_length, cb_need_rsp, \
  286. cb_is_prep, cb_value) { \
  287. .callback = CB_GATTS_REQUEST_WRITE, \
  288. .callback_result.conn_id = cb_conn_id, \
  289. .callback_result.trans_id = cb_trans_id, \
  290. .callback_result.properties = cb_prop, \
  291. .callback_result.num_properties = 1, \
  292. .callback_result.attr_handle = cb_attr_handle, \
  293. .callback_result.offset = cb_offset, \
  294. .callback_result.length = cb_length, \
  295. .callback_result.need_rsp = cb_need_rsp, \
  296. .callback_result.is_prep = cb_is_prep, \
  297. .callback_result.value = cb_value, \
  298. }
  299. #define CALLBACK_MAP_CLIENT_REMOTE_MAS_INSTANCE(cb_status, cb_prop, \
  300. cb_num_inst, cb_instances) { \
  301. .callback = CB_MAP_CLIENT_REMOTE_MAS_INSTANCES, \
  302. .callback_result.properties = cb_prop, \
  303. .callback_result.num_properties = 1, \
  304. .callback_result.status = cb_status, \
  305. .callback_result.num_mas_instances = cb_num_inst, \
  306. .callback_result.mas_instances = cb_instances, \
  307. }
  308. #define CALLBACK_PAN_CTRL_STATE(cb, cb_res, cb_state, cb_local_role) { \
  309. .callback = cb, \
  310. .callback_result.status = cb_res, \
  311. .callback_result.ctrl_state = cb_state, \
  312. .callback_result.local_role = cb_local_role, \
  313. }
  314. #define CALLBACK_PAN_CONN_STATE(cb, cb_res, cb_state, cb_local_role, \
  315. cb_remote_role) { \
  316. .callback = cb, \
  317. .callback_result.status = cb_res, \
  318. .callback_result.conn_state = cb_state, \
  319. .callback_result.local_role = cb_local_role, \
  320. .callback_result.remote_role = cb_remote_role, \
  321. }
  322. #define CALLBACK_HDP_APP_REG_STATE(cb, cb_app_id, cb_state) { \
  323. .callback = cb, \
  324. .callback_result.app_id = cb_app_id, \
  325. .callback_result.app_state = cb_state, \
  326. }
  327. #define CALLBACK_HDP_CHANNEL_STATE(cb, cb_app_id, cb_channel_id, \
  328. cb_mdep_cfg_index, cb_state) { \
  329. .callback = cb, \
  330. .callback_result.app_id = cb_app_id, \
  331. .callback_result.channel_id = cb_channel_id, \
  332. .callback_result.mdep_cfg_index = cb_mdep_cfg_index, \
  333. .callback_result.channel_state = cb_state, \
  334. }
  335. #define CALLBACK_AV_CONN_STATE(cb, cb_av_conn_state) { \
  336. .callback = cb, \
  337. .callback_result.av_conn_state = cb_av_conn_state, \
  338. }
  339. #define CALLBACK_AV_AUDIO_STATE(cb, cb_av_audio_state) { \
  340. .callback = cb, \
  341. .callback_result.av_audio_state = cb_av_audio_state, \
  342. }
  343. #define CALLBACK_RC_PLAY_STATUS(cb, cb_length, cb_position, cb_status) { \
  344. .callback = cb, \
  345. .callback_result.song_length = cb_length, \
  346. .callback_result.song_position = cb_position, \
  347. .callback_result.play_status = cb_status, \
  348. }
  349. #define CALLBACK_RC_REG_NOTIF_TRACK_CHANGED(cb, cb_index) { \
  350. .callback = cb, \
  351. .callback_result.rc_index = cb_index, \
  352. }
  353. #define CALLBACK_RC_REG_NOTIF_POSITION_CHANGED(cb, cb_position) { \
  354. .callback = cb, \
  355. .callback_result.song_position = cb_position, \
  356. }
  357. #define CALLBACK_RC_REG_NOTIF_STATUS_CHANGED(cb, cb_status) { \
  358. .callback = cb, \
  359. .callback_result.play_status = cb_status, \
  360. }
  361. #define CALLBACK_RC_GET_ELEMENT_ATTRIBUTES(cb, cb_num_of_attrs, cb_attrs) { \
  362. .callback = cb, \
  363. .callback_result.num_of_attrs = cb_num_of_attrs, \
  364. .callback_result.attrs = cb_attrs, \
  365. }
  366. #define CALLBACK_DEVICE_PROPS(props, prop_cnt) \
  367. CALLBACK_PROPS(CB_BT_REMOTE_DEVICE_PROPERTIES, props, prop_cnt)
  368. #define CALLBACK_DEVICE_FOUND(props, prop_cnt) \
  369. CALLBACK_PROPS(CB_BT_DEVICE_FOUND, props, prop_cnt)
  370. #define CALLBACK_BOND_STATE(cb_res, props, prop_cnt) { \
  371. .callback = CB_BT_BOND_STATE_CHANGED, \
  372. .callback_result.state = cb_res, \
  373. .callback_result.properties = props, \
  374. .callback_result.num_properties = prop_cnt, \
  375. }
  376. #define CALLBACK_BOND_STATE_FAILED(cb_res, props, prop_cnt, reason) { \
  377. .callback = CB_BT_BOND_STATE_CHANGED, \
  378. .callback_result.state = cb_res, \
  379. .callback_result.status = reason, \
  380. .callback_result.properties = props, \
  381. .callback_result.num_properties = prop_cnt, \
  382. }
  383. #define CALLBACK_SSP_REQ(pair_var, props, prop_cnt) { \
  384. .callback = CB_BT_SSP_REQUEST, \
  385. .callback_result.pairing_variant = pair_var, \
  386. .callback_result.properties = props, \
  387. .callback_result.num_properties = prop_cnt, \
  388. }
  389. #define DBG_CB(cb) { cb, #cb }
  390. /*
  391. * NOTICE:
  392. * Callback enum sections should be
  393. * updated while adding new HAL to tester.
  394. */
  395. typedef enum {
  396. CB_BT_NONE,
  397. CB_BT_ADAPTER_STATE_CHANGED,
  398. CB_BT_ADAPTER_PROPERTIES,
  399. CB_BT_REMOTE_DEVICE_PROPERTIES,
  400. CB_BT_DEVICE_FOUND,
  401. CB_BT_DISCOVERY_STATE_CHANGED,
  402. CB_BT_PIN_REQUEST,
  403. CB_BT_SSP_REQUEST,
  404. CB_BT_BOND_STATE_CHANGED,
  405. CB_BT_ACL_STATE_CHANGED,
  406. CB_BT_THREAD_EVT,
  407. CB_BT_DUT_MODE_RECV,
  408. CB_BT_LE_TEST_MODE,
  409. /* Hidhost cb */
  410. CB_HH_CONNECTION_STATE,
  411. CB_HH_HID_INFO,
  412. CB_HH_PROTOCOL_MODE,
  413. CB_HH_IDLE_TIME,
  414. CB_HH_GET_REPORT,
  415. CB_HH_VIRTUAL_UNPLUG,
  416. /* PAN cb */
  417. CB_PAN_CONTROL_STATE,
  418. CB_PAN_CONNECTION_STATE,
  419. /* HDP cb */
  420. CB_HDP_APP_REG_STATE,
  421. CB_HDP_CHANNEL_STATE,
  422. /* A2DP cb */
  423. CB_A2DP_CONN_STATE,
  424. CB_A2DP_AUDIO_STATE,
  425. /* AVRCP */
  426. CB_AVRCP_PLAY_STATUS_REQ,
  427. CB_AVRCP_PLAY_STATUS_RSP,
  428. CB_AVRCP_REG_NOTIF_REQ,
  429. CB_AVRCP_REG_NOTIF_RSP,
  430. CB_AVRCP_GET_ATTR_REQ,
  431. CB_AVRCP_GET_ATTR_RSP,
  432. /* Gatt client */
  433. CB_GATTC_REGISTER_CLIENT,
  434. CB_GATTC_SCAN_RESULT,
  435. CB_GATTC_OPEN,
  436. CB_GATTC_CLOSE,
  437. CB_GATTC_SEARCH_COMPLETE,
  438. CB_GATTC_SEARCH_RESULT,
  439. CB_GATTC_GET_CHARACTERISTIC,
  440. CB_GATTC_GET_DESCRIPTOR,
  441. CB_GATTC_GET_INCLUDED_SERVICE,
  442. CB_GATTC_REGISTER_FOR_NOTIFICATION,
  443. CB_GATTC_NOTIFY,
  444. CB_GATTC_READ_CHARACTERISTIC,
  445. CB_GATTC_WRITE_CHARACTERISTIC,
  446. CB_GATTC_READ_DESCRIPTOR,
  447. CB_GATTC_WRITE_DESCRIPTOR,
  448. CB_GATTC_EXECUTE_WRITE,
  449. CB_GATTC_READ_REMOTE_RSSI,
  450. CB_GATTC_LISTEN,
  451. /* Gatt server */
  452. CB_GATTS_REGISTER_SERVER,
  453. CB_GATTS_CONNECTION,
  454. CB_GATTS_SERVICE_ADDED,
  455. CB_GATTS_INCLUDED_SERVICE_ADDED,
  456. CB_GATTS_CHARACTERISTIC_ADDED,
  457. CB_GATTS_DESCRIPTOR_ADDED,
  458. CB_GATTS_SERVICE_STARTED,
  459. CB_GATTS_SERVICE_STOPPED,
  460. CB_GATTS_SERVICE_DELETED,
  461. CB_GATTS_REQUEST_READ,
  462. CB_GATTS_REQUEST_WRITE,
  463. CB_GATTS_REQUEST_EXEC_WRITE,
  464. CB_GATTS_RESPONSE_CONFIRMATION,
  465. CB_GATTS_INDICATION_SEND,
  466. /* Map client */
  467. CB_MAP_CLIENT_REMOTE_MAS_INSTANCES,
  468. /* Emulator callbacks */
  469. CB_EMU_CONFIRM_SEND_DATA,
  470. CB_EMU_ENCRYPTION_ENABLED,
  471. CB_EMU_ENCRYPTION_DISABLED,
  472. CB_EMU_CONNECTION_REJECTED,
  473. CB_EMU_VALUE_INDICATION,
  474. CB_EMU_VALUE_NOTIFICATION,
  475. CB_EMU_READ_RESPONSE,
  476. CB_EMU_WRITE_RESPONSE,
  477. CB_EMU_ATT_ERROR,
  478. } expected_bt_callback_t;
  479. struct test_data {
  480. struct mgmt *mgmt;
  481. audio_hw_device_t *audio;
  482. struct hw_device_t *device;
  483. struct hciemu *hciemu;
  484. enum hciemu_type hciemu_type;
  485. const bt_interface_t *if_bluetooth;
  486. const btsock_interface_t *if_sock;
  487. const bthh_interface_t *if_hid;
  488. const btpan_interface_t *if_pan;
  489. const bthl_interface_t *if_hdp;
  490. const btav_interface_t *if_a2dp;
  491. struct audio_stream_out *if_stream;
  492. const btrc_interface_t *if_avrcp;
  493. const btgatt_interface_t *if_gatt;
  494. const btmce_interface_t *if_map_client;
  495. const void *test_data;
  496. struct queue *steps;
  497. guint signalfd;
  498. uint16_t mgmt_index;
  499. pid_t bluetoothd_pid;
  500. struct queue *pdus;
  501. };
  502. /*
  503. * Struct holding bluetooth HAL action parameters
  504. */
  505. struct bt_action_data {
  506. bt_bdaddr_t *addr;
  507. /* Remote props action arguments */
  508. const int prop_type;
  509. const bt_property_t *prop;
  510. /* Bonding requests parameters */
  511. bt_pin_code_t *pin;
  512. const uint8_t pin_len;
  513. const uint8_t ssp_variant;
  514. const bool accept;
  515. const uint16_t io_cap;
  516. /* Socket HAL specific params */
  517. const btsock_type_t sock_type;
  518. const int channel;
  519. const uint8_t *service_uuid;
  520. const char *service_name;
  521. const int flags;
  522. int *fd;
  523. /* HidHost params */
  524. const int report_size;
  525. /*Connection params*/
  526. const uint8_t bearer_type;
  527. const uint8_t transport_type;
  528. };
  529. /* bthost's l2cap server setup parameters */
  530. struct emu_set_l2cap_data {
  531. const uint16_t psm;
  532. const bthost_l2cap_connect_cb func;
  533. void *user_data;
  534. };
  535. struct emu_l2cap_cid_data {
  536. const struct pdu_set *pdu;
  537. uint16_t handle;
  538. uint16_t cid;
  539. bool is_sdp;
  540. };
  541. struct map_inst_data {
  542. int32_t id;
  543. int32_t scn;
  544. int32_t msg_types;
  545. int32_t name_len;
  546. uint8_t *name;
  547. };
  548. /*
  549. * Callback data structure should be enhanced with data
  550. * returned by callbacks. It's used for test case step
  551. * matching with expected step data.
  552. */
  553. struct bt_callback_data {
  554. int state;
  555. int status;
  556. int num_properties;
  557. bt_property_t *properties;
  558. bt_uuid_t *uuid;
  559. bt_ssp_variant_t pairing_variant;
  560. bthh_protocol_mode_t mode;
  561. int report_size;
  562. bool adv_data;
  563. int gatt_app_id;
  564. int conn_id;
  565. int trans_id;
  566. int offset;
  567. bool is_long;
  568. int connected;
  569. uint16_t *attr_handle;
  570. uint16_t *srvc_handle;
  571. uint16_t *inc_srvc_handle;
  572. uint16_t *char_handle;
  573. uint16_t *desc_handle;
  574. btgatt_srvc_id_t *service;
  575. btgatt_gatt_id_t *characteristic;
  576. btgatt_gatt_id_t *descriptor;
  577. btgatt_srvc_id_t *included;
  578. btgatt_read_params_t *read_params;
  579. btgatt_write_params_t *write_params;
  580. btgatt_notify_params_t *notify_params;
  581. int notification_registered;
  582. int char_prop;
  583. int length;
  584. uint8_t *value;
  585. bool need_rsp;
  586. bool is_prep;
  587. uint8_t error;
  588. btpan_control_state_t ctrl_state;
  589. btpan_connection_state_t conn_state;
  590. int local_role;
  591. int remote_role;
  592. int app_id;
  593. int channel_id;
  594. int mdep_cfg_index;
  595. bthl_app_reg_state_t app_state;
  596. bthl_channel_state_t channel_state;
  597. btav_connection_state_t av_conn_state;
  598. btav_audio_state_t av_audio_state;
  599. uint32_t song_length;
  600. uint32_t song_position;
  601. btrc_play_status_t play_status;
  602. uint64_t rc_index;
  603. uint8_t num_of_attrs;
  604. btrc_element_attr_val_t *attrs;
  605. int num_mas_instances;
  606. btmce_mas_instance_t *mas_instances;
  607. };
  608. /*
  609. * Step structure contains expected step data and step
  610. * action, which should be performed before step check.
  611. */
  612. struct step {
  613. void (*action)(void);
  614. int action_status;
  615. expected_bt_callback_t callback;
  616. struct bt_callback_data callback_result;
  617. void *set_data;
  618. void *set_data_2;
  619. void *set_data_3;
  620. int set_data_len;
  621. uint16_t *store_srvc_handle;
  622. uint16_t *store_char_handle;
  623. uint16_t *store_desc_handle;
  624. };
  625. struct test_case {
  626. const uint8_t emu_type;
  627. const char *title;
  628. const uint16_t step_num;
  629. const struct step *step;
  630. };
  631. void tester_handle_l2cap_data_exchange(struct emu_l2cap_cid_data *cid_data);
  632. void tester_generic_connect_cb(uint16_t handle, uint16_t cid, void *user_data);
  633. /* Get, remove test cases API */
  634. struct queue *get_bluetooth_tests(void);
  635. void remove_bluetooth_tests(void);
  636. struct queue *get_socket_tests(void);
  637. void remove_socket_tests(void);
  638. struct queue *get_hidhost_tests(void);
  639. void remove_hidhost_tests(void);
  640. struct queue *get_pan_tests(void);
  641. void remove_pan_tests(void);
  642. struct queue *get_hdp_tests(void);
  643. void remove_hdp_tests(void);
  644. struct queue *get_a2dp_tests(void);
  645. void remove_a2dp_tests(void);
  646. struct queue *get_avrcp_tests(void);
  647. void remove_avrcp_tests(void);
  648. struct queue *get_gatt_tests(void);
  649. void remove_gatt_tests(void);
  650. struct queue *get_map_client_tests(void);
  651. void remove_map_client_tests(void);
  652. /* Generic tester API */
  653. void schedule_action_verification(struct step *step);
  654. void schedule_callback_verification(struct step *step);
  655. /* Emulator actions */
  656. void emu_setup_powered_remote_action(void);
  657. void emu_set_pin_code_action(void);
  658. void emu_set_ssp_mode_action(void);
  659. void emu_set_connect_cb_action(void);
  660. void emu_remote_connect_hci_action(void);
  661. void emu_remote_disconnect_hci_action(void);
  662. void emu_set_io_cap(void);
  663. void emu_add_l2cap_server_action(void);
  664. void emu_add_rfcomm_server_action(void);
  665. /* Actions */
  666. void dummy_action(void);
  667. void bluetooth_enable_action(void);
  668. void bluetooth_disable_action(void);
  669. void bt_set_property_action(void);
  670. void bt_get_property_action(void);
  671. void bt_start_discovery_action(void);
  672. void bt_cancel_discovery_action(void);
  673. void bt_get_device_props_action(void);
  674. void bt_get_device_prop_action(void);
  675. void bt_set_device_prop_action(void);
  676. void bt_create_bond_action(void);
  677. void bt_pin_reply_accept_action(void);
  678. void bt_ssp_reply_accept_action(void);
  679. void bt_cancel_bond_action(void);
  680. void bt_remove_bond_action(void);
  681. void set_default_ssp_request_handler(void);