[BACK]Return to rfcomm.h CVS log [TXT][DIR] Up to [local] / sys / netbt

Annotation of sys/netbt/rfcomm.h, Revision 1.1.1.1

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

CVSweb