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__printf(1, 2)
111int bt_info(const char *fmt, ...);
112__printf(1, 2)
113int bt_err(const char *fmt, ...);
114
115#define BT_INFO(fmt, ...) bt_info(fmt "\n", ##__VA_ARGS__)
116#define BT_ERR(fmt, ...) bt_err(fmt "\n", ##__VA_ARGS__)
117#define BT_DBG(fmt, ...) pr_debug(fmt "\n", ##__VA_ARGS__)
118
119
120enum {
121 BT_CONNECTED = 1,
122 BT_OPEN,
123 BT_BOUND,
124 BT_LISTEN,
125 BT_CONNECT,
126 BT_CONNECT2,
127 BT_CONFIG,
128 BT_DISCONN,
129 BT_CLOSED
130};
131
132
133static inline const char *state_to_string(int state)
134{
135 switch (state) {
136 case BT_CONNECTED:
137 return "BT_CONNECTED";
138 case BT_OPEN:
139 return "BT_OPEN";
140 case BT_BOUND:
141 return "BT_BOUND";
142 case BT_LISTEN:
143 return "BT_LISTEN";
144 case BT_CONNECT:
145 return "BT_CONNECT";
146 case BT_CONNECT2:
147 return "BT_CONNECT2";
148 case BT_CONFIG:
149 return "BT_CONFIG";
150 case BT_DISCONN:
151 return "BT_DISCONN";
152 case BT_CLOSED:
153 return "BT_CLOSED";
154 }
155
156 return "invalid state";
157}
158
159
160typedef struct {
161 __u8 b[6];
162} __packed bdaddr_t;
163
164
165#define BDADDR_BREDR 0x00
166#define BDADDR_LE_PUBLIC 0x01
167#define BDADDR_LE_RANDOM 0x02
168
169#define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0} })
170#define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff} })
171
172
173static inline int bacmp(bdaddr_t *ba1, bdaddr_t *ba2)
174{
175 return memcmp(ba1, ba2, sizeof(bdaddr_t));
176}
177static inline void bacpy(bdaddr_t *dst, bdaddr_t *src)
178{
179 memcpy(dst, src, sizeof(bdaddr_t));
180}
181
182void baswap(bdaddr_t *dst, bdaddr_t *src);
183
184
185
186#define bt_sk(__sk) ((struct bt_sock *) __sk)
187
188struct bt_sock {
189 struct sock sk;
190 bdaddr_t src;
191 bdaddr_t dst;
192 struct list_head accept_q;
193 struct sock *parent;
194 unsigned long flags;
195};
196
197enum {
198 BT_SK_DEFER_SETUP,
199 BT_SK_SUSPEND,
200};
201
202struct bt_sock_list {
203 struct hlist_head head;
204 rwlock_t lock;
205#ifdef CONFIG_PROC_FS
206 struct file_operations fops;
207 int (* custom_seq_show)(struct seq_file *, void *);
208#endif
209};
210
211int bt_sock_register(int proto, const struct net_proto_family *ops);
212int bt_sock_unregister(int proto);
213void bt_sock_link(struct bt_sock_list *l, struct sock *s);
214void bt_sock_unlink(struct bt_sock_list *l, struct sock *s);
215int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
216 struct msghdr *msg, size_t len, int flags);
217int bt_sock_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
218 struct msghdr *msg, size_t len, int flags);
219uint bt_sock_poll(struct file *file, struct socket *sock, poll_table *wait);
220int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
221int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo);
222
223void bt_accept_enqueue(struct sock *parent, struct sock *sk);
224void bt_accept_unlink(struct sock *sk);
225struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock);
226
227
228struct l2cap_ctrl {
229 unsigned int sframe:1,
230 poll:1,
231 final:1,
232 fcs:1,
233 sar:2,
234 super:2;
235 __u16 reqseq;
236 __u16 txseq;
237 __u8 retries;
238};
239
240struct bt_skb_cb {
241 __u8 pkt_type;
242 __u8 incoming;
243 __u16 expect;
244 __u8 force_active;
245 struct l2cap_ctrl control;
246};
247#define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
248
249static inline struct sk_buff *bt_skb_alloc(unsigned int len, gfp_t how)
250{
251 struct sk_buff *skb;
252
253 skb = alloc_skb(len + BT_SKB_RESERVE, how);
254 if (skb) {
255 skb_reserve(skb, BT_SKB_RESERVE);
256 bt_cb(skb)->incoming = 0;
257 }
258 return skb;
259}
260
261static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk,
262 unsigned long len, int nb, int *err)
263{
264 struct sk_buff *skb;
265
266 skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err);
267 if (skb) {
268 skb_reserve(skb, BT_SKB_RESERVE);
269 bt_cb(skb)->incoming = 0;
270 }
271
272 if (!skb && *err)
273 return NULL;
274
275 *err = sock_error(sk);
276 if (*err)
277 goto out;
278
279 if (sk->sk_shutdown) {
280 *err = -ECONNRESET;
281 goto out;
282 }
283
284 return skb;
285
286out:
287 kfree_skb(skb);
288 return NULL;
289}
290
291int bt_to_errno(__u16 code);
292
293extern int hci_sock_init(void);
294extern void hci_sock_cleanup(void);
295
296extern int bt_sysfs_init(void);
297extern void bt_sysfs_cleanup(void);
298
299extern int bt_procfs_init(struct module* module, struct net *net, const char *name,
300 struct bt_sock_list* sk_list,
301 int (* seq_show)(struct seq_file *, void *));
302extern void bt_procfs_cleanup(struct net *net, const char *name);
303
304extern struct dentry *bt_debugfs;
305
306int l2cap_init(void);
307void l2cap_exit(void);
308
309int sco_init(void);
310void sco_exit(void);
311
312void bt_sock_reclassify_lock(struct sock *sk, int proto);
313
314#endif
315