hci_lib.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2000-2001 Qualcomm Incorporated
  7. * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
  8. * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
  9. *
  10. *
  11. */
  12. #ifndef __HCI_LIB_H
  13. #define __HCI_LIB_H
  14. #ifdef __cplusplus
  15. extern "C" {
  16. #endif
  17. struct hci_request {
  18. uint16_t ogf;
  19. uint16_t ocf;
  20. int event;
  21. void *cparam;
  22. int clen;
  23. void *rparam;
  24. int rlen;
  25. };
  26. struct hci_version {
  27. uint16_t manufacturer;
  28. uint8_t hci_ver;
  29. uint16_t hci_rev;
  30. uint8_t lmp_ver;
  31. uint16_t lmp_subver;
  32. };
  33. int hci_open_dev(int dev_id);
  34. int hci_close_dev(int dd);
  35. int hci_send_cmd(int dd, uint16_t ogf, uint16_t ocf, uint8_t plen, void *param);
  36. int hci_send_req(int dd, struct hci_request *req, int timeout);
  37. int hci_create_connection(int dd, const bdaddr_t *bdaddr, uint16_t ptype, uint16_t clkoffset, uint8_t rswitch, uint16_t *handle, int to);
  38. int hci_disconnect(int dd, uint16_t handle, uint8_t reason, int to);
  39. int hci_inquiry(int dev_id, int len, int num_rsp, const uint8_t *lap, inquiry_info **ii, long flags);
  40. int hci_devinfo(int dev_id, struct hci_dev_info *di);
  41. int hci_devba(int dev_id, bdaddr_t *bdaddr);
  42. int hci_devid(const char *str);
  43. int hci_read_local_name(int dd, int len, char *name, int to);
  44. int hci_write_local_name(int dd, const char *name, int to);
  45. int hci_read_remote_name(int dd, const bdaddr_t *bdaddr, int len, char *name, int to);
  46. int hci_read_remote_name_with_clock_offset(int dd, const bdaddr_t *bdaddr, uint8_t pscan_rep_mode, uint16_t clkoffset, int len, char *name, int to);
  47. int hci_read_remote_name_cancel(int dd, const bdaddr_t *bdaddr, int to);
  48. int hci_read_remote_version(int dd, uint16_t handle, struct hci_version *ver, int to);
  49. int hci_read_remote_features(int dd, uint16_t handle, uint8_t *features, int to);
  50. int hci_read_remote_ext_features(int dd, uint16_t handle, uint8_t page, uint8_t *max_page, uint8_t *features, int to);
  51. int hci_read_clock_offset(int dd, uint16_t handle, uint16_t *clkoffset, int to);
  52. int hci_read_local_version(int dd, struct hci_version *ver, int to);
  53. int hci_read_local_commands(int dd, uint8_t *commands, int to);
  54. int hci_read_local_features(int dd, uint8_t *features, int to);
  55. int hci_read_local_ext_features(int dd, uint8_t page, uint8_t *max_page, uint8_t *features, int to);
  56. int hci_read_bd_addr(int dd, bdaddr_t *bdaddr, int to);
  57. int hci_read_class_of_dev(int dd, uint8_t *cls, int to);
  58. int hci_write_class_of_dev(int dd, uint32_t cls, int to);
  59. int hci_read_voice_setting(int dd, uint16_t *vs, int to);
  60. int hci_write_voice_setting(int dd, uint16_t vs, int to);
  61. int hci_read_current_iac_lap(int dd, uint8_t *num_iac, uint8_t *lap, int to);
  62. int hci_write_current_iac_lap(int dd, uint8_t num_iac, uint8_t *lap, int to);
  63. int hci_read_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t all, int to);
  64. int hci_write_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t *key, int to);
  65. int hci_delete_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t all, int to);
  66. int hci_authenticate_link(int dd, uint16_t handle, int to);
  67. int hci_encrypt_link(int dd, uint16_t handle, uint8_t encrypt, int to);
  68. int hci_change_link_key(int dd, uint16_t handle, int to);
  69. int hci_switch_role(int dd, bdaddr_t *bdaddr, uint8_t role, int to);
  70. int hci_park_mode(int dd, uint16_t handle, uint16_t max_interval, uint16_t min_interval, int to);
  71. int hci_exit_park_mode(int dd, uint16_t handle, int to);
  72. int hci_read_inquiry_scan_type(int dd, uint8_t *type, int to);
  73. int hci_write_inquiry_scan_type(int dd, uint8_t type, int to);
  74. int hci_read_inquiry_mode(int dd, uint8_t *mode, int to);
  75. int hci_write_inquiry_mode(int dd, uint8_t mode, int to);
  76. int hci_read_afh_mode(int dd, uint8_t *mode, int to);
  77. int hci_write_afh_mode(int dd, uint8_t mode, int to);
  78. int hci_read_ext_inquiry_response(int dd, uint8_t *fec, uint8_t *data, int to);
  79. int hci_write_ext_inquiry_response(int dd, uint8_t fec, uint8_t *data, int to);
  80. int hci_read_simple_pairing_mode(int dd, uint8_t *mode, int to);
  81. int hci_write_simple_pairing_mode(int dd, uint8_t mode, int to);
  82. int hci_read_local_oob_data(int dd, uint8_t *hash, uint8_t *randomizer, int to);
  83. int hci_read_inq_response_tx_power_level(int dd, int8_t *level, int to);
  84. int hci_read_inquiry_transmit_power_level(int dd, int8_t *level, int to);
  85. int hci_write_inquiry_transmit_power_level(int dd, int8_t level, int to);
  86. int hci_read_transmit_power_level(int dd, uint16_t handle, uint8_t type, int8_t *level, int to);
  87. int hci_read_link_policy(int dd, uint16_t handle, uint16_t *policy, int to);
  88. int hci_write_link_policy(int dd, uint16_t handle, uint16_t policy, int to);
  89. int hci_read_link_supervision_timeout(int dd, uint16_t handle, uint16_t *timeout, int to);
  90. int hci_write_link_supervision_timeout(int dd, uint16_t handle, uint16_t timeout, int to);
  91. int hci_set_afh_classification(int dd, uint8_t *map, int to);
  92. int hci_read_link_quality(int dd, uint16_t handle, uint8_t *link_quality, int to);
  93. int hci_read_rssi(int dd, uint16_t handle, int8_t *rssi, int to);
  94. int hci_read_afh_map(int dd, uint16_t handle, uint8_t *mode, uint8_t *map, int to);
  95. int hci_read_clock(int dd, uint16_t handle, uint8_t which, uint32_t *clock, uint16_t *accuracy, int to);
  96. int hci_le_set_scan_enable(int dev_id, uint8_t enable, uint8_t filter_dup, int to);
  97. int hci_le_set_scan_parameters(int dev_id, uint8_t type, uint16_t interval,
  98. uint16_t window, uint8_t own_type,
  99. uint8_t filter, int to);
  100. int hci_le_set_advertise_enable(int dev_id, uint8_t enable, int to);
  101. int hci_le_create_conn(int dd, uint16_t interval, uint16_t window,
  102. uint8_t initiator_filter, uint8_t peer_bdaddr_type,
  103. bdaddr_t peer_bdaddr, uint8_t own_bdaddr_type,
  104. uint16_t min_interval, uint16_t max_interval,
  105. uint16_t latency, uint16_t supervision_timeout,
  106. uint16_t min_ce_length, uint16_t max_ce_length,
  107. uint16_t *handle, int to);
  108. int hci_le_conn_update(int dd, uint16_t handle, uint16_t min_interval,
  109. uint16_t max_interval, uint16_t latency,
  110. uint16_t supervision_timeout, int to);
  111. int hci_le_add_white_list(int dd, const bdaddr_t *bdaddr, uint8_t type, int to);
  112. int hci_le_rm_white_list(int dd, const bdaddr_t *bdaddr, uint8_t type, int to);
  113. int hci_le_read_white_list_size(int dd, uint8_t *size, int to);
  114. int hci_le_clear_white_list(int dd, int to);
  115. int hci_le_add_resolving_list(int dd, const bdaddr_t *bdaddr, uint8_t type,
  116. uint8_t *peer_irk, uint8_t *local_irk, int to);
  117. int hci_le_rm_resolving_list(int dd, const bdaddr_t *bdaddr, uint8_t type, int to);
  118. int hci_le_clear_resolving_list(int dd, int to);
  119. int hci_le_read_resolving_list_size(int dd, uint8_t *size, int to);
  120. int hci_le_set_address_resolution_enable(int dev_id, uint8_t enable, int to);
  121. int hci_le_read_remote_features(int dd, uint16_t handle, uint8_t *features, int to);
  122. int hci_for_each_dev(int flag, int(*func)(int dd, int dev_id, long arg), long arg);
  123. int hci_get_route(bdaddr_t *bdaddr);
  124. char *hci_bustostr(int bus);
  125. char *hci_typetostr(int type);
  126. char *hci_dtypetostr(int type);
  127. char *hci_dflagstostr(uint32_t flags);
  128. char *hci_ptypetostr(unsigned int ptype);
  129. int hci_strtoptype(char *str, unsigned int *val);
  130. char *hci_scoptypetostr(unsigned int ptype);
  131. int hci_strtoscoptype(char *str, unsigned int *val);
  132. char *hci_lptostr(unsigned int ptype);
  133. int hci_strtolp(char *str, unsigned int *val);
  134. char *hci_lmtostr(unsigned int ptype);
  135. int hci_strtolm(char *str, unsigned int *val);
  136. char *hci_cmdtostr(unsigned int cmd);
  137. char *hci_commandstostr(uint8_t *commands, char *pref, int width);
  138. char *hci_vertostr(unsigned int ver);
  139. int hci_strtover(char *str, unsigned int *ver);
  140. char *lmp_vertostr(unsigned int ver);
  141. int lmp_strtover(char *str, unsigned int *ver);
  142. char *pal_vertostr(unsigned int ver);
  143. int pal_strtover(char *str, unsigned int *ver);
  144. char *lmp_featurestostr(uint8_t *features, char *pref, int width);
  145. static inline void hci_set_bit(int nr, void *addr)
  146. {
  147. *((uint32_t *) addr + (nr >> 5)) |= (1 << (nr & 31));
  148. }
  149. static inline void hci_clear_bit(int nr, void *addr)
  150. {
  151. *((uint32_t *) addr + (nr >> 5)) &= ~(1 << (nr & 31));
  152. }
  153. static inline int hci_test_bit(int nr, void *addr)
  154. {
  155. return *((uint32_t *) addr + (nr >> 5)) & (1 << (nr & 31));
  156. }
  157. /* HCI filter tools */
  158. static inline void hci_filter_clear(struct hci_filter *f)
  159. {
  160. memset(f, 0, sizeof(*f));
  161. }
  162. static inline void hci_filter_set_ptype(int t, struct hci_filter *f)
  163. {
  164. hci_set_bit((t == HCI_VENDOR_PKT) ? 0 : (t & HCI_FLT_TYPE_BITS), &f->type_mask);
  165. }
  166. static inline void hci_filter_clear_ptype(int t, struct hci_filter *f)
  167. {
  168. hci_clear_bit((t == HCI_VENDOR_PKT) ? 0 : (t & HCI_FLT_TYPE_BITS), &f->type_mask);
  169. }
  170. static inline int hci_filter_test_ptype(int t, struct hci_filter *f)
  171. {
  172. return hci_test_bit((t == HCI_VENDOR_PKT) ? 0 : (t & HCI_FLT_TYPE_BITS), &f->type_mask);
  173. }
  174. static inline void hci_filter_all_ptypes(struct hci_filter *f)
  175. {
  176. memset((void *) &f->type_mask, 0xff, sizeof(f->type_mask));
  177. }
  178. static inline void hci_filter_set_event(int e, struct hci_filter *f)
  179. {
  180. hci_set_bit((e & HCI_FLT_EVENT_BITS), &f->event_mask);
  181. }
  182. static inline void hci_filter_clear_event(int e, struct hci_filter *f)
  183. {
  184. hci_clear_bit((e & HCI_FLT_EVENT_BITS), &f->event_mask);
  185. }
  186. static inline int hci_filter_test_event(int e, struct hci_filter *f)
  187. {
  188. return hci_test_bit((e & HCI_FLT_EVENT_BITS), &f->event_mask);
  189. }
  190. static inline void hci_filter_all_events(struct hci_filter *f)
  191. {
  192. memset((void *) f->event_mask, 0xff, sizeof(f->event_mask));
  193. }
  194. static inline void hci_filter_set_opcode(int opcode, struct hci_filter *f)
  195. {
  196. f->opcode = opcode;
  197. }
  198. static inline void hci_filter_clear_opcode(struct hci_filter *f)
  199. {
  200. f->opcode = 0;
  201. }
  202. static inline int hci_filter_test_opcode(int opcode, struct hci_filter *f)
  203. {
  204. return (f->opcode == opcode);
  205. }
  206. #ifdef __cplusplus
  207. }
  208. #endif
  209. #endif /* __HCI_LIB_H */