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