Home | History | Annotate | Download | only in bluetooth
      1 /*
      2  *
      3  *  BlueZ - Bluetooth protocol stack for Linux
      4  *
      5  *  Copyright (C) 2000-2001  Qualcomm Incorporated
      6  *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk (at) qualcomm.com>
      7  *  Copyright (C) 2002-2010  Marcel Holtmann <marcel (at) holtmann.org>
      8  *
      9  *
     10  *  This program is free software; you can redistribute it and/or modify
     11  *  it under the terms of the GNU General Public License as published by
     12  *  the Free Software Foundation; either version 2 of the License, or
     13  *  (at your option) any later version.
     14  *
     15  *  This program is distributed in the hope that it will be useful,
     16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18  *  GNU General Public License for more details.
     19  *
     20  *  You should have received a copy of the GNU General Public License
     21  *  along with this program; if not, write to the Free Software
     22  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     23  *
     24  */
     25 
     26 #ifndef __HCI_LIB_H
     27 #define __HCI_LIB_H
     28 
     29 #ifdef __cplusplus
     30 extern "C" {
     31 #endif
     32 
     33 struct hci_request {
     34 	uint16_t ogf;
     35 	uint16_t ocf;
     36 	int      event;
     37 	void     *cparam;
     38 	int      clen;
     39 	void     *rparam;
     40 	int      rlen;
     41 };
     42 
     43 struct hci_version {
     44 	uint16_t manufacturer;
     45 	uint8_t  hci_ver;
     46 	uint16_t hci_rev;
     47 	uint8_t  lmp_ver;
     48 	uint16_t lmp_subver;
     49 };
     50 
     51 int hci_open_dev(int dev_id);
     52 int hci_close_dev(int dd);
     53 int hci_send_cmd(int dd, uint16_t ogf, uint16_t ocf, uint8_t plen, void *param);
     54 int hci_send_req(int dd, struct hci_request *req, int timeout);
     55 
     56 int hci_create_connection(int dd, const bdaddr_t *bdaddr, uint16_t ptype, uint16_t clkoffset, uint8_t rswitch, uint16_t *handle, int to);
     57 int hci_disconnect(int dd, uint16_t handle, uint8_t reason, int to);
     58 
     59 int hci_inquiry(int dev_id, int len, int num_rsp, const uint8_t *lap, inquiry_info **ii, long flags);
     60 int hci_devinfo(int dev_id, struct hci_dev_info *di);
     61 int hci_devba(int dev_id, bdaddr_t *bdaddr);
     62 int hci_devid(const char *str);
     63 
     64 int hci_read_local_name(int dd, int len, char *name, int to);
     65 int hci_write_local_name(int dd, const char *name, int to);
     66 int hci_read_remote_name(int dd, const bdaddr_t *bdaddr, int len, char *name, int to);
     67 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);
     68 int hci_read_remote_name_cancel(int dd, const bdaddr_t *bdaddr, int to);
     69 int hci_read_remote_version(int dd, uint16_t handle, struct hci_version *ver, int to);
     70 int hci_read_remote_features(int dd, uint16_t handle, uint8_t *features, int to);
     71 int hci_read_remote_ext_features(int dd, uint16_t handle, uint8_t page, uint8_t *max_page, uint8_t *features, int to);
     72 int hci_read_clock_offset(int dd, uint16_t handle, uint16_t *clkoffset, int to);
     73 int hci_read_local_version(int dd, struct hci_version *ver, int to);
     74 int hci_read_local_commands(int dd, uint8_t *commands, int to);
     75 int hci_read_local_features(int dd, uint8_t *features, int to);
     76 int hci_read_local_ext_features(int dd, uint8_t page, uint8_t *max_page, uint8_t *features, int to);
     77 int hci_read_bd_addr(int dd, bdaddr_t *bdaddr, int to);
     78 int hci_read_class_of_dev(int dd, uint8_t *cls, int to);
     79 int hci_write_class_of_dev(int dd, uint32_t cls, int to);
     80 int hci_read_voice_setting(int dd, uint16_t *vs, int to);
     81 int hci_write_voice_setting(int dd, uint16_t vs, int to);
     82 int hci_read_current_iac_lap(int dd, uint8_t *num_iac, uint8_t *lap, int to);
     83 int hci_write_current_iac_lap(int dd, uint8_t num_iac, uint8_t *lap, int to);
     84 int hci_read_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t all, int to);
     85 int hci_write_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t *key, int to);
     86 int hci_delete_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t all, int to);
     87 int hci_authenticate_link(int dd, uint16_t handle, int to);
     88 int hci_encrypt_link(int dd, uint16_t handle, uint8_t encrypt, int to);
     89 int hci_change_link_key(int dd, uint16_t handle, int to);
     90 int hci_switch_role(int dd, bdaddr_t *bdaddr, uint8_t role, int to);
     91 int hci_park_mode(int dd, uint16_t handle, uint16_t max_interval, uint16_t min_interval, int to);
     92 int hci_exit_park_mode(int dd, uint16_t handle, int to);
     93 int hci_read_inquiry_scan_type(int dd, uint8_t *type, int to);
     94 int hci_write_inquiry_scan_type(int dd, uint8_t type, int to);
     95 int hci_read_inquiry_mode(int dd, uint8_t *mode, int to);
     96 int hci_write_inquiry_mode(int dd, uint8_t mode, int to);
     97 int hci_read_afh_mode(int dd, uint8_t *mode, int to);
     98 int hci_write_afh_mode(int dd, uint8_t mode, int to);
     99 int hci_read_ext_inquiry_response(int dd, uint8_t *fec, uint8_t *data, int to);
    100 int hci_write_ext_inquiry_response(int dd, uint8_t fec, uint8_t *data, int to);
    101 int hci_read_simple_pairing_mode(int dd, uint8_t *mode, int to);
    102 int hci_write_simple_pairing_mode(int dd, uint8_t mode, int to);
    103 int hci_read_local_oob_data(int dd, uint8_t *hash, uint8_t *randomizer, int to);
    104 int hci_read_inq_response_tx_power_level(int dd, int8_t *level, int to);
    105 int hci_read_inquiry_transmit_power_level(int dd, int8_t *level, int to);
    106 int hci_write_inquiry_transmit_power_level(int dd, int8_t level, int to);
    107 int hci_read_transmit_power_level(int dd, uint16_t handle, uint8_t type, int8_t *level, int to);
    108 int hci_read_link_policy(int dd, uint16_t handle, uint16_t *policy, int to);
    109 int hci_write_link_policy(int dd, uint16_t handle, uint16_t policy, int to);
    110 int hci_read_link_supervision_timeout(int dd, uint16_t handle, uint16_t *timeout, int to);
    111 int hci_write_link_supervision_timeout(int dd, uint16_t handle, uint16_t timeout, int to);
    112 int hci_set_afh_classification(int dd, uint8_t *map, int to);
    113 int hci_read_link_quality(int dd, uint16_t handle, uint8_t *link_quality, int to);
    114 int hci_read_rssi(int dd, uint16_t handle, int8_t *rssi, int to);
    115 int hci_read_afh_map(int dd, uint16_t handle, uint8_t *mode, uint8_t *map, int to);
    116 int hci_read_clock(int dd, uint16_t handle, uint8_t which, uint32_t *clock, uint16_t *accuracy, int to);
    117 
    118 int hci_le_set_scan_enable(int dev_id, uint8_t enable, uint8_t filter_dup);
    119 int hci_le_set_scan_parameters(int dev_id, uint8_t type, uint16_t interval,
    120 					uint16_t window, uint8_t own_type,
    121 					uint8_t filter);
    122 int hci_le_set_advertise_enable(int dev_id, uint8_t enable);
    123 int hci_le_create_conn(int dd, uint16_t interval, uint16_t window,
    124 		uint8_t initiator_filter, uint8_t peer_bdaddr_type,
    125 		bdaddr_t peer_bdaddr, uint8_t own_bdaddr_type,
    126 		uint16_t min_interval, 	uint16_t max_interval,
    127 		uint16_t latency, uint16_t supervision_timeout,
    128 		uint16_t min_ce_length, uint16_t max_ce_length,
    129 		uint16_t *handle, int to);
    130 
    131 int hci_for_each_dev(int flag, int(*func)(int dd, int dev_id, long arg), long arg);
    132 int hci_get_route(bdaddr_t *bdaddr);
    133 
    134 char *hci_bustostr(int bus);
    135 char *hci_typetostr(int type);
    136 char *hci_dtypetostr(int type);
    137 char *hci_dflagstostr(uint32_t flags);
    138 char *hci_ptypetostr(unsigned int ptype);
    139 int hci_strtoptype(char *str, unsigned int *val);
    140 char *hci_scoptypetostr(unsigned int ptype);
    141 int hci_strtoscoptype(char *str, unsigned int *val);
    142 char *hci_lptostr(unsigned int ptype);
    143 int hci_strtolp(char *str, unsigned int *val);
    144 char *hci_lmtostr(unsigned int ptype);
    145 int hci_strtolm(char *str, unsigned int *val);
    146 
    147 char *hci_cmdtostr(unsigned int cmd);
    148 char *hci_commandstostr(uint8_t *commands, char *pref, int width);
    149 
    150 char *hci_vertostr(unsigned int ver);
    151 int hci_strtover(char *str, unsigned int *ver);
    152 char *lmp_vertostr(unsigned int ver);
    153 int lmp_strtover(char *str, unsigned int *ver);
    154 
    155 char *lmp_featurestostr(uint8_t *features, char *pref, int width);
    156 
    157 static inline void hci_set_bit(int nr, void *addr)
    158 {
    159 	*((uint32_t *) addr + (nr >> 5)) |= (1 << (nr & 31));
    160 }
    161 
    162 static inline void hci_clear_bit(int nr, void *addr)
    163 {
    164 	*((uint32_t *) addr + (nr >> 5)) &= ~(1 << (nr & 31));
    165 }
    166 
    167 static inline int hci_test_bit(int nr, void *addr)
    168 {
    169 	return *((uint32_t *) addr + (nr >> 5)) & (1 << (nr & 31));
    170 }
    171 
    172 /* HCI filter tools */
    173 static inline void hci_filter_clear(struct hci_filter *f)
    174 {
    175 	memset(f, 0, sizeof(*f));
    176 }
    177 static inline void hci_filter_set_ptype(int t, struct hci_filter *f)
    178 {
    179 	hci_set_bit((t == HCI_VENDOR_PKT) ? 0 : (t & HCI_FLT_TYPE_BITS), &f->type_mask);
    180 }
    181 static inline void hci_filter_clear_ptype(int t, struct hci_filter *f)
    182 {
    183 	hci_clear_bit((t == HCI_VENDOR_PKT) ? 0 : (t & HCI_FLT_TYPE_BITS), &f->type_mask);
    184 }
    185 static inline int hci_filter_test_ptype(int t, struct hci_filter *f)
    186 {
    187 	return hci_test_bit((t == HCI_VENDOR_PKT) ? 0 : (t & HCI_FLT_TYPE_BITS), &f->type_mask);
    188 }
    189 static inline void hci_filter_all_ptypes(struct hci_filter *f)
    190 {
    191 	memset((void *) &f->type_mask, 0xff, sizeof(f->type_mask));
    192 }
    193 static inline void hci_filter_set_event(int e, struct hci_filter *f)
    194 {
    195 	hci_set_bit((e & HCI_FLT_EVENT_BITS), &f->event_mask);
    196 }
    197 static inline void hci_filter_clear_event(int e, struct hci_filter *f)
    198 {
    199 	hci_clear_bit((e & HCI_FLT_EVENT_BITS), &f->event_mask);
    200 }
    201 static inline int hci_filter_test_event(int e, struct hci_filter *f)
    202 {
    203 	return hci_test_bit((e & HCI_FLT_EVENT_BITS), &f->event_mask);
    204 }
    205 static inline void hci_filter_all_events(struct hci_filter *f)
    206 {
    207 	memset((void *) f->event_mask, 0xff, sizeof(f->event_mask));
    208 }
    209 static inline void hci_filter_set_opcode(int opcode, struct hci_filter *f)
    210 {
    211 	f->opcode = opcode;
    212 }
    213 static inline void hci_filter_clear_opcode(struct hci_filter *f)
    214 {
    215 	f->opcode = 0;
    216 }
    217 static inline int hci_filter_test_opcode(int opcode, struct hci_filter *f)
    218 {
    219 	return (f->opcode == opcode);
    220 }
    221 
    222 #ifdef __cplusplus
    223 }
    224 #endif
    225 
    226 #endif /* __HCI_LIB_H */
    227