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

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

1.1       nbrk        1: /*     $OpenBSD: l2cap.h,v 1.4 2007/06/01 02:46:11 uwe Exp $   */
                      2: /*     $NetBSD: l2cap.h,v 1.5 2007/04/21 06:15:23 plunky Exp $ */
                      3:
                      4: /*-
                      5:  * Copyright (c) 2005 Iain Hibbert.
                      6:  * Copyright (c) 2006 Itronix Inc.
                      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:  * 3. The name of Itronix Inc. may not be used to endorse
                     18:  *    or promote products derived from this software without specific
                     19:  *    prior written permission.
                     20:  *
                     21:  * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND
                     22:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     23:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     24:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY
                     25:  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     26:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
                     27:  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
                     28:  * ON ANY THEORY OF LIABILITY, WHETHER IN
                     29:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     30:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     31:  * POSSIBILITY OF SUCH DAMAGE.
                     32:  */
                     33: /*-
                     34:  * Copyright (c) Maksim Yevmenkin <m_evmenkin@yahoo.com>
                     35:  * All rights reserved.
                     36:  *
                     37:  * Redistribution and use in source and binary forms, with or without
                     38:  * modification, are permitted provided that the following conditions
                     39:  * are met:
                     40:  * 1. Redistributions of source code must retain the above copyright
                     41:  *    notice, this list of conditions and the following disclaimer.
                     42:  * 2. Redistributions in binary form must reproduce the above copyright
                     43:  *    notice, this list of conditions and the following disclaimer in the
                     44:  *    documentation and/or other materials provided with the distribution.
                     45:  *
                     46:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     47:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     48:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     49:  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                     50:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     51:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     52:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     53:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     54:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     55:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     56:  * SUCH DAMAGE.
                     57:  *
                     58:  * $Id: l2cap.h,v 1.4 2007/06/01 02:46:11 uwe Exp $
                     59:  * $FreeBSD: src/sys/netgraph/bluetooth/include/l2cap.h,v 1.4 2005/08/31 18:13:23 emax Exp $
                     60:  */
                     61:
                     62: /*
                     63:  * This file contains everything that application needs to know about
                     64:  * Link Layer Control and Adaptation Protocol (L2CAP). All information
                     65:  * was obtained from Bluetooth Specification Books (v1.1 and up)
                     66:  *
                     67:  * This file can be included by both kernel and userland applications.
                     68:  */
                     69:
                     70: #ifndef _NETBT_L2CAP_H_
                     71: #define _NETBT_L2CAP_H_
                     72:
                     73: #include <sys/types.h>
                     74:
                     75: /**************************************************************************
                     76:  **************************************************************************
                     77:  **                   Common defines and types (L2CAP)
                     78:  **************************************************************************
                     79:  **************************************************************************/
                     80:
                     81: /*
                     82:  * Channel IDs are assigned per machine. So the total number of channels that
                     83:  * a machine can have open at the same time is 0xffff - 0x0040 = 0xffbf (65471).
                     84:  * This number does not depend on number of HCI connections.
                     85:  */
                     86:
                     87: #define L2CAP_NULL_CID                 0x0000  /* DO NOT USE THIS CID */
                     88: #define L2CAP_SIGNAL_CID               0x0001  /* signaling channel ID */
                     89: #define L2CAP_CLT_CID                  0x0002  /* connectionless channel ID */
                     90:        /* 0x0003 - 0x003f Reserved */
                     91: #define L2CAP_FIRST_CID                        0x0040  /* dynamically alloc. (start) */
                     92: #define L2CAP_LAST_CID                 0xffff  /* dynamically alloc. (end) */
                     93:
                     94: /* L2CAP MTU */
                     95: #define L2CAP_MTU_MINIMUM              48
                     96: #define L2CAP_MTU_DEFAULT              672
                     97: #define L2CAP_MTU_MAXIMUM              0xffff
                     98:
                     99: /* L2CAP flush and link timeouts */
                    100: #define L2CAP_FLUSH_TIMO_DEFAULT       0xffff /* always retransmit */
                    101: #define L2CAP_LINK_TIMO_DEFAULT                0xffff
                    102:
                    103: /* L2CAP Command Reject reasons */
                    104: #define L2CAP_REJ_NOT_UNDERSTOOD       0x0000
                    105: #define L2CAP_REJ_MTU_EXCEEDED         0x0001
                    106: #define L2CAP_REJ_INVALID_CID          0x0002
                    107: /* 0x0003 - 0xffff - reserved for future use */
                    108:
                    109: /* Protocol/Service Multiplexor (PSM) values */
                    110: #define L2CAP_PSM_ANY                  0x0000  /* Any/Invalid PSM */
                    111: #define L2CAP_PSM_SDP                  0x0001  /* Service Discovery Protocol */
                    112: #define L2CAP_PSM_RFCOMM               0x0003  /* RFCOMM protocol */
                    113: #define L2CAP_PSM_TCP                  0x0005  /* Telephony Control Protocol */
                    114: #define L2CAP_PSM_TCS                  0x0007  /* TCS cordless */
                    115: #define L2CAP_PSM_BNEP                 0x000f  /* Bluetooth Network */
                    116:                                                /*      Encapsulation Protocol*/
                    117: #define L2CAP_PSM_HID_CNTL             0x0011  /* HID Control */
                    118: #define L2CAP_PSM_HID_INTR             0x0013  /* HID Interrupt */
                    119: #define L2CAP_PSM_ESDP                 0x0015  /* Extended Service */
                    120:                                                /*      Discovery Profile */
                    121: #define L2CAP_PSM_AVCTP                        0x0017  /* Audio/Visual Control */
                    122:                                                /*      Transport Protocol */
                    123: #define L2CAP_PSM_AVDTP                        0x0019  /* Audio/Visual Distribution */
                    124:                                                /*      Transport Protocol */
                    125: /* 0x0019 - 0x1000 - reserved for future use */
                    126:
                    127: #define L2CAP_PSM_INVALID(psm)         (((psm) & 0x0101) != 0x0001)
                    128:
                    129: /* L2CAP Connection response command result codes */
                    130: #define L2CAP_SUCCESS                  0x0000
                    131: #define L2CAP_PENDING                  0x0001
                    132: #define L2CAP_PSM_NOT_SUPPORTED                0x0002
                    133: #define L2CAP_SECURITY_BLOCK           0x0003
                    134: #define L2CAP_NO_RESOURCES             0x0004
                    135: #define L2CAP_TIMEOUT                  0xeeee
                    136: #define L2CAP_UNKNOWN                  0xffff
                    137: /* 0x0005 - 0xffff - reserved for future use */
                    138:
                    139: /* L2CAP Connection response status codes */
                    140: #define L2CAP_NO_INFO                  0x0000
                    141: #define L2CAP_AUTH_PENDING             0x0001
                    142: #define L2CAP_AUTZ_PENDING             0x0002
                    143: /* 0x0003 - 0xffff - reserved for future use */
                    144:
                    145: /* L2CAP Configuration response result codes */
                    146: #define L2CAP_UNACCEPTABLE_PARAMS      0x0001
                    147: #define L2CAP_REJECT                   0x0002
                    148: #define L2CAP_UNKNOWN_OPTION           0x0003
                    149: /* 0x0003 - 0xffff - reserved for future use */
                    150:
                    151: /* L2CAP Configuration options */
                    152: #define L2CAP_OPT_CFLAG_BIT            0x0001
                    153: #define L2CAP_OPT_CFLAG(flags)         ((flags) & L2CAP_OPT_CFLAG_BIT)
                    154: #define L2CAP_OPT_HINT_BIT             0x80
                    155: #define L2CAP_OPT_HINT(type)           ((type) & L2CAP_OPT_HINT_BIT)
                    156: #define L2CAP_OPT_HINT_MASK            0x7f
                    157: #define L2CAP_OPT_MTU                  0x01
                    158: #define L2CAP_OPT_MTU_SIZE             sizeof(uint16_t)
                    159: #define L2CAP_OPT_FLUSH_TIMO           0x02
                    160: #define L2CAP_OPT_FLUSH_TIMO_SIZE      sizeof(uint16_t)
                    161: #define L2CAP_OPT_QOS                  0x03
                    162: #define L2CAP_OPT_QOS_SIZE             sizeof(l2cap_qos_t)
                    163: #define L2CAP_OPT_RFC                  0x04
                    164: #define L2CAP_OPT_RFC_SIZE             sizeof(l2cap_rfc_t)
                    165: /* 0x05 - 0xff - reserved for future use */
                    166:
                    167: /* L2CAP Information request type codes */
                    168: #define L2CAP_CONNLESS_MTU             0x0001
                    169: #define L2CAP_EXTENDED_FEATURES                0x0002
                    170: /* 0x0003 - 0xffff - reserved for future use */
                    171:
                    172: /* L2CAP Information response codes */
                    173: #define L2CAP_NOT_SUPPORTED            0x0001
                    174: /* 0x0002 - 0xffff - reserved for future use */
                    175:
                    176: /* L2CAP Quality of Service option */
                    177: typedef struct {
                    178:        uint8_t  flags;                 /* reserved for future use */
                    179:        uint8_t  service_type;          /* service type */
                    180:        uint32_t token_rate;            /* bytes per second */
                    181:        uint32_t token_bucket_size;     /* bytes */
                    182:        uint32_t peak_bandwidth;        /* bytes per second */
                    183:        uint32_t latency;               /* microseconds */
                    184:        uint32_t delay_variation;       /* microseconds */
                    185: } __attribute__ ((__packed__)) l2cap_qos_t;
                    186:
                    187: /* L2CAP QoS type */
                    188: #define L2CAP_QOS_NO_TRAFFIC   0x00
                    189: #define L2CAP_QOS_BEST_EFFORT  0x01       /* (default) */
                    190: #define L2CAP_QOS_GUARANTEED   0x02
                    191: /* 0x03 - 0xff - reserved for future use */
                    192:
                    193: /* L2CAP Retransmission & Flow Control option */
                    194: typedef struct {
                    195:        uint8_t mode;              /* RFC mode */
                    196:        uint8_t window_size;       /* bytes */
                    197:        uint8_t max_transmit;      /* max retransmissions */
                    198:        uint16_t        retransmit_timo;   /* milliseconds */
                    199:        uint16_t        monitor_timo;      /* milliseconds */
                    200:        uint16_t        max_pdu_size;      /* bytes */
                    201: } __attribute__ ((__packed__)) l2cap_rfc_t;
                    202:
                    203: /* L2CAP RFC mode */
                    204: #define L2CAP_RFC_BASIC                0x00       /* (default) */
                    205: #define L2CAP_RFC_RETRANSMIT   0x01
                    206: #define L2CAP_RFC_FLOW         0x02
                    207: /* 0x03 - 0xff - reserved for future use */
                    208:
                    209: /**************************************************************************
                    210:  **************************************************************************
                    211:  **                 Link level defines, headers and types
                    212:  **************************************************************************
                    213:  **************************************************************************/
                    214:
                    215: /* L2CAP header */
                    216: typedef struct {
                    217:        uint16_t        length; /* payload size */
                    218:        uint16_t        dcid;   /* destination channel ID */
                    219: } __attribute__ ((__packed__)) l2cap_hdr_t;
                    220:
                    221: /* L2CAP ConnectionLess Traffic                (dcid == L2CAP_CLT_CID) */
                    222: typedef struct {
                    223:        uint16_t        psm; /* Protocol/Service Multiplexor */
                    224: } __attribute__ ((__packed__)) l2cap_clt_hdr_t;
                    225:
                    226: #define L2CAP_CLT_MTU_MAXIMUM \
                    227:        (L2CAP_MTU_MAXIMUM - sizeof(l2cap_clt_hdr_t))
                    228:
                    229: /* L2CAP Command header                        (dcid == L2CAP_SIGNAL_CID) */
                    230: typedef struct {
                    231:        uint8_t code;   /* command OpCode */
                    232:        uint8_t ident;  /* identifier to match request and response */
                    233:        uint16_t        length; /* command parameters length */
                    234: } __attribute__ ((__packed__)) l2cap_cmd_hdr_t;
                    235:
                    236: /* L2CAP Command Reject */
                    237: #define L2CAP_COMMAND_REJ                      0x01
                    238: typedef struct {
                    239:        uint16_t        reason; /* reason to reject command */
                    240:        uint16_t        data[2];/* optional data */
                    241: } __attribute__ ((__packed__)) l2cap_cmd_rej_cp;
                    242:
                    243: /* L2CAP Connection Request */
                    244: #define L2CAP_CONNECT_REQ                      0x02
                    245: typedef struct {
                    246:        uint16_t        psm;  /* Protocol/Service Multiplexor (PSM) */
                    247:        uint16_t        scid; /* source channel ID */
                    248: } __attribute__ ((__packed__)) l2cap_con_req_cp;
                    249:
                    250: /* L2CAP Connection Response */
                    251: #define L2CAP_CONNECT_RSP                      0x03
                    252: typedef struct {
                    253:        uint16_t        dcid;   /* destination channel ID */
                    254:        uint16_t        scid;   /* source channel ID */
                    255:        uint16_t        result; /* 0x00 - success */
                    256:        uint16_t        status; /* more info if result != 0x00 */
                    257: } __attribute__ ((__packed__)) l2cap_con_rsp_cp;
                    258:
                    259: /* L2CAP Configuration Request */
                    260: #define L2CAP_CONFIG_REQ                       0x04
                    261: typedef struct {
                    262:        uint16_t        dcid;  /* destination channel ID */
                    263:        uint16_t        flags; /* flags */
                    264: /*     uint8_t options[] --  options */
                    265: } __attribute__ ((__packed__)) l2cap_cfg_req_cp;
                    266:
                    267: /* L2CAP Configuration Response */
                    268: #define L2CAP_CONFIG_RSP                       0x05
                    269: typedef struct {
                    270:        uint16_t        scid;   /* source channel ID */
                    271:        uint16_t        flags;  /* flags */
                    272:        uint16_t        result; /* 0x00 - success */
                    273: /*     uint8_t options[] -- options */
                    274: } __attribute__ ((__packed__)) l2cap_cfg_rsp_cp;
                    275:
                    276: /* L2CAP configuration option */
                    277: typedef struct {
                    278:        uint8_t type;
                    279:        uint8_t length;
                    280: /*     uint8_t value[] -- option value (depends on type) */
                    281: } __attribute__ ((__packed__)) l2cap_cfg_opt_t;
                    282:
                    283: /* L2CAP configuration option value */
                    284: typedef union {
                    285:        uint16_t                mtu;            /* L2CAP_OPT_MTU */
                    286:        uint16_t                flush_timo;     /* L2CAP_OPT_FLUSH_TIMO */
                    287:        l2cap_qos_t             qos;            /* L2CAP_OPT_QOS */
                    288:        l2cap_rfc_t             rfc;            /* L2CAP_OPT_RFC */
                    289: } l2cap_cfg_opt_val_t;
                    290:
                    291: /* L2CAP Disconnect Request */
                    292: #define L2CAP_DISCONNECT_REQ                   0x06
                    293: typedef struct {
                    294:        uint16_t        dcid; /* destination channel ID */
                    295:        uint16_t        scid; /* source channel ID */
                    296: } __attribute__ ((__packed__)) l2cap_discon_req_cp;
                    297:
                    298: /* L2CAP Disconnect Response */
                    299: #define L2CAP_DISCONNECT_RSP                   0x07
                    300: typedef l2cap_discon_req_cp    l2cap_discon_rsp_cp;
                    301:
                    302: /* L2CAP Echo Request */
                    303: #define L2CAP_ECHO_REQ                         0x08
                    304: /* No command parameters, only optional data */
                    305:
                    306: /* L2CAP Echo Response */
                    307: #define L2CAP_ECHO_RSP                         0x09
                    308: #define L2CAP_MAX_ECHO_SIZE \
                    309:        (L2CAP_MTU_MAXIMUM - sizeof(l2cap_cmd_hdr_t))
                    310: /* No command parameters, only optional data */
                    311:
                    312: /* L2CAP Information Request */
                    313: #define L2CAP_INFO_REQ                         0x0a
                    314: typedef struct {
                    315:        uint16_t        type; /* requested information type */
                    316: } __attribute__ ((__packed__)) l2cap_info_req_cp;
                    317:
                    318: /* L2CAP Information Response */
                    319: #define L2CAP_INFO_RSP                         0x0b
                    320: typedef struct {
                    321:        uint16_t        type;   /* requested information type */
                    322:        uint16_t        result; /* 0x00 - success */
                    323: /*     uint8_t info[]  -- info data (depends on type)
                    324:  *
                    325:  * L2CAP_CONNLESS_MTU - 2 bytes connectionless MTU
                    326:  */
                    327: } __attribute__ ((__packed__)) l2cap_info_rsp_cp;
                    328:
                    329: typedef union {
                    330:        /* L2CAP_CONNLESS_MTU */
                    331:        struct {
                    332:                uint16_t        mtu;
                    333:        } __attribute__ ((__packed__)) mtu;
                    334: } l2cap_info_rsp_data_t;
                    335:
                    336: /**************************************************************************
                    337:  **************************************************************************
                    338:  **            L2CAP Socket Definitions
                    339:  **************************************************************************
                    340:  **************************************************************************/
                    341:
                    342: /* Socket options */
                    343: #define SO_L2CAP_IMTU          1       /* incoming MTU */
                    344: #define SO_L2CAP_OMTU          2       /* outgoing MTU */
                    345: #define SO_L2CAP_IQOS          3       /* incoming QoS */
                    346: #define SO_L2CAP_OQOS          4       /* outgoing QoS */
                    347: #define SO_L2CAP_FLUSH         5       /* flush timeout */
                    348: #define SO_L2CAP_LM            6       /* link mode */
                    349:
                    350: /* L2CAP link mode flags */
                    351: #define L2CAP_LM_AUTH          (1<<0)  /* want authentication */
                    352: #define L2CAP_LM_ENCRYPT       (1<<1)  /* want encryption */
                    353: #define L2CAP_LM_SECURE                (1<<2)  /* want secured link */
                    354:
                    355: #ifdef _KERNEL
                    356:
                    357: #include <net/if.h>            /* for struct ifqueue */
                    358:
                    359: LIST_HEAD(l2cap_channel_list, l2cap_channel);
                    360:
                    361: /* global variables */
                    362: extern struct l2cap_channel_list l2cap_active_list;
                    363: extern struct l2cap_channel_list l2cap_listen_list;
                    364: extern struct pool l2cap_pdu_pool;
                    365: extern struct pool l2cap_req_pool;
                    366: extern const l2cap_qos_t l2cap_default_qos;
                    367:
                    368: /* sysctl variables */
                    369: extern int l2cap_response_timeout;
                    370: extern int l2cap_response_extended_timeout;
                    371: extern int l2cap_sendspace, l2cap_recvspace;
                    372:
                    373: /*
                    374:  * L2CAP Channel
                    375:  */
                    376: struct l2cap_channel {
                    377:        struct hci_link         *lc_link;       /* ACL connection (down) */
                    378:        uint16_t                 lc_state;      /* channel state */
                    379:        uint16_t                 lc_flags;      /* channel flags */
                    380:        uint8_t                  lc_ident;      /* cached request id */
                    381:
                    382:        uint16_t                 lc_lcid;       /* local channel ID */
                    383:        struct sockaddr_bt       lc_laddr;      /* local address */
                    384:
                    385:        uint16_t                 lc_rcid;       /* remote channel ID */
                    386:        struct sockaddr_bt       lc_raddr;      /* remote address */
                    387:
                    388:        int                      lc_mode;       /* link mode */
                    389:        uint16_t                 lc_imtu;       /* incoming mtu */
                    390:        uint16_t                 lc_omtu;       /* outgoing mtu */
                    391:        uint16_t                 lc_flush;      /* flush timeout */
                    392:        l2cap_qos_t              lc_iqos;       /* incoming QoS flow control */
                    393:        l2cap_qos_t              lc_oqos;       /* outgoing Qos flow control */
                    394:
                    395:        uint8_t                  lc_pending;    /* num of pending PDUs */
                    396:        struct ifqueue           lc_txq;        /* transmit queue */
                    397:
                    398:        const struct btproto    *lc_proto;      /* upper layer callbacks */
                    399:        void                    *lc_upper;      /* upper layer argument */
                    400:
                    401:        LIST_ENTRY(l2cap_channel)lc_ncid;       /* next channel (ascending CID) */
                    402: };
                    403:
                    404: /* l2cap_channel state */
                    405: #define L2CAP_CLOSED                   0 /* closed */
                    406: #define L2CAP_WAIT_SEND_CONNECT_REQ    1 /* waiting to send connect request */
                    407: #define L2CAP_WAIT_RECV_CONNECT_RSP    2 /* waiting to recv connect response */
                    408: #define L2CAP_WAIT_SEND_CONNECT_RSP    3 /* waiting to send connect response */
                    409: #define L2CAP_WAIT_CONFIG              4 /* waiting for configuration */
                    410: #define L2CAP_OPEN                     5 /* user data transfer state */
                    411: #define L2CAP_WAIT_DISCONNECT          6 /* have sent disconnect request */
                    412:
                    413: /* l2cap_channel flags */
                    414: #define L2CAP_SHUTDOWN         (1<<0)  /* channel is closing */
                    415: #define L2CAP_WAIT_CONFIG_REQ  (1<<1)  /* waiting for config request */
                    416: #define L2CAP_WAIT_CONFIG_RSP  (1<<2)  /* waiting for config response */
                    417:
                    418: /*
                    419:  * L2CAP Request
                    420:  */
                    421: struct l2cap_req {
                    422:        struct hci_link         *lr_link;       /* ACL connection */
                    423:        struct l2cap_channel    *lr_chan;       /* channel pointer */
                    424:        uint8_t                  lr_code;       /* request code */
                    425:        uint8_t                  lr_id;         /* request id */
                    426:        struct timeout           lr_rtx;        /* response timer */
                    427:        TAILQ_ENTRY(l2cap_req)   lr_next;       /* next request on link */
                    428: };
                    429:
                    430: /*
                    431:  * L2CAP Protocol Data Unit
                    432:  */
                    433: struct l2cap_pdu {
                    434:        struct l2cap_channel    *lp_chan;       /* PDU owner */
                    435:        struct ifqueue           lp_data;       /* PDU data */
                    436:        TAILQ_ENTRY(l2cap_pdu)   lp_next;       /* next PDU on link */
                    437:        int                      lp_pending;    /* # of fragments pending */
                    438: };
                    439:
                    440: /*
                    441:  * L2CAP function prototypes
                    442:  */
                    443:
                    444: struct socket;
                    445: struct mbuf;
                    446:
                    447: /* l2cap_lower.c */
                    448: void l2cap_close(struct l2cap_channel *, int);
                    449: void l2cap_recv_frame(struct mbuf *, struct hci_link *);
                    450: int l2cap_start(struct l2cap_channel *);
                    451:
                    452: /* l2cap_misc.c */
                    453: void l2cap_init(void);
                    454: int l2cap_setmode(struct l2cap_channel *);
                    455: int l2cap_cid_alloc(struct l2cap_channel *);
                    456: struct l2cap_channel *l2cap_cid_lookup(uint16_t);
                    457: int l2cap_request_alloc(struct l2cap_channel *, uint8_t);
                    458: struct l2cap_req *l2cap_request_lookup(struct hci_link *, uint8_t);
                    459: void l2cap_request_free(struct l2cap_req *);
                    460: void l2cap_rtx(void *);
                    461:
                    462: /* l2cap_signal.c */
                    463: void l2cap_recv_signal(struct mbuf *, struct hci_link *);
                    464: int l2cap_send_connect_req(struct l2cap_channel *);
                    465: int l2cap_send_config_req(struct l2cap_channel *);
                    466: int l2cap_send_disconnect_req(struct l2cap_channel *);
                    467: int l2cap_send_connect_rsp(struct hci_link *, uint8_t, uint16_t, uint16_t, uint16_t);
                    468:
                    469: /* l2cap_socket.c */
                    470: int l2cap_usrreq(struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *);
                    471: int l2cap_ctloutput(int, struct socket *, int, int, struct mbuf **);
                    472:
                    473: /* l2cap_upper.c */
                    474: int l2cap_attach(struct l2cap_channel **, const struct btproto *, void *);
                    475: int l2cap_bind(struct l2cap_channel *, struct sockaddr_bt *);
                    476: int l2cap_sockaddr(struct l2cap_channel *, struct sockaddr_bt *);
                    477: int l2cap_connect(struct l2cap_channel *, struct sockaddr_bt *);
                    478: int l2cap_peeraddr(struct l2cap_channel *, struct sockaddr_bt *);
                    479: int l2cap_disconnect(struct l2cap_channel *, int);
                    480: int l2cap_detach(struct l2cap_channel **);
                    481: int l2cap_listen(struct l2cap_channel *);
                    482: int l2cap_send(struct l2cap_channel *, struct mbuf *);
                    483: int l2cap_setopt(struct l2cap_channel *, int, void *);
                    484: int l2cap_getopt(struct l2cap_channel *, int, void *);
                    485:
                    486: #endif /* _KERNEL */
                    487:
                    488: #endif /* _NETBT_L2CAP_H_ */

CVSweb