1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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#define RFCOMM_IDLE_TIMEOUT (HZ * 2)
33
34#define RFCOMM_DEFAULT_MTU 127
35#define RFCOMM_DEFAULT_CREDITS 7
36
37#define RFCOMM_MAX_L2CAP_MTU 1013
38#define RFCOMM_MAX_CREDITS 40
39
40#define RFCOMM_SKB_HEAD_RESERVE 8
41#define RFCOMM_SKB_TAIL_RESERVE 2
42#define RFCOMM_SKB_RESERVE (RFCOMM_SKB_HEAD_RESERVE + RFCOMM_SKB_TAIL_RESERVE)
43
44#define RFCOMM_SABM 0x2f
45#define RFCOMM_DISC 0x43
46#define RFCOMM_UA 0x63
47#define RFCOMM_DM 0x0f
48#define RFCOMM_UIH 0xef
49
50#define RFCOMM_TEST 0x08
51#define RFCOMM_FCON 0x28
52#define RFCOMM_FCOFF 0x18
53#define RFCOMM_MSC 0x38
54#define RFCOMM_RPN 0x24
55#define RFCOMM_RLS 0x14
56#define RFCOMM_PN 0x20
57#define RFCOMM_NSC 0x04
58
59#define RFCOMM_V24_FC 0x02
60#define RFCOMM_V24_RTC 0x04
61#define RFCOMM_V24_RTR 0x08
62#define RFCOMM_V24_IC 0x40
63#define RFCOMM_V24_DV 0x80
64
65#define RFCOMM_RPN_BR_2400 0x0
66#define RFCOMM_RPN_BR_4800 0x1
67#define RFCOMM_RPN_BR_7200 0x2
68#define RFCOMM_RPN_BR_9600 0x3
69#define RFCOMM_RPN_BR_19200 0x4
70#define RFCOMM_RPN_BR_38400 0x5
71#define RFCOMM_RPN_BR_57600 0x6
72#define RFCOMM_RPN_BR_115200 0x7
73#define RFCOMM_RPN_BR_230400 0x8
74
75#define RFCOMM_RPN_DATA_5 0x0
76#define RFCOMM_RPN_DATA_6 0x1
77#define RFCOMM_RPN_DATA_7 0x2
78#define RFCOMM_RPN_DATA_8 0x3
79
80#define RFCOMM_RPN_STOP_1 0
81#define RFCOMM_RPN_STOP_15 1
82
83#define RFCOMM_RPN_PARITY_NONE 0x0
84#define RFCOMM_RPN_PARITY_ODD 0x1
85#define RFCOMM_RPN_PARITY_EVEN 0x3
86#define RFCOMM_RPN_PARITY_MARK 0x5
87#define RFCOMM_RPN_PARITY_SPACE 0x7
88
89#define RFCOMM_RPN_FLOW_NONE 0x00
90
91#define RFCOMM_RPN_XON_CHAR 0x11
92#define RFCOMM_RPN_XOFF_CHAR 0x13
93
94#define RFCOMM_RPN_PM_BITRATE 0x0001
95#define RFCOMM_RPN_PM_DATA 0x0002
96#define RFCOMM_RPN_PM_STOP 0x0004
97#define RFCOMM_RPN_PM_PARITY 0x0008
98#define RFCOMM_RPN_PM_PARITY_TYPE 0x0010
99#define RFCOMM_RPN_PM_XON 0x0020
100#define RFCOMM_RPN_PM_XOFF 0x0040
101#define RFCOMM_RPN_PM_FLOW 0x3F00
102
103#define RFCOMM_RPN_PM_ALL 0x3F7F
104
105struct rfcomm_hdr {
106 u8 addr;
107 u8 ctrl;
108 u8 len;
109} __attribute__ ((packed));
110
111struct rfcomm_cmd {
112 u8 addr;
113 u8 ctrl;
114 u8 len;
115 u8 fcs;
116} __attribute__ ((packed));
117
118struct rfcomm_mcc {
119 u8 type;
120 u8 len;
121} __attribute__ ((packed));
122
123struct rfcomm_pn {
124 u8 dlci;
125 u8 flow_ctrl;
126 u8 priority;
127 u8 ack_timer;
128 __le16 mtu;
129 u8 max_retrans;
130 u8 credits;
131} __attribute__ ((packed));
132
133struct rfcomm_rpn {
134 u8 dlci;
135 u8 bit_rate;
136 u8 line_settings;
137 u8 flow_ctrl;
138 u8 xon_char;
139 u8 xoff_char;
140 __le16 param_mask;
141} __attribute__ ((packed));
142
143struct rfcomm_rls {
144 u8 dlci;
145 u8 status;
146} __attribute__ ((packed));
147
148struct rfcomm_msc {
149 u8 dlci;
150 u8 v24_sig;
151} __attribute__ ((packed));
152
153
154
155struct rfcomm_session {
156 struct list_head list;
157 struct socket *sock;
158 struct timer_list timer;
159 unsigned long state;
160 unsigned long flags;
161 atomic_t refcnt;
162 int initiator;
163
164
165 int cfc;
166 uint mtu;
167
168 struct list_head dlcs;
169};
170
171struct rfcomm_dlc {
172 struct list_head list;
173 struct rfcomm_session *session;
174 struct sk_buff_head tx_queue;
175 struct timer_list timer;
176
177 spinlock_t lock;
178 unsigned long state;
179 unsigned long flags;
180 atomic_t refcnt;
181 u8 dlci;
182 u8 addr;
183 u8 priority;
184 u8 v24_sig;
185 u8 remote_v24_sig;
186 u8 mscex;
187 u8 out;
188 u8 sec_level;
189 u8 role_switch;
190 u32 defer_setup;
191
192 uint mtu;
193 uint cfc;
194 uint rx_credits;
195 uint tx_credits;
196
197 void *owner;
198
199 void (*data_ready)(struct rfcomm_dlc *d, struct sk_buff *skb);
200 void (*state_change)(struct rfcomm_dlc *d, int err);
201 void (*modem_status)(struct rfcomm_dlc *d, u8 v24_sig);
202};
203
204
205#define RFCOMM_RX_THROTTLED 0
206#define RFCOMM_TX_THROTTLED 1
207#define RFCOMM_TIMED_OUT 2
208#define RFCOMM_MSC_PENDING 3
209#define RFCOMM_SEC_PENDING 4
210#define RFCOMM_AUTH_PENDING 5
211#define RFCOMM_AUTH_ACCEPT 6
212#define RFCOMM_AUTH_REJECT 7
213#define RFCOMM_DEFER_SETUP 8
214
215
216#define RFCOMM_SCHED_STATE 0
217#define RFCOMM_SCHED_RX 1
218#define RFCOMM_SCHED_TX 2
219#define RFCOMM_SCHED_TIMEO 3
220#define RFCOMM_SCHED_AUTH 4
221#define RFCOMM_SCHED_WAKEUP 31
222
223
224#define RFCOMM_MSCEX_TX 1
225#define RFCOMM_MSCEX_RX 2
226#define RFCOMM_MSCEX_OK (RFCOMM_MSCEX_TX + RFCOMM_MSCEX_RX)
227
228
229#define RFCOMM_CFC_UNKNOWN -1
230#define RFCOMM_CFC_DISABLED 0
231#define RFCOMM_CFC_ENABLED RFCOMM_MAX_CREDITS
232
233
234int rfcomm_send_rpn(struct rfcomm_session *s, int cr, u8 dlci,
235 u8 bit_rate, u8 data_bits, u8 stop_bits,
236 u8 parity, u8 flow_ctrl_settings,
237 u8 xon_char, u8 xoff_char, u16 param_mask);
238
239
240struct rfcomm_dlc *rfcomm_dlc_alloc(gfp_t prio);
241void rfcomm_dlc_free(struct rfcomm_dlc *d);
242int rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel);
243int rfcomm_dlc_close(struct rfcomm_dlc *d, int reason);
244int rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb);
245int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig);
246int rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig);
247void rfcomm_dlc_accept(struct rfcomm_dlc *d);
248
249#define rfcomm_dlc_lock(d) spin_lock(&d->lock)
250#define rfcomm_dlc_unlock(d) spin_unlock(&d->lock)
251
252static inline void rfcomm_dlc_hold(struct rfcomm_dlc *d)
253{
254 atomic_inc(&d->refcnt);
255}
256
257static inline void rfcomm_dlc_put(struct rfcomm_dlc *d)
258{
259 if (atomic_dec_and_test(&d->refcnt))
260 rfcomm_dlc_free(d);
261}
262
263extern void __rfcomm_dlc_throttle(struct rfcomm_dlc *d);
264extern void __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d);
265
266static inline void rfcomm_dlc_throttle(struct rfcomm_dlc *d)
267{
268 if (!test_and_set_bit(RFCOMM_RX_THROTTLED, &d->flags))
269 __rfcomm_dlc_throttle(d);
270}
271
272static inline void rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)
273{
274 if (test_and_clear_bit(RFCOMM_RX_THROTTLED, &d->flags))
275 __rfcomm_dlc_unthrottle(d);
276}
277
278
279void rfcomm_session_getaddr(struct rfcomm_session *s, bdaddr_t *src, bdaddr_t *dst);
280
281static inline void rfcomm_session_hold(struct rfcomm_session *s)
282{
283 atomic_inc(&s->refcnt);
284}
285
286
287struct sockaddr_rc {
288 sa_family_t rc_family;
289 bdaddr_t rc_bdaddr;
290 u8 rc_channel;
291};
292
293#define RFCOMM_CONNINFO 0x02
294struct rfcomm_conninfo {
295 __u16 hci_handle;
296 __u8 dev_class[3];
297};
298
299#define RFCOMM_LM 0x03
300#define RFCOMM_LM_MASTER 0x0001
301#define RFCOMM_LM_AUTH 0x0002
302#define RFCOMM_LM_ENCRYPT 0x0004
303#define RFCOMM_LM_TRUSTED 0x0008
304#define RFCOMM_LM_RELIABLE 0x0010
305#define RFCOMM_LM_SECURE 0x0020
306
307#define rfcomm_pi(sk) ((struct rfcomm_pinfo *) sk)
308
309struct rfcomm_pinfo {
310 struct bt_sock bt;
311 struct rfcomm_dlc *dlc;
312 u8 channel;
313 u8 sec_level;
314 u8 role_switch;
315};
316
317int rfcomm_init_sockets(void);
318void rfcomm_cleanup_sockets(void);
319
320int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc **d);
321
322
323#define RFCOMM_MAX_DEV 256
324
325#define RFCOMMCREATEDEV _IOW('R', 200, int)
326#define RFCOMMRELEASEDEV _IOW('R', 201, int)
327#define RFCOMMGETDEVLIST _IOR('R', 210, int)
328#define RFCOMMGETDEVINFO _IOR('R', 211, int)
329#define RFCOMMSTEALDLC _IOW('R', 220, int)
330
331#define RFCOMM_REUSE_DLC 0
332#define RFCOMM_RELEASE_ONHUP 1
333#define RFCOMM_HANGUP_NOW 2
334#define RFCOMM_TTY_ATTACHED 3
335#define RFCOMM_TTY_RELEASED 4
336
337struct rfcomm_dev_req {
338 s16 dev_id;
339 u32 flags;
340 bdaddr_t src;
341 bdaddr_t dst;
342 u8 channel;
343};
344
345struct rfcomm_dev_info {
346 s16 id;
347 u32 flags;
348 u16 state;
349 bdaddr_t src;
350 bdaddr_t dst;
351 u8 channel;
352};
353
354struct rfcomm_dev_list_req {
355 u16 dev_num;
356 struct rfcomm_dev_info dev_info[0];
357};
358
359int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg);
360
361#ifdef CONFIG_BT_RFCOMM_TTY
362int rfcomm_init_ttys(void);
363void rfcomm_cleanup_ttys(void);
364#else
365static inline int rfcomm_init_ttys(void)
366{
367 return 0;
368}
369static inline void rfcomm_cleanup_ttys(void)
370{
371}
372#endif
373#endif
374