1f2bb1caeSJulian Elischer /* 2f2bb1caeSJulian Elischer * ng_btsocket_rfcomm.h 3c398230bSWarner Losh */ 4c398230bSWarner Losh 5c398230bSWarner Losh /*- 64d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 7fe267a55SPedro F. Giffuni * 8f2bb1caeSJulian Elischer * Copyright (c) 2001-2003 Maksim Yevmenkin <m_evmenkin@yahoo.com> 9f2bb1caeSJulian Elischer * All rights reserved. 10f2bb1caeSJulian Elischer * 11f2bb1caeSJulian Elischer * Redistribution and use in source and binary forms, with or without 12f2bb1caeSJulian Elischer * modification, are permitted provided that the following conditions 13f2bb1caeSJulian Elischer * are met: 14f2bb1caeSJulian Elischer * 1. Redistributions of source code must retain the above copyright 15f2bb1caeSJulian Elischer * notice, this list of conditions and the following disclaimer. 16f2bb1caeSJulian Elischer * 2. Redistributions in binary form must reproduce the above copyright 17f2bb1caeSJulian Elischer * notice, this list of conditions and the following disclaimer in the 18f2bb1caeSJulian Elischer * documentation and/or other materials provided with the distribution. 19f2bb1caeSJulian Elischer * 20f2bb1caeSJulian Elischer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 21f2bb1caeSJulian Elischer * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22f2bb1caeSJulian Elischer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23f2bb1caeSJulian Elischer * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24f2bb1caeSJulian Elischer * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25f2bb1caeSJulian Elischer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26f2bb1caeSJulian Elischer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27f2bb1caeSJulian Elischer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28f2bb1caeSJulian Elischer * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29f2bb1caeSJulian Elischer * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30f2bb1caeSJulian Elischer * SUCH DAMAGE. 31f2bb1caeSJulian Elischer * 32f2bb1caeSJulian Elischer * $Id: ng_btsocket_rfcomm.h,v 1.10 2003/03/29 22:27:42 max Exp $ 33f2bb1caeSJulian Elischer */ 34f2bb1caeSJulian Elischer 35f2bb1caeSJulian Elischer #ifndef _NETGRAPH_BTSOCKET_RFCOMM_H_ 36f21fff6cSMaksim Yevmenkin #define _NETGRAPH_BTSOCKET_RFCOMM_H_ 37f2bb1caeSJulian Elischer 38f2bb1caeSJulian Elischer /***************************************************************************** 39f2bb1caeSJulian Elischer ***************************************************************************** 40f2bb1caeSJulian Elischer ** RFCOMM ** 41f2bb1caeSJulian Elischer ***************************************************************************** 42f2bb1caeSJulian Elischer *****************************************************************************/ 43f2bb1caeSJulian Elischer 44f2bb1caeSJulian Elischer /* XXX FIXME this does not belong here */ 45f2bb1caeSJulian Elischer 46980b8b89SMaksim Yevmenkin #define RFCOMM_DEFAULT_MTU 667 47f2bb1caeSJulian Elischer #define RFCOMM_MAX_MTU 1024 48f2bb1caeSJulian Elischer 49f2bb1caeSJulian Elischer #define RFCOMM_DEFAULT_CREDITS 7 50f2bb1caeSJulian Elischer #define RFCOMM_MAX_CREDITS 40 51f2bb1caeSJulian Elischer 52f2bb1caeSJulian Elischer /* RFCOMM frame types */ 53f2bb1caeSJulian Elischer #define RFCOMM_FRAME_SABM 0x2f 54f2bb1caeSJulian Elischer #define RFCOMM_FRAME_DISC 0x43 55f2bb1caeSJulian Elischer #define RFCOMM_FRAME_UA 0x63 56f2bb1caeSJulian Elischer #define RFCOMM_FRAME_DM 0x0f 57f2bb1caeSJulian Elischer #define RFCOMM_FRAME_UIH 0xef 58f2bb1caeSJulian Elischer 59f2bb1caeSJulian Elischer /* RFCOMM MCC commands */ 60f2bb1caeSJulian Elischer #define RFCOMM_MCC_TEST 0x08 /* Test */ 61f2bb1caeSJulian Elischer #define RFCOMM_MCC_FCON 0x28 /* Flow Control on */ 62f2bb1caeSJulian Elischer #define RFCOMM_MCC_FCOFF 0x18 /* Flow Control off */ 63f2bb1caeSJulian Elischer #define RFCOMM_MCC_MSC 0x38 /* Modem Status Command */ 64f2bb1caeSJulian Elischer #define RFCOMM_MCC_RPN 0x24 /* Remote Port Negotiation */ 65f2bb1caeSJulian Elischer #define RFCOMM_MCC_RLS 0x14 /* Remote Line Status */ 66f2bb1caeSJulian Elischer #define RFCOMM_MCC_PN 0x20 /* Port Negotiation */ 67f2bb1caeSJulian Elischer #define RFCOMM_MCC_NSC 0x04 /* Non Supported Command */ 68f2bb1caeSJulian Elischer 69f2bb1caeSJulian Elischer /* RFCOMM modem signals */ 70f2bb1caeSJulian Elischer #define RFCOMM_MODEM_FC 0x02 /* Flow Control asserted */ 71f2bb1caeSJulian Elischer #define RFCOMM_MODEM_RTC 0x04 /* Ready To Communicate */ 72f2bb1caeSJulian Elischer #define RFCOMM_MODEM_RTR 0x08 /* Ready To Receive */ 73053359b7SPedro F. Giffuni #define RFCOMM_MODEM_IC 0x40 /* Incoming Call */ 74f2bb1caeSJulian Elischer #define RFCOMM_MODEM_DV 0x80 /* Data Valid */ 75f2bb1caeSJulian Elischer 76f2bb1caeSJulian Elischer /* RPN parameters - baud rate */ 77f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_2400 0x0 78f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_4800 0x1 79f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_7200 0x2 80f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_9600 0x3 81f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_19200 0x4 82f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_38400 0x5 83f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_57600 0x6 84f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_115200 0x7 85f2bb1caeSJulian Elischer #define RFCOMM_RPN_BR_230400 0x8 86f2bb1caeSJulian Elischer 87f2bb1caeSJulian Elischer /* RPN parameters - data bits */ 88f2bb1caeSJulian Elischer #define RFCOMM_RPN_DATA_5 0x0 8906acf4bcSMaksim Yevmenkin #define RFCOMM_RPN_DATA_6 0x2 9006acf4bcSMaksim Yevmenkin #define RFCOMM_RPN_DATA_7 0x1 91f2bb1caeSJulian Elischer #define RFCOMM_RPN_DATA_8 0x3 92f2bb1caeSJulian Elischer 93f2bb1caeSJulian Elischer /* RPN parameters - stop bit */ 94f2bb1caeSJulian Elischer #define RFCOMM_RPN_STOP_1 0 95f2bb1caeSJulian Elischer #define RFCOMM_RPN_STOP_15 1 96f2bb1caeSJulian Elischer 97f2bb1caeSJulian Elischer /* RPN parameters - parity */ 98f2bb1caeSJulian Elischer #define RFCOMM_RPN_PARITY_NONE 0x0 99f2bb1caeSJulian Elischer #define RFCOMM_RPN_PARITY_ODD 0x4 100f2bb1caeSJulian Elischer #define RFCOMM_RPN_PARITY_EVEN 0x5 101f2bb1caeSJulian Elischer #define RFCOMM_RPN_PARITY_MARK 0x6 102f2bb1caeSJulian Elischer #define RFCOMM_RPN_PARITY_SPACE 0x7 103f2bb1caeSJulian Elischer 104f2bb1caeSJulian Elischer /* RPN parameters - flow control */ 105f2bb1caeSJulian Elischer #define RFCOMM_RPN_FLOW_NONE 0x00 106f2bb1caeSJulian Elischer #define RFCOMM_RPN_XON_CHAR 0x11 107f2bb1caeSJulian Elischer #define RFCOMM_RPN_XOFF_CHAR 0x13 108f2bb1caeSJulian Elischer 109f2bb1caeSJulian Elischer /* RPN parameters - mask */ 110f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_BITRATE 0x0001 111f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_DATA 0x0002 112f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_STOP 0x0004 113f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_PARITY 0x0008 114f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_PARITY_TYPE 0x0010 115f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_XON 0x0020 116f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_XOFF 0x0040 117f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_FLOW 0x3F00 118f2bb1caeSJulian Elischer #define RFCOMM_RPN_PM_ALL 0x3F7F 119f2bb1caeSJulian Elischer 120f2bb1caeSJulian Elischer /* RFCOMM frame header */ 121f2bb1caeSJulian Elischer struct rfcomm_frame_hdr 122f2bb1caeSJulian Elischer { 123f2bb1caeSJulian Elischer u_int8_t address; 124f2bb1caeSJulian Elischer u_int8_t control; 125f2bb1caeSJulian Elischer u_int8_t length; /* Actual size could be 2 bytes */ 126f2bb1caeSJulian Elischer } __attribute__ ((packed)); 127f2bb1caeSJulian Elischer 128f2bb1caeSJulian Elischer /* RFCOMM command frame header */ 129f2bb1caeSJulian Elischer struct rfcomm_cmd_hdr 130f2bb1caeSJulian Elischer { 131f2bb1caeSJulian Elischer u_int8_t address; 132f2bb1caeSJulian Elischer u_int8_t control; 133f2bb1caeSJulian Elischer u_int8_t length; 134f2bb1caeSJulian Elischer u_int8_t fcs; 135f2bb1caeSJulian Elischer } __attribute__ ((packed)); 136f2bb1caeSJulian Elischer 137f2bb1caeSJulian Elischer /* RFCOMM MCC command header */ 138f2bb1caeSJulian Elischer struct rfcomm_mcc_hdr 139f2bb1caeSJulian Elischer { 140f2bb1caeSJulian Elischer u_int8_t type; 141f2bb1caeSJulian Elischer u_int8_t length; /* XXX FIXME Can actual size be 2 bytes?? */ 142f2bb1caeSJulian Elischer } __attribute__ ((packed)); 143f2bb1caeSJulian Elischer 144f2bb1caeSJulian Elischer /* RFCOMM MSC command */ 145f2bb1caeSJulian Elischer struct rfcomm_mcc_msc 146f2bb1caeSJulian Elischer { 147f2bb1caeSJulian Elischer u_int8_t address; 148f2bb1caeSJulian Elischer u_int8_t modem; 149f2bb1caeSJulian Elischer } __attribute__ ((packed)); 150f2bb1caeSJulian Elischer 151f2bb1caeSJulian Elischer /* RFCOMM RPN command */ 152f2bb1caeSJulian Elischer struct rfcomm_mcc_rpn 153f2bb1caeSJulian Elischer { 154f2bb1caeSJulian Elischer u_int8_t dlci; 155f2bb1caeSJulian Elischer u_int8_t bit_rate; 156f2bb1caeSJulian Elischer u_int8_t line_settings; 157f2bb1caeSJulian Elischer u_int8_t flow_control; 158f2bb1caeSJulian Elischer u_int8_t xon_char; 159f2bb1caeSJulian Elischer u_int8_t xoff_char; 160f2bb1caeSJulian Elischer u_int16_t param_mask; 161f2bb1caeSJulian Elischer } __attribute__ ((packed)); 162f2bb1caeSJulian Elischer 163f2bb1caeSJulian Elischer /* RFCOMM RLS command */ 164f2bb1caeSJulian Elischer struct rfcomm_mcc_rls 165f2bb1caeSJulian Elischer { 166f2bb1caeSJulian Elischer u_int8_t address; 167f2bb1caeSJulian Elischer u_int8_t status; 168f2bb1caeSJulian Elischer } __attribute__ ((packed)); 169f2bb1caeSJulian Elischer 170f2bb1caeSJulian Elischer /* RFCOMM PN command */ 171f2bb1caeSJulian Elischer struct rfcomm_mcc_pn 172f2bb1caeSJulian Elischer { 173f2bb1caeSJulian Elischer u_int8_t dlci; 174f2bb1caeSJulian Elischer u_int8_t flow_control; 175f2bb1caeSJulian Elischer u_int8_t priority; 176f2bb1caeSJulian Elischer u_int8_t ack_timer; 177f2bb1caeSJulian Elischer u_int16_t mtu; 178f2bb1caeSJulian Elischer u_int8_t max_retrans; 179f2bb1caeSJulian Elischer u_int8_t credits; 180f2bb1caeSJulian Elischer } __attribute__ ((packed)); 181f2bb1caeSJulian Elischer 182f2bb1caeSJulian Elischer /* RFCOMM frame parsing macros */ 183f2bb1caeSJulian Elischer #define RFCOMM_DLCI(b) (((b) & 0xfc) >> 2) 184f2bb1caeSJulian Elischer #define RFCOMM_CHANNEL(b) (((b) & 0xf8) >> 3) 185f2bb1caeSJulian Elischer #define RFCOMM_DIRECTION(b) (((b) & 0x04) >> 2) 186f2bb1caeSJulian Elischer #define RFCOMM_TYPE(b) (((b) & 0xef)) 187f2bb1caeSJulian Elischer 188f2bb1caeSJulian Elischer #define RFCOMM_EA(b) (((b) & 0x01)) 189f2bb1caeSJulian Elischer #define RFCOMM_CR(b) (((b) & 0x02) >> 1) 190f2bb1caeSJulian Elischer #define RFCOMM_PF(b) (((b) & 0x10) >> 4) 191f2bb1caeSJulian Elischer 192f2bb1caeSJulian Elischer #define RFCOMM_SRVCHANNEL(dlci) ((dlci) >> 1) 193f2bb1caeSJulian Elischer 194f2bb1caeSJulian Elischer #define RFCOMM_MKADDRESS(cr, dlci) \ 195f2bb1caeSJulian Elischer ((((dlci) & 0x3f) << 2) | ((cr) << 1) | 0x01) 196f2bb1caeSJulian Elischer 197f2bb1caeSJulian Elischer #define RFCOMM_MKCONTROL(type, pf) ((((type) & 0xef) | ((pf) << 4))) 198f2bb1caeSJulian Elischer #define RFCOMM_MKDLCI(dir, channel) ((((channel) & 0x1f) << 1) | (dir)) 199f2bb1caeSJulian Elischer 200f2bb1caeSJulian Elischer #define RFCOMM_MKLEN8(len) (((len) << 1) | 1) 201f2bb1caeSJulian Elischer #define RFCOMM_MKLEN16(len) ((len) << 1) 202f2bb1caeSJulian Elischer 203f2bb1caeSJulian Elischer /* RFCOMM MCC macros */ 204f2bb1caeSJulian Elischer #define RFCOMM_MCC_TYPE(b) (((b) & 0xfc) >> 2) 205f2bb1caeSJulian Elischer #define RFCOMM_MCC_LENGTH(b) (((b) & 0xfe) >> 1) 206f2bb1caeSJulian Elischer #define RFCOMM_MKMCC_TYPE(cr, type) ((((type) << 2) | ((cr) << 1) | 0x01)) 207f2bb1caeSJulian Elischer 208f2bb1caeSJulian Elischer /* RPN macros */ 209f2bb1caeSJulian Elischer #define RFCOMM_RPN_DATA_BITS(line) ((line) & 0x3) 210f2bb1caeSJulian Elischer #define RFCOMM_RPN_STOP_BITS(line) (((line) >> 2) & 0x1) 211f2bb1caeSJulian Elischer #define RFCOMM_RPN_PARITY(line) (((line) >> 3) & 0x3) 212f2bb1caeSJulian Elischer #define RFCOMM_MKRPN_LINE_SETTINGS(data, stop, parity) \ 213f2bb1caeSJulian Elischer (((data) & 0x3) | (((stop) & 0x1) << 2) | (((parity) & 0x3) << 3)) 214f2bb1caeSJulian Elischer 215f2bb1caeSJulian Elischer /***************************************************************************** 216f2bb1caeSJulian Elischer ***************************************************************************** 217f2bb1caeSJulian Elischer ** SOCK_STREAM RFCOMM sockets ** 218f2bb1caeSJulian Elischer ***************************************************************************** 219f2bb1caeSJulian Elischer *****************************************************************************/ 220f2bb1caeSJulian Elischer 221f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SENDSPACE \ 222980b8b89SMaksim Yevmenkin (RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 2) 223f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_RECVSPACE \ 224980b8b89SMaksim Yevmenkin (RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 2) 225f2bb1caeSJulian Elischer 226f2bb1caeSJulian Elischer /* 227f2bb1caeSJulian Elischer * Bluetooth RFCOMM session. One L2CAP connection == one RFCOMM session 228f2bb1caeSJulian Elischer */ 229f2bb1caeSJulian Elischer 230f2bb1caeSJulian Elischer struct ng_btsocket_rfcomm_pcb; 231f2bb1caeSJulian Elischer struct ng_btsocket_rfcomm_session; 232f2bb1caeSJulian Elischer 233f2bb1caeSJulian Elischer struct ng_btsocket_rfcomm_session { 234f2bb1caeSJulian Elischer struct socket *l2so; /* L2CAP socket */ 235f2bb1caeSJulian Elischer 236f2bb1caeSJulian Elischer u_int16_t state; /* session state */ 237f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_CLOSED 0 238f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_LISTENING 1 239f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_CONNECTING 2 240f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_CONNECTED 3 241f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_OPEN 4 242f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_DISCONNECTING 5 243f2bb1caeSJulian Elischer 244f2bb1caeSJulian Elischer u_int16_t flags; /* session flags */ 245f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_INITIATOR (1 << 0) /* initiator */ 246f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_LFC (1 << 1) /* local flow */ 247f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_SESSION_RFC (1 << 2) /* remote flow */ 248f2bb1caeSJulian Elischer 249f2bb1caeSJulian Elischer #define INITIATOR(s) \ 250f2bb1caeSJulian Elischer (((s)->flags & NG_BTSOCKET_RFCOMM_SESSION_INITIATOR)? 1 : 0) 251f2bb1caeSJulian Elischer 252f2bb1caeSJulian Elischer u_int16_t mtu; /* default MTU */ 253f2bb1caeSJulian Elischer struct ng_bt_mbufq outq; /* outgoing queue */ 254f2bb1caeSJulian Elischer 255f2bb1caeSJulian Elischer struct mtx session_mtx; /* session lock */ 256f2bb1caeSJulian Elischer LIST_HEAD(, ng_btsocket_rfcomm_pcb) dlcs; /* active DLC */ 257f2bb1caeSJulian Elischer 258f2bb1caeSJulian Elischer LIST_ENTRY(ng_btsocket_rfcomm_session) next; /* link to next */ 259f2bb1caeSJulian Elischer }; 260f2bb1caeSJulian Elischer typedef struct ng_btsocket_rfcomm_session ng_btsocket_rfcomm_session_t; 261f2bb1caeSJulian Elischer typedef struct ng_btsocket_rfcomm_session * ng_btsocket_rfcomm_session_p; 262f2bb1caeSJulian Elischer 263f2bb1caeSJulian Elischer /* 264f2bb1caeSJulian Elischer * Bluetooth RFCOMM socket PCB (DLC) 265f2bb1caeSJulian Elischer */ 266f2bb1caeSJulian Elischer 267f2bb1caeSJulian Elischer struct ng_btsocket_rfcomm_pcb { 268f2bb1caeSJulian Elischer struct socket *so; /* RFCOMM socket */ 269f2bb1caeSJulian Elischer struct ng_btsocket_rfcomm_session *session; /* RFCOMM session */ 270f2bb1caeSJulian Elischer 271f2bb1caeSJulian Elischer u_int16_t flags; /* DLC flags */ 272f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_TIMO (1 << 0) /* timeout pending */ 273f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_CFC (1 << 1) /* credit flow ctrl */ 274053359b7SPedro F. Giffuni #define NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT (1 << 2) /* timeout happened */ 275f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_DETACHED (1 << 3) /* DLC detached */ 276f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_SENDING (1 << 4) /* send pending */ 277f2bb1caeSJulian Elischer 278f2bb1caeSJulian Elischer u_int16_t state; /* DLC state */ 279f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_CLOSED 0 280f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_W4_CONNECT 1 281f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_CONFIGURING 2 282f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_CONNECTING 3 283f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_CONNECTED 4 284f2bb1caeSJulian Elischer #define NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING 5 285f2bb1caeSJulian Elischer 286f2bb1caeSJulian Elischer bdaddr_t src; /* source address */ 287f2bb1caeSJulian Elischer bdaddr_t dst; /* dest. address */ 288f2bb1caeSJulian Elischer 289f2bb1caeSJulian Elischer u_int8_t channel; /* RFCOMM channel */ 290f2bb1caeSJulian Elischer u_int8_t dlci; /* RFCOMM DLCI */ 291f2bb1caeSJulian Elischer 292f2bb1caeSJulian Elischer u_int8_t lmodem; /* local mdm signls */ 293f2bb1caeSJulian Elischer u_int8_t rmodem; /* remote -/- */ 294f2bb1caeSJulian Elischer 295f2bb1caeSJulian Elischer u_int16_t mtu; /* MTU */ 296f2bb1caeSJulian Elischer int16_t rx_cred; /* RX credits */ 297f2bb1caeSJulian Elischer int16_t tx_cred; /* TX credits */ 298f2bb1caeSJulian Elischer 299f2bb1caeSJulian Elischer struct mtx pcb_mtx; /* PCB lock */ 3003d1592efSJohn Baldwin struct callout timo; /* timeout */ 301f2bb1caeSJulian Elischer 302f2bb1caeSJulian Elischer LIST_ENTRY(ng_btsocket_rfcomm_pcb) session_next;/* link to next */ 303f2bb1caeSJulian Elischer LIST_ENTRY(ng_btsocket_rfcomm_pcb) next; /* link to next */ 304f2bb1caeSJulian Elischer }; 305f2bb1caeSJulian Elischer typedef struct ng_btsocket_rfcomm_pcb ng_btsocket_rfcomm_pcb_t; 306f2bb1caeSJulian Elischer typedef struct ng_btsocket_rfcomm_pcb * ng_btsocket_rfcomm_pcb_p; 307f2bb1caeSJulian Elischer 308f2bb1caeSJulian Elischer #define so2rfcomm_pcb(so) \ 309f2bb1caeSJulian Elischer ((struct ng_btsocket_rfcomm_pcb *)((so)->so_pcb)) 310f2bb1caeSJulian Elischer 311f2bb1caeSJulian Elischer /* 312f2bb1caeSJulian Elischer * Bluetooth RFCOMM socket methods 313f2bb1caeSJulian Elischer */ 314f2bb1caeSJulian Elischer 315f2bb1caeSJulian Elischer #ifdef _KERNEL 316f2bb1caeSJulian Elischer 317ac45e92fSRobert Watson void ng_btsocket_rfcomm_abort (struct socket *); 318a152f8a3SRobert Watson void ng_btsocket_rfcomm_close (struct socket *); 319cfb1e929SGleb Smirnoff int ng_btsocket_rfcomm_accept (struct socket *, struct sockaddr *); 320f2bb1caeSJulian Elischer int ng_btsocket_rfcomm_attach (struct socket *, int, struct thread *); 321f2bb1caeSJulian Elischer int ng_btsocket_rfcomm_bind (struct socket *, struct sockaddr *, 322f2bb1caeSJulian Elischer struct thread *); 323f2bb1caeSJulian Elischer int ng_btsocket_rfcomm_connect (struct socket *, struct sockaddr *, 324f2bb1caeSJulian Elischer struct thread *); 325f277746eSGleb Smirnoff int ng_btsocket_rfcomm_control (struct socket *, u_long, void *, 326f2bb1caeSJulian Elischer struct ifnet *, struct thread *); 327f2bb1caeSJulian Elischer int ng_btsocket_rfcomm_ctloutput (struct socket *, struct sockopt *); 328bc725eafSRobert Watson void ng_btsocket_rfcomm_detach (struct socket *); 329f2bb1caeSJulian Elischer int ng_btsocket_rfcomm_disconnect (struct socket *); 330d374e81eSRobert Watson int ng_btsocket_rfcomm_listen (struct socket *, int, struct thread *); 331*0fac350cSGleb Smirnoff int ng_btsocket_rfcomm_peeraddr (struct socket *, struct sockaddr *); 332f2bb1caeSJulian Elischer int ng_btsocket_rfcomm_send (struct socket *, int, struct mbuf *, 333f2bb1caeSJulian Elischer struct sockaddr *, struct mbuf *, 334f2bb1caeSJulian Elischer struct thread *); 335*0fac350cSGleb Smirnoff int ng_btsocket_rfcomm_sockaddr (struct socket *, struct sockaddr *); 336f2bb1caeSJulian Elischer 337f2bb1caeSJulian Elischer #endif /* _KERNEL */ 338f2bb1caeSJulian Elischer 339f2bb1caeSJulian Elischer #endif /* _NETGRAPH_BTSOCKET_RFCOMM_H_ */ 340