1/*
2 *
3 *  BlueZ - Bluetooth protocol stack for Linux
4 *
5 *  Copyright (C) 2001-2002  Wayne Lee <waynelee@qualcomm.com>
6 *  Copyright (C) 2003-2011  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
116typedef 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
134typedef 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
156typedef 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
175typedef 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
205typedef 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
212typedef struct short_length {
213	uint8_t ea:1;
214	uint8_t len:7;
215} __attribute__ ((packed)) short_length;
216
217typedef 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
225typedef struct short_frame_head {
226	address_field addr;
227	uint8_t control;
228	short_length length;
229} __attribute__ ((packed)) short_frame_head;
230
231typedef struct short_frame {
232	short_frame_head h;
233	uint8_t data[0];
234} __attribute__ ((packed)) short_frame;
235
236typedef 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
243typedef 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 */
249typedef struct mcc_type {
250	uint8_t ea:1;
251	uint8_t cr:1;
252	uint8_t type:6;
253} __attribute__ ((packed)) mcc_type;
254
255typedef 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
261typedef struct mcc_short_frame {
262	mcc_short_frame_head h;
263	uint8_t value[0];
264} __attribute__ ((packed)) mcc_short_frame;
265
266typedef 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
272typedef 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 */
278typedef 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
288typedef 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
296typedef 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
305typedef 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 */
314typedef 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 */
324typedef 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 */
342typedef 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
351typedef 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
358typedef struct short_length {
359	uint8_t len:7;
360	uint8_t ea:1;
361} __attribute__ ((packed)) short_length;
362
363typedef 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
371typedef struct short_frame_head {
372	address_field addr;
373	uint8_t control;
374	short_length length;
375} __attribute__ ((packed)) short_frame_head;
376
377typedef struct short_frame {
378	short_frame_head h;
379	uint8_t data[0];
380} __attribute__ ((packed)) short_frame;
381
382typedef 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
389typedef struct long_frame {
390	long_frame_head h;
391	uint8_t data[0];
392} __attribute__ ((packed)) long_frame;
393
394typedef struct mcc_type {
395	uint8_t type:6;
396	uint8_t cr:1;
397	uint8_t ea:1;
398} __attribute__ ((packed)) mcc_type;
399
400typedef 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
406typedef struct mcc_short_frame {
407	mcc_short_frame_head h;
408	uint8_t value[0];
409} __attribute__ ((packed)) mcc_short_frame;
410
411typedef 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
417typedef struct mcc_long_frame {
418	mcc_long_frame_head h;
419	uint8_t value[0];
420} __attribute__ ((packed)) mcc_long_frame;
421
422typedef 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
432typedef 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
440typedef 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
449typedef 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
457typedef 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
466typedef 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
482typedef 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