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