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