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