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 #ifndef GAP_DEF_H 16 #define GAP_DEF_H 17 18 #include "gap.h" 19 #include "gap_le.h" 20 21 #include "alarm.h" 22 #include "list.h" 23 24 #ifdef __cplusplus 25 extern "C" { 26 #endif 27 28 #define GAP_BREDR_SUPPORT 29 #define GAP_LE_SUPPORT 30 31 #define BT_ADDR_FMT "%02X:%02X:**:**:**:%02X" 32 #define BT_ADDR_FMT_OUTPUT(addr) (addr)[5], (addr)[4], (addr)[0] 33 34 #define BT_ADDR_NULL \ 35 { \ 36 {0}, 0 \ 37 } 38 39 #define BT_COD_SIZE 3 40 #define COD_UINT_TO_ARRAY(cod) \ 41 { \ 42 ((cod)&0xff), (((cod) >> 8) & 0xff), (((cod) >> 16) & 0xff) \ 43 } 44 #define COD_ARRAY_TO_UINT(cod) ((uint32_t)(cod)[0] | (uint32_t)((cod)[1] << 8) | (uint32_t)((cod)[2] << 16)) 45 46 #define LAP_GENERAL_INQUIRY_ACCESS 0x9E8B33 47 #define LAP_LIMITED_INQUIRY_ACCESS 0x9E8B00 48 49 #define NO_SCANS_ENABLED 0 50 #define INQUIRY_SCAN_ENABLED_PAGE_SCAN_DISABLED 1 51 #define INQUIRY_SCAN_DISABLED_PAGE_SCAN_ENABLED 2 52 #define INQUIRY_SCAN_ENABLED_PAGE_SCAN_ENABLED 3 53 54 #define CURRENT_IAC_MAX_NUM 0x02 55 #define EXTENDED_SCAN_PHY_MAX_NUM 3 56 57 #define COD_LIMITED_DISCOVERABLE_BIT (1 << 13) 58 59 #define GAP_EIR_FEC_REQUIRED 0x00 60 61 #define GAP_INVALID_ACL_HANDLE 0xFFFF 62 63 #define GAP_HCI_DISC_REASON_AUTH_FAIL 0x05 64 65 #define GAP_DISC_ACL_WAIT_TIME 4000 66 #define GAP_USE_ACL_CONNECTION_TIME 30000 67 #define GAP_SEC_WAIT_ENCRYPT_TIME 2000 68 #define GAP_WAIT_EX_ADV_TERMINATED 1500 69 70 #define GAP_LINK_KEY_TYPE_UNKNOWN 0xFF 71 #define AUTHENTICATION_UNKNOWN_MITM 0xFF 72 73 #define AUTH_REQ_DEFAULT (SMP_AUTH_REQ_BONDING | SMP_AUTH_REQ_BIT_MITM | SMP_AUTH_REQ_BIT_SC) 74 75 #define LE_KEY_TYPE_UNAUTHENTICATION SMP_AUTH_FLAG_NO 76 #define LE_KEY_TYPE_AUTHENTICATION SMP_AUTH_FLAG_YES 77 #define LE_KEY_TYPE_UNKNOWN 0xFF 78 79 #ifdef GAP_BREDR_SUPPORT 80 81 #define INQUIRY_RESULT_SAVE_MAX 40 82 83 #define UNSUPPORT_SECURE_CONNECTIONS 0x00 84 #define SUPPORT_SECURE_CONNECTIONS 0x01 85 86 #define GAP_PAIR_RETRY_COUNT 5 87 #define GAP_PAIR_RETRY_WAIT_TIME 500 88 89 enum ScanModeStatus { 90 GAP_SCANMODE_STATUS_IDLE, 91 GAP_SCANMODE_STATUS_CLOSING, 92 GAP_SCANMODE_STATUS_SETTING, 93 }; 94 95 enum InquiryStatus { 96 GAP_INQUIRY_STATUS_IDLE, 97 GAP_INQUIRY_STATUS_START, 98 GAP_INQUIRY_STATUS_CANCEL, 99 }; 100 101 enum RemoteNameStatus { 102 GAP_REMOTE_NAME_STATUS_IDLE, 103 GAP_REMOTE_NAME_STATUS_START, 104 GAP_REMOTE_NAME_STATUS_CANCEL, 105 }; 106 107 enum DeviceSecurityStatus { 108 GAP_DEV_SEC_STATUS_IDLE, 109 GAP_DEV_SEC_STATUS_ACTION, 110 GAP_DEV_SEC_STATUS_WAIT_DISC, 111 }; 112 113 enum DeviceAuthenticationStatus { 114 GAP_AUTH_STATUS_IDLE, 115 GAP_AUTH_STATUS_ACTION, 116 GAP_AUTH_STATUS_WAIT_RETRY, 117 GAP_AUTH_STATUS_RETRY, 118 }; 119 120 enum DeviceEncryptionStatus { 121 GAP_ENC_STATUS_IDLE, 122 GAP_ENC_STATUS_ACTION, 123 }; 124 125 enum DeviceSecurityEvent { 126 GAP_SEC_EVENT_CONNECT_COMP, 127 GAP_SEC_EVENT_FEATURE_COMP, 128 GAP_SEC_EVENT_UNAUTH_SUCCESS, 129 GAP_SEC_EVENT_AUTH_SUCCESS, 130 GAP_SEC_EVENT_AUTH_FAILED, 131 GAP_SEC_EVENT_ENC_SUCCESS, 132 GAP_SEC_EVENT_ENC_FAILED, 133 GAP_SEC_EVENT_WAIT_ENC_TIMEOUT, 134 GAP_SEC_EVENT_ACL_DISCONNECT, 135 }; 136 137 enum SecurityRequestStatus { 138 GAP_SEC_REQ_STATUS_WAIT_CONNECT, 139 GAP_SEC_REQ_STATUS_WAIT_FEATURE, 140 GAP_SEC_REQ_STATUS_WAIT_ENCRYPT, 141 GAP_SEC_REQ_STATUS_WAIT_ACTION, 142 GAP_SEC_REQ_STATUS_ACTION, 143 GAP_SEC_REQ_STATUS_SUCCESS, 144 GAP_SEC_REQ_STATUS_FAILED, 145 }; 146 147 enum EncryptionRequestStatus { 148 GAP_SET_ENCRYPTION_STATUS_IDLE, 149 GAP_SET_ENCRYPTION_STATUS_SETTING, 150 }; 151 152 enum LESecurityActionStatus { 153 GAP_LE_SECURITY_STATUS_IDLE, 154 GAP_LE_SECURITY_STATUS_PAIR, 155 }; 156 157 enum LEConnParamUpdateStatus { 158 GAP_LE_CONN_PARAM_UPDATE_IDLE, 159 GAP_LE_CONN_PARAM_UPDATE_RECV_L2CAP, 160 GAP_LE_CONN_PARAM_UPDATE_RECV_HCI, 161 }; 162 163 typedef struct { 164 uint8_t status; 165 GapSetScanModeResultCallback callback; 166 void *context; 167 GapDiscoverModeInfo discoverMode; 168 GapConnectableModeInfo connectableMode; 169 } ScanModeBlock; 170 171 typedef struct { 172 BtAddr addr; 173 uint8_t repetitionMode; 174 uint16_t clockOffset; 175 } InquiryResultInfo; 176 177 typedef struct { 178 uint8_t status; 179 } InquiryBlock; 180 181 typedef struct { 182 uint8_t status; 183 } RemoteNameBlock; 184 185 typedef struct { 186 List *registerlist; 187 List *requestlist; 188 } ProfileSecurityBlock; 189 190 typedef struct { 191 BtAddr addr; 192 GapServiceSecurityInfo info; 193 uint16_t securityMode; 194 } ProfileSecurityInfo; 195 196 typedef struct { 197 List *devicelist; 198 } ConnectionInfoBlock; 199 200 typedef struct { 201 BtAddr addr; 202 bool needAuthentication; 203 bool needUnauthentication; 204 bool needEncryption; 205 bool needAuthorization; 206 bool needMITM; 207 GapServiceSecurityInfo info; 208 void *context; 209 bool doCallback; 210 GapSecurityResultCallback callback; 211 uint8_t status; 212 uint8_t hciStatus; 213 uint8_t retryCount; 214 Alarm *waitRetryalarm; 215 } RequestSecInfo; 216 217 typedef struct { 218 BtAddr addr; 219 Alarm *alarm; 220 uint16_t handle; 221 uint8_t status; 222 uint8_t authenticationStatus; 223 uint8_t encryptionStatus; 224 uint8_t linkkeyType; 225 uint8_t localIOCap; 226 uint8_t remoteAuthReq; 227 bool inDedicatedBonding; 228 bool isAuthentication; 229 bool isEncryption; 230 bool supportSSP; 231 RequestSecInfo *actionReq; 232 Alarm *aclAlarm; 233 Alarm *waitEncryptAlarm; 234 } DeviceInfo; 235 236 typedef struct { 237 uint8_t status; 238 GapEncryptionChangeCallback callback; 239 void *context; 240 } EncryptionBlock; 241 242 typedef struct { 243 bool isEnable; 244 uint8_t bondableMode; 245 uint32_t classOfDevice; 246 GAP_SecurityMode secMode; 247 GapOOBData oobData192; 248 GapOOBData oobData256; 249 bool keyMissingRetry; 250 ScanModeBlock scanModeBlock; 251 InquiryBlock inquiryBlock; 252 RemoteNameBlock remoteNameBlock; 253 ProfileSecurityBlock profileSecBlock; 254 ConnectionInfoBlock connectionInfoBlock; 255 EncryptionBlock encryptionBlock; 256 } GapBredrMng; 257 258 #endif 259 260 #ifdef GAP_LE_SUPPORT 261 262 typedef struct { 263 BtAddr addr; 264 BtAddr identityAddr; 265 uint8_t role; 266 uint8_t bondableMode; 267 uint8_t minEncKeySize; 268 GAP_LeSecMode1Level mode1Level; 269 GAP_LeSecMode2Level mode2Level; 270 uint8_t IRK[GAP_IRK_SIZE]; 271 } LeLocalInfo; 272 273 typedef struct { 274 uint8_t result; 275 GAP_LeSecurityStatus secReqStatus; 276 GapLeRequestSecurityResult callback; 277 void *context; 278 } LeSecurityReq; 279 280 typedef struct { 281 uint8_t status; 282 uint8_t id; 283 } LeConnParamUpdateReq; 284 285 typedef struct { 286 BtAddr addr; 287 uint16_t handle; 288 uint8_t role; 289 uint8_t securityStatus; 290 uint8_t encryptionStatus; 291 uint8_t pairMethod; 292 uint8_t keyType; 293 uint8_t keySize; 294 bool isRemoteSecurityRequest; 295 bool isLocalSecurityRequest; 296 BtAddr peerAddr; 297 BtAddr ownAddr; 298 Alarm *alarm; 299 bool ownAddrUpdated; 300 LeSecurityReq *securityReq; 301 LeConnParamUpdateReq *paramUpdateReq; 302 bool localSigningExists; 303 bool remoteSigningExists; 304 LeSignKey localSigningInfo; 305 LeSignKey remoteSigningInfo; 306 } LeDeviceInfo; 307 308 typedef struct { 309 List *deviceList; 310 } LeConnectionInfoBlock; 311 312 typedef struct { 313 bool isPairing; 314 BtAddr addr; 315 } LeBondBlock; 316 317 typedef struct { 318 List *RequestList; 319 } LeSignatureBlock; 320 321 typedef struct { 322 struct { 323 bool processing; 324 GenResPriAddrResult callback; 325 void *context; 326 } generationInfo; 327 328 List *reportRPAResolveList; 329 } LeRandomAddressBlock; 330 331 typedef struct { 332 uint8_t advHandle; 333 uint8_t randomAddress[BT_ADDRESS_SIZE]; 334 } LeExAdvInfo; 335 336 typedef struct { 337 List *exAdvInfoList; 338 uint8_t exAdvMaxNumber; 339 uint16_t exAdvDataMaxLen; 340 } LeExAdvBlock; 341 342 typedef struct { 343 bool isEnable; 344 LeLocalInfo local; 345 LeBondBlock bondBlock; 346 LeConnectionInfoBlock connectionInfoBlock; 347 LeSignatureBlock signatureBlock; 348 LeRandomAddressBlock randomAddressBlock; 349 LeExAdvBlock exAdvBlock; 350 } GapLeMng; 351 352 #endif 353 354 typedef struct { 355 int traceLevel; 356 #ifdef GAP_BREDR_SUPPORT 357 GapBredrMng bredr; 358 #endif 359 #ifdef GAP_LE_SUPPORT 360 GapLeMng le; 361 #endif 362 } GapMng; 363 364 #ifdef __cplusplus 365 } 366 #endif 367 368 #endif 369