btp_gap.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395
  1. /* gap.c - Bluetooth GAP Tester */
  2. /*
  3. * Copyright (c) 2015-2016 Intel Corporation
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. */
  7. #include <base/atomic.h>
  8. #include <base/types.h>
  9. #include <string.h>
  10. #include <errno.h>
  11. #include <stddef.h>
  12. #include <string.h>
  13. #include <base/common.h>
  14. #include <bluetooth/bluetooth.h>
  15. #include <bluetooth/conn.h>
  16. #include <bluetooth/gatt.h>
  17. #include <bluetooth/hci.h>
  18. #include <base/byteorder.h>
  19. #include <common/net_buf.h>
  20. #include "host/hci_core.h"
  21. #define LOG_MODULE_NAME bttester_gap
  22. #include <logging/bt_log.h>
  23. #include "btp/btp.h"
  24. #define CONTROLLER_INDEX 0
  25. #define CONTROLLER_NAME "btp_tester"
  26. #define BT_LE_AD_DISCOV_MASK (BT_LE_AD_LIMITED | BT_LE_AD_GENERAL)
  27. #define ADV_BUF_LEN (sizeof(struct gap_device_found_ev) + 2 * 31)
  28. static atomic_t current_settings;
  29. struct bt_conn_auth_cb cb;
  30. static uint8_t oob_legacy_tk[16] = { 0 };
  31. #if !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
  32. static struct bt_le_oob oob_sc_local = { 0 };
  33. static struct bt_le_oob oob_sc_remote = { 0 };
  34. #endif /* !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) */
  35. /* connection parameters for rejection test */
  36. #define REJECT_INTERVAL_MIN 0x0C80
  37. #define REJECT_INTERVAL_MAX 0x0C80
  38. #define REJECT_LATENCY 0x0000
  39. #define REJECT_SUPERVISION_TIMEOUT 0x0C80
  40. #if defined(CONFIG_BT_PRIVACY)
  41. static struct {
  42. bt_addr_le_t addr;
  43. bool supported;
  44. } cars[CONFIG_BT_MAX_PAIRED];
  45. static uint8_t read_car_cb(struct bt_conn *conn, uint8_t err,
  46. struct bt_gatt_read_params *params, const void *data,
  47. uint16_t length);
  48. static struct bt_gatt_read_params read_car_params = {
  49. .func = read_car_cb,
  50. .by_uuid.uuid = BT_UUID_CENTRAL_ADDR_RES,
  51. .by_uuid.start_handle = BT_ATT_FIRST_ATTRIBUTE_HANDLE,
  52. .by_uuid.end_handle = BT_ATT_LAST_ATTRIBUTE_HANDLE,
  53. };
  54. static uint8_t read_car_cb(struct bt_conn *conn, uint8_t err,
  55. struct bt_gatt_read_params *params, const void *data,
  56. uint16_t length)
  57. {
  58. struct bt_conn_info info;
  59. bool supported = false;
  60. if (!err && data && length == 1) {
  61. const uint8_t *tmp = data;
  62. /* only 0 or 1 are valid values */
  63. if (tmp[0] == 1) {
  64. supported = true;
  65. }
  66. }
  67. bt_conn_get_info(conn, &info);
  68. for (int i = 0; i < CONFIG_BT_MAX_PAIRED; i++) {
  69. if (bt_addr_le_eq(info.le.dst, &cars[i].addr)) {
  70. cars[i].supported = supported;
  71. break;
  72. }
  73. }
  74. return BT_GATT_ITER_STOP;
  75. }
  76. #endif
  77. static void le_connected(struct bt_conn *conn, uint8_t err)
  78. {
  79. struct gap_device_connected_ev ev;
  80. struct bt_conn_info info;
  81. if (err) {
  82. return;
  83. }
  84. bt_conn_get_info(conn, &info);
  85. memcpy(ev.address, info.le.dst->a.val, sizeof(ev.address));
  86. ev.address_type = info.le.dst->type;
  87. ev.interval = sys_cpu_to_le16(info.le.interval);
  88. ev.latency = sys_cpu_to_le16(info.le.latency);
  89. ev.timeout = sys_cpu_to_le16(info.le.timeout);
  90. tester_send(BTP_SERVICE_ID_GAP, GAP_EV_DEVICE_CONNECTED,
  91. CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
  92. }
  93. static void le_disconnected(struct bt_conn *conn, uint8_t reason)
  94. {
  95. struct gap_device_disconnected_ev ev;
  96. const bt_addr_le_t *addr = bt_conn_get_dst(conn);
  97. memcpy(ev.address, addr->a.val, sizeof(ev.address));
  98. ev.address_type = addr->type;
  99. tester_send(BTP_SERVICE_ID_GAP, GAP_EV_DEVICE_DISCONNECTED,
  100. CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
  101. }
  102. static void le_identity_resolved(struct bt_conn *conn, const bt_addr_le_t *rpa,
  103. const bt_addr_le_t *identity)
  104. {
  105. struct gap_identity_resolved_ev ev;
  106. ev.address_type = rpa->type;
  107. memcpy(ev.address, rpa->a.val, sizeof(ev.address));
  108. ev.identity_address_type = identity->type;
  109. memcpy(ev.identity_address, identity->a.val,
  110. sizeof(ev.identity_address));
  111. tester_send(BTP_SERVICE_ID_GAP, GAP_EV_IDENTITY_RESOLVED,
  112. CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
  113. }
  114. static void le_param_updated(struct bt_conn *conn, uint16_t interval,
  115. uint16_t latency, uint16_t timeout)
  116. {
  117. struct gap_conn_param_update_ev ev;
  118. const bt_addr_le_t *addr = bt_conn_get_dst(conn);
  119. memcpy(ev.address, addr->a.val, sizeof(ev.address));
  120. ev.address_type = addr->type;
  121. ev.interval = sys_cpu_to_le16(interval);
  122. ev.latency = sys_cpu_to_le16(latency);
  123. ev.timeout = sys_cpu_to_le16(timeout);
  124. tester_send(BTP_SERVICE_ID_GAP, GAP_EV_CONN_PARAM_UPDATE,
  125. CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
  126. }
  127. static bool le_param_req(struct bt_conn *conn, struct bt_le_conn_param *param)
  128. {
  129. /* reject update if all parameters match reject pattern */
  130. if ((param->interval_min == REJECT_INTERVAL_MIN) &&
  131. (param->interval_max == REJECT_INTERVAL_MAX) &&
  132. (param->latency == REJECT_LATENCY) &&
  133. (param->timeout == REJECT_SUPERVISION_TIMEOUT)) {
  134. return false;
  135. }
  136. return true;
  137. }
  138. static void le_security_changed(struct bt_conn *conn, bt_security_t level,
  139. enum bt_security_err err)
  140. {
  141. const bt_addr_le_t *addr = bt_conn_get_dst(conn);
  142. struct gap_sec_level_changed_ev sec_ev;
  143. struct gap_bond_lost_ev bond_ev;
  144. struct bt_conn_info info;
  145. switch (err) {
  146. case BT_SECURITY_ERR_SUCCESS:
  147. memcpy(sec_ev.address, addr->a.val, sizeof(sec_ev.address));
  148. sec_ev.address_type = addr->type;
  149. /* enum matches BTP values */
  150. sec_ev.sec_level = level;
  151. tester_send(BTP_SERVICE_ID_GAP, GAP_EV_SEC_LEVEL_CHANGED,
  152. CONTROLLER_INDEX, (uint8_t *) &sec_ev, sizeof(sec_ev));
  153. break;
  154. case BT_SECURITY_ERR_PIN_OR_KEY_MISSING:
  155. /* for central role this means that peer have no LTK when we
  156. * started encryption procedure
  157. *
  158. * This means bond is lost and we restart pairing to re-bond
  159. */
  160. if (bt_conn_get_info(conn, &info) == 0 &&
  161. info.role == BT_CONN_ROLE_CENTRAL) {
  162. BT_DBG("Bond lost");
  163. (void)memcpy(bond_ev.address, addr->a.val, sizeof(bond_ev.address));
  164. bond_ev.address_type = addr->type;
  165. tester_send(BTP_SERVICE_ID_GAP, GAP_EV_BOND_LOST,
  166. CONTROLLER_INDEX, (uint8_t *)&bond_ev, sizeof(bond_ev));
  167. (void)bt_conn_set_security(conn, BT_SECURITY_L2 | BT_SECURITY_FORCE_PAIR);
  168. }
  169. break;
  170. default:
  171. break;
  172. }
  173. }
  174. static struct bt_conn_cb conn_callbacks = {
  175. .connected = le_connected,
  176. .disconnected = le_disconnected,
  177. .identity_resolved = le_identity_resolved,
  178. .le_param_updated = le_param_updated,
  179. .le_param_req = le_param_req,
  180. .security_changed = le_security_changed,
  181. };
  182. static void supported_commands(uint8_t *data, uint16_t len)
  183. {
  184. uint8_t cmds[4];
  185. struct gap_read_supported_commands_rp *rp = (void *) &cmds;
  186. (void)memset(cmds, 0, sizeof(cmds));
  187. tester_set_bit(cmds, GAP_READ_SUPPORTED_COMMANDS);
  188. tester_set_bit(cmds, GAP_READ_CONTROLLER_INDEX_LIST);
  189. tester_set_bit(cmds, GAP_READ_CONTROLLER_INFO);
  190. tester_set_bit(cmds, GAP_SET_CONNECTABLE);
  191. tester_set_bit(cmds, GAP_SET_DISCOVERABLE);
  192. tester_set_bit(cmds, GAP_SET_BONDABLE);
  193. tester_set_bit(cmds, GAP_START_ADVERTISING);
  194. tester_set_bit(cmds, GAP_START_DIRECTED_ADV);
  195. tester_set_bit(cmds, GAP_STOP_ADVERTISING);
  196. tester_set_bit(cmds, GAP_START_DISCOVERY);
  197. tester_set_bit(cmds, GAP_STOP_DISCOVERY);
  198. tester_set_bit(cmds, GAP_CONNECT);
  199. tester_set_bit(cmds, GAP_DISCONNECT);
  200. tester_set_bit(cmds, GAP_SET_IO_CAP);
  201. tester_set_bit(cmds, GAP_PAIR);
  202. tester_set_bit(cmds, GAP_PASSKEY_ENTRY);
  203. tester_set_bit(cmds, GAP_PASSKEY_CONFIRM);
  204. tester_set_bit(cmds, GAP_CONN_PARAM_UPDATE);
  205. tester_set_bit(cmds, GAP_SET_MITM);
  206. tester_set_bit(cmds, GAP_OOB_LEGACY_SET_DATA);
  207. #if !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
  208. tester_set_bit(cmds, GAP_OOB_SC_GET_LOCAL_DATA);
  209. tester_set_bit(cmds, GAP_OOB_SC_SET_REMOTE_DATA);
  210. #endif /* !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) */
  211. tester_set_bit(cmds, GAP_SET_FILTER_LIST);
  212. tester_send(BTP_SERVICE_ID_GAP, GAP_READ_SUPPORTED_COMMANDS,
  213. CONTROLLER_INDEX, (uint8_t *) rp, sizeof(cmds));
  214. }
  215. static void controller_index_list(uint8_t *data, uint16_t len)
  216. {
  217. struct gap_read_controller_index_list_rp *rp;
  218. uint8_t buf[sizeof(*rp) + 1];
  219. rp = (void *) buf;
  220. rp->num = 1U;
  221. rp->index[0] = CONTROLLER_INDEX;
  222. tester_send(BTP_SERVICE_ID_GAP, GAP_READ_CONTROLLER_INDEX_LIST,
  223. BTP_INDEX_NONE, (uint8_t *) rp, sizeof(buf));
  224. }
  225. static void controller_info(uint8_t *data, uint16_t len)
  226. {
  227. struct gap_read_controller_info_rp rp;
  228. uint32_t supported_settings;
  229. (void)memset(&rp, 0, sizeof(rp));
  230. struct bt_le_oob oob_local = { 0 };
  231. bt_le_oob_get_local(BT_ID_DEFAULT, &oob_local);
  232. memcpy(rp.address, &oob_local.addr.a, sizeof(bt_addr_t));
  233. /*
  234. * Re-use the oob data read here in get_oob_sc_local_data()
  235. */
  236. #if !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
  237. oob_sc_local = oob_local;
  238. #endif /* !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) */
  239. /*
  240. * If privacy is used, the device uses random type address, otherwise
  241. * static random or public type address is used.
  242. */
  243. #if !defined(CONFIG_BT_PRIVACY)
  244. if (oob_local.addr.type == BT_ADDR_LE_RANDOM) {
  245. atomic_set_bit(&current_settings, GAP_SETTINGS_STATIC_ADDRESS);
  246. }
  247. #endif /* CONFIG_BT_PRIVACY */
  248. supported_settings = BIT(GAP_SETTINGS_POWERED);
  249. supported_settings |= BIT(GAP_SETTINGS_CONNECTABLE);
  250. supported_settings |= BIT(GAP_SETTINGS_BONDABLE);
  251. supported_settings |= BIT(GAP_SETTINGS_LE);
  252. supported_settings |= BIT(GAP_SETTINGS_ADVERTISING);
  253. rp.supported_settings = sys_cpu_to_le32(supported_settings);
  254. rp.current_settings = sys_cpu_to_le32(current_settings);
  255. memcpy(rp.name, CONTROLLER_NAME, sizeof(CONTROLLER_NAME));
  256. tester_send(BTP_SERVICE_ID_GAP, GAP_READ_CONTROLLER_INFO,
  257. CONTROLLER_INDEX, (uint8_t *) &rp, sizeof(rp));
  258. }
  259. #if !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
  260. static const char *oob_config_str(int oob_config)
  261. {
  262. switch (oob_config) {
  263. case BT_CONN_OOB_LOCAL_ONLY:
  264. return "Local";
  265. case BT_CONN_OOB_REMOTE_ONLY:
  266. return "Remote";
  267. case BT_CONN_OOB_BOTH_PEERS:
  268. return "Local and Remote";
  269. case BT_CONN_OOB_NO_DATA:
  270. default:
  271. return "no";
  272. }
  273. }
  274. #endif /* !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) */
  275. static void oob_data_request(struct bt_conn *conn,
  276. struct bt_conn_oob_info *oob_info)
  277. {
  278. struct bt_conn_info info;
  279. int err = bt_conn_get_info(conn, &info);
  280. if (err) {
  281. return;
  282. }
  283. char addr[BT_ADDR_LE_STR_LEN];
  284. bt_addr_le_to_str(info.le.dst, addr, sizeof(addr));
  285. switch (oob_info->type) {
  286. #if !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
  287. case BT_CONN_OOB_LE_SC:
  288. {
  289. BT_DBG("Set %s OOB SC data for %s, ",
  290. oob_config_str(oob_info->lesc.oob_config),
  291. addr);
  292. struct bt_le_oob_sc_data *oobd_local =
  293. oob_info->lesc.oob_config != BT_CONN_OOB_REMOTE_ONLY ?
  294. &oob_sc_local.le_sc_data :
  295. NULL;
  296. struct bt_le_oob_sc_data *oobd_remote =
  297. oob_info->lesc.oob_config != BT_CONN_OOB_LOCAL_ONLY ?
  298. &oob_sc_remote.le_sc_data :
  299. NULL;
  300. if (oobd_remote) {
  301. /* Assume that oob_sc_remote
  302. * corresponds to the currently connected peer
  303. */
  304. bt_addr_le_copy(&oob_sc_remote.addr, info.le.remote);
  305. }
  306. if (oobd_local &&
  307. !bt_addr_le_eq(info.le.local, &oob_sc_local.addr)) {
  308. bt_addr_le_to_str(info.le.local, addr, sizeof(addr));
  309. BT_DBG("No OOB data available for local %s",
  310. addr);
  311. bt_conn_auth_cancel(conn);
  312. return;
  313. }
  314. err = bt_le_oob_set_sc_data(conn, oobd_local, oobd_remote);
  315. if (err) {
  316. BT_DBG("bt_le_oob_set_sc_data failed with: %d", err);
  317. }
  318. break;
  319. }
  320. #endif /* !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) */
  321. #if !defined(CONFIG_BT_SMP_SC_PAIR_ONLY)
  322. case BT_CONN_OOB_LE_LEGACY:
  323. BT_DBG("Legacy OOB TK requested from remote %s", addr);
  324. err = bt_le_oob_set_legacy_tk(conn, oob_legacy_tk);
  325. if (err < 0) {
  326. BT_ERR("Failed to set OOB TK: %d", err);
  327. }
  328. break;
  329. #endif /* !defined(CONFIG_BT_SMP_SC_PAIR_ONLY) */
  330. default:
  331. BT_ERR("Unhandled OOB type %d", oob_info->type);
  332. break;
  333. }
  334. }
  335. #if !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
  336. static void get_oob_sc_local_data(void)
  337. {
  338. cb.oob_data_request = oob_data_request;
  339. struct gap_oob_sc_get_local_data_rp rp = { 0 };
  340. memcpy(&rp.conf[0], &oob_sc_local.le_sc_data.c[0], sizeof(rp.conf));
  341. memcpy(&rp.rand[0], &oob_sc_local.le_sc_data.r[0], sizeof(rp.rand));
  342. tester_send(BTP_SERVICE_ID_GAP, GAP_OOB_SC_GET_LOCAL_DATA,
  343. CONTROLLER_INDEX, (uint8_t *)&rp, sizeof(rp));
  344. }
  345. static void set_oob_sc_remote_data(const uint8_t *data, uint16_t len)
  346. {
  347. cb.oob_data_request = oob_data_request;
  348. bt_set_oob_data_flag(true);
  349. const struct gap_oob_sc_set_remote_data_cmd *cmd = (void *)data;
  350. /* Note that the .addr field
  351. * will be set by the oob_data_request callback
  352. */
  353. memcpy(&oob_sc_remote.le_sc_data.r[0], &cmd->rand[0],
  354. sizeof(oob_sc_remote.le_sc_data.r));
  355. memcpy(&oob_sc_remote.le_sc_data.c[0], &cmd->conf[0],
  356. sizeof(oob_sc_remote.le_sc_data.c));
  357. tester_rsp(BTP_SERVICE_ID_GAP, GAP_OOB_SC_SET_REMOTE_DATA,
  358. CONTROLLER_INDEX, BTP_STATUS_SUCCESS);
  359. }
  360. #endif /* !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) */
  361. static void set_connectable(uint8_t *data, uint16_t len)
  362. {
  363. const struct gap_set_connectable_cmd *cmd = (void *) data;
  364. struct gap_set_connectable_rp rp;
  365. if (cmd->connectable) {
  366. atomic_set_bit(&current_settings, GAP_SETTINGS_CONNECTABLE);
  367. } else {
  368. atomic_clear_bit(&current_settings, GAP_SETTINGS_CONNECTABLE);
  369. }
  370. rp.current_settings = sys_cpu_to_le32(current_settings);
  371. tester_send(BTP_SERVICE_ID_GAP, GAP_SET_CONNECTABLE, CONTROLLER_INDEX,
  372. (uint8_t *) &rp, sizeof(rp));
  373. }
  374. static uint8_t ad_flags = BT_LE_AD_NO_BREDR;
  375. static struct bt_data ad[10] = {
  376. BT_DATA(BT_DATA_FLAGS, &ad_flags, sizeof(ad_flags)),
  377. };
  378. static struct bt_data sd[10];
  379. static void set_discoverable(uint8_t *data, uint16_t len)
  380. {
  381. const struct gap_set_discoverable_cmd *cmd = (void *) data;
  382. struct gap_set_discoverable_rp rp;
  383. switch (cmd->discoverable) {
  384. case GAP_NON_DISCOVERABLE:
  385. ad_flags &= ~(BT_LE_AD_GENERAL | BT_LE_AD_LIMITED);
  386. atomic_clear_bit(&current_settings, GAP_SETTINGS_DISCOVERABLE);
  387. break;
  388. case GAP_GENERAL_DISCOVERABLE:
  389. ad_flags &= ~BT_LE_AD_LIMITED;
  390. ad_flags |= BT_LE_AD_GENERAL;
  391. atomic_set_bit(&current_settings, GAP_SETTINGS_DISCOVERABLE);
  392. break;
  393. case GAP_LIMITED_DISCOVERABLE:
  394. ad_flags &= ~BT_LE_AD_GENERAL;
  395. ad_flags |= BT_LE_AD_LIMITED;
  396. atomic_set_bit(&current_settings, GAP_SETTINGS_DISCOVERABLE);
  397. break;
  398. default:
  399. BT_WARN("unknown mode: 0x%x", cmd->discoverable);
  400. tester_rsp(BTP_SERVICE_ID_GAP, GAP_SET_DISCOVERABLE,
  401. CONTROLLER_INDEX, BTP_STATUS_FAILED);
  402. return;
  403. }
  404. rp.current_settings = sys_cpu_to_le32(current_settings);
  405. tester_send(BTP_SERVICE_ID_GAP, GAP_SET_DISCOVERABLE, CONTROLLER_INDEX,
  406. (uint8_t *) &rp, sizeof(rp));
  407. }
  408. static void set_bondable(uint8_t *data, uint16_t len)
  409. {
  410. const struct gap_set_bondable_cmd *cmd = (void *) data;
  411. struct gap_set_bondable_rp rp;
  412. BT_DBG("cmd->bondable: %d", cmd->bondable);
  413. if (cmd->bondable) {
  414. atomic_set_bit(&current_settings, GAP_SETTINGS_BONDABLE);
  415. } else {
  416. atomic_clear_bit(&current_settings, GAP_SETTINGS_BONDABLE);
  417. }
  418. bt_set_bondable(cmd->bondable);
  419. rp.current_settings = sys_cpu_to_le32(current_settings);
  420. tester_send(BTP_SERVICE_ID_GAP, GAP_SET_BONDABLE, CONTROLLER_INDEX,
  421. (uint8_t *) &rp, sizeof(rp));
  422. }
  423. static void start_advertising(const uint8_t *data, uint16_t len)
  424. {
  425. const struct gap_start_advertising_cmd *cmd = (void *) data;
  426. struct gap_start_advertising_rp rp;
  427. uint8_t adv_len, sd_len;
  428. bool adv_conn;
  429. int i;
  430. BT_ERR("start_advertising 1");
  431. for (i = 0, adv_len = 1U; i < cmd->adv_data_len; adv_len++) {
  432. if (adv_len >= ARRAY_SIZE(ad)) {
  433. BT_ERR("ad[] Out of memory");
  434. goto fail;
  435. }
  436. ad[adv_len].type = cmd->adv_sr_data[i++];
  437. ad[adv_len].data_len = cmd->adv_sr_data[i++];
  438. ad[adv_len].data = &cmd->adv_sr_data[i];
  439. i += ad[adv_len].data_len;
  440. }
  441. BT_ERR("start_advertising 2");
  442. for (sd_len = 0U; i < cmd->adv_data_len+cmd->scan_rsp_len; sd_len++) {
  443. if (sd_len >= ARRAY_SIZE(sd)) {
  444. BT_ERR("sd[] Out of memory");
  445. goto fail;
  446. }
  447. sd[sd_len].type = cmd->adv_sr_data[i++];
  448. sd[sd_len].data_len = cmd->adv_sr_data[i++];
  449. sd[sd_len].data = &cmd->adv_sr_data[i];
  450. i += sd[sd_len].data_len;
  451. }
  452. BT_ERR("start_advertising 3");
  453. adv_conn = atomic_test_bit(&current_settings, GAP_SETTINGS_CONNECTABLE);
  454. BT_ERR("start_advertising 4");
  455. /* BTP API don't allow to set empty scan response data. */
  456. if (bt_le_adv_start(adv_conn ? BT_LE_ADV_CONN : BT_LE_ADV_NCONN,
  457. ad, adv_len, sd_len ? sd : NULL, sd_len) < 0) {
  458. BT_ERR("Failed to start advertising");
  459. goto fail;
  460. }
  461. BT_ERR("start_advertising 5");
  462. atomic_set_bit(&current_settings, GAP_SETTINGS_ADVERTISING);
  463. rp.current_settings = sys_cpu_to_le32(current_settings);
  464. BT_ERR("start_advertising 6");
  465. tester_send(BTP_SERVICE_ID_GAP, GAP_START_ADVERTISING, CONTROLLER_INDEX,
  466. (uint8_t *) &rp, sizeof(rp));
  467. return;
  468. fail:
  469. BT_ERR("start_advertising 7");
  470. tester_rsp(BTP_SERVICE_ID_GAP, GAP_START_ADVERTISING, CONTROLLER_INDEX,
  471. BTP_STATUS_FAILED);
  472. }
  473. static void start_directed_advertising(const uint8_t *data, uint16_t len)
  474. {
  475. const struct gap_start_directed_adv_cmd *cmd = (void *)data;
  476. struct gap_start_directed_adv_rp rp;
  477. struct bt_le_adv_param adv_param;
  478. uint16_t options = sys_le16_to_cpu(cmd->options);
  479. const bt_addr_le_t *peer = (bt_addr_le_t *)data;
  480. adv_param = *BT_LE_ADV_CONN_DIR(peer);
  481. if (!(options & GAP_START_DIRECTED_ADV_HD)) {
  482. adv_param.options |= BT_LE_ADV_OPT_DIR_MODE_LOW_DUTY;
  483. adv_param.interval_max = BT_GAP_ADV_FAST_INT_MAX_2;
  484. adv_param.interval_min = BT_GAP_ADV_FAST_INT_MIN_2;
  485. }
  486. if (options & GAP_START_DIRECTED_ADV_PEER_RPA) {
  487. #if defined(CONFIG_BT_PRIVACY)
  488. /* check if peer supports Central Address Resolution */
  489. for (int i = 0; i < CONFIG_BT_MAX_PAIRED; i++) {
  490. if (bt_addr_le_eq(peer, &cars[i].addr)) {
  491. if (cars[i].supported) {
  492. adv_param.options |= BT_LE_ADV_OPT_DIR_ADDR_RPA;
  493. }
  494. }
  495. }
  496. #endif
  497. }
  498. if (bt_le_adv_start(&adv_param, NULL, 0, NULL, 0) < 0) {
  499. BT_ERR("Failed to start advertising");
  500. goto fail;
  501. }
  502. atomic_set_bit(&current_settings, GAP_SETTINGS_ADVERTISING);
  503. rp.current_settings = sys_cpu_to_le32(current_settings);
  504. tester_send(BTP_SERVICE_ID_GAP, GAP_START_DIRECTED_ADV,
  505. CONTROLLER_INDEX, (uint8_t *)&rp, sizeof(rp));
  506. return;
  507. fail:
  508. tester_rsp(BTP_SERVICE_ID_GAP, GAP_START_DIRECTED_ADV, CONTROLLER_INDEX,
  509. BTP_STATUS_FAILED);
  510. }
  511. static void stop_advertising(const uint8_t *data, uint16_t len)
  512. {
  513. struct gap_stop_advertising_rp rp;
  514. int err;
  515. err = bt_le_adv_stop();
  516. if (err < 0) {
  517. tester_rsp(BTP_SERVICE_ID_GAP, GAP_STOP_ADVERTISING,
  518. CONTROLLER_INDEX, BTP_STATUS_FAILED);
  519. BT_ERR("Failed to stop advertising: %d", err);
  520. return;
  521. }
  522. atomic_clear_bit(&current_settings, GAP_SETTINGS_ADVERTISING);
  523. rp.current_settings = sys_cpu_to_le32(current_settings);
  524. tester_send(BTP_SERVICE_ID_GAP, GAP_STOP_ADVERTISING, CONTROLLER_INDEX,
  525. (uint8_t *) &rp, sizeof(rp));
  526. }
  527. static uint8_t get_ad_flags(struct net_buf_simple *ad)
  528. {
  529. uint8_t len, i;
  530. /* Parse advertisement to get flags */
  531. for (i = 0U; i < ad->len; i += len - 1) {
  532. len = ad->data[i++];
  533. if (!len) {
  534. break;
  535. }
  536. /* Check if field length is correct */
  537. if (len > (ad->len - i) || (ad->len - i) < 1) {
  538. break;
  539. }
  540. switch (ad->data[i++]) {
  541. case BT_DATA_FLAGS:
  542. return ad->data[i];
  543. default:
  544. break;
  545. }
  546. }
  547. return 0;
  548. }
  549. static uint8_t discovery_flags;
  550. static struct net_buf_simple *adv_buf = NET_BUF_SIMPLE(ADV_BUF_LEN);
  551. static void store_adv(const bt_addr_le_t *addr, int8_t rssi,
  552. struct net_buf_simple *ad)
  553. {
  554. struct gap_device_found_ev *ev;
  555. /* cleanup */
  556. net_buf_simple_init(adv_buf, 0);
  557. ev = net_buf_simple_add(adv_buf, sizeof(*ev));
  558. memcpy(ev->address, addr->a.val, sizeof(ev->address));
  559. ev->address_type = addr->type;
  560. ev->rssi = rssi;
  561. ev->flags = GAP_DEVICE_FOUND_FLAG_AD | GAP_DEVICE_FOUND_FLAG_RSSI;
  562. ev->eir_data_len = ad->len;
  563. memcpy(net_buf_simple_add(adv_buf, ad->len), ad->data, ad->len);
  564. }
  565. static void device_found(const bt_addr_le_t *addr, int8_t rssi, uint8_t evtype,
  566. struct net_buf_simple *ad)
  567. {
  568. /* if General/Limited Discovery - parse Advertising data to get flags */
  569. if (!(discovery_flags & GAP_DISCOVERY_FLAG_LE_OBSERVE) &&
  570. (evtype != BT_GAP_ADV_TYPE_SCAN_RSP)) {
  571. uint8_t flags = get_ad_flags(ad);
  572. /* ignore non-discoverable devices */
  573. if (!(flags & BT_LE_AD_DISCOV_MASK)) {
  574. BT_DBG("Non discoverable, skipping");
  575. return;
  576. }
  577. /* if Limited Discovery - ignore general discoverable devices */
  578. if ((discovery_flags & GAP_DISCOVERY_FLAG_LIMITED) &&
  579. !(flags & BT_LE_AD_LIMITED)) {
  580. BT_DBG("General discoverable, skipping");
  581. return;
  582. }
  583. }
  584. /* attach Scan Response data */
  585. if (evtype == BT_GAP_ADV_TYPE_SCAN_RSP) {
  586. struct gap_device_found_ev *ev;
  587. bt_addr_le_t a;
  588. /* skip if there is no pending advertisement */
  589. if (!adv_buf->len) {
  590. BT_INFO("No pending advertisement, skipping");
  591. return;
  592. }
  593. ev = (void *) adv_buf->data;
  594. a.type = ev->address_type;
  595. memcpy(a.a.val, ev->address, sizeof(a.a.val));
  596. /*
  597. * in general, the Scan Response comes right after the
  598. * Advertisement, but if not if send stored event and ignore
  599. * this one
  600. */
  601. if (!bt_addr_le_eq(addr, &a)) {
  602. BT_INFO("Address does not match, skipping");
  603. goto done;
  604. }
  605. ev->eir_data_len += ad->len;
  606. ev->flags |= GAP_DEVICE_FOUND_FLAG_SD;
  607. memcpy(net_buf_simple_add(adv_buf, ad->len), ad->data, ad->len);
  608. goto done;
  609. }
  610. /*
  611. * if there is another pending advertisement, send it and store the
  612. * current one
  613. */
  614. if (adv_buf->len) {
  615. tester_send(BTP_SERVICE_ID_GAP, GAP_EV_DEVICE_FOUND,
  616. CONTROLLER_INDEX, adv_buf->data, adv_buf->len);
  617. net_buf_simple_reset(adv_buf);
  618. }
  619. store_adv(addr, rssi, ad);
  620. /* if Active Scan and scannable event - wait for Scan Response */
  621. if ((discovery_flags & GAP_DISCOVERY_FLAG_LE_ACTIVE_SCAN) &&
  622. (evtype == BT_GAP_ADV_TYPE_ADV_IND ||
  623. evtype == BT_GAP_ADV_TYPE_ADV_SCAN_IND)) {
  624. BT_DBG("Waiting for scan response");
  625. return;
  626. }
  627. done:
  628. tester_send(BTP_SERVICE_ID_GAP, GAP_EV_DEVICE_FOUND,
  629. CONTROLLER_INDEX, adv_buf->data, adv_buf->len);
  630. net_buf_simple_reset(adv_buf);
  631. }
  632. static void start_discovery(const uint8_t *data, uint16_t len)
  633. {
  634. const struct gap_start_discovery_cmd *cmd = (void *) data;
  635. uint8_t status;
  636. /* only LE scan is supported */
  637. if (cmd->flags & GAP_DISCOVERY_FLAG_BREDR) {
  638. status = BTP_STATUS_FAILED;
  639. BT_WARN("BR/EDR not supported");
  640. goto reply;
  641. }
  642. if (bt_le_scan_start(cmd->flags & GAP_DISCOVERY_FLAG_LE_ACTIVE_SCAN ?
  643. BT_LE_SCAN_ACTIVE : BT_LE_SCAN_PASSIVE,
  644. device_found) < 0) {
  645. status = BTP_STATUS_FAILED;
  646. BT_ERR("Failed to start scanning");
  647. goto reply;
  648. }
  649. net_buf_simple_init(adv_buf, 0);
  650. discovery_flags = cmd->flags;
  651. status = BTP_STATUS_SUCCESS;
  652. reply:
  653. tester_rsp(BTP_SERVICE_ID_GAP, GAP_START_DISCOVERY, CONTROLLER_INDEX,
  654. status);
  655. }
  656. static void stop_discovery(const uint8_t *data, uint16_t len)
  657. {
  658. uint8_t status = BTP_STATUS_SUCCESS;
  659. int err;
  660. err = bt_le_scan_stop();
  661. if (err < 0) {
  662. BT_ERR("Failed to stop scanning: %d", err);
  663. status = BTP_STATUS_FAILED;
  664. }
  665. tester_rsp(BTP_SERVICE_ID_GAP, GAP_STOP_DISCOVERY, CONTROLLER_INDEX,
  666. status);
  667. }
  668. static void connect(const uint8_t *data, uint16_t len)
  669. {
  670. const bt_addr_le_t *addr = (const bt_addr_le_t *)data;
  671. uint8_t status;
  672. int err;
  673. if (!bt_addr_le_eq(addr, BT_ADDR_LE_ANY)) {
  674. struct bt_conn *conn;
  675. err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN,
  676. BT_LE_CONN_PARAM_DEFAULT, &conn);
  677. if (err) {
  678. BT_ERR("Failed to create connection (%d)", err);
  679. status = BTP_STATUS_FAILED;
  680. goto rsp;
  681. }
  682. bt_conn_unref(conn);
  683. } else {
  684. err = bt_conn_le_create_auto(BT_CONN_LE_CREATE_CONN,
  685. BT_LE_CONN_PARAM_DEFAULT);
  686. if (err) {
  687. BT_ERR("Failed to create auto connection (%d)", err);
  688. status = BTP_STATUS_FAILED;
  689. goto rsp;
  690. }
  691. }
  692. status = BTP_STATUS_SUCCESS;
  693. rsp:
  694. tester_rsp(BTP_SERVICE_ID_GAP, GAP_CONNECT, CONTROLLER_INDEX, status);
  695. }
  696. static void disconnect(const uint8_t *data, uint16_t len)
  697. {
  698. struct bt_conn *conn;
  699. uint8_t status;
  700. conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, (bt_addr_le_t *)data);
  701. if (!conn) {
  702. status = BTP_STATUS_FAILED;
  703. BT_ERR("Unknown connection");
  704. goto rsp;
  705. }
  706. if (bt_conn_disconnect(conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN)) {
  707. BT_ERR("Failed to disconnect");
  708. status = BTP_STATUS_FAILED;
  709. } else {
  710. status = BTP_STATUS_SUCCESS;
  711. }
  712. bt_conn_unref(conn);
  713. rsp:
  714. tester_rsp(BTP_SERVICE_ID_GAP, GAP_DISCONNECT, CONTROLLER_INDEX,
  715. status);
  716. }
  717. static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey)
  718. {
  719. struct gap_passkey_display_ev ev;
  720. const bt_addr_le_t *addr = bt_conn_get_dst(conn);
  721. memcpy(ev.address, addr->a.val, sizeof(ev.address));
  722. ev.address_type = addr->type;
  723. ev.passkey = sys_cpu_to_le32(passkey);
  724. tester_send(BTP_SERVICE_ID_GAP, GAP_EV_PASSKEY_DISPLAY,
  725. CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
  726. }
  727. static void auth_passkey_entry(struct bt_conn *conn)
  728. {
  729. struct gap_passkey_entry_req_ev ev;
  730. const bt_addr_le_t *addr = bt_conn_get_dst(conn);
  731. memcpy(ev.address, addr->a.val, sizeof(ev.address));
  732. ev.address_type = addr->type;
  733. tester_send(BTP_SERVICE_ID_GAP, GAP_EV_PASSKEY_ENTRY_REQ,
  734. CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
  735. }
  736. static void auth_passkey_confirm(struct bt_conn *conn, unsigned int passkey)
  737. {
  738. struct gap_passkey_confirm_req_ev ev;
  739. const bt_addr_le_t *addr = bt_conn_get_dst(conn);
  740. memcpy(ev.address, addr->a.val, sizeof(ev.address));
  741. ev.address_type = addr->type;
  742. ev.passkey = sys_cpu_to_le32(passkey);
  743. tester_send(BTP_SERVICE_ID_GAP, GAP_EV_PASSKEY_CONFIRM_REQ,
  744. CONTROLLER_INDEX, (uint8_t *) &ev, sizeof(ev));
  745. }
  746. static void auth_cancel(struct bt_conn *conn)
  747. {
  748. /* TODO */
  749. }
  750. enum bt_security_err auth_pairing_accept(struct bt_conn *conn,
  751. const struct bt_conn_pairing_feat *const feat)
  752. {
  753. struct gap_bond_lost_ev ev;
  754. const bt_addr_le_t *addr = bt_conn_get_dst(conn);
  755. if (!bt_addr_le_is_bonded(BT_ID_DEFAULT, addr)) {
  756. return BT_SECURITY_ERR_SUCCESS;
  757. }
  758. /* If a peer is already bonded and tries to pair again then it means that
  759. * the it has lost its bond information.
  760. */
  761. BT_DBG("Bond lost");
  762. memcpy(ev.address, addr->a.val, sizeof(ev.address));
  763. ev.address_type = addr->type;
  764. tester_send(BTP_SERVICE_ID_GAP, GAP_EV_BOND_LOST, CONTROLLER_INDEX, (uint8_t *)&ev,
  765. sizeof(ev));
  766. return BT_SECURITY_ERR_SUCCESS;
  767. }
  768. void auth_pairing_failed(struct bt_conn *conn, enum bt_security_err reason)
  769. {
  770. struct gap_bond_pairing_failed_ev ev;
  771. const bt_addr_le_t *addr = bt_conn_get_dst(conn);
  772. memcpy(ev.address, addr->a.val, sizeof(ev.address));
  773. ev.address_type = addr->type;
  774. ev.reason = reason;
  775. tester_send(BTP_SERVICE_ID_GAP, GAP_EV_PAIRING_FAILED, CONTROLLER_INDEX,
  776. (uint8_t *)&ev, sizeof(ev));
  777. }
  778. static void auth_pairing_complete(struct bt_conn *conn, bool bonded)
  779. {
  780. #if defined(CONFIG_BT_PRIVACY)
  781. /* Read peer's Central Address Resolution if bonded */
  782. if (bonded) {
  783. bt_gatt_read(conn, &read_car_params);
  784. }
  785. #endif
  786. }
  787. static struct bt_conn_auth_info_cb auth_info_cb = {
  788. .pairing_failed = auth_pairing_failed,
  789. .pairing_complete = auth_pairing_complete,
  790. };
  791. static void set_io_cap(const uint8_t *data, uint16_t len)
  792. {
  793. const struct gap_set_io_cap_cmd *cmd = (void *) data;
  794. uint8_t status;
  795. /* Reset io cap requirements */
  796. (void)memset(&cb, 0, sizeof(cb));
  797. bt_conn_auth_cb_register(NULL);
  798. BT_DBG("io_cap: %d", cmd->io_cap);
  799. switch (cmd->io_cap) {
  800. case GAP_IO_CAP_DISPLAY_ONLY:
  801. cb.cancel = auth_cancel;
  802. cb.passkey_display = auth_passkey_display;
  803. break;
  804. case GAP_IO_CAP_KEYBOARD_DISPLAY:
  805. cb.cancel = auth_cancel;
  806. cb.passkey_display = auth_passkey_display;
  807. cb.passkey_entry = auth_passkey_entry;
  808. cb.passkey_confirm = auth_passkey_confirm;
  809. break;
  810. case GAP_IO_CAP_NO_INPUT_OUTPUT:
  811. cb.cancel = auth_cancel;
  812. break;
  813. case GAP_IO_CAP_KEYBOARD_ONLY:
  814. cb.cancel = auth_cancel;
  815. cb.passkey_entry = auth_passkey_entry;
  816. break;
  817. case GAP_IO_CAP_DISPLAY_YESNO:
  818. cb.cancel = auth_cancel;
  819. cb.passkey_display = auth_passkey_display;
  820. cb.passkey_confirm = auth_passkey_confirm;
  821. break;
  822. default:
  823. BT_WARN("Unhandled io_cap: 0x%x", cmd->io_cap);
  824. status = BTP_STATUS_FAILED;
  825. goto rsp;
  826. }
  827. // cb.pairing_accept = auth_pairing_accept;
  828. if (bt_conn_auth_cb_register(&cb)) {
  829. status = BTP_STATUS_FAILED;
  830. goto rsp;
  831. }
  832. status = BTP_STATUS_SUCCESS;
  833. rsp:
  834. tester_rsp(BTP_SERVICE_ID_GAP, GAP_SET_IO_CAP, CONTROLLER_INDEX,
  835. status);
  836. }
  837. static void pair(const uint8_t *data, uint16_t len)
  838. {
  839. struct bt_conn *conn;
  840. uint8_t status;
  841. int err;
  842. conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, (bt_addr_le_t *)data);
  843. if (!conn) {
  844. BT_ERR("Unknown connection");
  845. status = BTP_STATUS_FAILED;
  846. goto rsp;
  847. }
  848. err = bt_conn_set_security(conn, BT_SECURITY_L2);
  849. if (err < 0) {
  850. BT_ERR("Failed to set security: %d", err);
  851. status = BTP_STATUS_FAILED;
  852. bt_conn_unref(conn);
  853. goto rsp;
  854. }
  855. bt_conn_unref(conn);
  856. status = BTP_STATUS_SUCCESS;
  857. rsp:
  858. tester_rsp(BTP_SERVICE_ID_GAP, GAP_PAIR, CONTROLLER_INDEX, status);
  859. }
  860. static void unpair(const uint8_t *data, uint16_t len)
  861. {
  862. struct gap_unpair_cmd *cmd = (void *) data;
  863. struct bt_conn *conn;
  864. bt_addr_le_t addr;
  865. uint8_t status;
  866. int err;
  867. addr.type = cmd->address_type;
  868. memcpy(addr.a.val, cmd->address, sizeof(addr.a.val));
  869. conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, &addr);
  870. if (!conn) {
  871. BT_ERR("Unknown connection");
  872. goto keys;
  873. }
  874. err = bt_conn_disconnect(conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN);
  875. bt_conn_unref(conn);
  876. if (err < 0) {
  877. BT_ERR("Failed to disconnect: %d", err);
  878. status = BTP_STATUS_FAILED;
  879. goto rsp;
  880. }
  881. keys:
  882. err = bt_unpair(BT_ID_DEFAULT, &addr);
  883. status = err < 0 ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS;
  884. rsp:
  885. tester_rsp(BTP_SERVICE_ID_GAP, GAP_UNPAIR, CONTROLLER_INDEX, status);
  886. }
  887. static void passkey_entry(const uint8_t *data, uint16_t len)
  888. {
  889. const struct gap_passkey_entry_cmd *cmd = (void *) data;
  890. struct bt_conn *conn;
  891. uint8_t status;
  892. int err;
  893. conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, (bt_addr_le_t *)data);
  894. if (!conn) {
  895. BT_ERR("Unknown connection");
  896. status = BTP_STATUS_FAILED;
  897. goto rsp;
  898. }
  899. err = bt_conn_auth_passkey_entry(conn, sys_le32_to_cpu(cmd->passkey));
  900. if (err < 0) {
  901. BT_ERR("Failed to enter passkey: %d", err);
  902. }
  903. bt_conn_unref(conn);
  904. status = err < 0 ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS;
  905. rsp:
  906. tester_rsp(BTP_SERVICE_ID_GAP, GAP_PASSKEY_ENTRY, CONTROLLER_INDEX,
  907. status);
  908. }
  909. static void passkey_confirm(const uint8_t *data, uint16_t len)
  910. {
  911. const struct gap_passkey_confirm_cmd *cmd = (void *) data;
  912. struct bt_conn *conn;
  913. uint8_t status;
  914. int err;
  915. conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, (bt_addr_le_t *)data);
  916. if (!conn) {
  917. BT_ERR("Unknown connection");
  918. status = BTP_STATUS_FAILED;
  919. goto rsp;
  920. }
  921. if (cmd->match) {
  922. err = bt_conn_auth_passkey_confirm(conn);
  923. if (err < 0) {
  924. BT_ERR("Failed to confirm passkey: %d", err);
  925. }
  926. } else {
  927. err = bt_conn_auth_cancel(conn);
  928. if (err < 0) {
  929. BT_ERR("Failed to cancel auth: %d", err);
  930. }
  931. }
  932. bt_conn_unref(conn);
  933. status = err < 0 ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS;
  934. rsp:
  935. tester_rsp(BTP_SERVICE_ID_GAP, GAP_PASSKEY_CONFIRM, CONTROLLER_INDEX,
  936. status);
  937. }
  938. static void conn_param_update(const uint8_t *data, uint16_t len)
  939. {
  940. const struct gap_conn_param_update_cmd *cmd = (void *) data;
  941. struct bt_le_conn_param param = {
  942. .interval_min = sys_le16_to_cpu(cmd->interval_min),
  943. .interval_max = sys_le16_to_cpu(cmd->interval_max),
  944. .latency = sys_le16_to_cpu(cmd->latency),
  945. .timeout = sys_le16_to_cpu(cmd->timeout),
  946. };
  947. struct bt_conn *conn;
  948. uint8_t status = BTP_STATUS_FAILED;
  949. int err;
  950. conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, (bt_addr_le_t *)data);
  951. if (!conn) {
  952. BT_ERR("Unknown connection");
  953. goto rsp;
  954. }
  955. err = bt_conn_le_param_update(conn, &param);
  956. if (err < 0) {
  957. BT_ERR("Failed to update params: %d", err);
  958. }
  959. bt_conn_unref(conn);
  960. status = err < 0 ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS;
  961. rsp:
  962. tester_rsp(BTP_SERVICE_ID_GAP, GAP_CONN_PARAM_UPDATE, CONTROLLER_INDEX,
  963. status);
  964. }
  965. static void set_mitm(const uint8_t *data, uint16_t len)
  966. {
  967. BT_WARN("Use CONFIG_BT_SMP_ENFORCE_MITM instead");
  968. tester_rsp(BTP_SERVICE_ID_GAP, GAP_SET_MITM, CONTROLLER_INDEX,
  969. BTP_STATUS_SUCCESS);
  970. }
  971. static void set_oob_legacy_data(const uint8_t *data, uint16_t len)
  972. {
  973. const struct gap_oob_legacy_set_data_cmd *cmd = (void *) data;
  974. memcpy(oob_legacy_tk, cmd->oob_data, 16);
  975. bt_set_oob_data_flag(true);
  976. cb.oob_data_request = oob_data_request;
  977. tester_rsp(BTP_SERVICE_ID_GAP, GAP_OOB_LEGACY_SET_DATA,
  978. CONTROLLER_INDEX, BTP_STATUS_SUCCESS);
  979. }
  980. static void set_filter_list(const uint8_t *data, uint16_t len)
  981. {
  982. const struct gap_set_filter_list *cmd = (const void *) data;
  983. uint8_t status;
  984. int err;
  985. if (len < sizeof(*cmd) ||
  986. len != (sizeof(*cmd) + (cmd->cnt * sizeof(cmd->addr[0])))) {
  987. status = BTP_STATUS_FAILED;
  988. goto failed;
  989. }
  990. (void)bt_le_filter_accept_list_clear();
  991. for (int i = 0; i < cmd->cnt; i++) {
  992. err = bt_le_filter_accept_list_add(&cmd->addr[i]);
  993. if (err < 0) {
  994. status = BTP_STATUS_FAILED;
  995. goto failed;
  996. }
  997. }
  998. status = BTP_STATUS_SUCCESS;
  999. failed:
  1000. tester_rsp(BTP_SERVICE_ID_GAP, GAP_SET_FILTER_LIST,
  1001. CONTROLLER_INDEX, status);
  1002. }
  1003. void tester_handle_gap(uint8_t opcode, uint8_t index, uint8_t *data,
  1004. uint16_t len)
  1005. {
  1006. BT_DBG("opcode111: 0x%x", opcode);
  1007. switch (opcode) {
  1008. case GAP_READ_SUPPORTED_COMMANDS:
  1009. case GAP_READ_CONTROLLER_INDEX_LIST:
  1010. if (index != BTP_INDEX_NONE){
  1011. tester_rsp(BTP_SERVICE_ID_GAP, opcode, index,
  1012. BTP_STATUS_FAILED);
  1013. BT_WARN("index != BTP_INDEX_NONE: opcode: 0x%x "
  1014. "index: 0x%x", opcode, index);
  1015. return;
  1016. }
  1017. break;
  1018. default:
  1019. BT_DBG("index1111: 0x%02x", index);
  1020. if (index != CONTROLLER_INDEX){
  1021. tester_rsp(BTP_SERVICE_ID_GAP, opcode, index,
  1022. BTP_STATUS_FAILED);
  1023. BT_WARN("index != CONTROLLER_INDEX: opcode: 0x%x "
  1024. "index: 0x%x", opcode, index);
  1025. return;
  1026. }
  1027. break;
  1028. }
  1029. BT_DBG("opcode1: 0x%02x", opcode);
  1030. switch (opcode) {
  1031. case GAP_READ_SUPPORTED_COMMANDS:
  1032. supported_commands(data, len);
  1033. return;
  1034. case GAP_READ_CONTROLLER_INDEX_LIST:
  1035. controller_index_list(data, len);
  1036. return;
  1037. case GAP_READ_CONTROLLER_INFO:
  1038. controller_info(data, len);
  1039. return;
  1040. case GAP_SET_CONNECTABLE:
  1041. set_connectable(data, len);
  1042. return;
  1043. case GAP_SET_DISCOVERABLE:
  1044. set_discoverable(data, len);
  1045. return;
  1046. case GAP_SET_BONDABLE:
  1047. set_bondable(data, len);
  1048. return;
  1049. case GAP_START_ADVERTISING:
  1050. start_advertising(data, len);
  1051. return;
  1052. case GAP_START_DIRECTED_ADV:
  1053. start_directed_advertising(data, len);
  1054. return;
  1055. case GAP_STOP_ADVERTISING:
  1056. stop_advertising(data, len);
  1057. return;
  1058. case GAP_START_DISCOVERY:
  1059. start_discovery(data, len);
  1060. return;
  1061. case GAP_STOP_DISCOVERY:
  1062. stop_discovery(data, len);
  1063. return;
  1064. case GAP_CONNECT:
  1065. connect(data, len);
  1066. return;
  1067. case GAP_DISCONNECT:
  1068. disconnect(data, len);
  1069. return;
  1070. case GAP_SET_IO_CAP:
  1071. set_io_cap(data, len);
  1072. return;
  1073. case GAP_PAIR:
  1074. pair(data, len);
  1075. return;
  1076. case GAP_UNPAIR:
  1077. unpair(data, len);
  1078. return;
  1079. case GAP_PASSKEY_ENTRY:
  1080. passkey_entry(data, len);
  1081. return;
  1082. case GAP_PASSKEY_CONFIRM:
  1083. passkey_confirm(data, len);
  1084. return;
  1085. case GAP_CONN_PARAM_UPDATE:
  1086. conn_param_update(data, len);
  1087. return;
  1088. case GAP_SET_MITM:
  1089. set_mitm(data, len);
  1090. return;
  1091. case GAP_OOB_LEGACY_SET_DATA:
  1092. set_oob_legacy_data(data, len);
  1093. return;
  1094. #if !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
  1095. case GAP_OOB_SC_GET_LOCAL_DATA:
  1096. get_oob_sc_local_data();
  1097. return;
  1098. case GAP_OOB_SC_SET_REMOTE_DATA:
  1099. set_oob_sc_remote_data(data, len);
  1100. return;
  1101. #endif /* !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) */
  1102. case GAP_SET_FILTER_LIST:
  1103. set_filter_list(data, len);
  1104. return;
  1105. default:
  1106. BT_WARN("Unknown opcode: 0x%x", opcode);
  1107. tester_rsp(BTP_SERVICE_ID_GAP, opcode, index,
  1108. BTP_STATUS_UNKNOWN_CMD);
  1109. return;
  1110. }
  1111. }
  1112. static void tester_init_gap_cb(int err)
  1113. {
  1114. if (err) {
  1115. tester_rsp(BTP_SERVICE_ID_CORE, CORE_REGISTER_SERVICE,
  1116. BTP_INDEX_NONE, BTP_STATUS_FAILED);
  1117. BT_WARN("Error: %d", err);
  1118. return;
  1119. }
  1120. atomic_clear(&current_settings);
  1121. atomic_set_bit(&current_settings, GAP_SETTINGS_POWERED);
  1122. atomic_set_bit(&current_settings, GAP_SETTINGS_CONNECTABLE);
  1123. atomic_set_bit(&current_settings, GAP_SETTINGS_BONDABLE);
  1124. atomic_set_bit(&current_settings, GAP_SETTINGS_LE);
  1125. #if defined(CONFIG_BT_PRIVACY)
  1126. atomic_set_bit(&current_settings, GAP_SETTINGS_PRIVACY);
  1127. #endif /* CONFIG_BT_PRIVACY */
  1128. bt_conn_cb_register(&conn_callbacks);
  1129. tester_rsp(BTP_SERVICE_ID_CORE, CORE_REGISTER_SERVICE, BTP_INDEX_NONE,
  1130. BTP_STATUS_SUCCESS);
  1131. }
  1132. uint8_t tester_init_gap(void)
  1133. {
  1134. int err;
  1135. // (void)memset(&cb, 0, sizeof(cb));
  1136. // bt_conn_auth_cb_register(NULL);
  1137. // // cb.pairing_accept = auth_pairing_accept;
  1138. // if (bt_conn_auth_cb_register(&cb)) {
  1139. // return BTP_STATUS_FAILED;
  1140. // }
  1141. // bt_conn_auth_info_cb_register(&auth_info_cb);
  1142. // err = bt_enable(tester_init_gap_cb);
  1143. // if (err < 0) {
  1144. // BT_ERR("Unable to enable Bluetooth: %d", err);
  1145. // return BTP_STATUS_FAILED;
  1146. // }
  1147. tester_init_gap_cb(0);
  1148. return BTP_STATUS_SUCCESS;
  1149. }
  1150. uint8_t tester_unregister_gap(void)
  1151. {
  1152. return BTP_STATUS_SUCCESS;
  1153. }