diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /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.h | 181 | ||||
-rw-r--r-- | include/net/bluetooth/hci.h | 755 | ||||
-rw-r--r-- | include/net/bluetooth/hci_core.h | 626 | ||||
-rw-r--r-- | include/net/bluetooth/l2cap.h | 238 | ||||
-rw-r--r-- | include/net/bluetooth/rfcomm.h | 353 | ||||
-rw-r--r-- | include/net/bluetooth/sco.h | 79 |
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 | |||
66 | extern struct proc_dir_entry *proc_bt; | ||
67 | |||
68 | /* Connection and socket states */ | ||
69 | enum { | ||
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 */ | ||
88 | typedef 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 */ | ||
96 | static inline int bacmp(bdaddr_t *ba1, bdaddr_t *ba2) | ||
97 | { | ||
98 | return memcmp(ba1, ba2, sizeof(bdaddr_t)); | ||
99 | } | ||
100 | static inline void bacpy(bdaddr_t *dst, bdaddr_t *src) | ||
101 | { | ||
102 | memcpy(dst, src, sizeof(bdaddr_t)); | ||
103 | } | ||
104 | |||
105 | void baswap(bdaddr_t *dst, bdaddr_t *src); | ||
106 | char *batostr(bdaddr_t *ba); | ||
107 | bdaddr_t *strtoba(char *str); | ||
108 | |||
109 | /* Common socket structures and functions */ | ||
110 | |||
111 | #define bt_sk(__sk) ((struct bt_sock *) __sk) | ||
112 | |||
113 | struct 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 | |||
121 | struct bt_sock_list { | ||
122 | struct hlist_head head; | ||
123 | rwlock_t lock; | ||
124 | }; | ||
125 | |||
126 | int bt_sock_register(int proto, struct net_proto_family *ops); | ||
127 | int bt_sock_unregister(int proto); | ||
128 | void bt_sock_link(struct bt_sock_list *l, struct sock *s); | ||
129 | void bt_sock_unlink(struct bt_sock_list *l, struct sock *s); | ||
130 | int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags); | ||
131 | uint bt_sock_poll(struct file * file, struct socket *sock, poll_table *wait); | ||
132 | int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo); | ||
133 | |||
134 | void bt_accept_enqueue(struct sock *parent, struct sock *sk); | ||
135 | void bt_accept_unlink(struct sock *sk); | ||
136 | struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock); | ||
137 | |||
138 | /* Skb helpers */ | ||
139 | struct bt_skb_cb { | ||
140 | int incoming; | ||
141 | }; | ||
142 | #define bt_cb(skb) ((struct bt_skb_cb *)(skb->cb)) | ||
143 | |||
144 | static 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 | |||
155 | static 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 | |||
168 | static 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 | |||
177 | void bt_dump(char *pref, __u8 *buf, int count); | ||
178 | |||
179 | int 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 */ | ||
55 | enum { | ||
56 | HCI_QUIRK_RESET_ON_INIT, | ||
57 | HCI_QUIRK_RAW_DEVICE | ||
58 | }; | ||
59 | |||
60 | /* HCI device flags */ | ||
61 | enum { | ||
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 | ||
184 | struct 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 | ||
194 | struct hci_rp_read_loc_features { | ||
195 | __u8 status; | ||
196 | __u8 features[8]; | ||
197 | } __attribute__ ((packed)); | ||
198 | |||
199 | #define OCF_READ_BUFFER_SIZE 0x0005 | ||
200 | struct 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 | ||
209 | struct 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 | ||
237 | struct 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 | ||
258 | struct 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 | ||
264 | struct hci_cp_write_dev_class { | ||
265 | __u8 dev_class[3]; | ||
266 | } __attribute__ ((packed)); | ||
267 | |||
268 | #define OCF_READ_VOICE_SETTING 0x0025 | ||
269 | struct hci_rp_read_voice_setting { | ||
270 | __u8 status; | ||
271 | __u16 voice_setting; | ||
272 | } __attribute__ ((packed)); | ||
273 | |||
274 | #define OCF_WRITE_VOICE_SETTING 0x0026 | ||
275 | struct hci_cp_write_voice_setting { | ||
276 | __u16 voice_setting; | ||
277 | } __attribute__ ((packed)); | ||
278 | |||
279 | #define OCF_HOST_BUFFER_SIZE 0x0033 | ||
280 | struct 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 | ||
290 | struct 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 | ||
300 | struct hci_cp_accept_conn_req { | ||
301 | bdaddr_t bdaddr; | ||
302 | __u8 role; | ||
303 | } __attribute__ ((packed)); | ||
304 | |||
305 | #define OCF_REJECT_CONN_REQ 0x000a | ||
306 | struct hci_cp_reject_conn_req { | ||
307 | bdaddr_t bdaddr; | ||
308 | __u8 reason; | ||
309 | } __attribute__ ((packed)); | ||
310 | |||
311 | #define OCF_DISCONNECT 0x0006 | ||
312 | struct hci_cp_disconnect { | ||
313 | __u16 handle; | ||
314 | __u8 reason; | ||
315 | } __attribute__ ((packed)); | ||
316 | |||
317 | #define OCF_ADD_SCO 0x0007 | ||
318 | struct hci_cp_add_sco { | ||
319 | __u16 handle; | ||
320 | __u16 pkt_type; | ||
321 | } __attribute__ ((packed)); | ||
322 | |||
323 | #define OCF_INQUIRY 0x0001 | ||
324 | struct 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 | ||
333 | struct 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 | ||
339 | struct hci_cp_link_key_neg_reply { | ||
340 | bdaddr_t bdaddr; | ||
341 | } __attribute__ ((packed)); | ||
342 | |||
343 | #define OCF_PIN_CODE_REPLY 0x000D | ||
344 | struct 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 | ||
351 | struct hci_cp_pin_code_neg_reply { | ||
352 | bdaddr_t bdaddr; | ||
353 | } __attribute__ ((packed)); | ||
354 | |||
355 | #define OCF_CHANGE_CONN_PTYPE 0x000F | ||
356 | struct hci_cp_change_conn_ptype { | ||
357 | __u16 handle; | ||
358 | __u16 pkt_type; | ||
359 | } __attribute__ ((packed)); | ||
360 | |||
361 | #define OCF_AUTH_REQUESTED 0x0011 | ||
362 | struct hci_cp_auth_requested { | ||
363 | __u16 handle; | ||
364 | } __attribute__ ((packed)); | ||
365 | |||
366 | #define OCF_SET_CONN_ENCRYPT 0x0013 | ||
367 | struct hci_cp_set_conn_encrypt { | ||
368 | __u16 handle; | ||
369 | __u8 encrypt; | ||
370 | } __attribute__ ((packed)); | ||
371 | |||
372 | #define OCF_CHANGE_CONN_LINK_KEY 0x0015 | ||
373 | struct hci_cp_change_conn_link_key { | ||
374 | __u16 handle; | ||
375 | } __attribute__ ((packed)); | ||
376 | |||
377 | #define OCF_READ_REMOTE_FEATURES 0x001B | ||
378 | struct hci_cp_read_rmt_features { | ||
379 | __u16 handle; | ||
380 | } __attribute__ ((packed)); | ||
381 | |||
382 | #define OCF_READ_REMOTE_VERSION 0x001D | ||
383 | struct 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 | ||
390 | struct hci_cp_role_discovery { | ||
391 | __u16 handle; | ||
392 | } __attribute__ ((packed)); | ||
393 | struct hci_rp_role_discovery { | ||
394 | __u8 status; | ||
395 | __u16 handle; | ||
396 | __u8 role; | ||
397 | } __attribute__ ((packed)); | ||
398 | |||
399 | #define OCF_READ_LINK_POLICY 0x000C | ||
400 | struct hci_cp_read_link_policy { | ||
401 | __u16 handle; | ||
402 | } __attribute__ ((packed)); | ||
403 | struct hci_rp_read_link_policy { | ||
404 | __u8 status; | ||
405 | __u16 handle; | ||
406 | __u16 policy; | ||
407 | } __attribute__ ((packed)); | ||
408 | |||
409 | #define OCF_SWITCH_ROLE 0x000B | ||
410 | struct hci_cp_switch_role { | ||
411 | bdaddr_t bdaddr; | ||
412 | __u8 role; | ||
413 | } __attribute__ ((packed)); | ||
414 | |||
415 | #define OCF_WRITE_LINK_POLICY 0x000D | ||
416 | struct hci_cp_write_link_policy { | ||
417 | __u16 handle; | ||
418 | __u16 policy; | ||
419 | } __attribute__ ((packed)); | ||
420 | struct 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 | ||
438 | struct 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 | ||
448 | struct 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 | ||
458 | struct 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 | ||
467 | struct 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 | ||
474 | struct hci_ev_disconn_complete { | ||
475 | __u8 status; | ||
476 | __u16 handle; | ||
477 | __u8 reason; | ||
478 | } __attribute__ ((packed)); | ||
479 | |||
480 | #define HCI_EV_AUTH_COMPLETE 0x06 | ||
481 | struct hci_ev_auth_complete { | ||
482 | __u8 status; | ||
483 | __u16 handle; | ||
484 | } __attribute__ ((packed)); | ||
485 | |||
486 | #define HCI_EV_ENCRYPT_CHANGE 0x08 | ||
487 | struct 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 | ||
494 | struct 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 | ||
500 | struct hci_qos { | ||
501 | __u8 service_type; | ||
502 | __u32 token_rate; | ||
503 | __u32 peak_bandwidth; | ||
504 | __u32 latency; | ||
505 | __u32 delay_variation; | ||
506 | } __attribute__ ((packed)); | ||
507 | struct 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 | ||
514 | struct hci_ev_cmd_complete { | ||
515 | __u8 ncmd; | ||
516 | __u16 opcode; | ||
517 | } __attribute__ ((packed)); | ||
518 | |||
519 | #define HCI_EV_CMD_STATUS 0x0F | ||
520 | struct 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 | ||
527 | struct hci_ev_num_comp_pkts { | ||
528 | __u8 num_hndl; | ||
529 | /* variable length part */ | ||
530 | } __attribute__ ((packed)); | ||
531 | |||
532 | #define HCI_EV_ROLE_CHANGE 0x12 | ||
533 | struct 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 | ||
540 | struct 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 | ||
548 | struct hci_ev_pin_code_req { | ||
549 | bdaddr_t bdaddr; | ||
550 | } __attribute__ ((packed)); | ||
551 | |||
552 | #define HCI_EV_LINK_KEY_REQ 0x17 | ||
553 | struct hci_ev_link_key_req { | ||
554 | bdaddr_t bdaddr; | ||
555 | } __attribute__ ((packed)); | ||
556 | |||
557 | #define HCI_EV_LINK_KEY_NOTIFY 0x18 | ||
558 | struct 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 | ||
565 | struct 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 | ||
572 | struct 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 | ||
581 | struct 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 | ||
589 | struct hci_ev_stack_internal { | ||
590 | __u16 type; | ||
591 | __u8 data[0]; | ||
592 | } __attribute__ ((packed)); | ||
593 | |||
594 | #define HCI_EV_SI_DEVICE 0x01 | ||
595 | struct hci_ev_si_device { | ||
596 | __u16 event; | ||
597 | __u16 dev_id; | ||
598 | } __attribute__ ((packed)); | ||
599 | |||
600 | #define HCI_EV_SI_SECURITY 0x02 | ||
601 | struct 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 | |||
614 | struct hci_command_hdr { | ||
615 | __u16 opcode; /* OCF & OGF */ | ||
616 | __u8 plen; | ||
617 | } __attribute__ ((packed)); | ||
618 | |||
619 | struct hci_event_hdr { | ||
620 | __u8 evt; | ||
621 | __u8 plen; | ||
622 | } __attribute__ ((packed)); | ||
623 | |||
624 | struct hci_acl_hdr { | ||
625 | __u16 handle; /* Handle & Flags(PB, BC) */ | ||
626 | __u16 dlen; | ||
627 | } __attribute__ ((packed)); | ||
628 | |||
629 | struct 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 | |||
655 | struct sockaddr_hci { | ||
656 | sa_family_t hci_family; | ||
657 | unsigned short hci_dev; | ||
658 | }; | ||
659 | #define HCI_DEV_NONE 0xffff | ||
660 | |||
661 | struct hci_filter { | ||
662 | unsigned long type_mask; | ||
663 | unsigned long event_mask[2]; | ||
664 | __u16 opcode; | ||
665 | }; | ||
666 | |||
667 | struct 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 ---- */ | ||
679 | struct 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 | |||
692 | struct 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 | |||
715 | struct 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 | |||
724 | struct hci_dev_req { | ||
725 | __u16 dev_id; | ||
726 | __u32 dev_opt; | ||
727 | }; | ||
728 | |||
729 | struct hci_dev_list_req { | ||
730 | __u16 dev_num; | ||
731 | struct hci_dev_req dev_req[0]; /* hci_dev_req structures */ | ||
732 | }; | ||
733 | |||
734 | struct hci_conn_list_req { | ||
735 | __u16 dev_id; | ||
736 | __u16 conn_num; | ||
737 | struct hci_conn_info conn_info[0]; | ||
738 | }; | ||
739 | |||
740 | struct hci_conn_info_req { | ||
741 | bdaddr_t bdaddr; | ||
742 | __u8 type; | ||
743 | struct hci_conn_info conn_info[0]; | ||
744 | }; | ||
745 | |||
746 | struct 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 | |||
37 | extern struct proc_dir_entry *proc_bt_hci; | ||
38 | |||
39 | /* HCI Core structures */ | ||
40 | |||
41 | struct 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 | |||
51 | struct inquiry_entry { | ||
52 | struct inquiry_entry *next; | ||
53 | __u32 timestamp; | ||
54 | struct inquiry_data data; | ||
55 | }; | ||
56 | |||
57 | struct inquiry_cache { | ||
58 | spinlock_t lock; | ||
59 | __u32 timestamp; | ||
60 | struct inquiry_entry *list; | ||
61 | }; | ||
62 | |||
63 | struct hci_conn_hash { | ||
64 | struct list_head list; | ||
65 | spinlock_t lock; | ||
66 | unsigned int acl_num; | ||
67 | unsigned int sco_num; | ||
68 | }; | ||
69 | |||
70 | struct 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 | |||
146 | struct 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 | |||
175 | extern struct hci_proto *hci_proto[]; | ||
176 | extern struct list_head hci_dev_list; | ||
177 | extern struct list_head hci_cb_list; | ||
178 | extern rwlock_t hci_dev_list_lock; | ||
179 | extern 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 | |||
190 | static 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 | |||
197 | static 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 | |||
203 | static 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 | |||
209 | static inline long inquiry_entry_age(struct inquiry_entry *e) | ||
210 | { | ||
211 | return jiffies - e->timestamp; | ||
212 | } | ||
213 | |||
214 | struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr); | ||
215 | void hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data); | ||
216 | |||
217 | /* ----- HCI Connections ----- */ | ||
218 | enum { | ||
219 | HCI_CONN_AUTH_PEND, | ||
220 | HCI_CONN_ENCRYPT_PEND, | ||
221 | HCI_CONN_RSWITCH_PEND | ||
222 | }; | ||
223 | |||
224 | static 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 | |||
233 | static 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 | |||
243 | static 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 | |||
253 | static 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 | |||
268 | static 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 | |||
283 | void hci_acl_disconn(struct hci_conn *conn, __u8 reason); | ||
284 | void hci_add_sco(struct hci_conn *conn, __u16 handle); | ||
285 | |||
286 | struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst); | ||
287 | int hci_conn_del(struct hci_conn *conn); | ||
288 | void hci_conn_hash_flush(struct hci_dev *hdev); | ||
289 | |||
290 | struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *src); | ||
291 | int hci_conn_auth(struct hci_conn *conn); | ||
292 | int hci_conn_encrypt(struct hci_conn *conn); | ||
293 | int hci_conn_change_link_key(struct hci_conn *conn); | ||
294 | int hci_conn_switch_role(struct hci_conn *conn, uint8_t role); | ||
295 | |||
296 | static inline void hci_conn_set_timer(struct hci_conn *conn, unsigned long timeout) | ||
297 | { | ||
298 | mod_timer(&conn->timer, jiffies + timeout); | ||
299 | } | ||
300 | |||
301 | static inline void hci_conn_del_timer(struct hci_conn *conn) | ||
302 | { | ||
303 | del_timer(&conn->timer); | ||
304 | } | ||
305 | |||
306 | static inline void hci_conn_hold(struct hci_conn *conn) | ||
307 | { | ||
308 | atomic_inc(&conn->refcnt); | ||
309 | hci_conn_del_timer(conn); | ||
310 | } | ||
311 | |||
312 | static 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 ----- */ | ||
325 | static inline void hci_sched_cmd(struct hci_dev *hdev) | ||
326 | { | ||
327 | tasklet_schedule(&hdev->cmd_task); | ||
328 | } | ||
329 | |||
330 | static inline void hci_sched_rx(struct hci_dev *hdev) | ||
331 | { | ||
332 | tasklet_schedule(&hdev->rx_task); | ||
333 | } | ||
334 | |||
335 | static inline void hci_sched_tx(struct hci_dev *hdev) | ||
336 | { | ||
337 | tasklet_schedule(&hdev->tx_task); | ||
338 | } | ||
339 | |||
340 | /* ----- HCI Devices ----- */ | ||
341 | static inline void __hci_dev_put(struct hci_dev *d) | ||
342 | { | ||
343 | if (atomic_dec_and_test(&d->refcnt)) | ||
344 | d->destruct(d); | ||
345 | } | ||
346 | |||
347 | static inline void hci_dev_put(struct hci_dev *d) | ||
348 | { | ||
349 | __hci_dev_put(d); | ||
350 | module_put(d->owner); | ||
351 | } | ||
352 | |||
353 | static inline struct hci_dev *__hci_dev_hold(struct hci_dev *d) | ||
354 | { | ||
355 | atomic_inc(&d->refcnt); | ||
356 | return d; | ||
357 | } | ||
358 | |||
359 | static 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 | |||
371 | struct hci_dev *hci_dev_get(int index); | ||
372 | struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst); | ||
373 | |||
374 | struct hci_dev *hci_alloc_dev(void); | ||
375 | void hci_free_dev(struct hci_dev *hdev); | ||
376 | int hci_register_dev(struct hci_dev *hdev); | ||
377 | int hci_unregister_dev(struct hci_dev *hdev); | ||
378 | int hci_suspend_dev(struct hci_dev *hdev); | ||
379 | int hci_resume_dev(struct hci_dev *hdev); | ||
380 | int hci_dev_open(__u16 dev); | ||
381 | int hci_dev_close(__u16 dev); | ||
382 | int hci_dev_reset(__u16 dev); | ||
383 | int hci_dev_reset_stat(__u16 dev); | ||
384 | int hci_dev_cmd(unsigned int cmd, void __user *arg); | ||
385 | int hci_get_dev_list(void __user *arg); | ||
386 | int hci_get_dev_info(void __user *arg); | ||
387 | int hci_get_conn_list(void __user *arg); | ||
388 | int hci_get_conn_info(struct hci_dev *hdev, void __user *arg); | ||
389 | int hci_inquiry(void __user *arg); | ||
390 | |||
391 | void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb); | ||
392 | |||
393 | /* Receive frame from HCI drivers */ | ||
394 | static 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 | |||
415 | int hci_register_sysfs(struct hci_dev *hdev); | ||
416 | void 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 ----- */ | ||
425 | struct 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 | |||
441 | static 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 | |||
457 | static 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 | |||
470 | static 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 | |||
483 | static 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 | |||
496 | static 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 | |||
509 | int hci_register_proto(struct hci_proto *hproto); | ||
510 | int hci_unregister_proto(struct hci_proto *hproto); | ||
511 | |||
512 | /* ----- HCI callbacks ----- */ | ||
513 | struct 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 | |||
524 | static 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 | |||
539 | static 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 | |||
554 | static 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 | |||
567 | static 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 | |||
580 | int hci_register_cb(struct hci_cb *hcb); | ||
581 | int hci_unregister_cb(struct hci_cb *hcb); | ||
582 | |||
583 | int hci_register_notifier(struct notifier_block *nb); | ||
584 | int hci_unregister_notifier(struct notifier_block *nb); | ||
585 | |||
586 | int hci_send_cmd(struct hci_dev *hdev, __u16 ogf, __u16 ocf, __u32 plen, void *param); | ||
587 | int hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags); | ||
588 | int hci_send_sco(struct hci_conn *conn, struct sk_buff *skb); | ||
589 | |||
590 | void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 ogf, __u16 ocf); | ||
591 | |||
592 | void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data); | ||
593 | |||
594 | /* ----- HCI Sockets ----- */ | ||
595 | void 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 | |||
600 | struct 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 | |||
610 | struct 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 | |||
624 | void 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 */ | ||
35 | struct 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 | ||
43 | struct l2cap_options { | ||
44 | __u16 omtu; | ||
45 | __u16 imtu; | ||
46 | __u16 flush_to; | ||
47 | __u8 mode; | ||
48 | }; | ||
49 | |||
50 | #define L2CAP_CONNINFO 0x02 | ||
51 | struct 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 */ | ||
78 | struct l2cap_hdr { | ||
79 | __u16 len; | ||
80 | __u16 cid; | ||
81 | } __attribute__ ((packed)); | ||
82 | #define L2CAP_HDR_SIZE 4 | ||
83 | |||
84 | struct l2cap_cmd_hdr { | ||
85 | __u8 code; | ||
86 | __u8 ident; | ||
87 | __u16 len; | ||
88 | } __attribute__ ((packed)); | ||
89 | #define L2CAP_CMD_HDR_SIZE 4 | ||
90 | |||
91 | struct l2cap_cmd_rej { | ||
92 | __u16 reason; | ||
93 | } __attribute__ ((packed)); | ||
94 | |||
95 | struct l2cap_conn_req { | ||
96 | __u16 psm; | ||
97 | __u16 scid; | ||
98 | } __attribute__ ((packed)); | ||
99 | |||
100 | struct 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 | |||
119 | struct l2cap_conf_req { | ||
120 | __u16 dcid; | ||
121 | __u16 flags; | ||
122 | __u8 data[0]; | ||
123 | } __attribute__ ((packed)); | ||
124 | |||
125 | struct 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 | |||
135 | struct 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 | |||
149 | struct l2cap_disconn_req { | ||
150 | __u16 dcid; | ||
151 | __u16 scid; | ||
152 | } __attribute__ ((packed)); | ||
153 | |||
154 | struct l2cap_disconn_rsp { | ||
155 | __u16 dcid; | ||
156 | __u16 scid; | ||
157 | } __attribute__ ((packed)); | ||
158 | |||
159 | struct l2cap_info_req { | ||
160 | __u16 type; | ||
161 | __u8 data[0]; | ||
162 | } __attribute__ ((packed)); | ||
163 | |||
164 | struct 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 ----- */ | ||
179 | struct l2cap_chan_list { | ||
180 | struct sock *head; | ||
181 | rwlock_t lock; | ||
182 | long num; | ||
183 | }; | ||
184 | |||
185 | struct 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 | |||
206 | struct 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 | |||
236 | void 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 | |||
104 | struct rfcomm_hdr { | ||
105 | u8 addr; | ||
106 | u8 ctrl; | ||
107 | u8 len; // Actual size can be 2 bytes | ||
108 | } __attribute__ ((packed)); | ||
109 | |||
110 | struct rfcomm_cmd { | ||
111 | u8 addr; | ||
112 | u8 ctrl; | ||
113 | u8 len; | ||
114 | u8 fcs; | ||
115 | } __attribute__ ((packed)); | ||
116 | |||
117 | struct rfcomm_mcc { | ||
118 | u8 type; | ||
119 | u8 len; | ||
120 | } __attribute__ ((packed)); | ||
121 | |||
122 | struct 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 | |||
132 | struct 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 | |||
142 | struct rfcomm_rls { | ||
143 | u8 dlci; | ||
144 | u8 status; | ||
145 | } __attribute__ ((packed)); | ||
146 | |||
147 | struct rfcomm_msc { | ||
148 | u8 dlci; | ||
149 | u8 v24_sig; | ||
150 | } __attribute__ ((packed)); | ||
151 | |||
152 | /* ---- Core structures, flags etc ---- */ | ||
153 | |||
154 | struct 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 | |||
169 | struct 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) ---- */ | ||
227 | struct rfcomm_dlc *rfcomm_dlc_alloc(int prio); | ||
228 | void rfcomm_dlc_free(struct rfcomm_dlc *d); | ||
229 | int rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel); | ||
230 | int rfcomm_dlc_close(struct rfcomm_dlc *d, int reason); | ||
231 | int rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb); | ||
232 | int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig); | ||
233 | int 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 | |||
238 | static inline void rfcomm_dlc_hold(struct rfcomm_dlc *d) | ||
239 | { | ||
240 | atomic_inc(&d->refcnt); | ||
241 | } | ||
242 | |||
243 | static 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 | |||
249 | extern void FASTCALL(__rfcomm_dlc_throttle(struct rfcomm_dlc *d)); | ||
250 | extern void FASTCALL(__rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)); | ||
251 | |||
252 | static 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 | |||
258 | static 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 ---- */ | ||
265 | void rfcomm_session_getaddr(struct rfcomm_session *s, bdaddr_t *src, bdaddr_t *dst); | ||
266 | |||
267 | static inline void rfcomm_session_hold(struct rfcomm_session *s) | ||
268 | { | ||
269 | atomic_inc(&s->refcnt); | ||
270 | } | ||
271 | |||
272 | /* ---- RFCOMM chechsum ---- */ | ||
273 | extern u8 rfcomm_crc_table[]; | ||
274 | |||
275 | /* ---- RFCOMM sockets ---- */ | ||
276 | struct sockaddr_rc { | ||
277 | sa_family_t rc_family; | ||
278 | bdaddr_t rc_bdaddr; | ||
279 | u8 rc_channel; | ||
280 | }; | ||
281 | |||
282 | #define RFCOMM_CONNINFO 0x02 | ||
283 | struct 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 | |||
298 | struct rfcomm_pinfo { | ||
299 | struct bt_sock bt; | ||
300 | struct rfcomm_dlc *dlc; | ||
301 | u8 channel; | ||
302 | u32 link_mode; | ||
303 | }; | ||
304 | |||
305 | int rfcomm_init_sockets(void); | ||
306 | void rfcomm_cleanup_sockets(void); | ||
307 | |||
308 | int 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 | |||
324 | struct rfcomm_dev_req { | ||
325 | s16 dev_id; | ||
326 | u32 flags; | ||
327 | bdaddr_t src; | ||
328 | bdaddr_t dst; | ||
329 | u8 channel; | ||
330 | |||
331 | }; | ||
332 | |||
333 | struct 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 | |||
342 | struct rfcomm_dev_list_req { | ||
343 | u16 dev_num; | ||
344 | struct rfcomm_dev_info dev_info[0]; | ||
345 | }; | ||
346 | |||
347 | int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg); | ||
348 | int rfcomm_init_ttys(void); | ||
349 | void rfcomm_cleanup_ttys(void); | ||
350 | |||
351 | extern 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 */ | ||
37 | struct sockaddr_sco { | ||
38 | sa_family_t sco_family; | ||
39 | bdaddr_t sco_bdaddr; | ||
40 | }; | ||
41 | |||
42 | /* SCO socket options */ | ||
43 | #define SCO_OPTIONS 0x01 | ||
44 | struct sco_options { | ||
45 | __u16 mtu; | ||
46 | }; | ||
47 | |||
48 | #define SCO_CONNINFO 0x02 | ||
49 | struct sco_conninfo { | ||
50 | __u16 hci_handle; | ||
51 | __u8 dev_class[3]; | ||
52 | }; | ||
53 | |||
54 | /* ---- SCO connections ---- */ | ||
55 | struct 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 | |||
73 | struct sco_pinfo { | ||
74 | struct bt_sock bt; | ||
75 | __u32 flags; | ||
76 | struct sco_conn *conn; | ||
77 | }; | ||
78 | |||
79 | #endif /* __SCO_H */ | ||