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};
60#define BT_SECURITY_SDP 0
61#define BT_SECURITY_LOW 1
62#define BT_SECURITY_MEDIUM 2
63#define BT_SECURITY_HIGH 3
64
65#define BT_DEFER_SETUP 7
66
67#define BT_INFO(fmt, arg...) printk(KERN_INFO "Bluetooth: " fmt "\n" , ## arg)
68#define BT_ERR(fmt, arg...) printk(KERN_ERR "%s: " fmt "\n" , __func__ , ## arg)
69#define BT_DBG(fmt, arg...) pr_debug("%s: " fmt "\n" , __func__ , ## arg)
70
71
72enum {
73 BT_CONNECTED = 1,
74 BT_OPEN,
75 BT_BOUND,
76 BT_LISTEN,
77 BT_CONNECT,
78 BT_CONNECT2,
79 BT_CONFIG,
80 BT_DISCONN,
81 BT_CLOSED
82};
83
84
85typedef struct {
86 __u8 b[6];
87} __attribute__((packed)) bdaddr_t;
88
89#define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})
90#define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff}})
91
92
93static inline int bacmp(bdaddr_t *ba1, bdaddr_t *ba2)
94{
95 return memcmp(ba1, ba2, sizeof(bdaddr_t));
96}
97static inline void bacpy(bdaddr_t *dst, bdaddr_t *src)
98{
99 memcpy(dst, src, sizeof(bdaddr_t));
100}
101
102void baswap(bdaddr_t *dst, bdaddr_t *src);
103char *batostr(bdaddr_t *ba);
104bdaddr_t *strtoba(char *str);
105
106
107
108#define bt_sk(__sk) ((struct bt_sock *) __sk)
109
110struct bt_sock {
111 struct sock sk;
112 bdaddr_t src;
113 bdaddr_t dst;
114 struct list_head accept_q;
115 struct sock *parent;
116 u32 defer_setup;
117};
118
119struct bt_sock_list {
120 struct hlist_head head;
121 rwlock_t lock;
122};
123
124int bt_sock_register(int proto, struct net_proto_family *ops);
125int bt_sock_unregister(int proto);
126void bt_sock_link(struct bt_sock_list *l, struct sock *s);
127void bt_sock_unlink(struct bt_sock_list *l, struct sock *s);
128int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags);
129uint bt_sock_poll(struct file * file, struct socket *sock, poll_table *wait);
130int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
131int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo);
132
133void bt_accept_enqueue(struct sock *parent, struct sock *sk);
134void bt_accept_unlink(struct sock *sk);
135struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock);
136
137
138struct bt_skb_cb {
139 __u8 pkt_type;
140 __u8 incoming;
141};
142#define bt_cb(skb) ((struct bt_skb_cb *)(skb->cb))
143
144static inline struct sk_buff *bt_skb_alloc(unsigned int len, gfp_t how)
145{
146 struct sk_buff *skb;
147
148 if ((skb = alloc_skb(len + BT_SKB_RESERVE, how))) {
149 skb_reserve(skb, BT_SKB_RESERVE);
150 bt_cb(skb)->incoming = 0;
151 }
152 return skb;
153}
154
155static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk, unsigned long len,
156 int nb, int *err)
157{
158 struct sk_buff *skb;
159
160 if ((skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err))) {
161 skb_reserve(skb, BT_SKB_RESERVE);
162 bt_cb(skb)->incoming = 0;
163 }
164
165 return skb;
166}
167
168int bt_err(__u16 code);
169
170extern int hci_sock_init(void);
171extern void hci_sock_cleanup(void);
172
173extern int bt_sysfs_init(void);
174extern void bt_sysfs_cleanup(void);
175
176extern struct class *bt_class;
177
178#endif
179