Path: blob/main/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h
34814 views
/*1* ng_btsocket_rfcomm.h2*/34/*-5* SPDX-License-Identifier: BSD-2-Clause6*7* Copyright (c) 2001-2003 Maksim Yevmenkin <[email protected]>8* All rights reserved.9*10* Redistribution and use in source and binary forms, with or without11* modification, are permitted provided that the following conditions12* are met:13* 1. Redistributions of source code must retain the above copyright14* notice, this list of conditions and the following disclaimer.15* 2. Redistributions in binary form must reproduce the above copyright16* notice, this list of conditions and the following disclaimer in the17* documentation and/or other materials provided with the distribution.18*19* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND20* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE21* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE22* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE23* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL24* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS25* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)26* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT27* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY28* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF29* SUCH DAMAGE.30*31* $Id: ng_btsocket_rfcomm.h,v 1.10 2003/03/29 22:27:42 max Exp $32*/3334#ifndef _NETGRAPH_BTSOCKET_RFCOMM_H_35#define _NETGRAPH_BTSOCKET_RFCOMM_H_3637/*****************************************************************************38*****************************************************************************39** RFCOMM **40*****************************************************************************41*****************************************************************************/4243/* XXX FIXME this does not belong here */4445#define RFCOMM_DEFAULT_MTU 66746#define RFCOMM_MAX_MTU 10244748#define RFCOMM_DEFAULT_CREDITS 749#define RFCOMM_MAX_CREDITS 405051/* RFCOMM frame types */52#define RFCOMM_FRAME_SABM 0x2f53#define RFCOMM_FRAME_DISC 0x4354#define RFCOMM_FRAME_UA 0x6355#define RFCOMM_FRAME_DM 0x0f56#define RFCOMM_FRAME_UIH 0xef5758/* 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 */6768/* 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 */7475/* RPN parameters - baud rate */76#define RFCOMM_RPN_BR_2400 0x077#define RFCOMM_RPN_BR_4800 0x178#define RFCOMM_RPN_BR_7200 0x279#define RFCOMM_RPN_BR_9600 0x380#define RFCOMM_RPN_BR_19200 0x481#define RFCOMM_RPN_BR_38400 0x582#define RFCOMM_RPN_BR_57600 0x683#define RFCOMM_RPN_BR_115200 0x784#define RFCOMM_RPN_BR_230400 0x88586/* RPN parameters - data bits */87#define RFCOMM_RPN_DATA_5 0x088#define RFCOMM_RPN_DATA_6 0x289#define RFCOMM_RPN_DATA_7 0x190#define RFCOMM_RPN_DATA_8 0x39192/* RPN parameters - stop bit */93#define RFCOMM_RPN_STOP_1 094#define RFCOMM_RPN_STOP_15 19596/* RPN parameters - parity */97#define RFCOMM_RPN_PARITY_NONE 0x098#define RFCOMM_RPN_PARITY_ODD 0x499#define RFCOMM_RPN_PARITY_EVEN 0x5100#define RFCOMM_RPN_PARITY_MARK 0x6101#define RFCOMM_RPN_PARITY_SPACE 0x7102103/* RPN parameters - flow control */104#define RFCOMM_RPN_FLOW_NONE 0x00105#define RFCOMM_RPN_XON_CHAR 0x11106#define RFCOMM_RPN_XOFF_CHAR 0x13107108/* RPN parameters - mask */109#define RFCOMM_RPN_PM_BITRATE 0x0001110#define RFCOMM_RPN_PM_DATA 0x0002111#define RFCOMM_RPN_PM_STOP 0x0004112#define RFCOMM_RPN_PM_PARITY 0x0008113#define RFCOMM_RPN_PM_PARITY_TYPE 0x0010114#define RFCOMM_RPN_PM_XON 0x0020115#define RFCOMM_RPN_PM_XOFF 0x0040116#define RFCOMM_RPN_PM_FLOW 0x3F00117#define RFCOMM_RPN_PM_ALL 0x3F7F118119/* RFCOMM frame header */120struct rfcomm_frame_hdr121{122u_int8_t address;123u_int8_t control;124u_int8_t length; /* Actual size could be 2 bytes */125} __attribute__ ((packed));126127/* RFCOMM command frame header */128struct rfcomm_cmd_hdr129{130u_int8_t address;131u_int8_t control;132u_int8_t length;133u_int8_t fcs;134} __attribute__ ((packed));135136/* RFCOMM MCC command header */137struct rfcomm_mcc_hdr138{139u_int8_t type;140u_int8_t length; /* XXX FIXME Can actual size be 2 bytes?? */141} __attribute__ ((packed));142143/* RFCOMM MSC command */144struct rfcomm_mcc_msc145{146u_int8_t address;147u_int8_t modem;148} __attribute__ ((packed));149150/* RFCOMM RPN command */151struct rfcomm_mcc_rpn152{153u_int8_t dlci;154u_int8_t bit_rate;155u_int8_t line_settings;156u_int8_t flow_control;157u_int8_t xon_char;158u_int8_t xoff_char;159u_int16_t param_mask;160} __attribute__ ((packed));161162/* RFCOMM RLS command */163struct rfcomm_mcc_rls164{165u_int8_t address;166u_int8_t status;167} __attribute__ ((packed));168169/* RFCOMM PN command */170struct rfcomm_mcc_pn171{172u_int8_t dlci;173u_int8_t flow_control;174u_int8_t priority;175u_int8_t ack_timer;176u_int16_t mtu;177u_int8_t max_retrans;178u_int8_t credits;179} __attribute__ ((packed));180181/* 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))186187#define RFCOMM_EA(b) (((b) & 0x01))188#define RFCOMM_CR(b) (((b) & 0x02) >> 1)189#define RFCOMM_PF(b) (((b) & 0x10) >> 4)190191#define RFCOMM_SRVCHANNEL(dlci) ((dlci) >> 1)192193#define RFCOMM_MKADDRESS(cr, dlci) \194((((dlci) & 0x3f) << 2) | ((cr) << 1) | 0x01)195196#define RFCOMM_MKCONTROL(type, pf) ((((type) & 0xef) | ((pf) << 4)))197#define RFCOMM_MKDLCI(dir, channel) ((((channel) & 0x1f) << 1) | (dir))198199#define RFCOMM_MKLEN8(len) (((len) << 1) | 1)200#define RFCOMM_MKLEN16(len) ((len) << 1)201202/* 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))206207/* 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))213214/*****************************************************************************215*****************************************************************************216** SOCK_STREAM RFCOMM sockets **217*****************************************************************************218*****************************************************************************/219220#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)224225/*226* Bluetooth RFCOMM session. One L2CAP connection == one RFCOMM session227*/228229struct ng_btsocket_rfcomm_pcb;230struct ng_btsocket_rfcomm_session;231232struct ng_btsocket_rfcomm_session {233struct socket *l2so; /* L2CAP socket */234235u_int16_t state; /* session state */236#define NG_BTSOCKET_RFCOMM_SESSION_CLOSED 0237#define NG_BTSOCKET_RFCOMM_SESSION_LISTENING 1238#define NG_BTSOCKET_RFCOMM_SESSION_CONNECTING 2239#define NG_BTSOCKET_RFCOMM_SESSION_CONNECTED 3240#define NG_BTSOCKET_RFCOMM_SESSION_OPEN 4241#define NG_BTSOCKET_RFCOMM_SESSION_DISCONNECTING 5242243u_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 */247248#define INITIATOR(s) \249(((s)->flags & NG_BTSOCKET_RFCOMM_SESSION_INITIATOR)? 1 : 0)250251u_int16_t mtu; /* default MTU */252struct ng_bt_mbufq outq; /* outgoing queue */253254struct mtx session_mtx; /* session lock */255LIST_HEAD(, ng_btsocket_rfcomm_pcb) dlcs; /* active DLC */256257LIST_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;261262/*263* Bluetooth RFCOMM socket PCB (DLC)264*/265266struct ng_btsocket_rfcomm_pcb {267struct socket *so; /* RFCOMM socket */268struct ng_btsocket_rfcomm_session *session; /* RFCOMM session */269270u_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 */276277u_int16_t state; /* DLC state */278#define NG_BTSOCKET_RFCOMM_DLC_CLOSED 0279#define NG_BTSOCKET_RFCOMM_DLC_W4_CONNECT 1280#define NG_BTSOCKET_RFCOMM_DLC_CONFIGURING 2281#define NG_BTSOCKET_RFCOMM_DLC_CONNECTING 3282#define NG_BTSOCKET_RFCOMM_DLC_CONNECTED 4283#define NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING 5284285bdaddr_t src; /* source address */286bdaddr_t dst; /* dest. address */287288u_int8_t channel; /* RFCOMM channel */289u_int8_t dlci; /* RFCOMM DLCI */290291u_int8_t lmodem; /* local mdm signls */292u_int8_t rmodem; /* remote -/- */293294u_int16_t mtu; /* MTU */295int16_t rx_cred; /* RX credits */296int16_t tx_cred; /* TX credits */297298struct mtx pcb_mtx; /* PCB lock */299struct callout timo; /* timeout */300301LIST_ENTRY(ng_btsocket_rfcomm_pcb) session_next;/* link to next */302LIST_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;306307#define so2rfcomm_pcb(so) \308((struct ng_btsocket_rfcomm_pcb *)((so)->so_pcb))309310/*311* Bluetooth RFCOMM socket methods312*/313314#ifdef _KERNEL315316void ng_btsocket_rfcomm_abort (struct socket *);317void ng_btsocket_rfcomm_close (struct socket *);318int ng_btsocket_rfcomm_accept (struct socket *, struct sockaddr *);319int ng_btsocket_rfcomm_attach (struct socket *, int, struct thread *);320int ng_btsocket_rfcomm_bind (struct socket *, struct sockaddr *,321struct thread *);322int ng_btsocket_rfcomm_connect (struct socket *, struct sockaddr *,323struct thread *);324int ng_btsocket_rfcomm_control (struct socket *, u_long, void *,325struct ifnet *, struct thread *);326int ng_btsocket_rfcomm_ctloutput (struct socket *, struct sockopt *);327void ng_btsocket_rfcomm_detach (struct socket *);328int ng_btsocket_rfcomm_disconnect (struct socket *);329int ng_btsocket_rfcomm_listen (struct socket *, int, struct thread *);330int ng_btsocket_rfcomm_peeraddr (struct socket *, struct sockaddr *);331int ng_btsocket_rfcomm_send (struct socket *, int, struct mbuf *,332struct sockaddr *, struct mbuf *,333struct thread *);334int ng_btsocket_rfcomm_sockaddr (struct socket *, struct sockaddr *);335336#endif /* _KERNEL */337338#endif /* _NETGRAPH_BTSOCKET_RFCOMM_H_ */339340341