1f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky/*
2e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
3aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann *  BlueZ - Bluetooth protocol stack for Linux
4e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
5e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  Copyright (C) 2001-2002  Wayne Lee <waynelee@qualcomm.com>
6e5e4f00bb96381f8971b9b1ca674902e9771626cMarcel Holtmann *  Copyright (C) 2003-2011  Marcel Holtmann <marcel@holtmann.org>
7e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
8e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
9e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  This program is free software; you can redistribute it and/or modify
10e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  it under the terms of the GNU General Public License as published by
11e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  the Free Software Foundation; either version 2 of the License, or
12e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  (at your option) any later version.
13e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
14e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  This program is distributed in the hope that it will be useful,
15e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  GNU General Public License for more details.
18e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
19e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  You should have received a copy of the GNU General Public License
20e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  along with this program; if not, write to the Free Software
21aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
22e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
23f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky */
24f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
25e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann#ifndef __RFCOMM_H
26e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann#define __RFCOMM_H
27e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
287649cbdb262494b241a8983555ca75592501b856Marcel Holtmann#include <endian.h>
297649cbdb262494b241a8983555ca75592501b856Marcel Holtmann
30e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann#define RFCOMM_PSM 3
31f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
32e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann#define TRUE  1
33e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann#define FALSE 0
34f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
35f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define RFCOMM_MAX_CONN 10
36f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define BT_NBR_DATAPORTS RFCOMM_MAX_CONN
37f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
38f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define GET_BIT(pos,bitfield) ((bitfield[(pos)/32]) & (1 << ((pos) % 32)))
39f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define SET_BIT(pos,bitfield) ((bitfield[(pos)/32]) |= (1 << ((pos) % 32)))
40f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define CLR_BIT(pos,bitfield) ((bitfield[(pos)/32]) &= ((1 << ((pos) % 32)) ^ (~0)))
41803752117135528b1adebf0fa045596e188a996dMarcel Holtmann
42f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky/* Sets the P/F-bit in the control field */
43803752117135528b1adebf0fa045596e188a996dMarcel Holtmann#define SET_PF(ctr) ((ctr) | (1 << 4))
44803752117135528b1adebf0fa045596e188a996dMarcel Holtmann/* Clears the P/F-bit in the control field */
45f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define CLR_PF(ctr) ((ctr) & 0xef)
46803752117135528b1adebf0fa045596e188a996dMarcel Holtmann/* Returns the P/F-bit */
47f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define GET_PF(ctr) (((ctr) >> 4) & 0x1)
48f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
49803752117135528b1adebf0fa045596e188a996dMarcel Holtmann#define MIN(a, b) (((a) < (b)) ? (a) : (b))
50f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
51803752117135528b1adebf0fa045596e188a996dMarcel Holtmann/* Endian-swapping macros for structs */
52f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define swap_long_frame(x) ((x)->h.length.val = le16_to_cpu((x)->h.length.val))
53f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define swap_mcc_long_frame(x) (swap_long_frame(x))
54f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
55803752117135528b1adebf0fa045596e188a996dMarcel Holtmann/* Used for UIH packets */
56f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define SHORT_CRC_CHECK 2
57803752117135528b1adebf0fa045596e188a996dMarcel Holtmann/* Used for all packet exepts for the UIH packets */
58f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define LONG_CRC_CHECK 3
59803752117135528b1adebf0fa045596e188a996dMarcel Holtmann/* Short header for short UIH packets */
60f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define SHORT_HDR 2
61803752117135528b1adebf0fa045596e188a996dMarcel Holtmann/* Long header for long UIH packets */
62f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define LONG_HDR 3
63f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
64803752117135528b1adebf0fa045596e188a996dMarcel Holtmann/* FIXME: Should this one be defined here? */
65f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define SHORT_PAYLOAD_SIZE 127
66803752117135528b1adebf0fa045596e188a996dMarcel Holtmann/* Used for setting the EA field in different packets, really neccessary? */
67f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define EA 1
68f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky/* Yes the FCS size is only one byte */
69803752117135528b1adebf0fa045596e188a996dMarcel Holtmann#define FCS_SIZE 1
70f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
71f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define RFCOMM_MAX_HDR_SIZE 5
72f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
73f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define MAX_CREDITS   30
74f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define START_CREDITS 7
75f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define MIN_CREDITS   6
76f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
77f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define DEF_RFCOMM_MTU 127
78f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
79f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky/* The values in the control field when sending ordinary rfcomm packets */
80f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define SABM 0x2f	/* set asynchronous balanced mode */
81f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define UA   0x63	/* unnumbered acknolodgement */
82f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define DM   0x0f	/* disconnected mode */
83f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define DISC 0x43	/* disconnect */
84f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define UIH  0xef	/* unnumbered information with header check (only) */
85f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define UI   0x03	/* unnumbered information (with all data check) */
86f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
87f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define SABM_SIZE 4
88f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define UA_SIZE   4
89f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
90f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky/* The values in the type field in a multiplexer command packet */
91f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define PN    (0x80 >> 2)	/* parameter negotiation */
92f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define PSC   (0x40 >> 2)	/* power saving control */
93f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define CLD   (0xc0 >> 2)	/* close down */
94f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define TEST  (0x20 >> 2)	/* test */
95f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define FCON  (0xa0 >> 2)	/* flow control on */
96f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define FCOFF (0x60 >> 2)	/* flow control off */
97f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define MSC   (0xe0 >> 2)	/* modem status command */
98f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define NSC   (0x10 >> 2)	/* not supported command response */
99f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define RPN   (0x90 >> 2)	/* remote port negotiation */
100f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define RLS   (0x50 >> 2)	/* remote line status */
101f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define SNC   (0xd0 >> 2)	/* service negotiation command */
102f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
103f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky/* Define of some V.24 signals modem control signals in RFCOMM */
104f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define DV  0x80	/* data valid */
105f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define IC  0x40	/* incoming call */
106f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define RTR 0x08	/* ready to receive */
107f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define RTC 0x04	/* ready to communicate */
108f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define FC  0x02	/* flow control (unable to accept frames) */
109f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
110f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#define CTRL_CHAN 0	/* The control channel is defined as DLCI 0 in rfcomm */
111f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define MCC_CMD 1	 /* Multiplexer command */
112f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky#define MCC_RSP 0	 /* Multiplexer response */
113f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
1147649cbdb262494b241a8983555ca75592501b856Marcel Holtmann#if __BYTE_ORDER == __LITTLE_ENDIAN
115f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
116185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct parameter_mask {
1170d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t bit_rate:1;
1180d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t data_bits:1;
1190d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t stop_bit:1;
1200d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t parity:1;
1210d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t parity_type:1;
1220d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xon:1;
1230d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xoff:1;
1240d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res1:1;
1250d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xon_input:1;
1260d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xon_output:1;
1270d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtr_input:1;
1280d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtr_output:1;
1290d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtc_input:1;
1300d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtc_output:1;
1310d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res2:2;
132f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) parameter_mask;
133f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
134185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct rpn_values {
1350d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t bit_rate;
1360d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t data_bits:2;
1370d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t stop_bit:1;
1380d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t parity:1;
1390d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t parity_type:2;
1400d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res1:2;
1410d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xon_input:1;
1420d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xon_output:1;
1430d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtr_input:1;
1440d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtr_output:1;
1450d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtc_input:1;
1460d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtc_output:1;
1470d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res2:2;
1480d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xon;
1490d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xoff;
150185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmann	uint16_t pm;
151185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmann	//parameter_mask pm;
152f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) rpn_values;
153f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
1547649cbdb262494b241a8983555ca75592501b856Marcel Holtmann#elif __BYTE_ORDER == __BIG_ENDIAN
155f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
156185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct parameter_mask {
1570d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res1:1;
1580d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xoff:1;
1590d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xon:1;
1600d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t parity_type:1;
1610d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t parity:1;
1620d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t stop_bit:1;
1630d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t data_bits:1;
1640d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t bit_rate:1;
1650d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res2:2;
1660d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtc_output:1;
1670d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtc_input:1;
1680d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtr_output:1;
1690d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtr_input:1;
1700d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xon_output:1;
1710d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xon_input:1;
172f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
173f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) parameter_mask;
174f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
175185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct rpn_values {
1760d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t bit_rate;
1770d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res1:2;
1780d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t parity_type:2;
1790d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t parity:1;
1800d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t stop_bit:1;
1810d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t data_bits:2;
1820d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res2:2;
1830d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtc_output:1;
1840d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtc_input:1;
1850d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtr_output:1;
1860d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtr_input:1;
1870d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xon_output:1;
1880d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xon_input:1;
1890d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xon;
1900d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t xoff;
191185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmann	uint16_t pm;
192185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmann	//parameter_mask pm;
193f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) rpn_values;
194f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
1957649cbdb262494b241a8983555ca75592501b856Marcel Holtmann#else
1967649cbdb262494b241a8983555ca75592501b856Marcel Holtmann#error "Unknown byte order"
197f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#endif
198f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
199f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky/* Typedefinitions of stuctures used for creating and parsing packets, for a
200803752117135528b1adebf0fa045596e188a996dMarcel Holtmann * further description of the structures please se the bluetooth core
201803752117135528b1adebf0fa045596e188a996dMarcel Holtmann * specification part F:1 and the ETSI TS 07.10 specification  */
202f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
2037649cbdb262494b241a8983555ca75592501b856Marcel Holtmann#if __BYTE_ORDER == __LITTLE_ENDIAN
204f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
205f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct address_field {
2060d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ea:1;
2070d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t cr:1;
2080d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t d:1;
2090d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t server_chn:5;
210f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) address_field;
211f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
212f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct short_length {
2130d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ea:1;
2140d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t len:7;
215f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) short_length;
216f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
217f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyanskytypedef union long_length {
218f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	struct bits {
2190d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann		uint8_t ea:1;
220f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky		unsigned short len:15;
221f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	} __attribute__ ((packed)) bits ;
2220d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t val ;
223f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) long_length;
224f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
225f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct short_frame_head {
226f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	address_field addr;
2270d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t control;
228f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	short_length length;
229f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) short_frame_head;
230f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
231f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct short_frame {
232f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	short_frame_head h;
2330d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t data[0];
234f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) short_frame;
235f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
236f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct long_frame_head {
237f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	address_field addr;
2380d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t control;
239f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	long_length length;
2400d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t data[0];
241f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) long_frame_head;
242f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
243f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct long_frame {
244f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	long_frame_head h;
2450d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t data[0];
246f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) long_frame;
247f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
248f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky/* Typedefinitions for structures used for the multiplexer commands */
249f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct mcc_type {
2500d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ea:1;
2510d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t cr:1;
2520d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t type:6;
253f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) mcc_type;
254f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
255f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct mcc_short_frame_head {
256f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	mcc_type type;
257f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	short_length length;
2580d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t value[0];
259f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) mcc_short_frame_head;
260f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
261f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct mcc_short_frame {
262f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	mcc_short_frame_head h;
2630d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t value[0];
264f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) mcc_short_frame;
265f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
266f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct mcc_long_frame_head {
267f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	mcc_type type;
268f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	long_length length;
2690d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t value[0];
270f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) mcc_long_frame_head;
271f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
272f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct mcc_long_frame {
273f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	mcc_long_frame_head h;
2740d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t value[0];
275f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) mcc_long_frame;
276f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
277f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky/* MSC-command */
278f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct v24_signals {
2790d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ea:1;
2800d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t fc:1;
2810d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtc:1;
2820d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtr:1;
2830d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t reserved:2;
2840d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ic:1;
2850d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t dv:1;
286f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) v24_signals;
287f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
288f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyanskytypedef struct break_signals {
2890d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ea:1;
2900d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t b1:1;
2910d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t b2:1;
2920d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t b3:1;
2930d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t len:4;
294f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) break_signals;
295f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
296f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct msc_msg {
297f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	short_frame_head s_head;
298f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	mcc_short_frame_head mcc_s_head;
299f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	address_field dlci;
300f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	v24_signals v24_sigs;
301f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	//break_signals break_sigs;
3020d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t fcs;
303f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) msc_msg;
304f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
305f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct rpn_msg {
306f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	short_frame_head s_head;
307f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	mcc_short_frame_head mcc_s_head;
308f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	address_field dlci;
309f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	rpn_values rpn_val;
3100d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t fcs;
311f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) rpn_msg;
312f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
313f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky/* RLS-command */
314f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyanskytypedef struct rls_msg {
315f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	short_frame_head s_head;
316f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	mcc_short_frame_head mcc_s_head;
317f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	address_field dlci;
3180d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t error:4;
3190d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res:4;
3200d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t fcs;
321f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) rls_msg;
322f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
323f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky/* PN-command */
324f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyanskytypedef struct pn_msg {
325f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	short_frame_head s_head;
326f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	mcc_short_frame_head mcc_s_head;
327f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky/* The res1, res2 and res3 values have to be set to 0 by the sender */
3280d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t dlci:6;
3290d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res1:2;
3300d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t frame_type:4;
3310d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t credit_flow:4;
3320d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t prior:6;
3330d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res2:2;
3340d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ack_timer;
3350d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t frame_size:16;
3360d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t max_nbrof_retrans;
3370d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t credits;
3380d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t fcs;
339f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) pn_msg;
340f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
341f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky/* NSC-command */
342f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyanskytypedef struct nsc_msg {
343f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	short_frame_head s_head;
344f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	mcc_short_frame_head mcc_s_head;
345f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	mcc_type command_type;
3460d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t fcs;
347f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) nsc_msg;
348f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
3497649cbdb262494b241a8983555ca75592501b856Marcel Holtmann#elif __BYTE_ORDER == __BIG_ENDIAN
350f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
351f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyanskytypedef struct address_field {
3520d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t server_chn:5;
3530d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t d:1;
3540d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t cr:1;
3550d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ea:1;
356f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) address_field;
357f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
358f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyanskytypedef struct short_length {
3590d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t len:7;
3600d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ea:1;
361f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) short_length;
362f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
363f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyanskytypedef union long_length {
364f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	struct bits {
365f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky		unsigned short len:15;
3660d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann		uint8_t ea:1;
367f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	} __attribute__ ((packed)) bits;
3680d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t val;
369f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) long_length;
370f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
371185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct short_frame_head {
372f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	address_field addr;
3730d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t control;
374f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	short_length length;
375f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) short_frame_head;
376f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
377f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyanskytypedef struct short_frame {
378f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	short_frame_head h;
3790d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t data[0];
380f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) short_frame;
381f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
382185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct long_frame_head {
383f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	address_field addr;
3840d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t control;
385f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	long_length length;
3860d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t data[0];
387f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) long_frame_head;
388f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
389185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct long_frame {
390f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	long_frame_head h;
3910d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t data[0];
392f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) long_frame;
393f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
394185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct mcc_type {
3950d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t type:6;
3960d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t cr:1;
3970d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ea:1;
398f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) mcc_type;
399f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
400185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct mcc_short_frame_head {
401f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	mcc_type type;
402f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	short_length length;
4030d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t value[0];
404f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) mcc_short_frame_head;
405f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
406185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct mcc_short_frame {
407f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	mcc_short_frame_head h;
4080d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t value[0];
409f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) mcc_short_frame;
410f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
411185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct mcc_long_frame_head {
412f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	mcc_type type;
413f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	long_length length;
4140d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t value[0];
415f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) mcc_long_frame_head;
416f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
417185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct mcc_long_frame {
418f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	mcc_long_frame_head h;
4190d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t value[0];
420f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) mcc_long_frame;
421f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
422185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct v24_signals {
4230d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t dv:1;
4240d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ic:1;
4250d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t reserved:2;
4260d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtr:1;
4270d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t rtc:1;
4280d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t fc:1;
4290d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ea:1;
430f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) v24_signals;
431f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
432185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct break_signals {
4330d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t len:4;
4340d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t b3:1;
4350d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t b2:1;
4360d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t b1:1;
4370d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ea:1;
438f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) break_signals;
439f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
440185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct msc_msg {
441f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	short_frame_head s_head;
442f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	mcc_short_frame_head mcc_s_head;
443f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	address_field dlci;
444f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	v24_signals v24_sigs;
445f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	//break_signals break_sigs;
4460d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t fcs;
447f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) msc_msg;
448f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
449185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct rpn_msg {
450f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	short_frame_head s_head;
451f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	mcc_short_frame_head mcc_s_head;
452f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	address_field dlci;
453f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	rpn_values rpn_val;
4540d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t fcs;
455f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) rpn_msg;
456f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
457185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct rls_msg {
458f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	short_frame_head s_head;
459f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	mcc_short_frame_head mcc_s_head;
460f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	address_field dlci;
4610d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res:4;
4620d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t error:4;
4630d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t fcs;
464f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) rls_msg;
465f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky
466185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct pn_msg {
467f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	short_frame_head s_head;
468f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky	mcc_short_frame_head mcc_s_head;
4690d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res1:2;
4700d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t dlci:6;
4710d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t credit_flow:4;
4720d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t frame_type:4;
4730d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t res2:2;
4740d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t prior:6;
4750d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t ack_timer;
4760d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t frame_size:16;
4770d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t max_nbrof_retrans;
4780d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t credits;
4790d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t fcs;
480f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky} __attribute__ ((packed)) pn_msg;
481f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
482185e27902e7e5449d20a0458cf1077b4a55b76d0Marcel Holtmanntypedef struct nsc_msg {
483f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	short_frame_head s_head;
484f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	mcc_short_frame_head mcc_s_head;
485f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	mcc_type command_type;
4860d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t fcs;
487f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky} __attribute__ ((packed)) nsc_msg;
488f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
4897649cbdb262494b241a8983555ca75592501b856Marcel Holtmann#else
4907649cbdb262494b241a8983555ca75592501b856Marcel Holtmann#error "Unknown byte order"
491f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky#error Processor endianness unknown!
4927649cbdb262494b241a8983555ca75592501b856Marcel Holtmann#endif
493f27ea7b12fdb6881d18ff84b7e92546f57167cb4Max Krasnyansky
494e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann#endif /* __RFCOMM_H */
495