/*
 *
 *  BlueZ - Bluetooth protocol stack for Linux
 *
 *  Copyright (C) 2014 Intel Corporation
 *
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#define RFCOMM_SABM	0x2f
#define RFCOMM_DISC	0x43
#define RFCOMM_UA	0x63
#define RFCOMM_DM	0x0f
#define RFCOMM_UIH	0xef

#define RFCOMM_GET_TYPE(control)	((control) & 0xef)
#define RFCOMM_GET_DLCI(address)	((address & 0xfc) >> 2)
#define RFCOMM_GET_CHANNEL(address)	((address & 0xf8) >> 3)
#define RFCOMM_GET_DIR(address)		((address & 0x04) >> 2)
#define RFCOMM_TEST_EA(length)		((length & 0x01))

struct rfcomm_hdr {
	uint8_t address;
	uint8_t control;
	uint8_t length;
} __attribute__((packed));

struct rfcomm_cmd {
	uint8_t address;
	uint8_t control;
	uint8_t length;
	uint8_t fcs;
} __attribute__((packed));

#define RFCOMM_TEST    0x08
#define RFCOMM_FCON    0x28
#define RFCOMM_FCOFF   0x18
#define RFCOMM_MSC     0x38
#define RFCOMM_RPN     0x24
#define RFCOMM_RLS     0x14
#define RFCOMM_PN      0x20
#define RFCOMM_NSC     0x04

#define RFCOMM_TEST_CR(type)		((type & 0x02))
#define RFCOMM_GET_MCC_TYPE(type)	((type & 0xfc) >> 2)

struct rfcomm_mcc {
	uint8_t type;
	uint8_t length;
} __attribute__((packed));

struct rfcomm_msc {
	uint8_t dlci;
	uint8_t v24_sig;
} __attribute__((packed));

struct rfcomm_pn {
	uint8_t  dlci;
	uint8_t  flow_ctrl;
	uint8_t  priority;
	uint8_t  ack_timer;
	uint16_t mtu;
	uint8_t  max_retrans;
	uint8_t  credits;
} __attribute__((packed));
