• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  *  BlueZ - Bluetooth protocol stack for Linux
4  *
5  *  Copyright (C) 2001-2002  Wayne Lee <waynelee@qualcomm.com>
6  *  Copyright (C) 2003-2007  Marcel Holtmann <marcel@holtmann.org>
7  *
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or
12  *  (at your option) any later version.
13  *
14  *  This program is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License
20  *  along with this program; if not, write to the Free Software
21  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
22  *
23  */
24 
25 #ifndef __RFCOMM_H
26 #define __RFCOMM_H
27 
28 #include <endian.h>
29 
30 #define RFCOMM_PSM 3
31 
32 #define TRUE  1
33 #define FALSE 0
34 
35 #define RFCOMM_MAX_CONN 10
36 #define BT_NBR_DATAPORTS RFCOMM_MAX_CONN
37 
38 #define GET_BIT(pos,bitfield) ((bitfield[(pos)/32]) & (1 << ((pos) % 32)))
39 #define SET_BIT(pos,bitfield) ((bitfield[(pos)/32]) |= (1 << ((pos) % 32)))
40 #define CLR_BIT(pos,bitfield) ((bitfield[(pos)/32]) &= ((1 << ((pos) % 32)) ^ (~0)))
41 
42 /* Sets the P/F-bit in the control field */
43 #define SET_PF(ctr) ((ctr) | (1 << 4))
44 /* Clears the P/F-bit in the control field */
45 #define CLR_PF(ctr) ((ctr) & 0xef)
46 /* Returns the P/F-bit */
47 #define GET_PF(ctr) (((ctr) >> 4) & 0x1)
48 
49 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
50 
51 /* Endian-swapping macros for structs */
52 #define swap_long_frame(x) ((x)->h.length.val = le16_to_cpu((x)->h.length.val))
53 #define swap_mcc_long_frame(x) (swap_long_frame(x))
54 
55 /* Used for UIH packets */
56 #define SHORT_CRC_CHECK 2
57 /* Used for all packet exepts for the UIH packets */
58 #define LONG_CRC_CHECK 3
59 /* Short header for short UIH packets */
60 #define SHORT_HDR 2
61 /* Long header for long UIH packets */
62 #define LONG_HDR 3
63 
64 /* FIXME: Should this one be defined here? */
65 #define SHORT_PAYLOAD_SIZE 127
66 /* Used for setting the EA field in different packets, really neccessary? */
67 #define EA 1
68 /* Yes the FCS size is only one byte */
69 #define FCS_SIZE 1
70 
71 #define RFCOMM_MAX_HDR_SIZE 5
72 
73 #define MAX_CREDITS   30
74 #define START_CREDITS 7
75 #define MIN_CREDITS   6
76 
77 #define DEF_RFCOMM_MTU 127
78 
79 /* The values in the control field when sending ordinary rfcomm packets */
80 #define SABM 0x2f	/* set asynchronous balanced mode */
81 #define UA   0x63	/* unnumbered acknolodgement */
82 #define DM   0x0f	/* disconnected mode */
83 #define DISC 0x43	/* disconnect */
84 #define UIH  0xef	/* unnumbered information with header check (only) */
85 #define UI   0x03	/* unnumbered information (with all data check) */
86 
87 #define SABM_SIZE 4
88 #define UA_SIZE   4
89 
90 /* The values in the type field in a multiplexer command packet */
91 #define PN    (0x80 >> 2)	/* parameter negotiation */
92 #define PSC   (0x40 >> 2)	/* power saving control */
93 #define CLD   (0xc0 >> 2)	/* close down */
94 #define TEST  (0x20 >> 2)	/* test */
95 #define FCON  (0xa0 >> 2)	/* flow control on */
96 #define FCOFF (0x60 >> 2)	/* flow control off */
97 #define MSC   (0xe0 >> 2)	/* modem status command */
98 #define NSC   (0x10 >> 2)	/* not supported command response */
99 #define RPN   (0x90 >> 2)	/* remote port negotiation */
100 #define RLS   (0x50 >> 2)	/* remote line status */
101 #define SNC   (0xd0 >> 2)	/* service negotiation command */
102 
103 /* Define of some V.24 signals modem control signals in RFCOMM */
104 #define DV  0x80	/* data valid */
105 #define IC  0x40	/* incoming call */
106 #define RTR 0x08	/* ready to receive */
107 #define RTC 0x04	/* ready to communicate */
108 #define FC  0x02	/* flow control (unable to accept frames) */
109 
110 #define CTRL_CHAN 0	/* The control channel is defined as DLCI 0 in rfcomm */
111 #define MCC_CMD 1	 /* Multiplexer command */
112 #define MCC_RSP 0	 /* Multiplexer response */
113 
114 #if __BYTE_ORDER == __LITTLE_ENDIAN
115 
116 typedef struct parameter_mask {
117 	uint8_t bit_rate:1;
118 	uint8_t data_bits:1;
119 	uint8_t stop_bit:1;
120 	uint8_t parity:1;
121 	uint8_t parity_type:1;
122 	uint8_t xon:1;
123 	uint8_t xoff:1;
124 	uint8_t res1:1;
125 	uint8_t xon_input:1;
126 	uint8_t xon_output:1;
127 	uint8_t rtr_input:1;
128 	uint8_t rtr_output:1;
129 	uint8_t rtc_input:1;
130 	uint8_t rtc_output:1;
131 	uint8_t res2:2;
132 } __attribute__ ((packed)) parameter_mask;
133 
134 typedef struct rpn_values {
135 	uint8_t bit_rate;
136 	uint8_t data_bits:2;
137 	uint8_t stop_bit:1;
138 	uint8_t parity:1;
139 	uint8_t parity_type:2;
140 	uint8_t res1:2;
141 	uint8_t xon_input:1;
142 	uint8_t xon_output:1;
143 	uint8_t rtr_input:1;
144 	uint8_t rtr_output:1;
145 	uint8_t rtc_input:1;
146 	uint8_t rtc_output:1;
147 	uint8_t res2:2;
148 	uint8_t xon;
149 	uint8_t xoff;
150 	uint16_t pm;
151 	//parameter_mask pm;
152 } __attribute__ ((packed)) rpn_values;
153 
154 #elif __BYTE_ORDER == __BIG_ENDIAN
155 
156 typedef struct parameter_mask {
157 	uint8_t res1:1;
158 	uint8_t xoff:1;
159 	uint8_t xon:1;
160 	uint8_t parity_type:1;
161 	uint8_t parity:1;
162 	uint8_t stop_bit:1;
163 	uint8_t data_bits:1;
164 	uint8_t bit_rate:1;
165 	uint8_t res2:2;
166 	uint8_t rtc_output:1;
167 	uint8_t rtc_input:1;
168 	uint8_t rtr_output:1;
169 	uint8_t rtr_input:1;
170 	uint8_t xon_output:1;
171 	uint8_t xon_input:1;
172 
173 } __attribute__ ((packed)) parameter_mask;
174 
175 typedef struct rpn_values {
176 	uint8_t bit_rate;
177 	uint8_t res1:2;
178 	uint8_t parity_type:2;
179 	uint8_t parity:1;
180 	uint8_t stop_bit:1;
181 	uint8_t data_bits:2;
182 	uint8_t res2:2;
183 	uint8_t rtc_output:1;
184 	uint8_t rtc_input:1;
185 	uint8_t rtr_output:1;
186 	uint8_t rtr_input:1;
187 	uint8_t xon_output:1;
188 	uint8_t xon_input:1;
189 	uint8_t xon;
190 	uint8_t xoff;
191 	uint16_t pm;
192 	//parameter_mask pm;
193 } __attribute__ ((packed)) rpn_values;
194 
195 #else
196 #error "Unknown byte order"
197 #endif
198 
199 /* Typedefinitions of stuctures used for creating and parsing packets, for a
200  * further description of the structures please se the bluetooth core
201  * specification part F:1 and the ETSI TS 07.10 specification  */
202 
203 #if __BYTE_ORDER == __LITTLE_ENDIAN
204 
205 typedef struct address_field {
206 	uint8_t ea:1;
207 	uint8_t cr:1;
208 	uint8_t d:1;
209 	uint8_t server_chn:5;
210 } __attribute__ ((packed)) address_field;
211 
212 typedef struct short_length {
213 	uint8_t ea:1;
214 	uint8_t len:7;
215 } __attribute__ ((packed)) short_length;
216 
217 typedef union long_length {
218 	struct bits {
219 		uint8_t ea:1;
220 		unsigned short len:15;
221 	} __attribute__ ((packed)) bits ;
222 	uint16_t val ;
223 } __attribute__ ((packed)) long_length;
224 
225 typedef struct short_frame_head {
226 	address_field addr;
227 	uint8_t control;
228 	short_length length;
229 } __attribute__ ((packed)) short_frame_head;
230 
231 typedef struct short_frame {
232 	short_frame_head h;
233 	uint8_t data[0];
234 } __attribute__ ((packed)) short_frame;
235 
236 typedef struct long_frame_head {
237 	address_field addr;
238 	uint8_t control;
239 	long_length length;
240 	uint8_t data[0];
241 } __attribute__ ((packed)) long_frame_head;
242 
243 typedef struct long_frame {
244 	long_frame_head h;
245 	uint8_t data[0];
246 } __attribute__ ((packed)) long_frame;
247 
248 /* Typedefinitions for structures used for the multiplexer commands */
249 typedef struct mcc_type {
250 	uint8_t ea:1;
251 	uint8_t cr:1;
252 	uint8_t type:6;
253 } __attribute__ ((packed)) mcc_type;
254 
255 typedef struct mcc_short_frame_head {
256 	mcc_type type;
257 	short_length length;
258 	uint8_t value[0];
259 } __attribute__ ((packed)) mcc_short_frame_head;
260 
261 typedef struct mcc_short_frame {
262 	mcc_short_frame_head h;
263 	uint8_t value[0];
264 } __attribute__ ((packed)) mcc_short_frame;
265 
266 typedef struct mcc_long_frame_head {
267 	mcc_type type;
268 	long_length length;
269 	uint8_t value[0];
270 } __attribute__ ((packed)) mcc_long_frame_head;
271 
272 typedef struct mcc_long_frame {
273 	mcc_long_frame_head h;
274 	uint8_t value[0];
275 } __attribute__ ((packed)) mcc_long_frame;
276 
277 /* MSC-command */
278 typedef struct v24_signals {
279 	uint8_t ea:1;
280 	uint8_t fc:1;
281 	uint8_t rtc:1;
282 	uint8_t rtr:1;
283 	uint8_t reserved:2;
284 	uint8_t ic:1;
285 	uint8_t dv:1;
286 } __attribute__ ((packed)) v24_signals;
287 
288 typedef struct break_signals {
289 	uint8_t ea:1;
290 	uint8_t b1:1;
291 	uint8_t b2:1;
292 	uint8_t b3:1;
293 	uint8_t len:4;
294 } __attribute__ ((packed)) break_signals;
295 
296 typedef struct msc_msg {
297 	short_frame_head s_head;
298 	mcc_short_frame_head mcc_s_head;
299 	address_field dlci;
300 	v24_signals v24_sigs;
301 	//break_signals break_sigs;
302 	uint8_t fcs;
303 } __attribute__ ((packed)) msc_msg;
304 
305 typedef struct rpn_msg {
306 	short_frame_head s_head;
307 	mcc_short_frame_head mcc_s_head;
308 	address_field dlci;
309 	rpn_values rpn_val;
310 	uint8_t fcs;
311 } __attribute__ ((packed)) rpn_msg;
312 
313 /* RLS-command */
314 typedef struct rls_msg {
315 	short_frame_head s_head;
316 	mcc_short_frame_head mcc_s_head;
317 	address_field dlci;
318 	uint8_t error:4;
319 	uint8_t res:4;
320 	uint8_t fcs;
321 } __attribute__ ((packed)) rls_msg;
322 
323 /* PN-command */
324 typedef struct pn_msg {
325 	short_frame_head s_head;
326 	mcc_short_frame_head mcc_s_head;
327 /* The res1, res2 and res3 values have to be set to 0 by the sender */
328 	uint8_t dlci:6;
329 	uint8_t res1:2;
330 	uint8_t frame_type:4;
331 	uint8_t credit_flow:4;
332 	uint8_t prior:6;
333 	uint8_t res2:2;
334 	uint8_t ack_timer;
335 	uint16_t frame_size:16;
336 	uint8_t max_nbrof_retrans;
337 	uint8_t credits;
338 	uint8_t fcs;
339 } __attribute__ ((packed)) pn_msg;
340 
341 /* NSC-command */
342 typedef struct nsc_msg {
343 	short_frame_head s_head;
344 	mcc_short_frame_head mcc_s_head;
345 	mcc_type command_type;
346 	uint8_t fcs;
347 } __attribute__ ((packed)) nsc_msg;
348 
349 #elif __BYTE_ORDER == __BIG_ENDIAN
350 
351 typedef struct address_field {
352 	uint8_t server_chn:5;
353 	uint8_t d:1;
354 	uint8_t cr:1;
355 	uint8_t ea:1;
356 } __attribute__ ((packed)) address_field;
357 
358 typedef struct short_length {
359 	uint8_t len:7;
360 	uint8_t ea:1;
361 } __attribute__ ((packed)) short_length;
362 
363 typedef union long_length {
364 	struct bits {
365 		unsigned short len:15;
366 		uint8_t ea:1;
367 	} __attribute__ ((packed)) bits;
368 	uint16_t val;
369 } __attribute__ ((packed)) long_length;
370 
371 typedef struct short_frame_head {
372 	address_field addr;
373 	uint8_t control;
374 	short_length length;
375 } __attribute__ ((packed)) short_frame_head;
376 
377 typedef struct short_frame {
378 	short_frame_head h;
379 	uint8_t data[0];
380 } __attribute__ ((packed)) short_frame;
381 
382 typedef struct long_frame_head {
383 	address_field addr;
384 	uint8_t control;
385 	long_length length;
386 	uint8_t data[0];
387 } __attribute__ ((packed)) long_frame_head;
388 
389 typedef struct long_frame {
390 	long_frame_head h;
391 	uint8_t data[0];
392 } __attribute__ ((packed)) long_frame;
393 
394 typedef struct mcc_type {
395 	uint8_t type:6;
396 	uint8_t cr:1;
397 	uint8_t ea:1;
398 } __attribute__ ((packed)) mcc_type;
399 
400 typedef struct mcc_short_frame_head {
401 	mcc_type type;
402 	short_length length;
403 	uint8_t value[0];
404 } __attribute__ ((packed)) mcc_short_frame_head;
405 
406 typedef struct mcc_short_frame {
407 	mcc_short_frame_head h;
408 	uint8_t value[0];
409 } __attribute__ ((packed)) mcc_short_frame;
410 
411 typedef struct mcc_long_frame_head {
412 	mcc_type type;
413 	long_length length;
414 	uint8_t value[0];
415 } __attribute__ ((packed)) mcc_long_frame_head;
416 
417 typedef struct mcc_long_frame {
418 	mcc_long_frame_head h;
419 	uint8_t value[0];
420 } __attribute__ ((packed)) mcc_long_frame;
421 
422 typedef struct v24_signals {
423 	uint8_t dv:1;
424 	uint8_t ic:1;
425 	uint8_t reserved:2;
426 	uint8_t rtr:1;
427 	uint8_t rtc:1;
428 	uint8_t fc:1;
429 	uint8_t ea:1;
430 } __attribute__ ((packed)) v24_signals;
431 
432 typedef struct break_signals {
433 	uint8_t len:4;
434 	uint8_t b3:1;
435 	uint8_t b2:1;
436 	uint8_t b1:1;
437 	uint8_t ea:1;
438 } __attribute__ ((packed)) break_signals;
439 
440 typedef struct msc_msg {
441 	short_frame_head s_head;
442 	mcc_short_frame_head mcc_s_head;
443 	address_field dlci;
444 	v24_signals v24_sigs;
445 	//break_signals break_sigs;
446 	uint8_t fcs;
447 } __attribute__ ((packed)) msc_msg;
448 
449 typedef struct rpn_msg {
450 	short_frame_head s_head;
451 	mcc_short_frame_head mcc_s_head;
452 	address_field dlci;
453 	rpn_values rpn_val;
454 	uint8_t fcs;
455 } __attribute__ ((packed)) rpn_msg;
456 
457 typedef struct rls_msg {
458 	short_frame_head s_head;
459 	mcc_short_frame_head mcc_s_head;
460 	address_field dlci;
461 	uint8_t res:4;
462 	uint8_t error:4;
463 	uint8_t fcs;
464 } __attribute__ ((packed)) rls_msg;
465 
466 typedef struct pn_msg {
467 	short_frame_head s_head;
468 	mcc_short_frame_head mcc_s_head;
469 	uint8_t res1:2;
470 	uint8_t dlci:6;
471 	uint8_t credit_flow:4;
472 	uint8_t frame_type:4;
473 	uint8_t res2:2;
474 	uint8_t prior:6;
475 	uint8_t ack_timer;
476 	uint16_t frame_size:16;
477 	uint8_t max_nbrof_retrans;
478 	uint8_t credits;
479 	uint8_t fcs;
480 } __attribute__ ((packed)) pn_msg;
481 
482 typedef struct nsc_msg {
483 	short_frame_head s_head;
484 	mcc_short_frame_head mcc_s_head;
485 	mcc_type command_type;
486 	uint8_t fcs;
487 } __attribute__ ((packed)) nsc_msg;
488 
489 #else
490 #error "Unknown byte order"
491 #error Processor endianness unknown!
492 #endif
493 
494 #endif /* __RFCOMM_H */
495