1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#ifndef __BLUETOOTH_H
26#define __BLUETOOTH_H
27
28#include <linux/poll.h>
29#include <net/sock.h>
30#include <linux/seq_file.h>
31
32#define BT_SUBSYS_VERSION 2
33#define BT_SUBSYS_REVISION 22
34
35#ifndef AF_BLUETOOTH
36#define AF_BLUETOOTH 31
37#define PF_BLUETOOTH AF_BLUETOOTH
38#endif
39
40
41#define BLUETOOTH_VER_1_1 1
42#define BLUETOOTH_VER_1_2 2
43#define BLUETOOTH_VER_2_0 3
44
45
46#define BT_SKB_RESERVE 8
47
48#define BTPROTO_L2CAP 0
49#define BTPROTO_HCI 1
50#define BTPROTO_SCO 2
51#define BTPROTO_RFCOMM 3
52#define BTPROTO_BNEP 4
53#define BTPROTO_CMTP 5
54#define BTPROTO_HIDP 6
55#define BTPROTO_AVDTP 7
56
57#define SOL_HCI 0
58#define SOL_L2CAP 6
59#define SOL_SCO 17
60#define SOL_RFCOMM 18
61
62#define BT_SECURITY 4
63struct bt_security {
64 __u8 level;
65 __u8 key_size;
66};
67#define BT_SECURITY_SDP 0
68#define BT_SECURITY_LOW 1
69#define BT_SECURITY_MEDIUM 2
70#define BT_SECURITY_HIGH 3
71#define BT_SECURITY_FIPS 4
72
73#define BT_DEFER_SETUP 7
74
75#define BT_FLUSHABLE 8
76
77#define BT_FLUSHABLE_OFF 0
78#define BT_FLUSHABLE_ON 1
79
80#define BT_POWER 9
81struct bt_power {
82 __u8 force_active;
83};
84#define BT_POWER_FORCE_ACTIVE_OFF 0
85#define BT_POWER_FORCE_ACTIVE_ON 1
86
87#define BT_CHANNEL_POLICY 10
88
89
90
91
92
93
94#define BT_CHANNEL_POLICY_BREDR_ONLY 0
95
96
97
98
99
100
101#define BT_CHANNEL_POLICY_BREDR_PREFERRED 1
102
103
104
105
106
107
108
109
110
111
112#define BT_CHANNEL_POLICY_AMP_PREFERRED 2
113
114#define BT_VOICE 11
115struct bt_voice {
116 __u16 setting;
117};
118
119#define BT_VOICE_TRANSPARENT 0x0003
120#define BT_VOICE_CVSD_16BIT 0x0060
121
122#define BT_SNDMTU 12
123#define BT_RCVMTU 13
124
125__printf(1, 2)
126void bt_info(const char *fmt, ...);
127__printf(1, 2)
128void bt_warn(const char *fmt, ...);
129__printf(1, 2)
130void bt_err(const char *fmt, ...);
131__printf(1, 2)
132void bt_warn_ratelimited(const char *fmt, ...);
133__printf(1, 2)
134void bt_err_ratelimited(const char *fmt, ...);
135
136#define BT_INFO(fmt, ...) bt_info(fmt "\n", ##__VA_ARGS__)
137#define BT_WARN(fmt, ...) bt_warn(fmt "\n", ##__VA_ARGS__)
138#define BT_ERR(fmt, ...) bt_err(fmt "\n", ##__VA_ARGS__)
139#define BT_DBG(fmt, ...) pr_debug(fmt "\n", ##__VA_ARGS__)
140
141#define bt_dev_info(hdev, fmt, ...) \
142 BT_INFO("%s: " fmt, (hdev)->name, ##__VA_ARGS__)
143#define bt_dev_warn(hdev, fmt, ...) \
144 BT_WARN("%s: " fmt, (hdev)->name, ##__VA_ARGS__)
145#define bt_dev_err(hdev, fmt, ...) \
146 BT_ERR("%s: " fmt, (hdev)->name, ##__VA_ARGS__)
147#define bt_dev_dbg(hdev, fmt, ...) \
148 BT_DBG("%s: " fmt, (hdev)->name, ##__VA_ARGS__)
149
150#define bt_dev_warn_ratelimited(hdev, fmt, ...) \
151 bt_warn_ratelimited("%s: " fmt, (hdev)->name, ##__VA_ARGS__)
152#define bt_dev_err_ratelimited(hdev, fmt, ...) \
153 bt_err_ratelimited("%s: " fmt, (hdev)->name, ##__VA_ARGS__)
154
155
156enum {
157 BT_CONNECTED = 1,
158 BT_OPEN,
159 BT_BOUND,
160 BT_LISTEN,
161 BT_CONNECT,
162 BT_CONNECT2,
163 BT_CONFIG,
164 BT_DISCONN,
165 BT_CLOSED
166};
167
168
169static inline const char *state_to_string(int state)
170{
171 switch (state) {
172 case BT_CONNECTED:
173 return "BT_CONNECTED";
174 case BT_OPEN:
175 return "BT_OPEN";
176 case BT_BOUND:
177 return "BT_BOUND";
178 case BT_LISTEN:
179 return "BT_LISTEN";
180 case BT_CONNECT:
181 return "BT_CONNECT";
182 case BT_CONNECT2:
183 return "BT_CONNECT2";
184 case BT_CONFIG:
185 return "BT_CONFIG";
186 case BT_DISCONN:
187 return "BT_DISCONN";
188 case BT_CLOSED:
189 return "BT_CLOSED";
190 }
191
192 return "invalid state";
193}
194
195
196typedef struct {
197 __u8 b[6];
198} __packed bdaddr_t;
199
200
201#define BDADDR_BREDR 0x00
202#define BDADDR_LE_PUBLIC 0x01
203#define BDADDR_LE_RANDOM 0x02
204
205static inline bool bdaddr_type_is_valid(u8 type)
206{
207 switch (type) {
208 case BDADDR_BREDR:
209 case BDADDR_LE_PUBLIC:
210 case BDADDR_LE_RANDOM:
211 return true;
212 }
213
214 return false;
215}
216
217static inline bool bdaddr_type_is_le(u8 type)
218{
219 switch (type) {
220 case BDADDR_LE_PUBLIC:
221 case BDADDR_LE_RANDOM:
222 return true;
223 }
224
225 return false;
226}
227
228#define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})
229#define BDADDR_NONE (&(bdaddr_t) {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}})
230
231
232static inline int bacmp(const bdaddr_t *ba1, const bdaddr_t *ba2)
233{
234 return memcmp(ba1, ba2, sizeof(bdaddr_t));
235}
236static inline void bacpy(bdaddr_t *dst, const bdaddr_t *src)
237{
238 memcpy(dst, src, sizeof(bdaddr_t));
239}
240
241void baswap(bdaddr_t *dst, const bdaddr_t *src);
242
243
244
245#define bt_sk(__sk) ((struct bt_sock *) __sk)
246
247struct bt_sock {
248 struct sock sk;
249 struct list_head accept_q;
250 struct sock *parent;
251 unsigned long flags;
252 void (*skb_msg_name)(struct sk_buff *, void *, int *);
253};
254
255enum {
256 BT_SK_DEFER_SETUP,
257 BT_SK_SUSPEND,
258};
259
260struct bt_sock_list {
261 struct hlist_head head;
262 rwlock_t lock;
263#ifdef CONFIG_PROC_FS
264 int (* custom_seq_show)(struct seq_file *, void *);
265#endif
266};
267
268int bt_sock_register(int proto, const struct net_proto_family *ops);
269void bt_sock_unregister(int proto);
270void bt_sock_link(struct bt_sock_list *l, struct sock *s);
271void bt_sock_unlink(struct bt_sock_list *l, struct sock *s);
272int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
273 int flags);
274int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
275 size_t len, int flags);
276__poll_t bt_sock_poll(struct file *file, struct socket *sock, poll_table *wait);
277int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
278int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo);
279int bt_sock_wait_ready(struct sock *sk, unsigned long flags);
280
281void bt_accept_enqueue(struct sock *parent, struct sock *sk, bool bh);
282void bt_accept_unlink(struct sock *sk);
283struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock);
284
285
286struct l2cap_ctrl {
287 u8 sframe:1,
288 poll:1,
289 final:1,
290 fcs:1,
291 sar:2,
292 super:2;
293
294 u16 reqseq;
295 u16 txseq;
296 u8 retries;
297 __le16 psm;
298 bdaddr_t bdaddr;
299 struct l2cap_chan *chan;
300};
301
302struct hci_dev;
303
304typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status, u16 opcode);
305typedef void (*hci_req_complete_skb_t)(struct hci_dev *hdev, u8 status,
306 u16 opcode, struct sk_buff *skb);
307
308#define HCI_REQ_START BIT(0)
309#define HCI_REQ_SKB BIT(1)
310
311struct hci_ctrl {
312 u16 opcode;
313 u8 req_flags;
314 u8 req_event;
315 union {
316 hci_req_complete_t req_complete;
317 hci_req_complete_skb_t req_complete_skb;
318 };
319};
320
321struct bt_skb_cb {
322 u8 pkt_type;
323 u8 force_active;
324 u16 expect;
325 u8 incoming:1;
326 union {
327 struct l2cap_ctrl l2cap;
328 struct hci_ctrl hci;
329 };
330};
331#define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
332
333#define hci_skb_pkt_type(skb) bt_cb((skb))->pkt_type
334#define hci_skb_expect(skb) bt_cb((skb))->expect
335#define hci_skb_opcode(skb) bt_cb((skb))->hci.opcode
336
337static inline struct sk_buff *bt_skb_alloc(unsigned int len, gfp_t how)
338{
339 struct sk_buff *skb;
340
341 skb = alloc_skb(len + BT_SKB_RESERVE, how);
342 if (skb)
343 skb_reserve(skb, BT_SKB_RESERVE);
344 return skb;
345}
346
347static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk,
348 unsigned long len, int nb, int *err)
349{
350 struct sk_buff *skb;
351
352 skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err);
353 if (skb)
354 skb_reserve(skb, BT_SKB_RESERVE);
355
356 if (!skb && *err)
357 return NULL;
358
359 *err = sock_error(sk);
360 if (*err)
361 goto out;
362
363 if (sk->sk_shutdown) {
364 *err = -ECONNRESET;
365 goto out;
366 }
367
368 return skb;
369
370out:
371 kfree_skb(skb);
372 return NULL;
373}
374
375int bt_to_errno(u16 code);
376
377void hci_sock_set_flag(struct sock *sk, int nr);
378void hci_sock_clear_flag(struct sock *sk, int nr);
379int hci_sock_test_flag(struct sock *sk, int nr);
380unsigned short hci_sock_get_channel(struct sock *sk);
381u32 hci_sock_get_cookie(struct sock *sk);
382
383int hci_sock_init(void);
384void hci_sock_cleanup(void);
385
386int bt_sysfs_init(void);
387void bt_sysfs_cleanup(void);
388
389int bt_procfs_init(struct net *net, const char *name,
390 struct bt_sock_list *sk_list,
391 int (*seq_show)(struct seq_file *, void *));
392void bt_procfs_cleanup(struct net *net, const char *name);
393
394extern struct dentry *bt_debugfs;
395
396int l2cap_init(void);
397void l2cap_exit(void);
398
399#if IS_ENABLED(CONFIG_BT_BREDR)
400int sco_init(void);
401void sco_exit(void);
402#else
403static inline int sco_init(void)
404{
405 return 0;
406}
407
408static inline void sco_exit(void)
409{
410}
411#endif
412
413int mgmt_init(void);
414void mgmt_exit(void);
415
416void bt_sock_reclassify_lock(struct sock *sk, int proto);
417
418#endif
419