1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include <linux/refcount.h>
25
26#ifndef __RFCOMM_H
27#define __RFCOMM_H
28
29#define RFCOMM_CONN_TIMEOUT (HZ * 30)
30#define RFCOMM_DISC_TIMEOUT (HZ * 20)
31#define RFCOMM_AUTH_TIMEOUT (HZ * 25)
32#define RFCOMM_IDLE_TIMEOUT (HZ * 2)
33
34#define RFCOMM_DEFAULT_MTU 127
35#define RFCOMM_DEFAULT_CREDITS 7
36
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 0x1
84#define RFCOMM_RPN_PARITY_EVEN 0x3
85#define RFCOMM_RPN_PARITY_MARK 0x5
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;
108} __packed;
109
110struct rfcomm_cmd {
111 u8 addr;
112 u8 ctrl;
113 u8 len;
114 u8 fcs;
115} __packed;
116
117struct rfcomm_mcc {
118 u8 type;
119 u8 len;
120} __packed;
121
122struct rfcomm_pn {
123 u8 dlci;
124 u8 flow_ctrl;
125 u8 priority;
126 u8 ack_timer;
127 __le16 mtu;
128 u8 max_retrans;
129 u8 credits;
130} __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 __le16 param_mask;
140} __packed;
141
142struct rfcomm_rls {
143 u8 dlci;
144 u8 status;
145} __packed;
146
147struct rfcomm_msc {
148 u8 dlci;
149 u8 v24_sig;
150} __packed;
151
152
153
154struct rfcomm_session {
155 struct list_head list;
156 struct socket *sock;
157 struct timer_list timer;
158 unsigned long state;
159 unsigned long flags;
160 int initiator;
161
162
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 struct mutex lock;
176 unsigned long state;
177 unsigned long flags;
178 refcount_t refcnt;
179 u8 dlci;
180 u8 addr;
181 u8 priority;
182 u8 v24_sig;
183 u8 remote_v24_sig;
184 u8 mscex;
185 u8 out;
186 u8 sec_level;
187 u8 role_switch;
188 u32 defer_setup;
189
190 uint mtu;
191 uint cfc;
192 uint rx_credits;
193 uint tx_credits;
194
195 void *owner;
196
197 void (*data_ready)(struct rfcomm_dlc *d, struct sk_buff *skb);
198 void (*state_change)(struct rfcomm_dlc *d, int err);
199 void (*modem_status)(struct rfcomm_dlc *d, u8 v24_sig);
200};
201
202
203#define RFCOMM_RX_THROTTLED 0
204#define RFCOMM_TX_THROTTLED 1
205#define RFCOMM_TIMED_OUT 2
206#define RFCOMM_MSC_PENDING 3
207#define RFCOMM_SEC_PENDING 4
208#define RFCOMM_AUTH_PENDING 5
209#define RFCOMM_AUTH_ACCEPT 6
210#define RFCOMM_AUTH_REJECT 7
211#define RFCOMM_DEFER_SETUP 8
212#define RFCOMM_ENC_DROP 9
213
214
215#define RFCOMM_SCHED_WAKEUP 31
216
217
218#define RFCOMM_MSCEX_TX 1
219#define RFCOMM_MSCEX_RX 2
220#define RFCOMM_MSCEX_OK (RFCOMM_MSCEX_TX + RFCOMM_MSCEX_RX)
221
222
223#define RFCOMM_CFC_UNKNOWN -1
224#define RFCOMM_CFC_DISABLED 0
225#define RFCOMM_CFC_ENABLED RFCOMM_MAX_CREDITS
226
227
228int rfcomm_send_rpn(struct rfcomm_session *s, int cr, u8 dlci,
229 u8 bit_rate, u8 data_bits, u8 stop_bits,
230 u8 parity, u8 flow_ctrl_settings,
231 u8 xon_char, u8 xoff_char, u16 param_mask);
232
233
234struct rfcomm_dlc *rfcomm_dlc_alloc(gfp_t prio);
235void rfcomm_dlc_free(struct rfcomm_dlc *d);
236int rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst,
237 u8 channel);
238int rfcomm_dlc_close(struct rfcomm_dlc *d, int reason);
239int rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb);
240void rfcomm_dlc_send_noerror(struct rfcomm_dlc *d, struct sk_buff *skb);
241int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig);
242int rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig);
243void rfcomm_dlc_accept(struct rfcomm_dlc *d);
244struct rfcomm_dlc *rfcomm_dlc_exists(bdaddr_t *src, bdaddr_t *dst, u8 channel);
245
246#define rfcomm_dlc_lock(d) mutex_lock(&d->lock)
247#define rfcomm_dlc_unlock(d) mutex_unlock(&d->lock)
248
249static inline void rfcomm_dlc_hold(struct rfcomm_dlc *d)
250{
251 refcount_inc(&d->refcnt);
252}
253
254static inline void rfcomm_dlc_put(struct rfcomm_dlc *d)
255{
256 if (refcount_dec_and_test(&d->refcnt))
257 rfcomm_dlc_free(d);
258}
259
260void __rfcomm_dlc_throttle(struct rfcomm_dlc *d);
261void __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d);
262
263static inline void rfcomm_dlc_throttle(struct rfcomm_dlc *d)
264{
265 if (!test_and_set_bit(RFCOMM_RX_THROTTLED, &d->flags))
266 __rfcomm_dlc_throttle(d);
267}
268
269static inline void rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)
270{
271 if (test_and_clear_bit(RFCOMM_RX_THROTTLED, &d->flags))
272 __rfcomm_dlc_unthrottle(d);
273}
274
275
276void rfcomm_session_getaddr(struct rfcomm_session *s, bdaddr_t *src,
277 bdaddr_t *dst);
278
279
280struct sockaddr_rc {
281 sa_family_t rc_family;
282 bdaddr_t rc_bdaddr;
283 u8 rc_channel;
284};
285
286#define RFCOMM_CONNINFO 0x02
287struct rfcomm_conninfo {
288 __u16 hci_handle;
289 __u8 dev_class[3];
290};
291
292#define RFCOMM_LM 0x03
293#define RFCOMM_LM_MASTER 0x0001
294#define RFCOMM_LM_AUTH 0x0002
295#define RFCOMM_LM_ENCRYPT 0x0004
296#define RFCOMM_LM_TRUSTED 0x0008
297#define RFCOMM_LM_RELIABLE 0x0010
298#define RFCOMM_LM_SECURE 0x0020
299#define RFCOMM_LM_FIPS 0x0040
300
301#define rfcomm_pi(sk) ((struct rfcomm_pinfo *) sk)
302
303struct rfcomm_pinfo {
304 struct bt_sock bt;
305 bdaddr_t src;
306 bdaddr_t dst;
307 struct rfcomm_dlc *dlc;
308 u8 channel;
309 u8 sec_level;
310 u8 role_switch;
311};
312
313int rfcomm_init_sockets(void);
314void rfcomm_cleanup_sockets(void);
315
316int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel,
317 struct rfcomm_dlc **d);
318
319
320#define RFCOMM_MAX_DEV 256
321
322#define RFCOMMCREATEDEV _IOW('R', 200, int)
323#define RFCOMMRELEASEDEV _IOW('R', 201, int)
324#define RFCOMMGETDEVLIST _IOR('R', 210, int)
325#define RFCOMMGETDEVINFO _IOR('R', 211, int)
326#define RFCOMMSTEALDLC _IOW('R', 220, int)
327
328
329#define RFCOMM_REUSE_DLC 0
330#define RFCOMM_RELEASE_ONHUP 1
331#define RFCOMM_HANGUP_NOW 2
332#define RFCOMM_TTY_ATTACHED 3
333#define RFCOMM_DEFUNCT_BIT4 4
334
335
336#define RFCOMM_DEV_RELEASED 0
337#define RFCOMM_TTY_OWNED 1
338
339struct rfcomm_dev_req {
340 s16 dev_id;
341 u32 flags;
342 bdaddr_t src;
343 bdaddr_t dst;
344 u8 channel;
345};
346
347struct rfcomm_dev_info {
348 s16 id;
349 u32 flags;
350 u16 state;
351 bdaddr_t src;
352 bdaddr_t dst;
353 u8 channel;
354};
355
356struct rfcomm_dev_list_req {
357 u16 dev_num;
358 struct rfcomm_dev_info dev_info[];
359};
360
361int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg);
362
363#ifdef CONFIG_BT_RFCOMM_TTY
364int rfcomm_init_ttys(void);
365void rfcomm_cleanup_ttys(void);
366#else
367static inline int rfcomm_init_ttys(void)
368{
369 return 0;
370}
371static inline void rfcomm_cleanup_ttys(void)
372{
373}
374#endif
375#endif
376