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