• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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@qualcomm.com>
7  *  Copyright (C) 2002-2008  Marcel Holtmann <marcel@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_inquiry_transmit_power_level(int dd, int8_t *level, int to);
105 int hci_write_inquiry_transmit_power_level(int dd, int8_t level, int to);
106 int hci_read_transmit_power_level(int dd, uint16_t handle, uint8_t type, int8_t *level, int to);
107 int hci_read_link_policy(int dd, uint16_t handle, uint16_t *policy, int to);
108 int hci_write_link_policy(int dd, uint16_t handle, uint16_t policy, int to);
109 int hci_read_link_supervision_timeout(int dd, uint16_t handle, uint16_t *timeout, int to);
110 int hci_write_link_supervision_timeout(int dd, uint16_t handle, uint16_t timeout, int to);
111 int hci_set_afh_classification(int dd, uint8_t *map, int to);
112 int hci_read_link_quality(int dd, uint16_t handle, uint8_t *link_quality, int to);
113 int hci_read_rssi(int dd, uint16_t handle, int8_t *rssi, int to);
114 int hci_read_afh_map(int dd, uint16_t handle, uint8_t *mode, uint8_t *map, int to);
115 int hci_read_clock(int dd, uint16_t handle, uint8_t which, uint32_t *clock, uint16_t *accuracy, int to);
116 
117 int hci_local_name(int dd, int len, char *name, int to);
118 int hci_remote_name(int dd, const bdaddr_t *bdaddr, int len, char *name, int to);
119 
120 int hci_for_each_dev(int flag, int(*func)(int dd, int dev_id, long arg), long arg);
121 int hci_get_route(bdaddr_t *bdaddr);
122 
123 char *hci_dtypetostr(int type);
124 char *hci_dflagstostr(uint32_t flags);
125 char *hci_ptypetostr(unsigned int ptype);
126 int hci_strtoptype(char *str, unsigned int *val);
127 char *hci_scoptypetostr(unsigned int ptype);
128 int hci_strtoscoptype(char *str, unsigned int *val);
129 char *hci_lptostr(unsigned int ptype);
130 int hci_strtolp(char *str, unsigned int *val);
131 char *hci_lmtostr(unsigned int ptype);
132 int hci_strtolm(char *str, unsigned int *val);
133 
134 char *hci_cmdtostr(unsigned int cmd);
135 char *hci_commandstostr(uint8_t *commands, char *pref, int width);
136 
137 char *hci_vertostr(unsigned int ver);
138 int hci_strtover(char *str, unsigned int *ver);
139 char *lmp_vertostr(unsigned int ver);
140 int lmp_strtover(char *str, unsigned int *ver);
141 
142 char *lmp_featurestostr(uint8_t *features, char *pref, int width);
143 
hci_set_bit(int nr,void * addr)144 static inline void hci_set_bit(int nr, void *addr)
145 {
146 	*((uint32_t *) addr + (nr >> 5)) |= (1 << (nr & 31));
147 }
148 
hci_clear_bit(int nr,void * addr)149 static inline void hci_clear_bit(int nr, void *addr)
150 {
151 	*((uint32_t *) addr + (nr >> 5)) &= ~(1 << (nr & 31));
152 }
153 
hci_test_bit(int nr,void * addr)154 static inline int hci_test_bit(int nr, void *addr)
155 {
156 	return *((uint32_t *) addr + (nr >> 5)) & (1 << (nr & 31));
157 }
158 
159 /* HCI filter tools */
hci_filter_clear(struct hci_filter * f)160 static inline void hci_filter_clear(struct hci_filter *f)
161 {
162 	memset(f, 0, sizeof(*f));
163 }
hci_filter_set_ptype(int t,struct hci_filter * f)164 static inline void hci_filter_set_ptype(int t, struct hci_filter *f)
165 {
166 	hci_set_bit((t == HCI_VENDOR_PKT) ? 0 : (t & HCI_FLT_TYPE_BITS), &f->type_mask);
167 }
hci_filter_clear_ptype(int t,struct hci_filter * f)168 static inline void hci_filter_clear_ptype(int t, struct hci_filter *f)
169 {
170 	hci_clear_bit((t == HCI_VENDOR_PKT) ? 0 : (t & HCI_FLT_TYPE_BITS), &f->type_mask);
171 }
hci_filter_test_ptype(int t,struct hci_filter * f)172 static inline int hci_filter_test_ptype(int t, struct hci_filter *f)
173 {
174 	return hci_test_bit((t == HCI_VENDOR_PKT) ? 0 : (t & HCI_FLT_TYPE_BITS), &f->type_mask);
175 }
hci_filter_all_ptypes(struct hci_filter * f)176 static inline void hci_filter_all_ptypes(struct hci_filter *f)
177 {
178 	memset((void *) &f->type_mask, 0xff, sizeof(f->type_mask));
179 }
hci_filter_set_event(int e,struct hci_filter * f)180 static inline void hci_filter_set_event(int e, struct hci_filter *f)
181 {
182 	hci_set_bit((e & HCI_FLT_EVENT_BITS), &f->event_mask);
183 }
hci_filter_clear_event(int e,struct hci_filter * f)184 static inline void hci_filter_clear_event(int e, struct hci_filter *f)
185 {
186 	hci_clear_bit((e & HCI_FLT_EVENT_BITS), &f->event_mask);
187 }
hci_filter_test_event(int e,struct hci_filter * f)188 static inline int hci_filter_test_event(int e, struct hci_filter *f)
189 {
190 	return hci_test_bit((e & HCI_FLT_EVENT_BITS), &f->event_mask);
191 }
hci_filter_all_events(struct hci_filter * f)192 static inline void hci_filter_all_events(struct hci_filter *f)
193 {
194 	memset((void *) f->event_mask, 0xff, sizeof(f->event_mask));
195 }
hci_filter_set_opcode(int opcode,struct hci_filter * f)196 static inline void hci_filter_set_opcode(int opcode, struct hci_filter *f)
197 {
198 	f->opcode = opcode;
199 }
hci_filter_clear_opcode(struct hci_filter * f)200 static inline void hci_filter_clear_opcode(struct hci_filter *f)
201 {
202 	f->opcode = 0;
203 }
hci_filter_test_opcode(int opcode,struct hci_filter * f)204 static inline int hci_filter_test_opcode(int opcode, struct hci_filter *f)
205 {
206 	return (f->opcode == opcode);
207 }
208 
209 #ifdef __cplusplus
210 }
211 #endif
212 
213 #endif /* __HCI_LIB_H */
214