Home | History | Annotate | Download | only in include
      1 /******************************************************************************
      2  *
      3  *  Copyright 1999-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 #ifndef L2CDEFS_H
     20 #define L2CDEFS_H
     21 
     22 /* L2CAP command codes
     23 */
     24 #define L2CAP_CMD_REJECT 0x01
     25 #define L2CAP_CMD_CONN_REQ 0x02
     26 #define L2CAP_CMD_CONN_RSP 0x03
     27 #define L2CAP_CMD_CONFIG_REQ 0x04
     28 #define L2CAP_CMD_CONFIG_RSP 0x05
     29 #define L2CAP_CMD_DISC_REQ 0x06
     30 #define L2CAP_CMD_DISC_RSP 0x07
     31 #define L2CAP_CMD_ECHO_REQ 0x08
     32 #define L2CAP_CMD_ECHO_RSP 0x09
     33 #define L2CAP_CMD_INFO_REQ 0x0A
     34 #define L2CAP_CMD_INFO_RSP 0x0B
     35 #define L2CAP_CMD_AMP_CONN_REQ 0x0C
     36 #define L2CAP_CMD_AMP_CONN_RSP 0x0D
     37 #define L2CAP_CMD_AMP_MOVE_REQ 0x0E
     38 #define L2CAP_CMD_AMP_MOVE_RSP 0x0F
     39 #define L2CAP_CMD_AMP_MOVE_CFM 0x10
     40 #define L2CAP_CMD_AMP_MOVE_CFM_RSP 0x11
     41 #define L2CAP_CMD_BLE_UPDATE_REQ 0x12
     42 #define L2CAP_CMD_BLE_UPDATE_RSP 0x13
     43 #define L2CAP_CMD_BLE_CREDIT_BASED_CONN_REQ 0x14
     44 #define L2CAP_CMD_BLE_CREDIT_BASED_CONN_RES 0x15
     45 #define L2CAP_CMD_BLE_FLOW_CTRL_CREDIT 0x16
     46 
     47 /* Define some packet and header lengths
     48 */
     49 /* Length and CID                       */
     50 #define L2CAP_PKT_OVERHEAD 4
     51 /* Cmd code, Id and length              */
     52 #define L2CAP_CMD_OVERHEAD 4
     53 /* Reason (data is optional)            */
     54 #define L2CAP_CMD_REJECT_LEN 2
     55 /* PSM and source CID                   */
     56 #define L2CAP_CONN_REQ_LEN 4
     57 /* Dest CID, source CID, reason, status */
     58 #define L2CAP_CONN_RSP_LEN 8
     59 /* Dest CID, flags (data is optional)   */
     60 #define L2CAP_CONFIG_REQ_LEN 4
     61 /* Dest CID, flags, result,data optional*/
     62 #define L2CAP_CONFIG_RSP_LEN 6
     63 /* Dest CID, source CID                 */
     64 #define L2CAP_DISC_REQ_LEN 4
     65 /* Dest CID, source CID                 */
     66 #define L2CAP_DISC_RSP_LEN 4
     67 /* Data is optional                     */
     68 #define L2CAP_ECHO_REQ_LEN 0
     69 /* Data is optional                     */
     70 #define L2CAP_ECHO_RSP_LEN 0
     71 /* Info type                            */
     72 #define L2CAP_INFO_REQ_LEN 2
     73 /* Info type, result (data is optional) */
     74 #define L2CAP_INFO_RSP_LEN 4
     75 /* Additional connectionless packet overhead */
     76 #define L2CAP_UCD_OVERHEAD 2
     77 
     78 /* PSM, CID, and remote controller ID   */
     79 #define L2CAP_AMP_CONN_REQ_LEN 5
     80 /* CID and remote controller ID         */
     81 #define L2CAP_AMP_MOVE_REQ_LEN 3
     82 /* CID and result                       */
     83 #define L2CAP_AMP_MOVE_RSP_LEN 4
     84 /* CID and result                       */
     85 #define L2CAP_AMP_MOVE_CFM_LEN 4
     86 /* CID                                  */
     87 #define L2CAP_AMP_MOVE_CFM_RSP_LEN 2
     88 
     89 /* Min and max interval, latency, tout  */
     90 #define L2CAP_CMD_BLE_UPD_REQ_LEN 8
     91 /* Result                               */
     92 #define L2CAP_CMD_BLE_UPD_RSP_LEN 2
     93 
     94 /* LE_PSM, SCID, MTU, MPS, Init Credit */
     95 #define L2CAP_CMD_BLE_CREDIT_BASED_CONN_REQ_LEN 10
     96 /* DCID, MTU, MPS, Init credit, Result */
     97 #define L2CAP_CMD_BLE_CREDIT_BASED_CONN_RES_LEN 10
     98 /* CID, Credit */
     99 #define L2CAP_CMD_BLE_FLOW_CTRL_CREDIT_LEN 4
    100 
    101 /* Define the packet boundary flags
    102 */
    103 #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
    104 #define L2CAP_PKT_START_FLUSHABLE 2
    105 #define L2CAP_PKT_START_NON_FLUSHABLE 0
    106 #endif
    107 #define L2CAP_COMPLETE_AMP_PKT 3 /* complete L2CAP packet on AMP HCI */
    108 #define L2CAP_PKT_START 2
    109 #define L2CAP_PKT_CONTINUE 1
    110 #define L2CAP_MASK_FLAG 0x0FFF
    111 #define L2CAP_PKT_TYPE_SHIFT 12
    112 #define L2CAP_PKT_TYPE_MASK 3
    113 
    114 /* Define the L2CAP connection result codes
    115 */
    116 #define L2CAP_CONN_OK 0
    117 #define L2CAP_CONN_PENDING 1
    118 #define L2CAP_CONN_NO_PSM 2
    119 #define L2CAP_CONN_SECURITY_BLOCK 3
    120 #define L2CAP_CONN_NO_RESOURCES 4
    121 #define L2CAP_CONN_BAD_CTLR_ID 5 /* AMP related */
    122 #define L2CAP_CONN_TIMEOUT 0xEEEE
    123 #define L2CAP_CONN_AMP_FAILED 254
    124 /* Add a couple of our own for internal use */
    125 #define L2CAP_CONN_NO_LINK 255
    126 #define L2CAP_CONN_CANCEL 256 /* L2CAP connection cancelled */
    127 
    128 /* Define the LE L2CAP connection result codes
    129 */
    130 #define L2CAP_LE_CONN_OK 0
    131 #define L2CAP_LE_NO_PSM 2
    132 #define L2CAP_LE_NO_RESOURCES 4
    133 #define L2CAP_LE_INSUFFICIENT_AUTHENTICATION 5
    134 #define L2CAP_LE_INSUFFICIENT_AUTHORIZATION 6
    135 #define L2CAP_LE_INSUFFICIENT_ENCRYP_KEY_SIZE 7
    136 #define L2CAP_LE_INSUFFICIENT_ENCRYP 8
    137 /* We don't like peer device response */
    138 #define L2CAP_LE_INVALID_SOURCE_CID 9
    139 #define L2CAP_LE_SOURCE_CID_ALREADY_ALLOCATED 0x0A
    140 
    141 /* Define L2CAP Move Channel Response result codes
    142 */
    143 #define L2CAP_MOVE_OK 0
    144 #define L2CAP_MOVE_PENDING 1
    145 #define L2CAP_MOVE_CTRL_ID_NOT_SUPPORT 2
    146 #define L2CAP_MOVE_SAME_CTRLR_ID 3
    147 #define L2CAP_MOVE_CONFIG_NOT_SUPPORTED 4
    148 #define L2CAP_MOVE_CHAN_COLLISION 5
    149 #define L2CAP_MOVE_NOT_ALLOWED 6
    150 
    151 /* Define L2CAP Move Channel Confirmation result codes
    152 */
    153 #define L2CAP_MOVE_CFM_OK 0
    154 #define L2CAP_MOVE_CFM_REFUSED 1
    155 
    156 /* Define the L2CAP command reject reason codes
    157 */
    158 #define L2CAP_CMD_REJ_NOT_UNDERSTOOD 0
    159 #define L2CAP_CMD_REJ_MTU_EXCEEDED 1
    160 #define L2CAP_CMD_REJ_INVALID_CID 2
    161 
    162 /* L2CAP Predefined CIDs
    163 */
    164 #define L2CAP_SIGNALLING_CID 1
    165 #define L2CAP_CONNECTIONLESS_CID 2
    166 #define L2CAP_AMP_CID 3
    167 #define L2CAP_ATT_CID 4
    168 #define L2CAP_BLE_SIGNALLING_CID 5
    169 #define L2CAP_SMP_CID 6
    170 #define L2CAP_SMP_BR_CID 7
    171 #define L2CAP_AMP_TEST_CID 0x003F
    172 #define L2CAP_BASE_APPL_CID 0x0040
    173 #define L2CAP_BLE_CONN_MAX_CID 0x007F
    174 
    175 /* Fixed Channels mask bits */
    176 
    177 /* Signal channel supported (Mandatory) */
    178 #define L2CAP_FIXED_CHNL_SIG_BIT (1 << L2CAP_SIGNALLING_CID)
    179 
    180 /* Connectionless reception */
    181 #define L2CAP_FIXED_CHNL_CNCTLESS_BIT (1 << L2CAP_CONNECTIONLESS_CID)
    182 
    183 /* AMP Manager supported */
    184 #define L2CAP_FIXED_CHNL_AMP_BIT (1 << L2CAP_AMP_CID)
    185 
    186 /* Attribute protocol supported */
    187 #define L2CAP_FIXED_CHNL_ATT_BIT (1 << L2CAP_ATT_CID)
    188 
    189 /* BLE Signalling supported */
    190 #define L2CAP_FIXED_CHNL_BLE_SIG_BIT (1 << L2CAP_BLE_SIGNALLING_CID)
    191 
    192 /* BLE Security Mgr supported */
    193 #define L2CAP_FIXED_CHNL_SMP_BIT (1 << L2CAP_SMP_CID)
    194 
    195 /* Security Mgr over BR supported */
    196 #define L2CAP_FIXED_CHNL_SMP_BR_BIT (1 << L2CAP_SMP_BR_CID)
    197 
    198 /* Define the L2CAP configuration result codes
    199 */
    200 #define L2CAP_CFG_OK 0
    201 #define L2CAP_CFG_UNACCEPTABLE_PARAMS 1
    202 #define L2CAP_CFG_FAILED_NO_REASON 2
    203 #define L2CAP_CFG_UNKNOWN_OPTIONS 3
    204 #define L2CAP_CFG_PENDING 4
    205 #define L2CAP_CFG_FLOW_SPEC_REJECTED 5
    206 
    207 /* Define the L2CAP configuration option types
    208 */
    209 #define L2CAP_CFG_TYPE_MTU 0x01
    210 #define L2CAP_CFG_TYPE_FLUSH_TOUT 0x02
    211 #define L2CAP_CFG_TYPE_QOS 0x03
    212 #define L2CAP_CFG_TYPE_FCR 0x04
    213 #define L2CAP_CFG_TYPE_FCS 0x05
    214 #define L2CAP_CFG_TYPE_EXT_FLOW 0x06
    215 #define L2CAP_CFG_TYPE_EXT_WIN_SIZE 0x07
    216 
    217 #define L2CAP_CFG_MTU_OPTION_LEN 2       /* MTU option length    */
    218 #define L2CAP_CFG_FLUSH_OPTION_LEN 2     /* Flush option len     */
    219 #define L2CAP_CFG_QOS_OPTION_LEN 22      /* QOS option length    */
    220 #define L2CAP_CFG_FCR_OPTION_LEN 9       /* FCR option length    */
    221 #define L2CAP_CFG_FCS_OPTION_LEN 1       /* FCR option length    */
    222 #define L2CAP_CFG_EXT_FLOW_OPTION_LEN 16 /* Extended Flow Spec   */
    223 #define L2CAP_CFG_EXT_WIN_SIZE_LEN 2     /* Ext window size length */
    224 #define L2CAP_CFG_OPTION_OVERHEAD 2      /* Type and length      */
    225 
    226 /* Configuration Cmd/Rsp Flags mask
    227 */
    228 #define L2CAP_CFG_FLAGS_MASK_CONT 0x0001 /* Flags mask: Continuation */
    229 
    230 /* FCS Check Option values
    231 */
    232 #define L2CAP_CFG_FCS_BYPASS 0 /* Bypass the FCS in streaming or ERTM modes */
    233 #define L2CAP_CFG_FCS_USE \
    234   1 /* Use the FCS in streaming or ERTM modes [default] */
    235 
    236 /* Default values for configuration
    237 */
    238 #define L2CAP_NO_AUTOMATIC_FLUSH 0xFFFF
    239 #define L2CAP_NO_RETRANSMISSION 0x0001
    240 
    241 #define L2CAP_DEFAULT_MTU (672)
    242 #define L2CAP_DEFAULT_FLUSH_TO L2CAP_NO_AUTOMATIC_FLUSH
    243 #define L2CAP_DEFAULT_SERV_TYPE 1
    244 #define L2CAP_DEFAULT_TOKEN_RATE 0
    245 #define L2CAP_DEFAULT_BUCKET_SIZE 0
    246 #define L2CAP_DEFAULT_PEAK_BANDWIDTH 0
    247 #define L2CAP_DEFAULT_LATENCY 0xFFFFFFFF
    248 #define L2CAP_DEFAULT_DELAY 0xFFFFFFFF
    249 #define L2CAP_DEFAULT_FCS L2CAP_CFG_FCS_USE
    250 
    251 /* Define the L2CAP disconnect result codes
    252 */
    253 #define L2CAP_DISC_OK 0
    254 #define L2CAP_DISC_TIMEOUT 0xEEEE
    255 
    256 /* Define the L2CAP info resp result codes
    257 */
    258 #define L2CAP_INFO_RESP_RESULT_SUCCESS 0
    259 #define L2CAP_INFO_RESP_RESULT_NOT_SUPPORTED 1
    260 
    261 /* Define the info-type fields of information request & response
    262 */
    263 #define L2CAP_CONNLESS_MTU_INFO_TYPE 0x0001
    264 /* Used in Information Req/Response */
    265 #define L2CAP_EXTENDED_FEATURES_INFO_TYPE 0x0002
    266 /* Used in AMP                      */
    267 #define L2CAP_FIXED_CHANNELS_INFO_TYPE 0x0003
    268 
    269 /* Connectionless MTU size          */
    270 #define L2CAP_CONNLESS_MTU_INFO_SIZE 2
    271 /* Extended features array size     */
    272 #define L2CAP_EXTENDED_FEATURES_ARRAY_SIZE 4
    273 /* Fixed channel array size         */
    274 #define L2CAP_FIXED_CHNL_ARRAY_SIZE 8
    275 
    276 /* Extended features mask bits
    277 */
    278 /* Retransmission Mode (Not Supported)    */
    279 #define L2CAP_EXTFEA_RTRANS 0x00000001
    280 /* Flow Control Mode   (Not Supported)    */
    281 #define L2CAP_EXTFEA_FC 0x00000002
    282 #define L2CAP_EXTFEA_QOS 0x00000004
    283 /* Enhanced retransmission mode           */
    284 #define L2CAP_EXTFEA_ENH_RETRANS 0x00000008
    285 /* Streaming Mode                         */
    286 #define L2CAP_EXTFEA_STREAM_MODE 0x00000010
    287 /* Optional FCS (if set No FCS desired)   */
    288 #define L2CAP_EXTFEA_NO_CRC 0x00000020
    289 /* Extended flow spec                     */
    290 #define L2CAP_EXTFEA_EXT_FLOW_SPEC 0x00000040
    291 /* Fixed channels                         */
    292 #define L2CAP_EXTFEA_FIXED_CHNLS 0x00000080
    293 /* Extended Window Size                   */
    294 #define L2CAP_EXTFEA_EXT_WINDOW 0x00000100
    295 /* Unicast Connectionless Data Reception  */
    296 #define L2CAP_EXTFEA_UCD_RECEPTION 0x00000200
    297 
    298 /* Mask for locally supported features used in Information Response
    299  * (default to none) */
    300 #ifndef L2CAP_EXTFEA_SUPPORTED_MASK
    301 #define L2CAP_EXTFEA_SUPPORTED_MASK 0
    302 #endif
    303 
    304 /* Mask for LE supported features used in Information Response
    305  * (default to none) */
    306 #ifndef L2CAP_BLE_EXTFEA_MASK
    307 #define L2CAP_BLE_EXTFEA_MASK 0
    308 #endif
    309 
    310 /* Define a value that tells L2CAP to use the default HCI ACL buffer size */
    311 #define L2CAP_INVALID_ERM_BUF_SIZE 0
    312 /* Define a value that tells L2CAP to use the default MPS */
    313 #define L2CAP_DEFAULT_ERM_MPS 0x0000
    314 
    315 #define L2CAP_FCR_OVERHEAD 2         /* Control word                 */
    316 #define L2CAP_FCS_LEN 2              /* FCS takes 2 bytes */
    317 #define L2CAP_SDU_LEN_OVERHEAD 2     /* SDU length field is 2 bytes */
    318 #define L2CAP_SDU_LEN_OFFSET 2       /* SDU length offset is 2 bytes */
    319 #define L2CAP_EXT_CONTROL_OVERHEAD 4 /* Extended Control Field       */
    320 /* length(2), channel(2), control(4), SDU length(2) FCS(2) */
    321 #define L2CAP_MAX_HEADER_FCS                                                  \
    322   (L2CAP_PKT_OVERHEAD + L2CAP_EXT_CONTROL_OVERHEAD + L2CAP_SDU_LEN_OVERHEAD + \
    323    L2CAP_FCS_LEN)
    324 
    325 /* TODO: This value can probably be optimized per transport, and per L2CAP
    326  * socket type, but this should not bring any big performance improvements. For
    327  * LE CoC, it should be biggest multiple of "PDU length" smaller than 0xffff (so
    328  * depend on controller buffer size), for Classic, making it multiple of PDU
    329  * length and also of the 3DH5 air including the l2cap headers in each packet.
    330  */
    331 #define L2CAP_SDU_LENGTH_MAX (8080 + 26 - (L2CAP_MIN_OFFSET + 6))
    332 constexpr uint16_t L2CAP_SDU_LENGTH_LE_MAX = 0xffff;
    333 
    334 /* Part of L2CAP_MIN_OFFSET that is not part of L2CAP
    335 */
    336 #define L2CAP_OFFSET_WO_L2HDR \
    337   (L2CAP_MIN_OFFSET - (L2CAP_PKT_OVERHEAD + L2CAP_FCR_OVERHEAD))
    338 
    339 /* SAR bits in the control word
    340 */
    341 /* Control word to begin with for unsegmented PDU*/
    342 #define L2CAP_FCR_UNSEG_SDU 0x0000
    343 /* ...for Starting PDU of a semented SDU */
    344 #define L2CAP_FCR_START_SDU 0x4000
    345 /* ...for ending PDU of a segmented SDU */
    346 #define L2CAP_FCR_END_SDU 0x8000
    347 /* ...for continuation PDU of a segmented SDU */
    348 #define L2CAP_FCR_CONT_SDU 0xc000
    349 
    350 /* Supervisory frame types */
    351 /* Supervisory frame - RR                          */
    352 #define L2CAP_FCR_SUP_RR 0x0000
    353 /* Supervisory frame - REJ                         */
    354 #define L2CAP_FCR_SUP_REJ 0x0001
    355 /* Supervisory frame - RNR                         */
    356 #define L2CAP_FCR_SUP_RNR 0x0002
    357 /* Supervisory frame - SREJ                        */
    358 #define L2CAP_FCR_SUP_SREJ 0x0003
    359 
    360 /* Mask to get the SAR bits from control word */
    361 #define L2CAP_FCR_SAR_BITS 0xC000
    362 /* Bits to shift right to get the SAR bits from ctrl-word */
    363 #define L2CAP_FCR_SAR_BITS_SHIFT 14
    364 
    365 /* Mask to check if a PDU is S-frame */
    366 #define L2CAP_FCR_S_FRAME_BIT 0x0001
    367 /* Mask to get the req-seq from control word */
    368 #define L2CAP_FCR_REQ_SEQ_BITS 0x3F00
    369 /* Bits to shift right to get the req-seq from ctrl-word */
    370 #define L2CAP_FCR_REQ_SEQ_BITS_SHIFT 8
    371 /* Mask on get the tx-seq from control word */
    372 #define L2CAP_FCR_TX_SEQ_BITS 0x007E
    373 /* Bits to shift right to get the tx-seq from ctrl-word */
    374 #define L2CAP_FCR_TX_SEQ_BITS_SHIFT 1
    375 
    376 /* F-bit in the control word (Sup and I frames)  */
    377 #define L2CAP_FCR_F_BIT 0x0080
    378 /* P-bit in the control word (Sup frames only)   */
    379 #define L2CAP_FCR_P_BIT 0x0010
    380 
    381 #define L2CAP_FCR_F_BIT_SHIFT 7
    382 #define L2CAP_FCR_P_BIT_SHIFT 4
    383 
    384 /* Mask to get the segmentation bits from ctrl-word */
    385 #define L2CAP_FCR_SEG_BITS 0xC000
    386 /* Bits to shift right to get the S-bits from ctrl-word */
    387 #define L2CAP_FCR_SUP_SHIFT 2
    388 /* Mask to get the supervisory bits from ctrl-word */
    389 #define L2CAP_FCR_SUP_BITS 0x000C
    390 
    391 /* Initial state of the CRC register */
    392 #define L2CAP_FCR_INIT_CRC 0
    393 /* Mask for sequence numbers (range 0 - 63) */
    394 #define L2CAP_FCR_SEQ_MODULO 0x3F
    395 
    396 #endif
    397