]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 | |
3a5e903c S |
83 | #define RFCOMM_RPN_PARITY_ODD 0x1 |
84 | #define RFCOMM_RPN_PARITY_EVEN 0x3 | |
85 | #define RFCOMM_RPN_PARITY_MARK 0x5 | |
1da177e4 LT |
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 | ||
3a5e903c S |
226 | /* ---- RFCOMM SEND RPN ---- */ |
227 | int rfcomm_send_rpn(struct rfcomm_session *s, int cr, u8 dlci, | |
228 | u8 bit_rate, u8 data_bits, u8 stop_bits, | |
229 | u8 parity, u8 flow_ctrl_settings, | |
230 | u8 xon_char, u8 xoff_char, u16 param_mask); | |
231 | ||
1da177e4 | 232 | /* ---- RFCOMM DLCs (channels) ---- */ |
dd0fc66f | 233 | struct rfcomm_dlc *rfcomm_dlc_alloc(gfp_t prio); |
1da177e4 LT |
234 | void rfcomm_dlc_free(struct rfcomm_dlc *d); |
235 | int rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel); | |
236 | int rfcomm_dlc_close(struct rfcomm_dlc *d, int reason); | |
237 | int rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb); | |
238 | int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig); | |
239 | int rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig); | |
240 | ||
241 | #define rfcomm_dlc_lock(d) spin_lock(&d->lock) | |
242 | #define rfcomm_dlc_unlock(d) spin_unlock(&d->lock) | |
243 | ||
244 | static inline void rfcomm_dlc_hold(struct rfcomm_dlc *d) | |
245 | { | |
246 | atomic_inc(&d->refcnt); | |
247 | } | |
248 | ||
249 | static inline void rfcomm_dlc_put(struct rfcomm_dlc *d) | |
250 | { | |
251 | if (atomic_dec_and_test(&d->refcnt)) | |
252 | rfcomm_dlc_free(d); | |
253 | } | |
254 | ||
255 | extern void FASTCALL(__rfcomm_dlc_throttle(struct rfcomm_dlc *d)); | |
256 | extern void FASTCALL(__rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)); | |
257 | ||
258 | static inline void rfcomm_dlc_throttle(struct rfcomm_dlc *d) | |
259 | { | |
260 | if (!test_and_set_bit(RFCOMM_RX_THROTTLED, &d->flags)) | |
261 | __rfcomm_dlc_throttle(d); | |
262 | } | |
263 | ||
264 | static inline void rfcomm_dlc_unthrottle(struct rfcomm_dlc *d) | |
265 | { | |
266 | if (test_and_clear_bit(RFCOMM_RX_THROTTLED, &d->flags)) | |
267 | __rfcomm_dlc_unthrottle(d); | |
268 | } | |
269 | ||
270 | /* ---- RFCOMM sessions ---- */ | |
271 | void rfcomm_session_getaddr(struct rfcomm_session *s, bdaddr_t *src, bdaddr_t *dst); | |
272 | ||
273 | static inline void rfcomm_session_hold(struct rfcomm_session *s) | |
274 | { | |
275 | atomic_inc(&s->refcnt); | |
276 | } | |
277 | ||
278 | /* ---- RFCOMM chechsum ---- */ | |
279 | extern u8 rfcomm_crc_table[]; | |
280 | ||
281 | /* ---- RFCOMM sockets ---- */ | |
282 | struct sockaddr_rc { | |
283 | sa_family_t rc_family; | |
284 | bdaddr_t rc_bdaddr; | |
285 | u8 rc_channel; | |
286 | }; | |
287 | ||
288 | #define RFCOMM_CONNINFO 0x02 | |
289 | struct rfcomm_conninfo { | |
290 | __u16 hci_handle; | |
291 | __u8 dev_class[3]; | |
292 | }; | |
293 | ||
294 | #define RFCOMM_LM 0x03 | |
295 | #define RFCOMM_LM_MASTER 0x0001 | |
296 | #define RFCOMM_LM_AUTH 0x0002 | |
297 | #define RFCOMM_LM_ENCRYPT 0x0004 | |
298 | #define RFCOMM_LM_TRUSTED 0x0008 | |
299 | #define RFCOMM_LM_RELIABLE 0x0010 | |
300 | #define RFCOMM_LM_SECURE 0x0020 | |
301 | ||
302 | #define rfcomm_pi(sk) ((struct rfcomm_pinfo *) sk) | |
303 | ||
304 | struct rfcomm_pinfo { | |
305 | struct bt_sock bt; | |
306 | struct rfcomm_dlc *dlc; | |
307 | u8 channel; | |
308 | u32 link_mode; | |
309 | }; | |
310 | ||
311 | int rfcomm_init_sockets(void); | |
312 | void rfcomm_cleanup_sockets(void); | |
313 | ||
314 | int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc **d); | |
315 | ||
316 | /* ---- RFCOMM TTY ---- */ | |
317 | #define RFCOMM_MAX_DEV 256 | |
318 | ||
319 | #define RFCOMMCREATEDEV _IOW('R', 200, int) | |
320 | #define RFCOMMRELEASEDEV _IOW('R', 201, int) | |
321 | #define RFCOMMGETDEVLIST _IOR('R', 210, int) | |
322 | #define RFCOMMGETDEVINFO _IOR('R', 211, int) | |
323 | #define RFCOMMSTEALDLC _IOW('R', 220, int) | |
324 | ||
325 | #define RFCOMM_REUSE_DLC 0 | |
326 | #define RFCOMM_RELEASE_ONHUP 1 | |
327 | #define RFCOMM_HANGUP_NOW 2 | |
328 | #define RFCOMM_TTY_ATTACHED 3 | |
329 | ||
330 | struct rfcomm_dev_req { | |
331 | s16 dev_id; | |
332 | u32 flags; | |
333 | bdaddr_t src; | |
334 | bdaddr_t dst; | |
335 | u8 channel; | |
336 | ||
337 | }; | |
338 | ||
339 | struct rfcomm_dev_info { | |
340 | s16 id; | |
341 | u32 flags; | |
342 | u16 state; | |
343 | bdaddr_t src; | |
344 | bdaddr_t dst; | |
345 | u8 channel; | |
346 | }; | |
347 | ||
348 | struct rfcomm_dev_list_req { | |
349 | u16 dev_num; | |
350 | struct rfcomm_dev_info dev_info[0]; | |
351 | }; | |
352 | ||
353 | int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg); | |
354 | int rfcomm_init_ttys(void); | |
355 | void rfcomm_cleanup_ttys(void); | |
356 | ||
357 | extern struct proc_dir_entry *proc_bt_rfcomm; | |
358 | ||
359 | #endif /* __RFCOMM_H */ |