Home | History | Annotate | Line # | Download | only in netbt
      1  1.20    andvar /*	$NetBSD: rfcomm.h,v 1.20 2025/09/07 21:31:21 andvar Exp $	*/
      2   1.1   gdamore 
      3   1.1   gdamore /*-
      4   1.1   gdamore  * Copyright (c) 2006 Itronix Inc.
      5   1.1   gdamore  * All rights reserved.
      6   1.1   gdamore  *
      7   1.1   gdamore  * Written by Iain Hibbert for Itronix Inc.
      8   1.1   gdamore  *
      9   1.1   gdamore  * Redistribution and use in source and binary forms, with or without
     10   1.1   gdamore  * modification, are permitted provided that the following conditions
     11   1.1   gdamore  * are met:
     12   1.1   gdamore  * 1. Redistributions of source code must retain the above copyright
     13   1.1   gdamore  *    notice, this list of conditions and the following disclaimer.
     14   1.1   gdamore  * 2. Redistributions in binary form must reproduce the above copyright
     15   1.1   gdamore  *    notice, this list of conditions and the following disclaimer in the
     16   1.1   gdamore  *    documentation and/or other materials provided with the distribution.
     17   1.1   gdamore  * 3. The name of Itronix Inc. may not be used to endorse
     18   1.1   gdamore  *    or promote products derived from this software without specific
     19   1.1   gdamore  *    prior written permission.
     20   1.1   gdamore  *
     21   1.1   gdamore  * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND
     22   1.1   gdamore  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     23   1.1   gdamore  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     24   1.1   gdamore  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY
     25   1.1   gdamore  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     26   1.1   gdamore  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     27   1.1   gdamore  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     28   1.1   gdamore  * ON ANY THEORY OF LIABILITY, WHETHER IN
     29   1.1   gdamore  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     30   1.1   gdamore  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     31   1.1   gdamore  * POSSIBILITY OF SUCH DAMAGE.
     32   1.1   gdamore  */
     33   1.1   gdamore /*-
     34   1.1   gdamore  * Copyright (c) 2001-2003 Maksim Yevmenkin <m_evmenkin (at) yahoo.com>
     35   1.1   gdamore  * All rights reserved.
     36   1.1   gdamore  *
     37   1.1   gdamore  * Redistribution and use in source and binary forms, with or without
     38   1.1   gdamore  * modification, are permitted provided that the following conditions
     39   1.1   gdamore  * are met:
     40   1.1   gdamore  * 1. Redistributions of source code must retain the above copyright
     41   1.1   gdamore  *    notice, this list of conditions and the following disclaimer.
     42   1.1   gdamore  * 2. Redistributions in binary form must reproduce the above copyright
     43   1.1   gdamore  *    notice, this list of conditions and the following disclaimer in the
     44   1.1   gdamore  *    documentation and/or other materials provided with the distribution.
     45   1.1   gdamore  *
     46   1.1   gdamore  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     47   1.1   gdamore  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     48   1.1   gdamore  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     49   1.1   gdamore  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     50   1.1   gdamore  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     51   1.1   gdamore  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     52   1.1   gdamore  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     53   1.1   gdamore  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     54   1.1   gdamore  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     55   1.1   gdamore  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     56   1.1   gdamore  * SUCH DAMAGE.
     57   1.1   gdamore  *
     58  1.20    andvar  * $Id: rfcomm.h,v 1.20 2025/09/07 21:31:21 andvar Exp $
     59   1.1   gdamore  * $FreeBSD: src/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h,v 1.4 2005/01/11 01:39:53 emax Exp $
     60   1.1   gdamore  */
     61   1.1   gdamore 
     62   1.1   gdamore #ifndef _NETBT_RFCOMM_H_
     63   1.1   gdamore #define _NETBT_RFCOMM_H_
     64   1.1   gdamore 
     65   1.2    plunky #include <sys/types.h>
     66   1.2    plunky 
     67   1.1   gdamore /*************************************************************************
     68   1.1   gdamore  *************************************************************************
     69   1.1   gdamore  **				RFCOMM					**
     70   1.1   gdamore  *************************************************************************
     71   1.1   gdamore  *************************************************************************/
     72   1.1   gdamore 
     73   1.1   gdamore #define RFCOMM_MTU_MAX			32767
     74   1.1   gdamore #define RFCOMM_MTU_MIN			23
     75   1.1   gdamore #define RFCOMM_MTU_DEFAULT		127
     76   1.1   gdamore 
     77   1.1   gdamore #define RFCOMM_CREDITS_MAX		255	/* in any single packet */
     78   1.1   gdamore #define RFCOMM_CREDITS_DEFAULT		7	/* default initial value */
     79   1.1   gdamore 
     80   1.6    plunky #define RFCOMM_CHANNEL_ANY		0
     81   1.1   gdamore #define RFCOMM_CHANNEL_MIN		1
     82   1.1   gdamore #define RFCOMM_CHANNEL_MAX		30
     83   1.1   gdamore 
     84   1.1   gdamore /* RFCOMM frame types */
     85   1.1   gdamore #define RFCOMM_FRAME_SABM		0x2f
     86   1.1   gdamore #define RFCOMM_FRAME_DISC		0x43
     87   1.1   gdamore #define RFCOMM_FRAME_UA			0x63
     88   1.1   gdamore #define RFCOMM_FRAME_DM			0x0f
     89   1.1   gdamore #define RFCOMM_FRAME_UIH		0xef
     90   1.1   gdamore 
     91   1.1   gdamore /* RFCOMM MCC commands */
     92   1.1   gdamore #define RFCOMM_MCC_TEST			0x08	/* Test */
     93   1.1   gdamore #define RFCOMM_MCC_FCON			0x28	/* Flow Control on */
     94   1.1   gdamore #define RFCOMM_MCC_FCOFF		0x18	/* Flow Control off */
     95   1.1   gdamore #define RFCOMM_MCC_MSC			0x38	/* Modem Status Command */
     96   1.1   gdamore #define RFCOMM_MCC_RPN			0x24	/* Remote Port Negotiation */
     97   1.1   gdamore #define RFCOMM_MCC_RLS			0x14	/* Remote Line Status */
     98   1.1   gdamore #define RFCOMM_MCC_PN			0x20	/* Port Negotiation */
     99   1.1   gdamore #define RFCOMM_MCC_NSC			0x04	/* Non Supported Command */
    100   1.1   gdamore 
    101   1.1   gdamore /* RFCOMM modem signals */
    102   1.1   gdamore #define RFCOMM_MSC_FC			0x02	/* Flow Control asserted */
    103   1.1   gdamore #define RFCOMM_MSC_RTC			0x04	/* Ready To Communicate */
    104   1.1   gdamore #define RFCOMM_MSC_RTR			0x08	/* Ready To Receive */
    105  1.19    andvar #define RFCOMM_MSC_IC			0x40	/* Incoming Call (RING) */
    106   1.1   gdamore #define RFCOMM_MSC_DV			0x80	/* Data Valid */
    107   1.1   gdamore 
    108   1.1   gdamore /* RPN parameters - baud rate */
    109   1.1   gdamore #define RFCOMM_RPN_BR_2400		0x0
    110   1.1   gdamore #define RFCOMM_RPN_BR_4800		0x1
    111   1.1   gdamore #define RFCOMM_RPN_BR_7200		0x2
    112   1.1   gdamore #define RFCOMM_RPN_BR_9600		0x3
    113   1.1   gdamore #define RFCOMM_RPN_BR_19200		0x4
    114   1.1   gdamore #define RFCOMM_RPN_BR_38400		0x5
    115   1.1   gdamore #define RFCOMM_RPN_BR_57600		0x6
    116   1.1   gdamore #define RFCOMM_RPN_BR_115200		0x7
    117   1.1   gdamore #define RFCOMM_RPN_BR_230400		0x8
    118   1.1   gdamore 
    119   1.1   gdamore /* RPN parameters - data bits */
    120   1.1   gdamore #define RFCOMM_RPN_DATA_5		0x0
    121   1.1   gdamore #define RFCOMM_RPN_DATA_6		0x1
    122   1.1   gdamore #define RFCOMM_RPN_DATA_7		0x2
    123   1.1   gdamore #define RFCOMM_RPN_DATA_8		0x3
    124   1.1   gdamore 
    125   1.1   gdamore /* RPN parameters - stop bit */
    126   1.1   gdamore #define RFCOMM_RPN_STOP_1		0
    127   1.1   gdamore #define RFCOMM_RPN_STOP_15		1
    128   1.1   gdamore 
    129   1.1   gdamore /* RPN parameters - parity enable */
    130   1.1   gdamore #define RFCOMM_RPN_PARITY_NONE		0x0
    131   1.1   gdamore 
    132   1.1   gdamore /* RPN parameters - parity type */
    133   1.1   gdamore #define RFCOMM_RPN_PARITY_ODD		0x0
    134   1.1   gdamore #define RFCOMM_RPN_PARITY_EVEN		0x1
    135   1.1   gdamore #define RFCOMM_RPN_PARITY_MARK		0x2
    136   1.1   gdamore #define RFCOMM_RPN_PARITY_SPACE		0x3
    137   1.1   gdamore 
    138   1.1   gdamore /* RPN parameters - default line_setting */
    139   1.1   gdamore #define RFCOMM_RPN_8_N_1		0x03
    140   1.1   gdamore 
    141   1.1   gdamore /* RPN parameters - flow control */
    142   1.1   gdamore #define RFCOMM_RPN_XON_CHAR		0x11
    143   1.1   gdamore #define RFCOMM_RPN_XOFF_CHAR		0x13
    144   1.1   gdamore #define RFCOMM_RPN_FLOW_NONE		0x00
    145   1.1   gdamore 
    146   1.1   gdamore /* RPN parameters - mask */
    147   1.1   gdamore #define RFCOMM_RPN_PM_RATE		0x0001
    148   1.1   gdamore #define RFCOMM_RPN_PM_DATA		0x0002
    149   1.1   gdamore #define RFCOMM_RPN_PM_STOP		0x0004
    150   1.1   gdamore #define RFCOMM_RPN_PM_PARITY		0x0008
    151   1.1   gdamore #define RFCOMM_RPN_PM_PTYPE		0x0010
    152   1.1   gdamore #define RFCOMM_RPN_PM_XON		0x0020
    153   1.1   gdamore #define RFCOMM_RPN_PM_XOFF		0x0040
    154   1.1   gdamore 
    155   1.1   gdamore #define RFCOMM_RPN_PM_FLOW		0x3f00
    156   1.1   gdamore 
    157   1.1   gdamore #define RFCOMM_RPN_PM_ALL		0x3f7f
    158   1.1   gdamore 
    159   1.1   gdamore /* RFCOMM command frame header */
    160   1.1   gdamore struct rfcomm_cmd_hdr
    161   1.1   gdamore {
    162   1.1   gdamore 	uint8_t		address;
    163   1.1   gdamore 	uint8_t		control;
    164   1.1   gdamore 	uint8_t		length;
    165   1.1   gdamore 	uint8_t		fcs;
    166   1.8  gmcgarry } __packed;
    167   1.1   gdamore 
    168   1.1   gdamore /* RFCOMM MSC command */
    169   1.1   gdamore struct rfcomm_mcc_msc
    170   1.1   gdamore {
    171   1.1   gdamore 	uint8_t		address;
    172   1.1   gdamore 	uint8_t		modem;
    173   1.1   gdamore 	uint8_t		brk;
    174   1.8  gmcgarry } __packed;
    175   1.1   gdamore 
    176   1.1   gdamore /* RFCOMM RPN command */
    177   1.1   gdamore struct rfcomm_mcc_rpn
    178   1.1   gdamore {
    179   1.1   gdamore 	uint8_t		dlci;
    180   1.1   gdamore 	uint8_t		bit_rate;
    181   1.1   gdamore 	uint8_t		line_settings;
    182   1.1   gdamore 	uint8_t		flow_control;
    183   1.1   gdamore 	uint8_t		xon_char;
    184   1.1   gdamore 	uint8_t		xoff_char;
    185   1.1   gdamore 	uint16_t	param_mask;
    186   1.8  gmcgarry } __packed;
    187   1.1   gdamore 
    188   1.1   gdamore /* RFCOMM RLS command */
    189   1.1   gdamore struct rfcomm_mcc_rls
    190   1.1   gdamore {
    191   1.1   gdamore 	uint8_t		address;
    192   1.1   gdamore 	uint8_t		status;
    193   1.8  gmcgarry } __packed;
    194   1.1   gdamore 
    195   1.1   gdamore /* RFCOMM PN command */
    196   1.1   gdamore struct rfcomm_mcc_pn
    197   1.1   gdamore {
    198   1.1   gdamore 	uint8_t		dlci;
    199   1.1   gdamore 	uint8_t		flow_control;
    200   1.1   gdamore 	uint8_t		priority;
    201   1.1   gdamore 	uint8_t		ack_timer;
    202   1.1   gdamore 	uint16_t	mtu;
    203   1.1   gdamore 	uint8_t		max_retrans;
    204   1.1   gdamore 	uint8_t		credits;
    205   1.8  gmcgarry } __packed;
    206   1.1   gdamore 
    207   1.1   gdamore /* RFCOMM frame parsing macros */
    208   1.1   gdamore #define RFCOMM_DLCI(b)			(((b) & 0xfc) >> 2)
    209   1.1   gdamore #define RFCOMM_TYPE(b)			(((b) & 0xef))
    210   1.1   gdamore 
    211   1.1   gdamore #define RFCOMM_EA(b)			(((b) & 0x01))
    212   1.1   gdamore #define RFCOMM_CR(b)			(((b) & 0x02) >> 1)
    213   1.1   gdamore #define RFCOMM_PF(b)			(((b) & 0x10) >> 4)
    214   1.1   gdamore 
    215   1.1   gdamore #define RFCOMM_CHANNEL(dlci)		(((dlci) >> 1) & 0x2f)
    216   1.1   gdamore #define RFCOMM_DIRECTION(dlci)		((dlci) & 0x1)
    217   1.1   gdamore 
    218   1.1   gdamore #define RFCOMM_MKADDRESS(cr, dlci) \
    219   1.1   gdamore 	((((dlci) & 0x3f) << 2) | ((cr) << 1) | 0x01)
    220   1.1   gdamore 
    221   1.1   gdamore #define RFCOMM_MKCONTROL(type, pf)	((((type) & 0xef) | ((pf) << 4)))
    222   1.1   gdamore #define RFCOMM_MKDLCI(dir, channel)	((((channel) & 0x1f) << 1) | (dir))
    223   1.1   gdamore 
    224   1.1   gdamore /* RFCOMM MCC macros */
    225   1.1   gdamore #define RFCOMM_MCC_TYPE(b)		(((b) & 0xfc) >> 2)
    226   1.1   gdamore #define RFCOMM_MCC_LENGTH(b)		(((b) & 0xfe) >> 1)
    227   1.1   gdamore #define RFCOMM_MKMCC_TYPE(cr, type)	((((type) << 2) | ((cr) << 1) | 0x01))
    228   1.1   gdamore 
    229   1.1   gdamore /* RPN macros */
    230   1.1   gdamore #define RFCOMM_RPN_DATA_BITS(line)	((line) & 0x3)
    231   1.1   gdamore #define RFCOMM_RPN_STOP_BITS(line)	(((line) >> 2) & 0x1)
    232   1.1   gdamore #define RFCOMM_RPN_PARITY(line)		(((line) >> 3) & 0x1)
    233   1.1   gdamore 
    234   1.1   gdamore /*************************************************************************
    235   1.1   gdamore  *************************************************************************
    236   1.1   gdamore  **			SOCK_STREAM RFCOMM sockets			**
    237   1.1   gdamore  *************************************************************************
    238   1.1   gdamore  *************************************************************************/
    239   1.1   gdamore 
    240   1.3    plunky /* Socket options */
    241   1.1   gdamore #define SO_RFCOMM_MTU		1	/* mtu */
    242   1.1   gdamore #define SO_RFCOMM_FC_INFO	2	/* flow control info (below) */
    243   1.3    plunky #define SO_RFCOMM_LM		3	/* link mode */
    244   1.1   gdamore 
    245   1.1   gdamore /* Flow control information */
    246   1.1   gdamore struct rfcomm_fc_info {
    247   1.1   gdamore 	uint8_t		lmodem;		/* modem signals (local) */
    248   1.1   gdamore 	uint8_t		rmodem;		/* modem signals (remote) */
    249   1.1   gdamore 	uint8_t		tx_cred;	/* TX credits */
    250   1.1   gdamore 	uint8_t		rx_cred;	/* RX credits */
    251   1.1   gdamore 	uint8_t		cfc;		/* credit flow control */
    252   1.1   gdamore 	uint8_t		reserved;
    253   1.1   gdamore };
    254   1.1   gdamore 
    255   1.3    plunky /* RFCOMM link mode flags */
    256   1.3    plunky #define RFCOMM_LM_AUTH		(1<<0)	/* want authentication */
    257   1.3    plunky #define RFCOMM_LM_ENCRYPT	(1<<1)	/* want encryption */
    258   1.3    plunky #define RFCOMM_LM_SECURE	(1<<2)	/* want secured link */
    259   1.3    plunky 
    260   1.1   gdamore #ifdef _KERNEL
    261   1.1   gdamore 
    262   1.1   gdamore /* sysctl variables */
    263   1.1   gdamore extern int rfcomm_sendspace;
    264   1.1   gdamore extern int rfcomm_recvspace;
    265   1.1   gdamore extern int rfcomm_mtu_default;
    266   1.1   gdamore extern int rfcomm_ack_timeout;
    267   1.1   gdamore extern int rfcomm_mcc_timeout;
    268   1.1   gdamore 
    269   1.1   gdamore /*
    270   1.1   gdamore  * Bluetooth RFCOMM session data
    271   1.1   gdamore  * One L2CAP connection == one RFCOMM session
    272   1.1   gdamore  */
    273   1.1   gdamore 
    274   1.1   gdamore /* Credit note */
    275   1.1   gdamore struct rfcomm_credit {
    276   1.1   gdamore 	struct rfcomm_dlc		*rc_dlc;	/* owner */
    277   1.1   gdamore 	uint16_t			 rc_len;	/* length */
    278   1.1   gdamore 	SIMPLEQ_ENTRY(rfcomm_credit)	 rc_next;	/* next credit */
    279   1.1   gdamore };
    280   1.1   gdamore 
    281   1.1   gdamore /* RFCOMM session data (one L2CAP channel) */
    282   1.1   gdamore struct rfcomm_session {
    283   1.1   gdamore 	struct l2cap_channel		*rs_l2cap;	/* L2CAP pointer */
    284   1.1   gdamore 	uint16_t			 rs_flags;	/* session flags */
    285   1.1   gdamore 	uint16_t			 rs_state;	/* session state */
    286   1.1   gdamore 	uint16_t			 rs_mtu;	/* default MTU */
    287   1.1   gdamore 
    288   1.1   gdamore 	SIMPLEQ_HEAD(,rfcomm_credit)	 rs_credits;	/* credit notes */
    289   1.1   gdamore 	LIST_HEAD(,rfcomm_dlc)		 rs_dlcs;	/* DLC list */
    290   1.1   gdamore 
    291   1.4    plunky 	callout_t			 rs_timeout;	/* timeout */
    292   1.1   gdamore 
    293   1.1   gdamore 	LIST_ENTRY(rfcomm_session)	 rs_next;	/* next session */
    294   1.1   gdamore };
    295   1.1   gdamore 
    296   1.1   gdamore LIST_HEAD(rfcomm_session_list, rfcomm_session);
    297   1.1   gdamore extern struct rfcomm_session_list rfcomm_session_active;
    298   1.1   gdamore extern struct rfcomm_session_list rfcomm_session_listen;
    299   1.1   gdamore 
    300   1.1   gdamore /* Session state */
    301   1.1   gdamore #define RFCOMM_SESSION_CLOSED		0
    302   1.1   gdamore #define RFCOMM_SESSION_WAIT_CONNECT	1
    303   1.1   gdamore #define RFCOMM_SESSION_OPEN		2
    304   1.1   gdamore #define RFCOMM_SESSION_WAIT_DISCONNECT	3
    305   1.1   gdamore #define RFCOMM_SESSION_LISTEN		4
    306   1.1   gdamore 
    307   1.1   gdamore /* Session flags */
    308   1.1   gdamore #define RFCOMM_SESSION_INITIATOR	(1 << 0) /* we are initiator */
    309   1.1   gdamore #define RFCOMM_SESSION_CFC		(1 << 1) /* credit flow control */
    310   1.1   gdamore #define RFCOMM_SESSION_LFC		(1 << 2) /* local flow control */
    311   1.1   gdamore #define RFCOMM_SESSION_RFC		(1 << 3) /* remote flow control */
    312   1.1   gdamore #define RFCOMM_SESSION_FREE		(1 << 4) /* self lock out for free */
    313   1.1   gdamore 
    314   1.1   gdamore #define IS_INITIATOR(rs)	((rs)->rs_flags & RFCOMM_SESSION_INITIATOR)
    315   1.1   gdamore 
    316   1.1   gdamore /* Bluetooth RFCOMM DLC data (connection) */
    317   1.1   gdamore struct rfcomm_dlc {
    318   1.1   gdamore 	struct rfcomm_session	*rd_session; /* RFCOMM session */
    319   1.1   gdamore 	uint8_t			 rd_dlci;    /* RFCOMM DLCI */
    320   1.1   gdamore 
    321   1.1   gdamore 	uint16_t		 rd_flags;   /* DLC flags */
    322   1.1   gdamore 	uint16_t		 rd_state;   /* DLC state */
    323   1.1   gdamore 	uint16_t		 rd_mtu;     /* MTU */
    324   1.3    plunky 	int			 rd_mode;    /* link mode */
    325   1.1   gdamore 
    326   1.1   gdamore 	struct sockaddr_bt	 rd_laddr;   /* local address */
    327   1.1   gdamore 	struct sockaddr_bt	 rd_raddr;   /* remote address */
    328   1.1   gdamore 
    329  1.20    andvar 	uint8_t			 rd_lmodem;  /* local modem signals */
    330   1.1   gdamore 	uint8_t			 rd_rmodem;  /* remote modem signals */
    331   1.1   gdamore 
    332   1.1   gdamore 	int			 rd_rxcred;  /* receive credits (sent) */
    333   1.1   gdamore 	size_t			 rd_rxsize;  /* receive buffer (bytes, avail) */
    334   1.1   gdamore 	int			 rd_txcred;  /* transmit credits (unused) */
    335   1.1   gdamore 	int			 rd_pending; /* packets sent but not complete */
    336   1.1   gdamore 
    337   1.5    plunky 	callout_t		 rd_timeout; /* timeout */
    338   1.1   gdamore 	struct mbuf		*rd_txbuf;   /* transmit buffer */
    339   1.1   gdamore 
    340   1.1   gdamore 	const struct btproto	*rd_proto;   /* upper layer callbacks */
    341   1.1   gdamore 	void			*rd_upper;   /* upper layer argument */
    342   1.1   gdamore 
    343   1.1   gdamore 	LIST_ENTRY(rfcomm_dlc)	 rd_next;    /* next dlc on session */
    344   1.1   gdamore };
    345   1.1   gdamore 
    346   1.1   gdamore /*
    347   1.1   gdamore  * Credit Flow Control works in the following way.
    348   1.1   gdamore  *
    349   1.1   gdamore  * txcred is how many packets we can send. Received credit
    350   1.1   gdamore  * is added to this value, and it is decremented each time
    351   1.1   gdamore  * we send a packet.
    352   1.1   gdamore  *
    353   1.1   gdamore  * rxsize is the number of bytes that are available in the
    354   1.1   gdamore  * upstream receive buffer.
    355   1.1   gdamore  *
    356   1.1   gdamore  * rxcred is the number of credits that we have previously
    357   1.1   gdamore  * sent that are still unused. This value will be decreased
    358   1.1   gdamore  * for each packet we receive and we will add to it when we
    359   1.1   gdamore  * send credits. We calculate the amount of credits to send
    360   1.1   gdamore  * by the cunning formula "(space / mtu) - sent" so that if
    361   1.1   gdamore  * we get a bunch of small packets, we can continue sending
    362   1.1   gdamore  * credits without risking buffer overflow.
    363   1.1   gdamore  */
    364   1.1   gdamore 
    365   1.1   gdamore /* DLC flags */
    366   1.1   gdamore #define RFCOMM_DLC_DETACH		(1 << 0) /* DLC to be detached */
    367   1.1   gdamore #define RFCOMM_DLC_SHUTDOWN		(1 << 1) /* DLC to be shutdown */
    368   1.1   gdamore 
    369   1.1   gdamore /* DLC state */
    370   1.1   gdamore #define RFCOMM_DLC_CLOSED		0	/* no session */
    371   1.1   gdamore #define RFCOMM_DLC_WAIT_SESSION		1	/* waiting for session */
    372   1.1   gdamore #define RFCOMM_DLC_WAIT_CONNECT		2	/* waiting for connect */
    373   1.3    plunky #define RFCOMM_DLC_WAIT_SEND_SABM	3	/* waiting to send SABM */
    374   1.3    plunky #define RFCOMM_DLC_WAIT_SEND_UA		4	/* waiting to send UA */
    375   1.3    plunky #define RFCOMM_DLC_WAIT_RECV_UA		5	/* waiting to receive UA */
    376   1.3    plunky #define RFCOMM_DLC_OPEN			6	/* can send/receive */
    377   1.3    plunky #define RFCOMM_DLC_WAIT_DISCONNECT	7	/* waiting for disconnect */
    378   1.3    plunky #define RFCOMM_DLC_LISTEN		8	/* listening DLC */
    379   1.1   gdamore 
    380   1.1   gdamore /*
    381   1.1   gdamore  * Bluetooth RFCOMM socket kernel prototypes
    382   1.1   gdamore  */
    383   1.1   gdamore 
    384   1.1   gdamore struct socket;
    385   1.7    plunky struct sockopt;
    386   1.1   gdamore 
    387   1.1   gdamore /* rfcomm_dlc.c */
    388   1.1   gdamore struct rfcomm_dlc *rfcomm_dlc_lookup(struct rfcomm_session *, int);
    389   1.1   gdamore struct rfcomm_dlc *rfcomm_dlc_newconn(struct rfcomm_session *, int);
    390   1.1   gdamore void rfcomm_dlc_close(struct rfcomm_dlc *, int);
    391   1.1   gdamore void rfcomm_dlc_timeout(void *);
    392   1.3    plunky int rfcomm_dlc_setmode(struct rfcomm_dlc *);
    393   1.1   gdamore int rfcomm_dlc_connect(struct rfcomm_dlc *);
    394   1.3    plunky int rfcomm_dlc_open(struct rfcomm_dlc *);
    395   1.1   gdamore void rfcomm_dlc_start(struct rfcomm_dlc *);
    396   1.1   gdamore 
    397   1.1   gdamore /* rfcomm_session.c */
    398   1.1   gdamore struct rfcomm_session *rfcomm_session_alloc(struct rfcomm_session_list *, struct sockaddr_bt *);
    399   1.1   gdamore struct rfcomm_session *rfcomm_session_lookup(struct sockaddr_bt *, struct sockaddr_bt *);
    400   1.1   gdamore void rfcomm_session_free(struct rfcomm_session *);
    401   1.1   gdamore int rfcomm_session_send_frame(struct rfcomm_session *, int, int);
    402   1.1   gdamore int rfcomm_session_send_uih(struct rfcomm_session *, struct rfcomm_dlc *, int, struct mbuf *);
    403   1.1   gdamore int rfcomm_session_send_mcc(struct rfcomm_session *, int, uint8_t, void *, int);
    404   1.9     pooka void rfcomm_init(void);
    405   1.1   gdamore 
    406   1.1   gdamore /* rfcomm_socket.c */
    407   1.7    plunky int rfcomm_ctloutput(int, struct socket *, struct sockopt *);
    408   1.1   gdamore 
    409   1.1   gdamore /* rfcomm_upper.c */
    410  1.12     rmind int rfcomm_attach_pcb(struct rfcomm_dlc **, const struct btproto *, void *);
    411  1.14       rtr int rfcomm_bind_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
    412  1.13       rtr int rfcomm_sockaddr_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
    413  1.15       rtr int rfcomm_connect_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
    414  1.13       rtr int rfcomm_peeraddr_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
    415  1.16       rtr int rfcomm_disconnect_pcb(struct rfcomm_dlc *, int);
    416  1.12     rmind void rfcomm_detach_pcb(struct rfcomm_dlc **);
    417  1.14       rtr int rfcomm_listen_pcb(struct rfcomm_dlc *);
    418  1.17       rtr int rfcomm_send_pcb(struct rfcomm_dlc *, struct mbuf *);
    419  1.18       rtr int rfcomm_rcvd_pcb(struct rfcomm_dlc *, size_t);
    420   1.7    plunky int rfcomm_setopt(struct rfcomm_dlc *, const struct sockopt *);
    421   1.7    plunky int rfcomm_getopt(struct rfcomm_dlc *, struct sockopt *);
    422   1.1   gdamore 
    423   1.1   gdamore #endif /* _KERNEL */
    424   1.1   gdamore 
    425   1.1   gdamore #endif /* _NETBT_RFCOMM_H_ */
    426