1*1da177e4SLinus Torvalds /* 2*1da177e4SLinus Torvalds BlueZ - Bluetooth protocol stack for Linux 3*1da177e4SLinus Torvalds Copyright (C) 2000-2001 Qualcomm Incorporated 4*1da177e4SLinus Torvalds 5*1da177e4SLinus Torvalds Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> 6*1da177e4SLinus Torvalds 7*1da177e4SLinus Torvalds This program is free software; you can redistribute it and/or modify 8*1da177e4SLinus Torvalds it under the terms of the GNU General Public License version 2 as 9*1da177e4SLinus Torvalds published by the Free Software Foundation; 10*1da177e4SLinus Torvalds 11*1da177e4SLinus Torvalds THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 12*1da177e4SLinus Torvalds OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 13*1da177e4SLinus Torvalds FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. 14*1da177e4SLinus Torvalds IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY 15*1da177e4SLinus Torvalds CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 16*1da177e4SLinus Torvalds WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17*1da177e4SLinus Torvalds ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18*1da177e4SLinus Torvalds OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19*1da177e4SLinus Torvalds 20*1da177e4SLinus Torvalds ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 21*1da177e4SLinus Torvalds COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 22*1da177e4SLinus Torvalds SOFTWARE IS DISCLAIMED. 23*1da177e4SLinus Torvalds */ 24*1da177e4SLinus Torvalds 25*1da177e4SLinus Torvalds #ifndef __L2CAP_H 26*1da177e4SLinus Torvalds #define __L2CAP_H 27*1da177e4SLinus Torvalds 28*1da177e4SLinus Torvalds /* L2CAP defaults */ 29*1da177e4SLinus Torvalds #define L2CAP_DEFAULT_MTU 672 30*1da177e4SLinus Torvalds #define L2CAP_DEFAULT_FLUSH_TO 0xFFFF 31*1da177e4SLinus Torvalds 32*1da177e4SLinus Torvalds #define L2CAP_CONN_TIMEOUT (HZ * 40) 33*1da177e4SLinus Torvalds 34*1da177e4SLinus Torvalds /* L2CAP socket address */ 35*1da177e4SLinus Torvalds struct sockaddr_l2 { 36*1da177e4SLinus Torvalds sa_family_t l2_family; 37*1da177e4SLinus Torvalds unsigned short l2_psm; 38*1da177e4SLinus Torvalds bdaddr_t l2_bdaddr; 39*1da177e4SLinus Torvalds }; 40*1da177e4SLinus Torvalds 41*1da177e4SLinus Torvalds /* L2CAP socket options */ 42*1da177e4SLinus Torvalds #define L2CAP_OPTIONS 0x01 43*1da177e4SLinus Torvalds struct l2cap_options { 44*1da177e4SLinus Torvalds __u16 omtu; 45*1da177e4SLinus Torvalds __u16 imtu; 46*1da177e4SLinus Torvalds __u16 flush_to; 47*1da177e4SLinus Torvalds __u8 mode; 48*1da177e4SLinus Torvalds }; 49*1da177e4SLinus Torvalds 50*1da177e4SLinus Torvalds #define L2CAP_CONNINFO 0x02 51*1da177e4SLinus Torvalds struct l2cap_conninfo { 52*1da177e4SLinus Torvalds __u16 hci_handle; 53*1da177e4SLinus Torvalds __u8 dev_class[3]; 54*1da177e4SLinus Torvalds }; 55*1da177e4SLinus Torvalds 56*1da177e4SLinus Torvalds #define L2CAP_LM 0x03 57*1da177e4SLinus Torvalds #define L2CAP_LM_MASTER 0x0001 58*1da177e4SLinus Torvalds #define L2CAP_LM_AUTH 0x0002 59*1da177e4SLinus Torvalds #define L2CAP_LM_ENCRYPT 0x0004 60*1da177e4SLinus Torvalds #define L2CAP_LM_TRUSTED 0x0008 61*1da177e4SLinus Torvalds #define L2CAP_LM_RELIABLE 0x0010 62*1da177e4SLinus Torvalds #define L2CAP_LM_SECURE 0x0020 63*1da177e4SLinus Torvalds 64*1da177e4SLinus Torvalds /* L2CAP command codes */ 65*1da177e4SLinus Torvalds #define L2CAP_COMMAND_REJ 0x01 66*1da177e4SLinus Torvalds #define L2CAP_CONN_REQ 0x02 67*1da177e4SLinus Torvalds #define L2CAP_CONN_RSP 0x03 68*1da177e4SLinus Torvalds #define L2CAP_CONF_REQ 0x04 69*1da177e4SLinus Torvalds #define L2CAP_CONF_RSP 0x05 70*1da177e4SLinus Torvalds #define L2CAP_DISCONN_REQ 0x06 71*1da177e4SLinus Torvalds #define L2CAP_DISCONN_RSP 0x07 72*1da177e4SLinus Torvalds #define L2CAP_ECHO_REQ 0x08 73*1da177e4SLinus Torvalds #define L2CAP_ECHO_RSP 0x09 74*1da177e4SLinus Torvalds #define L2CAP_INFO_REQ 0x0a 75*1da177e4SLinus Torvalds #define L2CAP_INFO_RSP 0x0b 76*1da177e4SLinus Torvalds 77*1da177e4SLinus Torvalds /* L2CAP structures */ 78*1da177e4SLinus Torvalds struct l2cap_hdr { 79*1da177e4SLinus Torvalds __u16 len; 80*1da177e4SLinus Torvalds __u16 cid; 81*1da177e4SLinus Torvalds } __attribute__ ((packed)); 82*1da177e4SLinus Torvalds #define L2CAP_HDR_SIZE 4 83*1da177e4SLinus Torvalds 84*1da177e4SLinus Torvalds struct l2cap_cmd_hdr { 85*1da177e4SLinus Torvalds __u8 code; 86*1da177e4SLinus Torvalds __u8 ident; 87*1da177e4SLinus Torvalds __u16 len; 88*1da177e4SLinus Torvalds } __attribute__ ((packed)); 89*1da177e4SLinus Torvalds #define L2CAP_CMD_HDR_SIZE 4 90*1da177e4SLinus Torvalds 91*1da177e4SLinus Torvalds struct l2cap_cmd_rej { 92*1da177e4SLinus Torvalds __u16 reason; 93*1da177e4SLinus Torvalds } __attribute__ ((packed)); 94*1da177e4SLinus Torvalds 95*1da177e4SLinus Torvalds struct l2cap_conn_req { 96*1da177e4SLinus Torvalds __u16 psm; 97*1da177e4SLinus Torvalds __u16 scid; 98*1da177e4SLinus Torvalds } __attribute__ ((packed)); 99*1da177e4SLinus Torvalds 100*1da177e4SLinus Torvalds struct l2cap_conn_rsp { 101*1da177e4SLinus Torvalds __u16 dcid; 102*1da177e4SLinus Torvalds __u16 scid; 103*1da177e4SLinus Torvalds __u16 result; 104*1da177e4SLinus Torvalds __u16 status; 105*1da177e4SLinus Torvalds } __attribute__ ((packed)); 106*1da177e4SLinus Torvalds 107*1da177e4SLinus Torvalds /* connect result */ 108*1da177e4SLinus Torvalds #define L2CAP_CR_SUCCESS 0x0000 109*1da177e4SLinus Torvalds #define L2CAP_CR_PEND 0x0001 110*1da177e4SLinus Torvalds #define L2CAP_CR_BAD_PSM 0x0002 111*1da177e4SLinus Torvalds #define L2CAP_CR_SEC_BLOCK 0x0003 112*1da177e4SLinus Torvalds #define L2CAP_CR_NO_MEM 0x0004 113*1da177e4SLinus Torvalds 114*1da177e4SLinus Torvalds /* connect status */ 115*1da177e4SLinus Torvalds #define L2CAP_CS_NO_INFO 0x0000 116*1da177e4SLinus Torvalds #define L2CAP_CS_AUTHEN_PEND 0x0001 117*1da177e4SLinus Torvalds #define L2CAP_CS_AUTHOR_PEND 0x0002 118*1da177e4SLinus Torvalds 119*1da177e4SLinus Torvalds struct l2cap_conf_req { 120*1da177e4SLinus Torvalds __u16 dcid; 121*1da177e4SLinus Torvalds __u16 flags; 122*1da177e4SLinus Torvalds __u8 data[0]; 123*1da177e4SLinus Torvalds } __attribute__ ((packed)); 124*1da177e4SLinus Torvalds 125*1da177e4SLinus Torvalds struct l2cap_conf_rsp { 126*1da177e4SLinus Torvalds __u16 scid; 127*1da177e4SLinus Torvalds __u16 flags; 128*1da177e4SLinus Torvalds __u16 result; 129*1da177e4SLinus Torvalds __u8 data[0]; 130*1da177e4SLinus Torvalds } __attribute__ ((packed)); 131*1da177e4SLinus Torvalds 132*1da177e4SLinus Torvalds #define L2CAP_CONF_SUCCESS 0x00 133*1da177e4SLinus Torvalds #define L2CAP_CONF_UNACCEPT 0x01 134*1da177e4SLinus Torvalds 135*1da177e4SLinus Torvalds struct l2cap_conf_opt { 136*1da177e4SLinus Torvalds __u8 type; 137*1da177e4SLinus Torvalds __u8 len; 138*1da177e4SLinus Torvalds __u8 val[0]; 139*1da177e4SLinus Torvalds } __attribute__ ((packed)); 140*1da177e4SLinus Torvalds #define L2CAP_CONF_OPT_SIZE 2 141*1da177e4SLinus Torvalds 142*1da177e4SLinus Torvalds #define L2CAP_CONF_MTU 0x01 143*1da177e4SLinus Torvalds #define L2CAP_CONF_FLUSH_TO 0x02 144*1da177e4SLinus Torvalds #define L2CAP_CONF_QOS 0x03 145*1da177e4SLinus Torvalds #define L2CAP_CONF_RFC 0x04 146*1da177e4SLinus Torvalds 147*1da177e4SLinus Torvalds #define L2CAP_CONF_MAX_SIZE 22 148*1da177e4SLinus Torvalds 149*1da177e4SLinus Torvalds struct l2cap_disconn_req { 150*1da177e4SLinus Torvalds __u16 dcid; 151*1da177e4SLinus Torvalds __u16 scid; 152*1da177e4SLinus Torvalds } __attribute__ ((packed)); 153*1da177e4SLinus Torvalds 154*1da177e4SLinus Torvalds struct l2cap_disconn_rsp { 155*1da177e4SLinus Torvalds __u16 dcid; 156*1da177e4SLinus Torvalds __u16 scid; 157*1da177e4SLinus Torvalds } __attribute__ ((packed)); 158*1da177e4SLinus Torvalds 159*1da177e4SLinus Torvalds struct l2cap_info_req { 160*1da177e4SLinus Torvalds __u16 type; 161*1da177e4SLinus Torvalds __u8 data[0]; 162*1da177e4SLinus Torvalds } __attribute__ ((packed)); 163*1da177e4SLinus Torvalds 164*1da177e4SLinus Torvalds struct l2cap_info_rsp { 165*1da177e4SLinus Torvalds __u16 type; 166*1da177e4SLinus Torvalds __u16 result; 167*1da177e4SLinus Torvalds __u8 data[0]; 168*1da177e4SLinus Torvalds } __attribute__ ((packed)); 169*1da177e4SLinus Torvalds 170*1da177e4SLinus Torvalds /* info type */ 171*1da177e4SLinus Torvalds #define L2CAP_IT_CL_MTU 0x0001 172*1da177e4SLinus Torvalds #define L2CAP_IT_FEAT_MASK 0x0002 173*1da177e4SLinus Torvalds 174*1da177e4SLinus Torvalds /* info result */ 175*1da177e4SLinus Torvalds #define L2CAP_IR_SUCCESS 0x0000 176*1da177e4SLinus Torvalds #define L2CAP_IR_NOTSUPP 0x0001 177*1da177e4SLinus Torvalds 178*1da177e4SLinus Torvalds /* ----- L2CAP connections ----- */ 179*1da177e4SLinus Torvalds struct l2cap_chan_list { 180*1da177e4SLinus Torvalds struct sock *head; 181*1da177e4SLinus Torvalds rwlock_t lock; 182*1da177e4SLinus Torvalds long num; 183*1da177e4SLinus Torvalds }; 184*1da177e4SLinus Torvalds 185*1da177e4SLinus Torvalds struct l2cap_conn { 186*1da177e4SLinus Torvalds struct hci_conn *hcon; 187*1da177e4SLinus Torvalds 188*1da177e4SLinus Torvalds bdaddr_t *dst; 189*1da177e4SLinus Torvalds bdaddr_t *src; 190*1da177e4SLinus Torvalds 191*1da177e4SLinus Torvalds unsigned int mtu; 192*1da177e4SLinus Torvalds 193*1da177e4SLinus Torvalds spinlock_t lock; 194*1da177e4SLinus Torvalds 195*1da177e4SLinus Torvalds struct sk_buff *rx_skb; 196*1da177e4SLinus Torvalds __u32 rx_len; 197*1da177e4SLinus Torvalds __u8 rx_ident; 198*1da177e4SLinus Torvalds __u8 tx_ident; 199*1da177e4SLinus Torvalds 200*1da177e4SLinus Torvalds struct l2cap_chan_list chan_list; 201*1da177e4SLinus Torvalds }; 202*1da177e4SLinus Torvalds 203*1da177e4SLinus Torvalds /* ----- L2CAP channel and socket info ----- */ 204*1da177e4SLinus Torvalds #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) 205*1da177e4SLinus Torvalds 206*1da177e4SLinus Torvalds struct l2cap_pinfo { 207*1da177e4SLinus Torvalds struct bt_sock bt; 208*1da177e4SLinus Torvalds __u16 psm; 209*1da177e4SLinus Torvalds __u16 dcid; 210*1da177e4SLinus Torvalds __u16 scid; 211*1da177e4SLinus Torvalds 212*1da177e4SLinus Torvalds __u16 imtu; 213*1da177e4SLinus Torvalds __u16 omtu; 214*1da177e4SLinus Torvalds __u16 flush_to; 215*1da177e4SLinus Torvalds 216*1da177e4SLinus Torvalds __u32 link_mode; 217*1da177e4SLinus Torvalds 218*1da177e4SLinus Torvalds __u8 conf_state; 219*1da177e4SLinus Torvalds __u8 conf_retry; 220*1da177e4SLinus Torvalds __u16 conf_mtu; 221*1da177e4SLinus Torvalds 222*1da177e4SLinus Torvalds __u8 ident; 223*1da177e4SLinus Torvalds 224*1da177e4SLinus Torvalds __u16 sport; 225*1da177e4SLinus Torvalds 226*1da177e4SLinus Torvalds struct l2cap_conn *conn; 227*1da177e4SLinus Torvalds struct sock *next_c; 228*1da177e4SLinus Torvalds struct sock *prev_c; 229*1da177e4SLinus Torvalds }; 230*1da177e4SLinus Torvalds 231*1da177e4SLinus Torvalds #define L2CAP_CONF_REQ_SENT 0x01 232*1da177e4SLinus Torvalds #define L2CAP_CONF_INPUT_DONE 0x02 233*1da177e4SLinus Torvalds #define L2CAP_CONF_OUTPUT_DONE 0x04 234*1da177e4SLinus Torvalds #define L2CAP_CONF_MAX_RETRIES 2 235*1da177e4SLinus Torvalds 236*1da177e4SLinus Torvalds void l2cap_load(void); 237*1da177e4SLinus Torvalds 238*1da177e4SLinus Torvalds #endif /* __L2CAP_H */ 239