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 <asm/types.h>
29#include <asm/byteorder.h>
30#include <linux/list.h>
31#include <linux/poll.h>
32#include <net/sock.h>
33
34#ifndef AF_BLUETOOTH
35#define AF_BLUETOOTH 31
36#define PF_BLUETOOTH AF_BLUETOOTH
37#endif
38
39
40#define BLUETOOTH_VER_1_1 1
41#define BLUETOOTH_VER_1_2 2
42#define BLUETOOTH_VER_2_0 3
43
44
45#define BT_SKB_RESERVE 8
46
47#define BTPROTO_L2CAP 0
48#define BTPROTO_HCI 1
49#define BTPROTO_SCO 2
50#define BTPROTO_RFCOMM 3
51#define BTPROTO_BNEP 4
52#define BTPROTO_CMTP 5
53#define BTPROTO_HIDP 6
54#define BTPROTO_AVDTP 7
55
56#define SOL_HCI 0
57#define SOL_L2CAP 6
58#define SOL_SCO 17
59#define SOL_RFCOMM 18
60
61#define BT_SECURITY 4
62struct bt_security {
63 __u8 level;
64 __u8 key_size;
65};
66#define BT_SECURITY_SDP 0
67#define BT_SECURITY_LOW 1
68#define BT_SECURITY_MEDIUM 2
69#define BT_SECURITY_HIGH 3
70
71#define BT_DEFER_SETUP 7
72
73#define BT_FLUSHABLE 8
74
75#define BT_FLUSHABLE_OFF 0
76#define BT_FLUSHABLE_ON 1
77
78#define BT_POWER 9
79struct bt_power {
80 __u8 force_active;
81};
82#define BT_POWER_FORCE_ACTIVE_OFF 0
83#define BT_POWER_FORCE_ACTIVE_ON 1
84
85#define BT_CHANNEL_POLICY 10
86
87
88
89
90
91
92#define BT_CHANNEL_POLICY_BREDR_ONLY 0
93
94
95
96
97
98
99#define BT_CHANNEL_POLICY_BREDR_PREFERRED 1
100
101
102
103
104
105
106
107
108
109
110#define BT_CHANNEL_POLICY_AMP_PREFERRED 2
111
112__printf(2, 3)
113int bt_printk(const char *level, const char *fmt, ...);
114
115#define BT_INFO(fmt, arg...) bt_printk(KERN_INFO, pr_fmt(fmt), ##arg)
116#define BT_ERR(fmt, arg...) bt_printk(KERN_ERR, pr_fmt(fmt), ##arg)
117#define BT_DBG(fmt, arg...) pr_debug(fmt "\n", ##arg)
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
133typedef struct {
134 __u8 b[6];
135} __packed bdaddr_t;
136
137#define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})
138#define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff}})
139
140
141static inline int bacmp(bdaddr_t *ba1, bdaddr_t *ba2)
142{
143 return memcmp(ba1, ba2, sizeof(bdaddr_t));
144}
145static inline void bacpy(bdaddr_t *dst, bdaddr_t *src)
146{
147 memcpy(dst, src, sizeof(bdaddr_t));
148}
149
150void baswap(bdaddr_t *dst, bdaddr_t *src);
151char *batostr(bdaddr_t *ba);
152bdaddr_t *strtoba(char *str);
153
154
155
156#define bt_sk(__sk) ((struct bt_sock *) __sk)
157
158struct bt_sock {
159 struct sock sk;
160 bdaddr_t src;
161 bdaddr_t dst;
162 struct list_head accept_q;
163 struct sock *parent;
164 u32 defer_setup;
165};
166
167struct bt_sock_list {
168 struct hlist_head head;
169 rwlock_t lock;
170};
171
172int bt_sock_register(int proto, const struct net_proto_family *ops);
173int bt_sock_unregister(int proto);
174void bt_sock_link(struct bt_sock_list *l, struct sock *s);
175void bt_sock_unlink(struct bt_sock_list *l, struct sock *s);
176int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
177 struct msghdr *msg, size_t len, int flags);
178int bt_sock_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
179 struct msghdr *msg, size_t len, int flags);
180uint bt_sock_poll(struct file * file, struct socket *sock, poll_table *wait);
181int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
182int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo);
183
184void bt_accept_enqueue(struct sock *parent, struct sock *sk);
185void bt_accept_unlink(struct sock *sk);
186struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock);
187
188
189struct bt_skb_cb {
190 __u8 pkt_type;
191 __u8 incoming;
192 __u16 expect;
193 __u16 tx_seq;
194 __u8 retries;
195 __u8 sar;
196 unsigned short channel;
197 __u8 force_active;
198};
199#define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
200
201static inline struct sk_buff *bt_skb_alloc(unsigned int len, gfp_t how)
202{
203 struct sk_buff *skb;
204
205 if ((skb = alloc_skb(len + BT_SKB_RESERVE, how))) {
206 skb_reserve(skb, BT_SKB_RESERVE);
207 bt_cb(skb)->incoming = 0;
208 }
209 return skb;
210}
211
212static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk,
213 unsigned long len, int nb, int *err)
214{
215 struct sk_buff *skb;
216
217 release_sock(sk);
218 if ((skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err))) {
219 skb_reserve(skb, BT_SKB_RESERVE);
220 bt_cb(skb)->incoming = 0;
221 }
222 lock_sock(sk);
223
224 if (!skb && *err)
225 return NULL;
226
227 *err = sock_error(sk);
228 if (*err)
229 goto out;
230
231 if (sk->sk_shutdown) {
232 *err = -ECONNRESET;
233 goto out;
234 }
235
236 return skb;
237
238out:
239 kfree_skb(skb);
240 return NULL;
241}
242
243int bt_to_errno(__u16 code);
244
245extern int hci_sock_init(void);
246extern void hci_sock_cleanup(void);
247
248extern int bt_sysfs_init(void);
249extern void bt_sysfs_cleanup(void);
250
251extern struct dentry *bt_debugfs;
252
253int l2cap_init(void);
254void l2cap_exit(void);
255
256int sco_init(void);
257void sco_exit(void);
258
259void bt_sock_reclassify_lock(struct sock *sk, int proto);
260
261#endif
262