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