hal-utils.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. // SPDX-License-Identifier: Apache-2.0
  2. /*
  3. * Copyright (C) 2013 Intel Corporation
  4. *
  5. */
  6. #define _GNU_SOURCE
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <stdint.h>
  10. #include <stdbool.h>
  11. #include <cutils/properties.h>
  12. #include "hal.h"
  13. #include "hal-utils.h"
  14. /*
  15. * converts uuid to string
  16. * buf should be at least 39 bytes
  17. *
  18. * returns string representation of uuid
  19. */
  20. const char *bt_uuid_t2str(const uint8_t *uuid, char *buf)
  21. {
  22. int shift = 0;
  23. unsigned int i;
  24. int is_bt;
  25. if (!uuid)
  26. return strcpy(buf, "NULL");
  27. is_bt = !memcmp(&uuid[4], &BT_BASE_UUID[4], HAL_UUID_LEN - 4);
  28. for (i = 0; i < HAL_UUID_LEN; i++) {
  29. if (i == 4 && is_bt)
  30. break;
  31. if (i == 4 || i == 6 || i == 8 || i == 10) {
  32. buf[i * 2 + shift] = '-';
  33. shift++;
  34. }
  35. sprintf(buf + i * 2 + shift, "%02x", uuid[i]);
  36. }
  37. return buf;
  38. }
  39. const char *btuuid2str(const uint8_t *uuid)
  40. {
  41. static char buf[MAX_UUID_STR_LEN];
  42. return bt_uuid_t2str(uuid, buf);
  43. }
  44. INTMAP(bt_status_t, -1, "(unknown)")
  45. DELEMENT(BT_STATUS_SUCCESS),
  46. DELEMENT(BT_STATUS_FAIL),
  47. DELEMENT(BT_STATUS_NOT_READY),
  48. DELEMENT(BT_STATUS_NOMEM),
  49. DELEMENT(BT_STATUS_BUSY),
  50. DELEMENT(BT_STATUS_DONE),
  51. DELEMENT(BT_STATUS_UNSUPPORTED),
  52. DELEMENT(BT_STATUS_PARM_INVALID),
  53. DELEMENT(BT_STATUS_UNHANDLED),
  54. DELEMENT(BT_STATUS_AUTH_FAILURE),
  55. DELEMENT(BT_STATUS_RMT_DEV_DOWN),
  56. ENDMAP
  57. INTMAP(bt_state_t, -1, "(unknown)")
  58. DELEMENT(BT_STATE_OFF),
  59. DELEMENT(BT_STATE_ON),
  60. ENDMAP
  61. INTMAP(bt_device_type_t, -1, "(unknown)")
  62. DELEMENT(BT_DEVICE_DEVTYPE_BREDR),
  63. DELEMENT(BT_DEVICE_DEVTYPE_BLE),
  64. DELEMENT(BT_DEVICE_DEVTYPE_DUAL),
  65. ENDMAP
  66. INTMAP(bt_scan_mode_t, -1, "(unknown)")
  67. DELEMENT(BT_SCAN_MODE_NONE),
  68. DELEMENT(BT_SCAN_MODE_CONNECTABLE),
  69. DELEMENT(BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE),
  70. ENDMAP
  71. INTMAP(bt_discovery_state_t, -1, "(unknown)")
  72. DELEMENT(BT_DISCOVERY_STOPPED),
  73. DELEMENT(BT_DISCOVERY_STARTED),
  74. ENDMAP
  75. INTMAP(bt_acl_state_t, -1, "(unknown)")
  76. DELEMENT(BT_ACL_STATE_CONNECTED),
  77. DELEMENT(BT_ACL_STATE_DISCONNECTED),
  78. ENDMAP
  79. INTMAP(bt_bond_state_t, -1, "(unknown)")
  80. DELEMENT(BT_BOND_STATE_NONE),
  81. DELEMENT(BT_BOND_STATE_BONDING),
  82. DELEMENT(BT_BOND_STATE_BONDED),
  83. ENDMAP
  84. INTMAP(bt_ssp_variant_t, -1, "(unknown)")
  85. DELEMENT(BT_SSP_VARIANT_PASSKEY_CONFIRMATION),
  86. DELEMENT(BT_SSP_VARIANT_PASSKEY_ENTRY),
  87. DELEMENT(BT_SSP_VARIANT_CONSENT),
  88. DELEMENT(BT_SSP_VARIANT_PASSKEY_NOTIFICATION),
  89. ENDMAP
  90. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  91. INTMAP(bt_property_type_t, -1, "(unknown)")
  92. DELEMENT(BT_PROPERTY_BDNAME),
  93. DELEMENT(BT_PROPERTY_BDADDR),
  94. DELEMENT(BT_PROPERTY_UUIDS),
  95. DELEMENT(BT_PROPERTY_CLASS_OF_DEVICE),
  96. DELEMENT(BT_PROPERTY_TYPE_OF_DEVICE),
  97. DELEMENT(BT_PROPERTY_SERVICE_RECORD),
  98. DELEMENT(BT_PROPERTY_ADAPTER_SCAN_MODE),
  99. DELEMENT(BT_PROPERTY_ADAPTER_BONDED_DEVICES),
  100. DELEMENT(BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT),
  101. DELEMENT(BT_PROPERTY_REMOTE_FRIENDLY_NAME),
  102. DELEMENT(BT_PROPERTY_REMOTE_RSSI),
  103. DELEMENT(BT_PROPERTY_REMOTE_VERSION_INFO),
  104. DELEMENT(BT_PROPERTY_LOCAL_LE_FEATURES),
  105. DELEMENT(BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP),
  106. ENDMAP
  107. #else
  108. INTMAP(bt_property_type_t, -1, "(unknown)")
  109. DELEMENT(BT_PROPERTY_BDNAME),
  110. DELEMENT(BT_PROPERTY_BDADDR),
  111. DELEMENT(BT_PROPERTY_UUIDS),
  112. DELEMENT(BT_PROPERTY_CLASS_OF_DEVICE),
  113. DELEMENT(BT_PROPERTY_TYPE_OF_DEVICE),
  114. DELEMENT(BT_PROPERTY_SERVICE_RECORD),
  115. DELEMENT(BT_PROPERTY_ADAPTER_SCAN_MODE),
  116. DELEMENT(BT_PROPERTY_ADAPTER_BONDED_DEVICES),
  117. DELEMENT(BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT),
  118. DELEMENT(BT_PROPERTY_REMOTE_FRIENDLY_NAME),
  119. DELEMENT(BT_PROPERTY_REMOTE_RSSI),
  120. DELEMENT(BT_PROPERTY_REMOTE_VERSION_INFO),
  121. DELEMENT(BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP),
  122. ENDMAP
  123. #endif
  124. INTMAP(bt_cb_thread_evt, -1, "(unknown)")
  125. DELEMENT(ASSOCIATE_JVM),
  126. DELEMENT(DISASSOCIATE_JVM),
  127. ENDMAP
  128. /* Find first index of given value in table m */
  129. int int2str_findint(int v, const struct int2str m[])
  130. {
  131. int i;
  132. for (i = 0; m[i].str; ++i) {
  133. if (m[i].val == v)
  134. return i;
  135. }
  136. return -1;
  137. }
  138. /* Find first index of given string in table m */
  139. int int2str_findstr(const char *str, const struct int2str m[])
  140. {
  141. int i;
  142. for (i = 0; m[i].str; ++i) {
  143. if (strcmp(m[i].str, str) == 0)
  144. return i;
  145. }
  146. return -1;
  147. }
  148. /*
  149. * convert bd_addr to string
  150. * buf must be at least 18 char long
  151. *
  152. * returns buf
  153. */
  154. const char *bt_bdaddr_t2str(const bt_bdaddr_t *bd_addr, char *buf)
  155. {
  156. const uint8_t *p;
  157. if (!bd_addr)
  158. return strcpy(buf, "NULL");
  159. p = bd_addr->address;
  160. snprintf(buf, MAX_ADDR_STR_LEN, "%02x:%02x:%02x:%02x:%02x:%02x",
  161. p[0], p[1], p[2], p[3], p[4], p[5]);
  162. return buf;
  163. }
  164. /* converts string to bt_bdaddr_t */
  165. void str2bt_bdaddr_t(const char *str, bt_bdaddr_t *bd_addr)
  166. {
  167. uint8_t *p = bd_addr->address;
  168. sscanf(str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
  169. &p[0], &p[1], &p[2], &p[3], &p[4], &p[5]);
  170. }
  171. /* converts string to uuid */
  172. void str2bt_uuid_t(const char *str, bt_uuid_t *uuid)
  173. {
  174. int i = 0;
  175. memcpy(uuid, BT_BASE_UUID, sizeof(bt_uuid_t));
  176. while (*str && i < (int) sizeof(bt_uuid_t)) {
  177. while (*str == '-')
  178. str++;
  179. if (sscanf(str, "%02hhx", &uuid->uu[i]) != 1)
  180. break;
  181. i++;
  182. str += 2;
  183. }
  184. }
  185. const char *enum_defines(void *v, int i)
  186. {
  187. const struct int2str *m = v;
  188. return m[i].str != NULL ? m[i].str : NULL;
  189. }
  190. const char *enum_strings(void *v, int i)
  191. {
  192. const char **m = v;
  193. return m[i] != NULL ? m[i] : NULL;
  194. }
  195. const char *enum_one_string(void *v, int i)
  196. {
  197. const char *m = v;
  198. return (i == 0) && (m[0] != 0) ? m : NULL;
  199. }
  200. const char *bdaddr2str(const bt_bdaddr_t *bd_addr)
  201. {
  202. static char buf[MAX_ADDR_STR_LEN];
  203. return bt_bdaddr_t2str(bd_addr, buf);
  204. }
  205. static void bonded_devices2string(char *str, void *prop, int prop_len)
  206. {
  207. int count = prop_len / sizeof(bt_bdaddr_t);
  208. bt_bdaddr_t *addr = prop;
  209. strcat(str, "{");
  210. while (count--) {
  211. strcat(str, bdaddr2str(addr));
  212. if (count)
  213. strcat(str, ", ");
  214. addr++;
  215. }
  216. strcat(str, "}");
  217. }
  218. static void uuids2string(char *str, void *prop, int prop_len)
  219. {
  220. int count = prop_len / sizeof(bt_uuid_t);
  221. bt_uuid_t *uuid = prop;
  222. strcat(str, "{");
  223. while (count--) {
  224. strcat(str, btuuid2str(uuid->uu));
  225. if (count)
  226. strcat(str, ", ");
  227. uuid++;
  228. }
  229. strcat(str, "}");
  230. }
  231. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  232. static void local_le_feat2string(char *str, const bt_local_le_features_t *f)
  233. {
  234. uint16_t scan_num;
  235. str += sprintf(str, "{\n");
  236. str += sprintf(str, "Privacy supported: %s,\n",
  237. f->local_privacy_enabled ? "TRUE" : "FALSE");
  238. str += sprintf(str, "Num of advertising instances: %u,\n",
  239. f->max_adv_instance);
  240. str += sprintf(str, "PRA offloading support: %s,\n",
  241. f->rpa_offload_supported ? "TRUE" : "FALSE");
  242. str += sprintf(str, "Num of offloaded IRKs: %u,\n",
  243. f->max_irk_list_size);
  244. str += sprintf(str, "Num of offloaded scan filters: %u,\n",
  245. f->max_adv_filter_supported);
  246. scan_num = (f->scan_result_storage_size_hibyte << 8) +
  247. f->scan_result_storage_size_lobyte;
  248. str += sprintf(str, "Num of offloaded scan results: %u,\n", scan_num);
  249. str += sprintf(str, "Activity & energy report support: %s\n",
  250. f->activity_energy_info_supported ? "TRUE" : "FALSE");
  251. sprintf(str, "}");
  252. }
  253. #endif
  254. const char *btproperty2str(const bt_property_t *property)
  255. {
  256. bt_service_record_t *rec;
  257. static char buf[4096];
  258. char *p;
  259. p = buf + sprintf(buf, "type=%s len=%d val=",
  260. bt_property_type_t2str(property->type),
  261. property->len);
  262. switch (property->type) {
  263. case BT_PROPERTY_BDNAME:
  264. case BT_PROPERTY_REMOTE_FRIENDLY_NAME:
  265. snprintf(p, property->len + 1, "%s",
  266. ((bt_bdname_t *) property->val)->name);
  267. break;
  268. case BT_PROPERTY_BDADDR:
  269. sprintf(p, "%s", bdaddr2str((bt_bdaddr_t *) property->val));
  270. break;
  271. case BT_PROPERTY_CLASS_OF_DEVICE:
  272. sprintf(p, "%06x", *((int *) property->val));
  273. break;
  274. case BT_PROPERTY_TYPE_OF_DEVICE:
  275. sprintf(p, "%s", bt_device_type_t2str(
  276. *((bt_device_type_t *) property->val)));
  277. break;
  278. case BT_PROPERTY_REMOTE_RSSI:
  279. sprintf(p, "%d", *((char *) property->val));
  280. break;
  281. case BT_PROPERTY_ADAPTER_SCAN_MODE:
  282. sprintf(p, "%s",
  283. bt_scan_mode_t2str(*((bt_scan_mode_t *) property->val)));
  284. break;
  285. case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT:
  286. sprintf(p, "%d", *((int *) property->val));
  287. break;
  288. case BT_PROPERTY_ADAPTER_BONDED_DEVICES:
  289. bonded_devices2string(p, property->val, property->len);
  290. break;
  291. case BT_PROPERTY_UUIDS:
  292. uuids2string(p, property->val, property->len);
  293. break;
  294. case BT_PROPERTY_SERVICE_RECORD:
  295. rec = property->val;
  296. sprintf(p, "{%s, %d, %s}", btuuid2str(rec->uuid.uu),
  297. rec->channel, rec->name);
  298. break;
  299. #if ANDROID_VERSION >= PLATFORM_VER(5, 0, 0)
  300. case BT_PROPERTY_LOCAL_LE_FEATURES:
  301. local_le_feat2string(p, property->val);
  302. break;
  303. #endif
  304. case BT_PROPERTY_REMOTE_VERSION_INFO:
  305. case BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP:
  306. default:
  307. sprintf(p, "%p", property->val);
  308. break;
  309. }
  310. return buf;
  311. }
  312. #define PROP_PREFIX "persist.sys.bluetooth."
  313. #define PROP_PREFIX_RO "ro.bluetooth."
  314. int get_config(const char *config_key, char *value, const char *fallback)
  315. {
  316. char key[PROPERTY_KEY_MAX];
  317. int ret;
  318. if (strlen(config_key) + sizeof(PROP_PREFIX) > sizeof(key))
  319. return 0;
  320. snprintf(key, sizeof(key), PROP_PREFIX"%s", config_key);
  321. ret = property_get(key, value, "");
  322. if (ret > 0)
  323. return ret;
  324. snprintf(key, sizeof(key), PROP_PREFIX_RO"%s", config_key);
  325. ret = property_get(key, value, "");
  326. if (ret > 0)
  327. return ret;
  328. if (!fallback)
  329. return 0;
  330. return property_get(fallback, value, "");
  331. }