aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/bluetooth
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
commit1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch)
tree0bba044c4ce775e45a88a51686b5d9f90697ea9d /include/net/bluetooth
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
Diffstat (limited to 'include/net/bluetooth')
-rw-r--r--include/net/bluetooth/bluetooth.h181
-rw-r--r--include/net/bluetooth/hci.h755
-rw-r--r--include/net/bluetooth/hci_core.h626
-rw-r--r--include/net/bluetooth/l2cap.h238
-rw-r--r--include/net/bluetooth/rfcomm.h353
-rw-r--r--include/net/bluetooth/sco.h79
6 files changed, 2232 insertions, 0 deletions
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
new file mode 100644
index 000000000000..42a84c53678b
--- /dev/null
+++ b/include/net/bluetooth/bluetooth.h
@@ -0,0 +1,181 @@
1/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22 SOFTWARE IS DISCLAIMED.
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/* Reserv for core and drivers use */
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#ifdef HCI_DATA_DUMP
61#define BT_DMP(buf, len) bt_dump(__FUNCTION__, buf, len)
62#else
63#define BT_DMP(D...)
64#endif
65
66extern struct proc_dir_entry *proc_bt;
67
68/* Connection and socket states */
69enum {
70 BT_CONNECTED = 1, /* Equal to TCP_ESTABLISHED to make net code happy */
71 BT_OPEN,
72 BT_BOUND,
73 BT_LISTEN,
74 BT_CONNECT,
75 BT_CONNECT2,
76 BT_CONFIG,
77 BT_DISCONN,
78 BT_CLOSED
79};
80
81/* Endianness conversions */
82#define htobs(a) __cpu_to_le16(a)
83#define htobl(a) __cpu_to_le32(a)
84#define btohs(a) __le16_to_cpu(a)
85#define btohl(a) __le32_to_cpu(a)
86
87/* BD Address */
88typedef struct {
89 __u8 b[6];
90} __attribute__((packed)) bdaddr_t;
91
92#define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})
93#define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff}})
94
95/* Copy, swap, convert BD Address */
96static inline int bacmp(bdaddr_t *ba1, bdaddr_t *ba2)
97{
98 return memcmp(ba1, ba2, sizeof(bdaddr_t));
99}
100static inline void bacpy(bdaddr_t *dst, bdaddr_t *src)
101{
102 memcpy(dst, src, sizeof(bdaddr_t));
103}
104
105void baswap(bdaddr_t *dst, bdaddr_t *src);
106char *batostr(bdaddr_t *ba);
107bdaddr_t *strtoba(char *str);
108
109/* Common socket structures and functions */
110
111#define bt_sk(__sk) ((struct bt_sock *) __sk)
112
113struct bt_sock {
114 struct sock sk;
115 bdaddr_t src;
116 bdaddr_t dst;
117 struct list_head accept_q;
118 struct sock *parent;
119};
120
121struct bt_sock_list {
122 struct hlist_head head;
123 rwlock_t lock;
124};
125
126int bt_sock_register(int proto, struct net_proto_family *ops);
127int bt_sock_unregister(int proto);
128void bt_sock_link(struct bt_sock_list *l, struct sock *s);
129void bt_sock_unlink(struct bt_sock_list *l, struct sock *s);
130int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags);
131uint bt_sock_poll(struct file * file, struct socket *sock, poll_table *wait);
132int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo);
133
134void bt_accept_enqueue(struct sock *parent, struct sock *sk);
135void bt_accept_unlink(struct sock *sk);
136struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock);
137
138/* Skb helpers */
139struct bt_skb_cb {
140 int 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, int 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
168static inline int skb_frags_no(struct sk_buff *skb)
169{
170 register struct sk_buff *frag = skb_shinfo(skb)->frag_list;
171 register int n = 1;
172
173 for (; frag; frag=frag->next, n++);
174 return n;
175}
176
177void bt_dump(char *pref, __u8 *buf, int count);
178
179int bt_err(__u16 code);
180
181#endif /* __BLUETOOTH_H */
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
new file mode 100644
index 000000000000..6f0706f4af68
--- /dev/null
+++ b/include/net/bluetooth/hci.h
@@ -0,0 +1,755 @@
1/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22 SOFTWARE IS DISCLAIMED.
23*/
24
25#ifndef __HCI_H
26#define __HCI_H
27
28#define HCI_MAX_ACL_SIZE 1024
29#define HCI_MAX_SCO_SIZE 255
30#define HCI_MAX_EVENT_SIZE 260
31#define HCI_MAX_FRAME_SIZE (HCI_MAX_ACL_SIZE + 4)
32
33/* HCI dev events */
34#define HCI_DEV_REG 1
35#define HCI_DEV_UNREG 2
36#define HCI_DEV_UP 3
37#define HCI_DEV_DOWN 4
38#define HCI_DEV_SUSPEND 5
39#define HCI_DEV_RESUME 6
40
41/* HCI notify events */
42#define HCI_NOTIFY_CONN_ADD 1
43#define HCI_NOTIFY_CONN_DEL 2
44#define HCI_NOTIFY_VOICE_SETTING 3
45
46/* HCI device types */
47#define HCI_VHCI 0
48#define HCI_USB 1
49#define HCI_PCCARD 2
50#define HCI_UART 3
51#define HCI_RS232 4
52#define HCI_PCI 5
53
54/* HCI device quirks */
55enum {
56 HCI_QUIRK_RESET_ON_INIT,
57 HCI_QUIRK_RAW_DEVICE
58};
59
60/* HCI device flags */
61enum {
62 HCI_UP,
63 HCI_INIT,
64 HCI_RUNNING,
65
66 HCI_PSCAN,
67 HCI_ISCAN,
68 HCI_AUTH,
69 HCI_ENCRYPT,
70 HCI_INQUIRY,
71
72 HCI_RAW,
73
74 HCI_SECMGR
75};
76
77/* HCI ioctl defines */
78#define HCIDEVUP _IOW('H', 201, int)
79#define HCIDEVDOWN _IOW('H', 202, int)
80#define HCIDEVRESET _IOW('H', 203, int)
81#define HCIDEVRESTAT _IOW('H', 204, int)
82
83#define HCIGETDEVLIST _IOR('H', 210, int)
84#define HCIGETDEVINFO _IOR('H', 211, int)
85#define HCIGETCONNLIST _IOR('H', 212, int)
86#define HCIGETCONNINFO _IOR('H', 213, int)
87
88#define HCISETRAW _IOW('H', 220, int)
89#define HCISETSCAN _IOW('H', 221, int)
90#define HCISETAUTH _IOW('H', 222, int)
91#define HCISETENCRYPT _IOW('H', 223, int)
92#define HCISETPTYPE _IOW('H', 224, int)
93#define HCISETLINKPOL _IOW('H', 225, int)
94#define HCISETLINKMODE _IOW('H', 226, int)
95#define HCISETACLMTU _IOW('H', 227, int)
96#define HCISETSCOMTU _IOW('H', 228, int)
97
98#define HCISETSECMGR _IOW('H', 230, int)
99
100#define HCIINQUIRY _IOR('H', 240, int)
101
102/* HCI timeouts */
103#define HCI_CONN_TIMEOUT (HZ * 40)
104#define HCI_DISCONN_TIMEOUT (HZ * 2)
105#define HCI_CONN_IDLE_TIMEOUT (HZ * 60)
106
107/* HCI Packet types */
108#define HCI_COMMAND_PKT 0x01
109#define HCI_ACLDATA_PKT 0x02
110#define HCI_SCODATA_PKT 0x03
111#define HCI_EVENT_PKT 0x04
112#define HCI_VENDOR_PKT 0xff
113
114/* HCI Packet types */
115#define HCI_DM1 0x0008
116#define HCI_DM3 0x0400
117#define HCI_DM5 0x4000
118#define HCI_DH1 0x0010
119#define HCI_DH3 0x0800
120#define HCI_DH5 0x8000
121
122#define HCI_HV1 0x0020
123#define HCI_HV2 0x0040
124#define HCI_HV3 0x0080
125
126#define SCO_PTYPE_MASK (HCI_HV1 | HCI_HV2 | HCI_HV3)
127#define ACL_PTYPE_MASK (~SCO_PTYPE_MASK)
128
129/* ACL flags */
130#define ACL_CONT 0x01
131#define ACL_START 0x02
132#define ACL_ACTIVE_BCAST 0x04
133#define ACL_PICO_BCAST 0x08
134
135/* Baseband links */
136#define SCO_LINK 0x00
137#define ACL_LINK 0x01
138
139/* LMP features */
140#define LMP_3SLOT 0x01
141#define LMP_5SLOT 0x02
142#define LMP_ENCRYPT 0x04
143#define LMP_SOFFSET 0x08
144#define LMP_TACCURACY 0x10
145#define LMP_RSWITCH 0x20
146#define LMP_HOLD 0x40
147#define LMP_SNIF 0x80
148
149#define LMP_PARK 0x01
150#define LMP_RSSI 0x02
151#define LMP_QUALITY 0x04
152#define LMP_SCO 0x08
153#define LMP_HV2 0x10
154#define LMP_HV3 0x20
155#define LMP_ULAW 0x40
156#define LMP_ALAW 0x80
157
158#define LMP_CVSD 0x01
159#define LMP_PSCHEME 0x02
160#define LMP_PCONTROL 0x04
161
162/* Link policies */
163#define HCI_LP_RSWITCH 0x0001
164#define HCI_LP_HOLD 0x0002
165#define HCI_LP_SNIFF 0x0004
166#define HCI_LP_PARK 0x0008
167
168/* Link mode */
169#define HCI_LM_ACCEPT 0x8000
170#define HCI_LM_MASTER 0x0001
171#define HCI_LM_AUTH 0x0002
172#define HCI_LM_ENCRYPT 0x0004
173#define HCI_LM_TRUSTED 0x0008
174#define HCI_LM_RELIABLE 0x0010
175#define HCI_LM_SECURE 0x0020
176
177/* ----- HCI Commands ---- */
178/* OGF & OCF values */
179
180/* Informational Parameters */
181#define OGF_INFO_PARAM 0x04
182
183#define OCF_READ_LOCAL_VERSION 0x0001
184struct hci_rp_read_loc_version {
185 __u8 status;
186 __u8 hci_ver;
187 __u16 hci_rev;
188 __u8 lmp_ver;
189 __u16 manufacturer;
190 __u16 lmp_subver;
191} __attribute__ ((packed));
192
193#define OCF_READ_LOCAL_FEATURES 0x0003
194struct hci_rp_read_loc_features {
195 __u8 status;
196 __u8 features[8];
197} __attribute__ ((packed));
198
199#define OCF_READ_BUFFER_SIZE 0x0005
200struct hci_rp_read_buffer_size {
201 __u8 status;
202 __u16 acl_mtu;
203 __u8 sco_mtu;
204 __u16 acl_max_pkt;
205 __u16 sco_max_pkt;
206} __attribute__ ((packed));
207
208#define OCF_READ_BD_ADDR 0x0009
209struct hci_rp_read_bd_addr {
210 __u8 status;
211 bdaddr_t bdaddr;
212} __attribute__ ((packed));
213
214/* Host Controller and Baseband */
215#define OGF_HOST_CTL 0x03
216#define OCF_RESET 0x0003
217#define OCF_READ_AUTH_ENABLE 0x001F
218#define OCF_WRITE_AUTH_ENABLE 0x0020
219 #define AUTH_DISABLED 0x00
220 #define AUTH_ENABLED 0x01
221
222#define OCF_READ_ENCRYPT_MODE 0x0021
223#define OCF_WRITE_ENCRYPT_MODE 0x0022
224 #define ENCRYPT_DISABLED 0x00
225 #define ENCRYPT_P2P 0x01
226 #define ENCRYPT_BOTH 0x02
227
228#define OCF_WRITE_CA_TIMEOUT 0x0016
229#define OCF_WRITE_PG_TIMEOUT 0x0018
230
231#define OCF_WRITE_SCAN_ENABLE 0x001A
232 #define SCAN_DISABLED 0x00
233 #define SCAN_INQUIRY 0x01
234 #define SCAN_PAGE 0x02
235
236#define OCF_SET_EVENT_FLT 0x0005
237struct hci_cp_set_event_flt {
238 __u8 flt_type;
239 __u8 cond_type;
240 __u8 condition[0];
241} __attribute__ ((packed));
242
243/* Filter types */
244#define HCI_FLT_CLEAR_ALL 0x00
245#define HCI_FLT_INQ_RESULT 0x01
246#define HCI_FLT_CONN_SETUP 0x02
247
248/* CONN_SETUP Condition types */
249#define HCI_CONN_SETUP_ALLOW_ALL 0x00
250#define HCI_CONN_SETUP_ALLOW_CLASS 0x01
251#define HCI_CONN_SETUP_ALLOW_BDADDR 0x02
252
253/* CONN_SETUP Conditions */
254#define HCI_CONN_SETUP_AUTO_OFF 0x01
255#define HCI_CONN_SETUP_AUTO_ON 0x02
256
257#define OCF_READ_CLASS_OF_DEV 0x0023
258struct hci_rp_read_dev_class {
259 __u8 status;
260 __u8 dev_class[3];
261} __attribute__ ((packed));
262
263#define OCF_WRITE_CLASS_OF_DEV 0x0024
264struct hci_cp_write_dev_class {
265 __u8 dev_class[3];
266} __attribute__ ((packed));
267
268#define OCF_READ_VOICE_SETTING 0x0025
269struct hci_rp_read_voice_setting {
270 __u8 status;
271 __u16 voice_setting;
272} __attribute__ ((packed));
273
274#define OCF_WRITE_VOICE_SETTING 0x0026
275struct hci_cp_write_voice_setting {
276 __u16 voice_setting;
277} __attribute__ ((packed));
278
279#define OCF_HOST_BUFFER_SIZE 0x0033
280struct hci_cp_host_buffer_size {
281 __u16 acl_mtu;
282 __u8 sco_mtu;
283 __u16 acl_max_pkt;
284 __u16 sco_max_pkt;
285} __attribute__ ((packed));
286
287/* Link Control */
288#define OGF_LINK_CTL 0x01
289#define OCF_CREATE_CONN 0x0005
290struct hci_cp_create_conn {
291 bdaddr_t bdaddr;
292 __u16 pkt_type;
293 __u8 pscan_rep_mode;
294 __u8 pscan_mode;
295 __u16 clock_offset;
296 __u8 role_switch;
297} __attribute__ ((packed));
298
299#define OCF_ACCEPT_CONN_REQ 0x0009
300struct hci_cp_accept_conn_req {
301 bdaddr_t bdaddr;
302 __u8 role;
303} __attribute__ ((packed));
304
305#define OCF_REJECT_CONN_REQ 0x000a
306struct hci_cp_reject_conn_req {
307 bdaddr_t bdaddr;
308 __u8 reason;
309} __attribute__ ((packed));
310
311#define OCF_DISCONNECT 0x0006
312struct hci_cp_disconnect {
313 __u16 handle;
314 __u8 reason;
315} __attribute__ ((packed));
316
317#define OCF_ADD_SCO 0x0007
318struct hci_cp_add_sco {
319 __u16 handle;
320 __u16 pkt_type;
321} __attribute__ ((packed));
322
323#define OCF_INQUIRY 0x0001
324struct hci_cp_inquiry {
325 __u8 lap[3];
326 __u8 length;
327 __u8 num_rsp;
328} __attribute__ ((packed));
329
330#define OCF_INQUIRY_CANCEL 0x0002
331
332#define OCF_LINK_KEY_REPLY 0x000B
333struct hci_cp_link_key_reply {
334 bdaddr_t bdaddr;
335 __u8 link_key[16];
336} __attribute__ ((packed));
337
338#define OCF_LINK_KEY_NEG_REPLY 0x000C
339struct hci_cp_link_key_neg_reply {
340 bdaddr_t bdaddr;
341} __attribute__ ((packed));
342
343#define OCF_PIN_CODE_REPLY 0x000D
344struct hci_cp_pin_code_reply {
345 bdaddr_t bdaddr;
346 __u8 pin_len;
347 __u8 pin_code[16];
348} __attribute__ ((packed));
349
350#define OCF_PIN_CODE_NEG_REPLY 0x000E
351struct hci_cp_pin_code_neg_reply {
352 bdaddr_t bdaddr;
353} __attribute__ ((packed));
354
355#define OCF_CHANGE_CONN_PTYPE 0x000F
356struct hci_cp_change_conn_ptype {
357 __u16 handle;
358 __u16 pkt_type;
359} __attribute__ ((packed));
360
361#define OCF_AUTH_REQUESTED 0x0011
362struct hci_cp_auth_requested {
363 __u16 handle;
364} __attribute__ ((packed));
365
366#define OCF_SET_CONN_ENCRYPT 0x0013
367struct hci_cp_set_conn_encrypt {
368 __u16 handle;
369 __u8 encrypt;
370} __attribute__ ((packed));
371
372#define OCF_CHANGE_CONN_LINK_KEY 0x0015
373struct hci_cp_change_conn_link_key {
374 __u16 handle;
375} __attribute__ ((packed));
376
377#define OCF_READ_REMOTE_FEATURES 0x001B
378struct hci_cp_read_rmt_features {
379 __u16 handle;
380} __attribute__ ((packed));
381
382#define OCF_READ_REMOTE_VERSION 0x001D
383struct hci_cp_read_rmt_version {
384 __u16 handle;
385} __attribute__ ((packed));
386
387/* Link Policy */
388#define OGF_LINK_POLICY 0x02
389#define OCF_ROLE_DISCOVERY 0x0009
390struct hci_cp_role_discovery {
391 __u16 handle;
392} __attribute__ ((packed));
393struct hci_rp_role_discovery {
394 __u8 status;
395 __u16 handle;
396 __u8 role;
397} __attribute__ ((packed));
398
399#define OCF_READ_LINK_POLICY 0x000C
400struct hci_cp_read_link_policy {
401 __u16 handle;
402} __attribute__ ((packed));
403struct hci_rp_read_link_policy {
404 __u8 status;
405 __u16 handle;
406 __u16 policy;
407} __attribute__ ((packed));
408
409#define OCF_SWITCH_ROLE 0x000B
410struct hci_cp_switch_role {
411 bdaddr_t bdaddr;
412 __u8 role;
413} __attribute__ ((packed));
414
415#define OCF_WRITE_LINK_POLICY 0x000D
416struct hci_cp_write_link_policy {
417 __u16 handle;
418 __u16 policy;
419} __attribute__ ((packed));
420struct hci_rp_write_link_policy {
421 __u8 status;
422 __u16 handle;
423} __attribute__ ((packed));
424
425/* Status params */
426#define OGF_STATUS_PARAM 0x05
427
428/* Testing commands */
429#define OGF_TESTING_CMD 0x3E
430
431/* Vendor specific commands */
432#define OGF_VENDOR_CMD 0x3F
433
434/* ---- HCI Events ---- */
435#define HCI_EV_INQUIRY_COMPLETE 0x01
436
437#define HCI_EV_INQUIRY_RESULT 0x02
438struct inquiry_info {
439 bdaddr_t bdaddr;
440 __u8 pscan_rep_mode;
441 __u8 pscan_period_mode;
442 __u8 pscan_mode;
443 __u8 dev_class[3];
444 __u16 clock_offset;
445} __attribute__ ((packed));
446
447#define HCI_EV_INQUIRY_RESULT_WITH_RSSI 0x22
448struct inquiry_info_with_rssi {
449 bdaddr_t bdaddr;
450 __u8 pscan_rep_mode;
451 __u8 pscan_period_mode;
452 __u8 dev_class[3];
453 __u16 clock_offset;
454 __s8 rssi;
455} __attribute__ ((packed));
456
457#define HCI_EV_CONN_COMPLETE 0x03
458struct hci_ev_conn_complete {
459 __u8 status;
460 __u16 handle;
461 bdaddr_t bdaddr;
462 __u8 link_type;
463 __u8 encr_mode;
464} __attribute__ ((packed));
465
466#define HCI_EV_CONN_REQUEST 0x04
467struct hci_ev_conn_request {
468 bdaddr_t bdaddr;
469 __u8 dev_class[3];
470 __u8 link_type;
471} __attribute__ ((packed));
472
473#define HCI_EV_DISCONN_COMPLETE 0x05
474struct hci_ev_disconn_complete {
475 __u8 status;
476 __u16 handle;
477 __u8 reason;
478} __attribute__ ((packed));
479
480#define HCI_EV_AUTH_COMPLETE 0x06
481struct hci_ev_auth_complete {
482 __u8 status;
483 __u16 handle;
484} __attribute__ ((packed));
485
486#define HCI_EV_ENCRYPT_CHANGE 0x08
487struct hci_ev_encrypt_change {
488 __u8 status;
489 __u16 handle;
490 __u8 encrypt;
491} __attribute__ ((packed));
492
493#define HCI_EV_CHANGE_CONN_LINK_KEY_COMPLETE 0x09
494struct hci_ev_change_conn_link_key_complete {
495 __u8 status;
496 __u16 handle;
497} __attribute__ ((packed));
498
499#define HCI_EV_QOS_SETUP_COMPLETE 0x0D
500struct hci_qos {
501 __u8 service_type;
502 __u32 token_rate;
503 __u32 peak_bandwidth;
504 __u32 latency;
505 __u32 delay_variation;
506} __attribute__ ((packed));
507struct hci_ev_qos_setup_complete {
508 __u8 status;
509 __u16 handle;
510 struct hci_qos qos;
511} __attribute__ ((packed));
512
513#define HCI_EV_CMD_COMPLETE 0x0E
514struct hci_ev_cmd_complete {
515 __u8 ncmd;
516 __u16 opcode;
517} __attribute__ ((packed));
518
519#define HCI_EV_CMD_STATUS 0x0F
520struct hci_ev_cmd_status {
521 __u8 status;
522 __u8 ncmd;
523 __u16 opcode;
524} __attribute__ ((packed));
525
526#define HCI_EV_NUM_COMP_PKTS 0x13
527struct hci_ev_num_comp_pkts {
528 __u8 num_hndl;
529 /* variable length part */
530} __attribute__ ((packed));
531
532#define HCI_EV_ROLE_CHANGE 0x12
533struct hci_ev_role_change {
534 __u8 status;
535 bdaddr_t bdaddr;
536 __u8 role;
537} __attribute__ ((packed));
538
539#define HCI_EV_MODE_CHANGE 0x14
540struct hci_ev_mode_change {
541 __u8 status;
542 __u16 handle;
543 __u8 mode;
544 __u16 interval;
545} __attribute__ ((packed));
546
547#define HCI_EV_PIN_CODE_REQ 0x16
548struct hci_ev_pin_code_req {
549 bdaddr_t bdaddr;
550} __attribute__ ((packed));
551
552#define HCI_EV_LINK_KEY_REQ 0x17
553struct hci_ev_link_key_req {
554 bdaddr_t bdaddr;
555} __attribute__ ((packed));
556
557#define HCI_EV_LINK_KEY_NOTIFY 0x18
558struct hci_ev_link_key_notify {
559 bdaddr_t bdaddr;
560 __u8 link_key[16];
561 __u8 key_type;
562} __attribute__ ((packed));
563
564#define HCI_EV_RMT_FEATURES 0x0B
565struct hci_ev_rmt_features {
566 __u8 status;
567 __u16 handle;
568 __u8 features[8];
569} __attribute__ ((packed));
570
571#define HCI_EV_RMT_VERSION 0x0C
572struct hci_ev_rmt_version {
573 __u8 status;
574 __u16 handle;
575 __u8 lmp_ver;
576 __u16 manufacturer;
577 __u16 lmp_subver;
578} __attribute__ ((packed));
579
580#define HCI_EV_CLOCK_OFFSET 0x01C
581struct hci_ev_clock_offset {
582 __u8 status;
583 __u16 handle;
584 __u16 clock_offset;
585} __attribute__ ((packed));
586
587/* Internal events generated by Bluetooth stack */
588#define HCI_EV_STACK_INTERNAL 0xFD
589struct hci_ev_stack_internal {
590 __u16 type;
591 __u8 data[0];
592} __attribute__ ((packed));
593
594#define HCI_EV_SI_DEVICE 0x01
595struct hci_ev_si_device {
596 __u16 event;
597 __u16 dev_id;
598} __attribute__ ((packed));
599
600#define HCI_EV_SI_SECURITY 0x02
601struct hci_ev_si_security {
602 __u16 event;
603 __u16 proto;
604 __u16 subproto;
605 __u8 incoming;
606} __attribute__ ((packed));
607
608/* ---- HCI Packet structures ---- */
609#define HCI_COMMAND_HDR_SIZE 3
610#define HCI_EVENT_HDR_SIZE 2
611#define HCI_ACL_HDR_SIZE 4
612#define HCI_SCO_HDR_SIZE 3
613
614struct hci_command_hdr {
615 __u16 opcode; /* OCF & OGF */
616 __u8 plen;
617} __attribute__ ((packed));
618
619struct hci_event_hdr {
620 __u8 evt;
621 __u8 plen;
622} __attribute__ ((packed));
623
624struct hci_acl_hdr {
625 __u16 handle; /* Handle & Flags(PB, BC) */
626 __u16 dlen;
627} __attribute__ ((packed));
628
629struct hci_sco_hdr {
630 __u16 handle;
631 __u8 dlen;
632} __attribute__ ((packed));
633
634/* Command opcode pack/unpack */
635#define hci_opcode_pack(ogf, ocf) (__u16)((ocf & 0x03ff)|(ogf << 10))
636#define hci_opcode_ogf(op) (op >> 10)
637#define hci_opcode_ocf(op) (op & 0x03ff)
638
639/* ACL handle and flags pack/unpack */
640#define hci_handle_pack(h, f) (__u16)((h & 0x0fff)|(f << 12))
641#define hci_handle(h) (h & 0x0fff)
642#define hci_flags(h) (h >> 12)
643
644/* ---- HCI Sockets ---- */
645
646/* Socket options */
647#define HCI_DATA_DIR 1
648#define HCI_FILTER 2
649#define HCI_TIME_STAMP 3
650
651/* CMSG flags */
652#define HCI_CMSG_DIR 0x0001
653#define HCI_CMSG_TSTAMP 0x0002
654
655struct sockaddr_hci {
656 sa_family_t hci_family;
657 unsigned short hci_dev;
658};
659#define HCI_DEV_NONE 0xffff
660
661struct hci_filter {
662 unsigned long type_mask;
663 unsigned long event_mask[2];
664 __u16 opcode;
665};
666
667struct hci_ufilter {
668 __u32 type_mask;
669 __u32 event_mask[2];
670 __u16 opcode;
671};
672
673#define HCI_FLT_TYPE_BITS 31
674#define HCI_FLT_EVENT_BITS 63
675#define HCI_FLT_OGF_BITS 63
676#define HCI_FLT_OCF_BITS 127
677
678/* ---- HCI Ioctl requests structures ---- */
679struct hci_dev_stats {
680 __u32 err_rx;
681 __u32 err_tx;
682 __u32 cmd_tx;
683 __u32 evt_rx;
684 __u32 acl_tx;
685 __u32 acl_rx;
686 __u32 sco_tx;
687 __u32 sco_rx;
688 __u32 byte_rx;
689 __u32 byte_tx;
690};
691
692struct hci_dev_info {
693 __u16 dev_id;
694 char name[8];
695
696 bdaddr_t bdaddr;
697
698 __u32 flags;
699 __u8 type;
700
701 __u8 features[8];
702
703 __u32 pkt_type;
704 __u32 link_policy;
705 __u32 link_mode;
706
707 __u16 acl_mtu;
708 __u16 acl_pkts;
709 __u16 sco_mtu;
710 __u16 sco_pkts;
711
712 struct hci_dev_stats stat;
713};
714
715struct hci_conn_info {
716 __u16 handle;
717 bdaddr_t bdaddr;
718 __u8 type;
719 __u8 out;
720 __u16 state;
721 __u32 link_mode;
722};
723
724struct hci_dev_req {
725 __u16 dev_id;
726 __u32 dev_opt;
727};
728
729struct hci_dev_list_req {
730 __u16 dev_num;
731 struct hci_dev_req dev_req[0]; /* hci_dev_req structures */
732};
733
734struct hci_conn_list_req {
735 __u16 dev_id;
736 __u16 conn_num;
737 struct hci_conn_info conn_info[0];
738};
739
740struct hci_conn_info_req {
741 bdaddr_t bdaddr;
742 __u8 type;
743 struct hci_conn_info conn_info[0];
744};
745
746struct hci_inquiry_req {
747 __u16 dev_id;
748 __u16 flags;
749 __u8 lap[3];
750 __u8 length;
751 __u8 num_rsp;
752};
753#define IREQ_CACHE_FLUSH 0x0001
754
755#endif /* __HCI_H */
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
new file mode 100644
index 000000000000..6d63a47c731b
--- /dev/null
+++ b/include/net/bluetooth/hci_core.h
@@ -0,0 +1,626 @@
1/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22 SOFTWARE IS DISCLAIMED.
23*/
24
25#ifndef __HCI_CORE_H
26#define __HCI_CORE_H
27
28#include <linux/proc_fs.h>
29#include <net/bluetooth/hci.h>
30
31/* HCI upper protocols */
32#define HCI_PROTO_L2CAP 0
33#define HCI_PROTO_SCO 1
34
35#define HCI_INIT_TIMEOUT (HZ * 10)
36
37extern struct proc_dir_entry *proc_bt_hci;
38
39/* HCI Core structures */
40
41struct inquiry_data {
42 bdaddr_t bdaddr;
43 __u8 pscan_rep_mode;
44 __u8 pscan_period_mode;
45 __u8 pscan_mode;
46 __u8 dev_class[3];
47 __u16 clock_offset;
48 __s8 rssi;
49};
50
51struct inquiry_entry {
52 struct inquiry_entry *next;
53 __u32 timestamp;
54 struct inquiry_data data;
55};
56
57struct inquiry_cache {
58 spinlock_t lock;
59 __u32 timestamp;
60 struct inquiry_entry *list;
61};
62
63struct hci_conn_hash {
64 struct list_head list;
65 spinlock_t lock;
66 unsigned int acl_num;
67 unsigned int sco_num;
68};
69
70struct hci_dev {
71 struct list_head list;
72 spinlock_t lock;
73 atomic_t refcnt;
74
75 char name[8];
76 unsigned long flags;
77 __u16 id;
78 __u8 type;
79 bdaddr_t bdaddr;
80 __u8 features[8];
81 __u16 voice_setting;
82
83 __u16 pkt_type;
84 __u16 link_policy;
85 __u16 link_mode;
86
87 unsigned long quirks;
88
89 atomic_t cmd_cnt;
90 unsigned int acl_cnt;
91 unsigned int sco_cnt;
92
93 unsigned int acl_mtu;
94 unsigned int sco_mtu;
95 unsigned int acl_pkts;
96 unsigned int sco_pkts;
97
98 unsigned long cmd_last_tx;
99 unsigned long acl_last_tx;
100 unsigned long sco_last_tx;
101
102 struct tasklet_struct cmd_task;
103 struct tasklet_struct rx_task;
104 struct tasklet_struct tx_task;
105
106 struct sk_buff_head rx_q;
107 struct sk_buff_head raw_q;
108 struct sk_buff_head cmd_q;
109
110 struct sk_buff *sent_cmd;
111
112 struct semaphore req_lock;
113 wait_queue_head_t req_wait_q;
114 __u32 req_status;
115 __u32 req_result;
116
117 struct inquiry_cache inq_cache;
118 struct hci_conn_hash conn_hash;
119
120 struct hci_dev_stats stat;
121
122 struct sk_buff_head driver_init;
123
124 void *driver_data;
125 void *core_data;
126
127 atomic_t promisc;
128
129#ifdef CONFIG_PROC_FS
130 struct proc_dir_entry *proc;
131#endif
132
133 struct class_device class_dev;
134
135 struct module *owner;
136
137 int (*open)(struct hci_dev *hdev);
138 int (*close)(struct hci_dev *hdev);
139 int (*flush)(struct hci_dev *hdev);
140 int (*send)(struct sk_buff *skb);
141 void (*destruct)(struct hci_dev *hdev);
142 void (*notify)(struct hci_dev *hdev, unsigned int evt);
143 int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);
144};
145
146struct hci_conn {
147 struct list_head list;
148
149 atomic_t refcnt;
150 spinlock_t lock;
151
152 bdaddr_t dst;
153 __u16 handle;
154 __u16 state;
155 __u8 type;
156 __u8 out;
157 __u8 dev_class[3];
158 __u32 link_mode;
159 unsigned long pend;
160
161 unsigned int sent;
162
163 struct sk_buff_head data_q;
164
165 struct timer_list timer;
166
167 struct hci_dev *hdev;
168 void *l2cap_data;
169 void *sco_data;
170 void *priv;
171
172 struct hci_conn *link;
173};
174
175extern struct hci_proto *hci_proto[];
176extern struct list_head hci_dev_list;
177extern struct list_head hci_cb_list;
178extern rwlock_t hci_dev_list_lock;
179extern rwlock_t hci_cb_list_lock;
180
181/* ----- Inquiry cache ----- */
182#define INQUIRY_CACHE_AGE_MAX (HZ*30) // 30 seconds
183#define INQUIRY_ENTRY_AGE_MAX (HZ*60) // 60 seconds
184
185#define inquiry_cache_lock(c) spin_lock(&c->lock)
186#define inquiry_cache_unlock(c) spin_unlock(&c->lock)
187#define inquiry_cache_lock_bh(c) spin_lock_bh(&c->lock)
188#define inquiry_cache_unlock_bh(c) spin_unlock_bh(&c->lock)
189
190static inline void inquiry_cache_init(struct hci_dev *hdev)
191{
192 struct inquiry_cache *c = &hdev->inq_cache;
193 spin_lock_init(&c->lock);
194 c->list = NULL;
195}
196
197static inline int inquiry_cache_empty(struct hci_dev *hdev)
198{
199 struct inquiry_cache *c = &hdev->inq_cache;
200 return (c->list == NULL);
201}
202
203static inline long inquiry_cache_age(struct hci_dev *hdev)
204{
205 struct inquiry_cache *c = &hdev->inq_cache;
206 return jiffies - c->timestamp;
207}
208
209static inline long inquiry_entry_age(struct inquiry_entry *e)
210{
211 return jiffies - e->timestamp;
212}
213
214struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr);
215void hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data);
216
217/* ----- HCI Connections ----- */
218enum {
219 HCI_CONN_AUTH_PEND,
220 HCI_CONN_ENCRYPT_PEND,
221 HCI_CONN_RSWITCH_PEND
222};
223
224static inline void hci_conn_hash_init(struct hci_dev *hdev)
225{
226 struct hci_conn_hash *h = &hdev->conn_hash;
227 INIT_LIST_HEAD(&h->list);
228 spin_lock_init(&h->lock);
229 h->acl_num = 0;
230 h->sco_num = 0;
231}
232
233static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
234{
235 struct hci_conn_hash *h = &hdev->conn_hash;
236 list_add(&c->list, &h->list);
237 if (c->type == ACL_LINK)
238 h->acl_num++;
239 else
240 h->sco_num++;
241}
242
243static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
244{
245 struct hci_conn_hash *h = &hdev->conn_hash;
246 list_del(&c->list);
247 if (c->type == ACL_LINK)
248 h->acl_num--;
249 else
250 h->sco_num--;
251}
252
253static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,
254 __u16 handle)
255{
256 struct hci_conn_hash *h = &hdev->conn_hash;
257 struct list_head *p;
258 struct hci_conn *c;
259
260 list_for_each(p, &h->list) {
261 c = list_entry(p, struct hci_conn, list);
262 if (c->handle == handle)
263 return c;
264 }
265 return NULL;
266}
267
268static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev,
269 __u8 type, bdaddr_t *ba)
270{
271 struct hci_conn_hash *h = &hdev->conn_hash;
272 struct list_head *p;
273 struct hci_conn *c;
274
275 list_for_each(p, &h->list) {
276 c = list_entry(p, struct hci_conn, list);
277 if (c->type == type && !bacmp(&c->dst, ba))
278 return c;
279 }
280 return NULL;
281}
282
283void hci_acl_disconn(struct hci_conn *conn, __u8 reason);
284void hci_add_sco(struct hci_conn *conn, __u16 handle);
285
286struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst);
287int hci_conn_del(struct hci_conn *conn);
288void hci_conn_hash_flush(struct hci_dev *hdev);
289
290struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *src);
291int hci_conn_auth(struct hci_conn *conn);
292int hci_conn_encrypt(struct hci_conn *conn);
293int hci_conn_change_link_key(struct hci_conn *conn);
294int hci_conn_switch_role(struct hci_conn *conn, uint8_t role);
295
296static inline void hci_conn_set_timer(struct hci_conn *conn, unsigned long timeout)
297{
298 mod_timer(&conn->timer, jiffies + timeout);
299}
300
301static inline void hci_conn_del_timer(struct hci_conn *conn)
302{
303 del_timer(&conn->timer);
304}
305
306static inline void hci_conn_hold(struct hci_conn *conn)
307{
308 atomic_inc(&conn->refcnt);
309 hci_conn_del_timer(conn);
310}
311
312static inline void hci_conn_put(struct hci_conn *conn)
313{
314 if (atomic_dec_and_test(&conn->refcnt)) {
315 if (conn->type == ACL_LINK) {
316 unsigned long timeo = (conn->out) ?
317 HCI_DISCONN_TIMEOUT : HCI_DISCONN_TIMEOUT * 2;
318 hci_conn_set_timer(conn, timeo);
319 } else
320 hci_conn_set_timer(conn, HZ / 100);
321 }
322}
323
324/* ----- HCI tasks ----- */
325static inline void hci_sched_cmd(struct hci_dev *hdev)
326{
327 tasklet_schedule(&hdev->cmd_task);
328}
329
330static inline void hci_sched_rx(struct hci_dev *hdev)
331{
332 tasklet_schedule(&hdev->rx_task);
333}
334
335static inline void hci_sched_tx(struct hci_dev *hdev)
336{
337 tasklet_schedule(&hdev->tx_task);
338}
339
340/* ----- HCI Devices ----- */
341static inline void __hci_dev_put(struct hci_dev *d)
342{
343 if (atomic_dec_and_test(&d->refcnt))
344 d->destruct(d);
345}
346
347static inline void hci_dev_put(struct hci_dev *d)
348{
349 __hci_dev_put(d);
350 module_put(d->owner);
351}
352
353static inline struct hci_dev *__hci_dev_hold(struct hci_dev *d)
354{
355 atomic_inc(&d->refcnt);
356 return d;
357}
358
359static inline struct hci_dev *hci_dev_hold(struct hci_dev *d)
360{
361 if (try_module_get(d->owner))
362 return __hci_dev_hold(d);
363 return NULL;
364}
365
366#define hci_dev_lock(d) spin_lock(&d->lock)
367#define hci_dev_unlock(d) spin_unlock(&d->lock)
368#define hci_dev_lock_bh(d) spin_lock_bh(&d->lock)
369#define hci_dev_unlock_bh(d) spin_unlock_bh(&d->lock)
370
371struct hci_dev *hci_dev_get(int index);
372struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst);
373
374struct hci_dev *hci_alloc_dev(void);
375void hci_free_dev(struct hci_dev *hdev);
376int hci_register_dev(struct hci_dev *hdev);
377int hci_unregister_dev(struct hci_dev *hdev);
378int hci_suspend_dev(struct hci_dev *hdev);
379int hci_resume_dev(struct hci_dev *hdev);
380int hci_dev_open(__u16 dev);
381int hci_dev_close(__u16 dev);
382int hci_dev_reset(__u16 dev);
383int hci_dev_reset_stat(__u16 dev);
384int hci_dev_cmd(unsigned int cmd, void __user *arg);
385int hci_get_dev_list(void __user *arg);
386int hci_get_dev_info(void __user *arg);
387int hci_get_conn_list(void __user *arg);
388int hci_get_conn_info(struct hci_dev *hdev, void __user *arg);
389int hci_inquiry(void __user *arg);
390
391void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
392
393/* Receive frame from HCI drivers */
394static inline int hci_recv_frame(struct sk_buff *skb)
395{
396 struct hci_dev *hdev = (struct hci_dev *) skb->dev;
397 if (!hdev || (!test_bit(HCI_UP, &hdev->flags)
398 && !test_bit(HCI_INIT, &hdev->flags))) {
399 kfree_skb(skb);
400 return -ENXIO;
401 }
402
403 /* Incomming skb */
404 bt_cb(skb)->incoming = 1;
405
406 /* Time stamp */
407 do_gettimeofday(&skb->stamp);
408
409 /* Queue frame for rx task */
410 skb_queue_tail(&hdev->rx_q, skb);
411 hci_sched_rx(hdev);
412 return 0;
413}
414
415int hci_register_sysfs(struct hci_dev *hdev);
416void hci_unregister_sysfs(struct hci_dev *hdev);
417
418#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->class_dev.dev = (pdev))
419
420/* ----- LMP capabilities ----- */
421#define lmp_rswitch_capable(dev) (dev->features[0] & LMP_RSWITCH)
422#define lmp_encrypt_capable(dev) (dev->features[0] & LMP_ENCRYPT)
423
424/* ----- HCI protocols ----- */
425struct hci_proto {
426 char *name;
427 unsigned int id;
428 unsigned long flags;
429
430 void *priv;
431
432 int (*connect_ind) (struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type);
433 int (*connect_cfm) (struct hci_conn *conn, __u8 status);
434 int (*disconn_ind) (struct hci_conn *conn, __u8 reason);
435 int (*recv_acldata) (struct hci_conn *conn, struct sk_buff *skb, __u16 flags);
436 int (*recv_scodata) (struct hci_conn *conn, struct sk_buff *skb);
437 int (*auth_cfm) (struct hci_conn *conn, __u8 status);
438 int (*encrypt_cfm) (struct hci_conn *conn, __u8 status);
439};
440
441static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type)
442{
443 register struct hci_proto *hp;
444 int mask = 0;
445
446 hp = hci_proto[HCI_PROTO_L2CAP];
447 if (hp && hp->connect_ind)
448 mask |= hp->connect_ind(hdev, bdaddr, type);
449
450 hp = hci_proto[HCI_PROTO_SCO];
451 if (hp && hp->connect_ind)
452 mask |= hp->connect_ind(hdev, bdaddr, type);
453
454 return mask;
455}
456
457static inline void hci_proto_connect_cfm(struct hci_conn *conn, __u8 status)
458{
459 register struct hci_proto *hp;
460
461 hp = hci_proto[HCI_PROTO_L2CAP];
462 if (hp && hp->connect_cfm)
463 hp->connect_cfm(conn, status);
464
465 hp = hci_proto[HCI_PROTO_SCO];
466 if (hp && hp->connect_cfm)
467 hp->connect_cfm(conn, status);
468}
469
470static inline void hci_proto_disconn_ind(struct hci_conn *conn, __u8 reason)
471{
472 register struct hci_proto *hp;
473
474 hp = hci_proto[HCI_PROTO_L2CAP];
475 if (hp && hp->disconn_ind)
476 hp->disconn_ind(conn, reason);
477
478 hp = hci_proto[HCI_PROTO_SCO];
479 if (hp && hp->disconn_ind)
480 hp->disconn_ind(conn, reason);
481}
482
483static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status)
484{
485 register struct hci_proto *hp;
486
487 hp = hci_proto[HCI_PROTO_L2CAP];
488 if (hp && hp->auth_cfm)
489 hp->auth_cfm(conn, status);
490
491 hp = hci_proto[HCI_PROTO_SCO];
492 if (hp && hp->auth_cfm)
493 hp->auth_cfm(conn, status);
494}
495
496static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status)
497{
498 register struct hci_proto *hp;
499
500 hp = hci_proto[HCI_PROTO_L2CAP];
501 if (hp && hp->encrypt_cfm)
502 hp->encrypt_cfm(conn, status);
503
504 hp = hci_proto[HCI_PROTO_SCO];
505 if (hp && hp->encrypt_cfm)
506 hp->encrypt_cfm(conn, status);
507}
508
509int hci_register_proto(struct hci_proto *hproto);
510int hci_unregister_proto(struct hci_proto *hproto);
511
512/* ----- HCI callbacks ----- */
513struct hci_cb {
514 struct list_head list;
515
516 char *name;
517
518 void (*auth_cfm) (struct hci_conn *conn, __u8 status);
519 void (*encrypt_cfm) (struct hci_conn *conn, __u8 status, __u8 encrypt);
520 void (*key_change_cfm) (struct hci_conn *conn, __u8 status);
521 void (*role_switch_cfm) (struct hci_conn *conn, __u8 status, __u8 role);
522};
523
524static inline void hci_auth_cfm(struct hci_conn *conn, __u8 status)
525{
526 struct list_head *p;
527
528 hci_proto_auth_cfm(conn, status);
529
530 read_lock_bh(&hci_cb_list_lock);
531 list_for_each(p, &hci_cb_list) {
532 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
533 if (cb->auth_cfm)
534 cb->auth_cfm(conn, status);
535 }
536 read_unlock_bh(&hci_cb_list_lock);
537}
538
539static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status, __u8 encrypt)
540{
541 struct list_head *p;
542
543 hci_proto_encrypt_cfm(conn, status);
544
545 read_lock_bh(&hci_cb_list_lock);
546 list_for_each(p, &hci_cb_list) {
547 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
548 if (cb->encrypt_cfm)
549 cb->encrypt_cfm(conn, status, encrypt);
550 }
551 read_unlock_bh(&hci_cb_list_lock);
552}
553
554static inline void hci_key_change_cfm(struct hci_conn *conn, __u8 status)
555{
556 struct list_head *p;
557
558 read_lock_bh(&hci_cb_list_lock);
559 list_for_each(p, &hci_cb_list) {
560 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
561 if (cb->key_change_cfm)
562 cb->key_change_cfm(conn, status);
563 }
564 read_unlock_bh(&hci_cb_list_lock);
565}
566
567static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status, __u8 role)
568{
569 struct list_head *p;
570
571 read_lock_bh(&hci_cb_list_lock);
572 list_for_each(p, &hci_cb_list) {
573 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
574 if (cb->role_switch_cfm)
575 cb->role_switch_cfm(conn, status, role);
576 }
577 read_unlock_bh(&hci_cb_list_lock);
578}
579
580int hci_register_cb(struct hci_cb *hcb);
581int hci_unregister_cb(struct hci_cb *hcb);
582
583int hci_register_notifier(struct notifier_block *nb);
584int hci_unregister_notifier(struct notifier_block *nb);
585
586int hci_send_cmd(struct hci_dev *hdev, __u16 ogf, __u16 ocf, __u32 plen, void *param);
587int hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags);
588int hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
589
590void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 ogf, __u16 ocf);
591
592void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data);
593
594/* ----- HCI Sockets ----- */
595void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb);
596
597/* HCI info for socket */
598#define hci_pi(sk) ((struct hci_pinfo *) sk)
599
600struct hci_pinfo {
601 struct bt_sock bt;
602 struct hci_dev *hdev;
603 struct hci_filter filter;
604 __u32 cmsg_mask;
605};
606
607/* HCI security filter */
608#define HCI_SFLT_MAX_OGF 5
609
610struct hci_sec_filter {
611 __u32 type_mask;
612 __u32 event_mask[2];
613 __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
614};
615
616/* ----- HCI requests ----- */
617#define HCI_REQ_DONE 0
618#define HCI_REQ_PEND 1
619#define HCI_REQ_CANCELED 2
620
621#define hci_req_lock(d) down(&d->req_lock)
622#define hci_req_unlock(d) up(&d->req_lock)
623
624void hci_req_complete(struct hci_dev *hdev, int result);
625
626#endif /* __HCI_CORE_H */
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
new file mode 100644
index 000000000000..8242a0ee1f58
--- /dev/null
+++ b/include/net/bluetooth/l2cap.h
@@ -0,0 +1,238 @@
1/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22 SOFTWARE IS DISCLAIMED.
23*/
24
25#ifndef __L2CAP_H
26#define __L2CAP_H
27
28/* L2CAP defaults */
29#define L2CAP_DEFAULT_MTU 672
30#define L2CAP_DEFAULT_FLUSH_TO 0xFFFF
31
32#define L2CAP_CONN_TIMEOUT (HZ * 40)
33
34/* L2CAP socket address */
35struct sockaddr_l2 {
36 sa_family_t l2_family;
37 unsigned short l2_psm;
38 bdaddr_t l2_bdaddr;
39};
40
41/* L2CAP socket options */
42#define L2CAP_OPTIONS 0x01
43struct l2cap_options {
44 __u16 omtu;
45 __u16 imtu;
46 __u16 flush_to;
47 __u8 mode;
48};
49
50#define L2CAP_CONNINFO 0x02
51struct l2cap_conninfo {
52 __u16 hci_handle;
53 __u8 dev_class[3];
54};
55
56#define L2CAP_LM 0x03
57#define L2CAP_LM_MASTER 0x0001
58#define L2CAP_LM_AUTH 0x0002
59#define L2CAP_LM_ENCRYPT 0x0004
60#define L2CAP_LM_TRUSTED 0x0008
61#define L2CAP_LM_RELIABLE 0x0010
62#define L2CAP_LM_SECURE 0x0020
63
64/* L2CAP command codes */
65#define L2CAP_COMMAND_REJ 0x01
66#define L2CAP_CONN_REQ 0x02
67#define L2CAP_CONN_RSP 0x03
68#define L2CAP_CONF_REQ 0x04
69#define L2CAP_CONF_RSP 0x05
70#define L2CAP_DISCONN_REQ 0x06
71#define L2CAP_DISCONN_RSP 0x07
72#define L2CAP_ECHO_REQ 0x08
73#define L2CAP_ECHO_RSP 0x09
74#define L2CAP_INFO_REQ 0x0a
75#define L2CAP_INFO_RSP 0x0b
76
77/* L2CAP structures */
78struct l2cap_hdr {
79 __u16 len;
80 __u16 cid;
81} __attribute__ ((packed));
82#define L2CAP_HDR_SIZE 4
83
84struct l2cap_cmd_hdr {
85 __u8 code;
86 __u8 ident;
87 __u16 len;
88} __attribute__ ((packed));
89#define L2CAP_CMD_HDR_SIZE 4
90
91struct l2cap_cmd_rej {
92 __u16 reason;
93} __attribute__ ((packed));
94
95struct l2cap_conn_req {
96 __u16 psm;
97 __u16 scid;
98} __attribute__ ((packed));
99
100struct l2cap_conn_rsp {
101 __u16 dcid;
102 __u16 scid;
103 __u16 result;
104 __u16 status;
105} __attribute__ ((packed));
106
107/* connect result */
108#define L2CAP_CR_SUCCESS 0x0000
109#define L2CAP_CR_PEND 0x0001
110#define L2CAP_CR_BAD_PSM 0x0002
111#define L2CAP_CR_SEC_BLOCK 0x0003
112#define L2CAP_CR_NO_MEM 0x0004
113
114/* connect status */
115#define L2CAP_CS_NO_INFO 0x0000
116#define L2CAP_CS_AUTHEN_PEND 0x0001
117#define L2CAP_CS_AUTHOR_PEND 0x0002
118
119struct l2cap_conf_req {
120 __u16 dcid;
121 __u16 flags;
122 __u8 data[0];
123} __attribute__ ((packed));
124
125struct l2cap_conf_rsp {
126 __u16 scid;
127 __u16 flags;
128 __u16 result;
129 __u8 data[0];
130} __attribute__ ((packed));
131
132#define L2CAP_CONF_SUCCESS 0x00
133#define L2CAP_CONF_UNACCEPT 0x01
134
135struct l2cap_conf_opt {
136 __u8 type;
137 __u8 len;
138 __u8 val[0];
139} __attribute__ ((packed));
140#define L2CAP_CONF_OPT_SIZE 2
141
142#define L2CAP_CONF_MTU 0x01
143#define L2CAP_CONF_FLUSH_TO 0x02
144#define L2CAP_CONF_QOS 0x03
145#define L2CAP_CONF_RFC 0x04
146
147#define L2CAP_CONF_MAX_SIZE 22
148
149struct l2cap_disconn_req {
150 __u16 dcid;
151 __u16 scid;
152} __attribute__ ((packed));
153
154struct l2cap_disconn_rsp {
155 __u16 dcid;
156 __u16 scid;
157} __attribute__ ((packed));
158
159struct l2cap_info_req {
160 __u16 type;
161 __u8 data[0];
162} __attribute__ ((packed));
163
164struct l2cap_info_rsp {
165 __u16 type;
166 __u16 result;
167 __u8 data[0];
168} __attribute__ ((packed));
169
170/* info type */
171#define L2CAP_IT_CL_MTU 0x0001
172#define L2CAP_IT_FEAT_MASK 0x0002
173
174/* info result */
175#define L2CAP_IR_SUCCESS 0x0000
176#define L2CAP_IR_NOTSUPP 0x0001
177
178/* ----- L2CAP connections ----- */
179struct l2cap_chan_list {
180 struct sock *head;
181 rwlock_t lock;
182 long num;
183};
184
185struct l2cap_conn {
186 struct hci_conn *hcon;
187
188 bdaddr_t *dst;
189 bdaddr_t *src;
190
191 unsigned int mtu;
192
193 spinlock_t lock;
194
195 struct sk_buff *rx_skb;
196 __u32 rx_len;
197 __u8 rx_ident;
198 __u8 tx_ident;
199
200 struct l2cap_chan_list chan_list;
201};
202
203/* ----- L2CAP channel and socket info ----- */
204#define l2cap_pi(sk) ((struct l2cap_pinfo *) sk)
205
206struct l2cap_pinfo {
207 struct bt_sock bt;
208 __u16 psm;
209 __u16 dcid;
210 __u16 scid;
211
212 __u16 imtu;
213 __u16 omtu;
214 __u16 flush_to;
215
216 __u32 link_mode;
217
218 __u8 conf_state;
219 __u8 conf_retry;
220 __u16 conf_mtu;
221
222 __u8 ident;
223
224 __u16 sport;
225
226 struct l2cap_conn *conn;
227 struct sock *next_c;
228 struct sock *prev_c;
229};
230
231#define L2CAP_CONF_REQ_SENT 0x01
232#define L2CAP_CONF_INPUT_DONE 0x02
233#define L2CAP_CONF_OUTPUT_DONE 0x04
234#define L2CAP_CONF_MAX_RETRIES 2
235
236void l2cap_load(void);
237
238#endif /* __L2CAP_H */
diff --git a/include/net/bluetooth/rfcomm.h b/include/net/bluetooth/rfcomm.h
new file mode 100644
index 000000000000..13669bad00b3
--- /dev/null
+++ b/include/net/bluetooth/rfcomm.h
@@ -0,0 +1,353 @@
1/*
2 RFCOMM implementation for Linux Bluetooth stack (BlueZ).
3 Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
4 Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License version 2 as
8 published by the Free Software Foundation;
9
10 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
11 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
13 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
14 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
15 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18
19 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
20 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
21 SOFTWARE IS DISCLAIMED.
22*/
23
24#ifndef __RFCOMM_H
25#define __RFCOMM_H
26
27#define RFCOMM_PSM 3
28
29#define RFCOMM_CONN_TIMEOUT (HZ * 30)
30#define RFCOMM_DISC_TIMEOUT (HZ * 20)
31#define RFCOMM_AUTH_TIMEOUT (HZ * 25)
32
33#define RFCOMM_DEFAULT_MTU 127
34#define RFCOMM_DEFAULT_CREDITS 7
35
36#define RFCOMM_MAX_L2CAP_MTU 1024
37#define RFCOMM_MAX_CREDITS 40
38
39#define RFCOMM_SKB_HEAD_RESERVE 8
40#define RFCOMM_SKB_TAIL_RESERVE 2
41#define RFCOMM_SKB_RESERVE (RFCOMM_SKB_HEAD_RESERVE + RFCOMM_SKB_TAIL_RESERVE)
42
43#define RFCOMM_SABM 0x2f
44#define RFCOMM_DISC 0x43
45#define RFCOMM_UA 0x63
46#define RFCOMM_DM 0x0f
47#define RFCOMM_UIH 0xef
48
49#define RFCOMM_TEST 0x08
50#define RFCOMM_FCON 0x28
51#define RFCOMM_FCOFF 0x18
52#define RFCOMM_MSC 0x38
53#define RFCOMM_RPN 0x24
54#define RFCOMM_RLS 0x14
55#define RFCOMM_PN 0x20
56#define RFCOMM_NSC 0x04
57
58#define RFCOMM_V24_FC 0x02
59#define RFCOMM_V24_RTC 0x04
60#define RFCOMM_V24_RTR 0x08
61#define RFCOMM_V24_IC 0x40
62#define RFCOMM_V24_DV 0x80
63
64#define RFCOMM_RPN_BR_2400 0x0
65#define RFCOMM_RPN_BR_4800 0x1
66#define RFCOMM_RPN_BR_7200 0x2
67#define RFCOMM_RPN_BR_9600 0x3
68#define RFCOMM_RPN_BR_19200 0x4
69#define RFCOMM_RPN_BR_38400 0x5
70#define RFCOMM_RPN_BR_57600 0x6
71#define RFCOMM_RPN_BR_115200 0x7
72#define RFCOMM_RPN_BR_230400 0x8
73
74#define RFCOMM_RPN_DATA_5 0x0
75#define RFCOMM_RPN_DATA_6 0x1
76#define RFCOMM_RPN_DATA_7 0x2
77#define RFCOMM_RPN_DATA_8 0x3
78
79#define RFCOMM_RPN_STOP_1 0
80#define RFCOMM_RPN_STOP_15 1
81
82#define RFCOMM_RPN_PARITY_NONE 0x0
83#define RFCOMM_RPN_PARITY_ODD 0x4
84#define RFCOMM_RPN_PARITY_EVEN 0x5
85#define RFCOMM_RPN_PARITY_MARK 0x6
86#define RFCOMM_RPN_PARITY_SPACE 0x7
87
88#define RFCOMM_RPN_FLOW_NONE 0x00
89
90#define RFCOMM_RPN_XON_CHAR 0x11
91#define RFCOMM_RPN_XOFF_CHAR 0x13
92
93#define RFCOMM_RPN_PM_BITRATE 0x0001
94#define RFCOMM_RPN_PM_DATA 0x0002
95#define RFCOMM_RPN_PM_STOP 0x0004
96#define RFCOMM_RPN_PM_PARITY 0x0008
97#define RFCOMM_RPN_PM_PARITY_TYPE 0x0010
98#define RFCOMM_RPN_PM_XON 0x0020
99#define RFCOMM_RPN_PM_XOFF 0x0040
100#define RFCOMM_RPN_PM_FLOW 0x3F00
101
102#define RFCOMM_RPN_PM_ALL 0x3F7F
103
104struct rfcomm_hdr {
105 u8 addr;
106 u8 ctrl;
107 u8 len; // Actual size can be 2 bytes
108} __attribute__ ((packed));
109
110struct rfcomm_cmd {
111 u8 addr;
112 u8 ctrl;
113 u8 len;
114 u8 fcs;
115} __attribute__ ((packed));
116
117struct rfcomm_mcc {
118 u8 type;
119 u8 len;
120} __attribute__ ((packed));
121
122struct rfcomm_pn {
123 u8 dlci;
124 u8 flow_ctrl;
125 u8 priority;
126 u8 ack_timer;
127 u16 mtu;
128 u8 max_retrans;
129 u8 credits;
130} __attribute__ ((packed));
131
132struct rfcomm_rpn {
133 u8 dlci;
134 u8 bit_rate;
135 u8 line_settings;
136 u8 flow_ctrl;
137 u8 xon_char;
138 u8 xoff_char;
139 u16 param_mask;
140} __attribute__ ((packed));
141
142struct rfcomm_rls {
143 u8 dlci;
144 u8 status;
145} __attribute__ ((packed));
146
147struct rfcomm_msc {
148 u8 dlci;
149 u8 v24_sig;
150} __attribute__ ((packed));
151
152/* ---- Core structures, flags etc ---- */
153
154struct rfcomm_session {
155 struct list_head list;
156 struct socket *sock;
157 unsigned long state;
158 unsigned long flags;
159 atomic_t refcnt;
160 int initiator;
161
162 /* Default DLC parameters */
163 int cfc;
164 uint mtu;
165
166 struct list_head dlcs;
167};
168
169struct rfcomm_dlc {
170 struct list_head list;
171 struct rfcomm_session *session;
172 struct sk_buff_head tx_queue;
173 struct timer_list timer;
174
175 spinlock_t lock;
176 unsigned long state;
177 unsigned long flags;
178 atomic_t refcnt;
179 u8 dlci;
180 u8 addr;
181 u8 priority;
182 u8 v24_sig;
183 u8 mscex;
184
185 u32 link_mode;
186
187 uint mtu;
188 uint cfc;
189 uint rx_credits;
190 uint tx_credits;
191
192 void *owner;
193
194 void (*data_ready)(struct rfcomm_dlc *d, struct sk_buff *skb);
195 void (*state_change)(struct rfcomm_dlc *d, int err);
196 void (*modem_status)(struct rfcomm_dlc *d, u8 v24_sig);
197};
198
199/* DLC and session flags */
200#define RFCOMM_RX_THROTTLED 0
201#define RFCOMM_TX_THROTTLED 1
202#define RFCOMM_TIMED_OUT 2
203#define RFCOMM_MSC_PENDING 3
204#define RFCOMM_AUTH_PENDING 4
205#define RFCOMM_AUTH_ACCEPT 5
206#define RFCOMM_AUTH_REJECT 6
207
208/* Scheduling flags and events */
209#define RFCOMM_SCHED_STATE 0
210#define RFCOMM_SCHED_RX 1
211#define RFCOMM_SCHED_TX 2
212#define RFCOMM_SCHED_TIMEO 3
213#define RFCOMM_SCHED_AUTH 4
214#define RFCOMM_SCHED_WAKEUP 31
215
216/* MSC exchange flags */
217#define RFCOMM_MSCEX_TX 1
218#define RFCOMM_MSCEX_RX 2
219#define RFCOMM_MSCEX_OK (RFCOMM_MSCEX_TX + RFCOMM_MSCEX_RX)
220
221/* CFC states */
222#define RFCOMM_CFC_UNKNOWN -1
223#define RFCOMM_CFC_DISABLED 0
224#define RFCOMM_CFC_ENABLED RFCOMM_MAX_CREDITS
225
226/* ---- RFCOMM DLCs (channels) ---- */
227struct rfcomm_dlc *rfcomm_dlc_alloc(int prio);
228void rfcomm_dlc_free(struct rfcomm_dlc *d);
229int rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel);
230int rfcomm_dlc_close(struct rfcomm_dlc *d, int reason);
231int rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb);
232int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig);
233int rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig);
234
235#define rfcomm_dlc_lock(d) spin_lock(&d->lock)
236#define rfcomm_dlc_unlock(d) spin_unlock(&d->lock)
237
238static inline void rfcomm_dlc_hold(struct rfcomm_dlc *d)
239{
240 atomic_inc(&d->refcnt);
241}
242
243static inline void rfcomm_dlc_put(struct rfcomm_dlc *d)
244{
245 if (atomic_dec_and_test(&d->refcnt))
246 rfcomm_dlc_free(d);
247}
248
249extern void FASTCALL(__rfcomm_dlc_throttle(struct rfcomm_dlc *d));
250extern void FASTCALL(__rfcomm_dlc_unthrottle(struct rfcomm_dlc *d));
251
252static inline void rfcomm_dlc_throttle(struct rfcomm_dlc *d)
253{
254 if (!test_and_set_bit(RFCOMM_RX_THROTTLED, &d->flags))
255 __rfcomm_dlc_throttle(d);
256}
257
258static inline void rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)
259{
260 if (test_and_clear_bit(RFCOMM_RX_THROTTLED, &d->flags))
261 __rfcomm_dlc_unthrottle(d);
262}
263
264/* ---- RFCOMM sessions ---- */
265void rfcomm_session_getaddr(struct rfcomm_session *s, bdaddr_t *src, bdaddr_t *dst);
266
267static inline void rfcomm_session_hold(struct rfcomm_session *s)
268{
269 atomic_inc(&s->refcnt);
270}
271
272/* ---- RFCOMM chechsum ---- */
273extern u8 rfcomm_crc_table[];
274
275/* ---- RFCOMM sockets ---- */
276struct sockaddr_rc {
277 sa_family_t rc_family;
278 bdaddr_t rc_bdaddr;
279 u8 rc_channel;
280};
281
282#define RFCOMM_CONNINFO 0x02
283struct rfcomm_conninfo {
284 __u16 hci_handle;
285 __u8 dev_class[3];
286};
287
288#define RFCOMM_LM 0x03
289#define RFCOMM_LM_MASTER 0x0001
290#define RFCOMM_LM_AUTH 0x0002
291#define RFCOMM_LM_ENCRYPT 0x0004
292#define RFCOMM_LM_TRUSTED 0x0008
293#define RFCOMM_LM_RELIABLE 0x0010
294#define RFCOMM_LM_SECURE 0x0020
295
296#define rfcomm_pi(sk) ((struct rfcomm_pinfo *) sk)
297
298struct rfcomm_pinfo {
299 struct bt_sock bt;
300 struct rfcomm_dlc *dlc;
301 u8 channel;
302 u32 link_mode;
303};
304
305int rfcomm_init_sockets(void);
306void rfcomm_cleanup_sockets(void);
307
308int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc **d);
309
310/* ---- RFCOMM TTY ---- */
311#define RFCOMM_MAX_DEV 256
312
313#define RFCOMMCREATEDEV _IOW('R', 200, int)
314#define RFCOMMRELEASEDEV _IOW('R', 201, int)
315#define RFCOMMGETDEVLIST _IOR('R', 210, int)
316#define RFCOMMGETDEVINFO _IOR('R', 211, int)
317#define RFCOMMSTEALDLC _IOW('R', 220, int)
318
319#define RFCOMM_REUSE_DLC 0
320#define RFCOMM_RELEASE_ONHUP 1
321#define RFCOMM_HANGUP_NOW 2
322#define RFCOMM_TTY_ATTACHED 3
323
324struct rfcomm_dev_req {
325 s16 dev_id;
326 u32 flags;
327 bdaddr_t src;
328 bdaddr_t dst;
329 u8 channel;
330
331};
332
333struct rfcomm_dev_info {
334 s16 id;
335 u32 flags;
336 u16 state;
337 bdaddr_t src;
338 bdaddr_t dst;
339 u8 channel;
340};
341
342struct rfcomm_dev_list_req {
343 u16 dev_num;
344 struct rfcomm_dev_info dev_info[0];
345};
346
347int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg);
348int rfcomm_init_ttys(void);
349void rfcomm_cleanup_ttys(void);
350
351extern struct proc_dir_entry *proc_bt_rfcomm;
352
353#endif /* __RFCOMM_H */
diff --git a/include/net/bluetooth/sco.h b/include/net/bluetooth/sco.h
new file mode 100644
index 000000000000..e28a2a771471
--- /dev/null
+++ b/include/net/bluetooth/sco.h
@@ -0,0 +1,79 @@
1/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22 SOFTWARE IS DISCLAIMED.
23*/
24
25#ifndef __SCO_H
26#define __SCO_H
27
28/* SCO defaults */
29#define SCO_DEFAULT_MTU 500
30#define SCO_DEFAULT_FLUSH_TO 0xFFFF
31
32#define SCO_CONN_TIMEOUT (HZ * 40)
33#define SCO_DISCONN_TIMEOUT (HZ * 2)
34#define SCO_CONN_IDLE_TIMEOUT (HZ * 60)
35
36/* SCO socket address */
37struct sockaddr_sco {
38 sa_family_t sco_family;
39 bdaddr_t sco_bdaddr;
40};
41
42/* SCO socket options */
43#define SCO_OPTIONS 0x01
44struct sco_options {
45 __u16 mtu;
46};
47
48#define SCO_CONNINFO 0x02
49struct sco_conninfo {
50 __u16 hci_handle;
51 __u8 dev_class[3];
52};
53
54/* ---- SCO connections ---- */
55struct sco_conn {
56 struct hci_conn *hcon;
57
58 bdaddr_t *dst;
59 bdaddr_t *src;
60
61 spinlock_t lock;
62 struct sock *sk;
63
64 unsigned int mtu;
65};
66
67#define sco_conn_lock(c) spin_lock(&c->lock);
68#define sco_conn_unlock(c) spin_unlock(&c->lock);
69
70/* ----- SCO socket info ----- */
71#define sco_pi(sk) ((struct sco_pinfo *) sk)
72
73struct sco_pinfo {
74 struct bt_sock bt;
75 __u32 flags;
76 struct sco_conn *conn;
77};
78
79#endif /* __SCO_H */