1 /* 2 * Copyright (C) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 /** 17 * @file l2cap_def.h 18 * 19 * @brief Interface of bluetooth l2cap protocol BR/EDR part 20 * 21 */ 22 23 #ifndef L2CAP_DEF_H 24 #define L2CAP_DEF_H 25 26 #include <stdint.h> 27 #include "packet.h" 28 #include "btstack.h" 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif // __cplusplus 33 34 // -------------------- Below is for BR/EDR ------------------------------ 35 36 #define L2CAP_INFORMATION_TYPE_CONNECTIONLESS_MTU 0x0001 // not supported in this implementation 37 #define L2CAP_INFORMATION_TYPE_EXTENDED_FEATURE 0x0002 38 #define L2CAP_INFORMATION_TYPE_FIXED_CHANNEL 0x0003 39 40 // the first octet for extended feature mask 41 #define L2CAP_FEATURE_FLOW_CONTROL_MODE 0x01 42 #define L2CAP_FEATURE_RETRANSMISSION_MODE 0x02 43 #define L2CAP_FEATURE_BIDIRECTIONAL_QOS 0x04 44 #define L2CAP_FEATURE_ENHANCED_RETRANSMISSION_MODE 0x08 45 #define L2CAP_FEATURE_STREAMING_MODE 0x10 46 #define L2CAP_FEATURE_FCS_OPTION 0x20 47 #define L2CAP_FEATURE_EXTENDED_FLOW_SPECIFICATION 0x40 48 #define L2CAP_FEATURE_FIXED_CHANNELS 0x80 49 50 // the second octet for extended feature mask 51 #define L2CAP_FEATURE_EXTENDED_WINDOW_SIZE 0x01 52 #define L2CAP_FEATURE_UNICAST_CONNECTIONLESS_DATA 0x02 53 54 // the first octet for fixed channels supported 55 #define L2CAP_FEATURE_SIGNALING_CHANNEl 0x02 56 #define L2CAP_FEATURE_CONNECTIONLESS_RECEPTION 0x04 57 #define L2CAP_FEATURE_AMP_MANAGER_PROTOCOL 0x08 58 #define L2CAP_FEATURE_BREDR_SECURITY_MANAGER 0x80 59 60 // the eighth octet for fixed channels supported 61 #define L2CAP_FEATURE_AMP_TEST_MANAGER 0x80 62 63 // l2cap mode 64 #define L2CAP_BASIC_MODE 0x00 65 #define L2CAP_ENHANCED_RETRANSMISSION_MODE 0x03 66 #define L2CAP_STREAM_MODE 0x04 67 68 #define L2CAP_DEFAULT_MTU 672 69 70 // L2cap connection response result 71 #define L2CAP_CONNECTION_SUCCESSFUL 0x0000 72 #define L2CAP_CONNECTION_PENDING 0x0001 73 #define L2CAP_PSM_NOT_SUPPORTED 0x0002 74 #define L2CAP_SECURITY_BLOCK 0x0003 75 #define L2CAP_NO_RESOURCES_AVAILABLE 0x0004 76 #define L2CAP_INVALID_SOURCE_CID 0x0006 77 #define L2CAP_SOURCE_CID_ALREADY_ALLOCATED 0x0007 78 79 // L2cap connection response status 80 #define L2CAP_NO_FURTHER_INFORMATION_AVAILABLE 0x0000 81 #define L2CAP_AUTHENTICATION_PENDING 0x0001 82 #define L2CAP_AUTHORIZATION_PENDING 0x0002 83 84 // L2cap config response result 85 #define L2CAP_SUCCESS 0x0000 86 #define L2CAP_UNACCEPTABLE_PARAMETERS 0x0001 87 #define L2CAP_REJECTED 0x0002 88 #define L2CAP_UNKNOWN_OPTIONS 0x0003 89 #define L2CAP_PENDING 0x0004 90 #define L2CAP_FLOW_SPEC_REJECTED 0x0005 91 92 #define L2CAP_STATE_COLLISION 0xFF 93 94 typedef struct { 95 // The requested mode of the link. 96 // Possible values are, 97 // 0x00(Default) - Basic Mode 98 // 0x03 - Enhanced Retransmission mode 99 // 0x04 - Streaming mode 100 uint8_t mode; 101 102 // Valid in Enhanced Retransmission mode, the value should be set to 0. 103 uint8_t maxTransmit; 104 105 // Valid in Enhanced Retransmission mode, the value should be set to 0. 106 uint8_t txWindowSize; 107 108 // Valid in Enhanced Retransmission mode, refer to the size of transmission window. 109 // The value range is 1 to 63 110 // If the value is set to 0, then l2cap will determine the real value. 111 uint8_t rxWindowSize; 112 113 // Valid in Enhanced Retransmission mode, the value should be set to 0. 114 uint16_t retransmissionTimeout; 115 116 // Valid in Enhanced Retransmission mode, the value should be set to 0. 117 uint16_t monitorTimeout; 118 119 // Valid in Enhanced Retransmission mode or Streaming mode, the value should be set to 0. 120 uint16_t mps; 121 } L2capOptionRfc; 122 123 typedef struct { 124 // The maximum SDU size the sender of this option is capable of accepting for a channel. 125 // The minimum value is 48. 126 // The default value is 672. 127 uint16_t mtu; 128 129 // The Flush Timeout the sender is going to use. 130 // It should be set to default value if profile/protocol does not specially refer. 131 // Possible values are, 132 // 0x0001 - no retransmissions at the baseband level should be performed. 133 // 0x0002 to 0xFFFE - Flush Timeout in milliseconds used by the baseband. 134 // 0xFFFF(Default) - an infinite amount of retransmissions. 135 uint16_t flushTimeout; 136 137 // Retransmission and flow control option 138 L2capOptionRfc rfc; 139 140 // Valid in Enhanced Retransmission mode or Streaming mode, specify the type of Frame Check Sequence (FCS). 141 // It should be set to default value if profile/protocol does not specially refer. 142 // Possible values are, 143 // 0x00 - No FCS 144 // 0x01(Default) - 16-bit FCS 145 uint8_t fcs; 146 } L2capConfigInfo; 147 148 typedef struct { 149 BtAddr addr; 150 uint16_t handle; 151 } L2capConnectionInfo; 152 153 typedef struct { 154 // Connection Request packets received 155 void (*recvConnectionReq)(uint16_t lcid, uint8_t id, const L2capConnectionInfo *info, uint16_t lpsm, void *ctx); 156 157 // Connection Response packet received 158 void (*recvConnectionRsp)( 159 uint16_t lcid, const L2capConnectionInfo *info, uint16_t result, uint16_t status, void *ctx); 160 161 // Configuration Request packet received 162 void (*recvConfigReq)(uint16_t lcid, uint8_t id, const L2capConfigInfo *cfg, void *ctx); 163 164 // Configuration Response packet received 165 void (*recvConfigRsp)(uint16_t lcid, const L2capConfigInfo *cfg, uint16_t result, void *ctx); 166 167 // Disconnection Request packet received 168 void (*recvDisconnectionReq)(uint16_t lcid, uint8_t id, void *ctx); 169 170 // Disconnection Response packet received 171 void (*recvDisconnectionRsp)(uint16_t lcid, void *ctx); 172 173 // Disconnected abnormal, such as acl disconnected or link loss 174 void (*disconnectAbnormal)(uint16_t lcid, uint8_t reason, void *ctx); 175 176 // L2cap data packet received 177 void (*recvData)(uint16_t lcid, Packet *pkt, void *ctx); 178 179 // In Enhanced Retransmission mode, when RNR received or tx_window overflow, this callback is generated 180 void (*remoteBusy)(uint16_t lcid, uint8_t isBusy, void *ctx); 181 } L2capService; 182 183 typedef struct { 184 // Echo Request packet received 185 void (*recvEchoReq)(uint16_t aclHandle, uint8_t id, const uint8_t *data, uint16_t dataLen, void *ctx); 186 // Echo Response packet received 187 void (*recvEchoRsp)(uint16_t aclHandle, const uint8_t *data, uint16_t dataLen, void *ctx); 188 } L2capEcho; 189 190 // -------------------- Below is for LE ------------------------------ 191 192 #define L2CAP_LE_ROLE_MASTER 0x00 193 #define L2CAP_LE_ROLE_SLAVE 0x01 194 195 #define L2CAP_LE_ATT_CHANNEL 0x0004 196 #define L2CAP_LE_SMP_CHANNEL 0x0006 197 198 // L2CAP CONNECTION PARAMETER UPDATE RESPONSE result 199 #define L2CAP_LE_CONNECTION_PARAMETERS_ACCEPTED 0x0000 200 #define L2CAP_LE_CONNECTION_PARAMETERS_REJECTED 0x0001 201 202 // L2cap Credit Based Connection response result 203 #define L2CAP_LE_CONNECTION_SUCCESSFUL 0x0000 204 #define L2CAP_LE_PSM_NOT_SUPPORTED 0x0002 205 #define L2CAP_LE_NO_RESOURCES_AVAILABLE 0x0004 206 #define L2CAP_LE_INSUFFICIENT_AUTHENTICATION 0x0005 207 #define L2CAP_LE_INSUFFICIENT_AUTHORIZATION 0x0006 208 #define L2CAP_LE_INSUFFICIENT_ENCRYPTION_KEY_SIZE 0x0007 209 #define L2CAP_LE_INSUFFICIENT_ENCRYPTION 0x0008 210 #define L2CAP_LE_INVALID_SOURCE_CID 0x0009 211 #define L2CAP_LE_SOURCE_CID_ALREADY_ALLOCATED 0x000A 212 #define L2CAP_LE_UNACCEPTABLE_PARAMETERS 0x000B 213 214 typedef struct { 215 uint16_t mtu; 216 uint16_t mps; 217 uint16_t credit; 218 } L2capLeConfigInfo; 219 220 typedef struct { 221 // LE Credit Based Connection Request packet received 222 // Refer to charter 4.22 of Core 5.0 223 void (*recvLeCreditBasedConnectionReq)( 224 uint16_t lcid, uint8_t id, const L2capConnectionInfo *info, const L2capLeConfigInfo *cfg, void *ctx); 225 // LE Credit Based Connection Response packet received 226 // Refer to charter 4.23 of Core 5.0 227 void (*recvLeCreditBasedConnectionRsp)( 228 uint16_t lcid, const L2capConnectionInfo *info, const L2capLeConfigInfo *cfg, uint16_t result, void *ctx); 229 230 // Disconnection Request packet received 231 // Refer to charter 4.6 of Core 5.0 232 void (*recvLeDisconnectionReq)(uint16_t lcid, uint8_t id, void *ctx); 233 // Disconnection Response packet received 234 // Refer to charter 4.7 of Core 5.0 235 void (*recvLeDisconnectionRsp)(uint16_t lcid, void *ctx); 236 237 // Disconnected abnormal, such as le acl disconnected or link loss 238 // Refer to HCI specification charter 7.7.5 of Core 5.0 239 void (*leDisconnectAbnormal)(uint16_t lcid, uint8_t reason, void *ctx); 240 241 // LE data packet received 242 void (*recvLeData)(uint16_t lcid, Packet *pkt, void *ctx); 243 244 void (*leRemoteBusy)(uint16_t lcid, uint8_t busy, void *ctx); 245 } L2capLeService; 246 247 typedef struct { 248 uint16_t cid; 249 250 // LE ACL connected 251 void (*leConnected)(const BtAddr *addr, uint16_t aclHandle, uint8_t role, uint8_t status); 252 253 // LE ACL disconnected 254 void (*leDisconnected)(uint16_t aclHandle, uint8_t status, uint8_t reason); 255 256 // LE Fix Channel data received 257 void (*recvLeData)(uint16_t aclHandle, const Packet *pkt); 258 } L2capLeFixChannel; 259 260 typedef struct { 261 uint16_t connIntervalMin; // Range: 0x0006 to 0x0C80, Time = N * 1.25 ms, Time Range: 7.5 ms to 4 s. 262 uint16_t connIntervalMax; // Range: 0x0006 to 0x0C80, Time = N * 1.25 ms, Time Range: 7.5 ms to 4 s. 263 uint16_t connLatency; // the range 0 to ((supervisionTimeout / (connIntervalMax * 2)) - 1) less than 500. 264 uint16_t supervisionTimeout; // Range: 0x000A to 0x0C80, Time = N * 10 ms, Time Range: 100 ms to 32 s 265 } L2capLeConnectionParameter; 266 267 typedef struct { 268 // Connection Parameter Update Request packet received 269 void (*recvLeConnectionParameterUpdateReq)( 270 uint16_t aclHandle, uint8_t id, const L2capLeConnectionParameter *param, void *ctx); 271 272 // Connection Parameter Update Response packet received 273 void (*recvLeConnectionParameterUpdateRsp)(uint16_t aclHandle, uint16_t result, void *ctx); 274 } L2capLeConnectionParameterUpdate; 275 276 #ifdef __cplusplus 277 } 278 #endif // __cplusplus 279 280 #endif // L2CAP_DEF_H