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  * @addtogroup Bluetooth
18  * @{
19  *
20  * @brief Generic Access Profile
21  *
22  */
23 
24 /**
25  * @file gap.h
26  *
27  * @brief bluetooth gap interface
28  *
29  */
30 
31 #ifndef GAP_LE_IF_H
32 #define GAP_LE_IF_H
33 
34 #include "gap_comm.h"
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
40 /// BLE Roles
41 #define GAP_LE_ROLE_BROADCASTER (1 << 0)
42 #define GAP_LE_ROLE_OBSERVER (1 << 1)
43 #define GAP_LE_ROLE_PREIPHERAL (1 << 2)
44 #define GAP_LE_ROLE_CENTRAL (1 << 3)
45 
46 #define GAP_LTK_SIZE 0x10
47 #define GAP_IRK_SIZE 0x10
48 #define GAP_CSRK_SIZE 0x10
49 #define GAP_SIGNATURE_SIZE 12
50 
51 typedef void (*GenResPriAddrResult)(uint8_t result, const uint8_t addr[BT_ADDRESS_SIZE], void *context);
52 
53 #define GAP_ADVERTISING_DATA_LENGTH_MAX 31
54 
55 /// Advertising channel
56 #define GAP_ADVERTISING_CHANNEL_37 (1 << 0)
57 #define GAP_ADVERTISING_CHANNEL_38 (1 << 1)
58 #define GAP_ADVERTISING_CHANNEL_39 (1 << 2)
59 
60 /// Advertising filter policy
61 #define GAP_ADVERTISING_NOT_USE_WL (0x00)
62 #define GAP_ADVERTISING_USE_WL_FOR_SCAN (0x01)
63 #define GAP_ADVERTISING_USE_WL_FOR_CONNECTION (0x02)
64 #define GAP_ADVERTISING_USE_WL_FOR_BOTH (0x03)
65 
66 /// Intended Advertising property
67 #define GAP_ADVERTISING_PROPERTY_CONNECTABLE (1 << 0)
68 #define GAP_ADVERTISING_PROPERTY_SCANABLE (1 << 1)
69 #define GAP_ADVERTISING_PROPERTY_DIRECTED (1 << 2)
70 #define GAP_ADVERTISING_PROPERTY_HIGH_DUTY_CYCLE_DIRECTED (1 << 3)
71 #define GAP_ADVERTISING_PROPERTY_USE_LEGACY_PDUS (1 << 4)
72 #define GAP_ADVERTISING_PROPERTY_ANONYMOUS (1 << 5)
73 #define GAP_ADVERTISING_PROPERTY_INCLUDE_TXPOWER (1 << 6)
74 
75 /// Intended Advertising data operation
76 #define GAP_ADVERTISING_DATA_OPERATION_INTERMEDIATE (0x00)
77 #define GAP_ADVERTISING_DATA_OPERATION_FIRST (0x01)
78 #define GAP_ADVERTISING_DATA_OPERATION_LAST (0x02)
79 #define GAP_ADVERTISING_DATA_OPERATION_COMPLETE (0x03)
80 #define GAP_ADVERTISING_DATA_OPERATION_UNCHANGED (0x04)
81 
82 /// Intended Advertising PHY
83 #define GAP_ADVERTISEMENT_PHY_NONE (0x00)
84 #define GAP_ADVERTISEMENT_PHY_1M (0x01)
85 #define GAP_ADVERTISEMENT_PHY_2M (0x02)
86 #define GAP_ADVERTISEMENT_PHY_CODED (0x03)
87 
88 /// fragment preference
89 #define GAP_CONTROLLER_MAY_FRAGMENT (0x00)
90 #define GAP_CONTROLLER_SHOULD_NOT_FRAGMENT (0x01)
91 
92 /**
93  * @brief       Extended Advertising enable parameter structure
94  */
95 typedef struct {
96     uint8_t advHandle;    /// Extended Advertising handle
97     uint16_t duration;    /// Advertising duration (n * 10ms, 0 is no limit)
98     uint8_t maxExAdvEvt;  /// maximum number of advertising events (0 is no limit)
99 } GapExAdvSet;
100 
101 /**
102  * @brief       Extended Advertising callback function structure
103  */
104 typedef struct {
105     void (*exAdvSetRandAddrResult)(uint8_t status, void *context);
106     void (*exAdvSetParamResult)(uint8_t status, uint8_t selectTxPower, void *context);
107     void (*exAdvSetDataResult)(uint8_t status, void *context);
108     void (*exAdvSetScanRspDataResult)(uint8_t status, void *context);
109     void (*exAdvSetEnableResult)(uint8_t status, void *context);
110     void (*exAdvRemoveHandleResult)(uint8_t status, void *context);
111     void (*exAdvClearHandleResult)(uint8_t status, void *context);
112     void (*exAdvScanRequestReceived)(uint8_t advHandle, const BtAddr *scannerAddr, void *context);
113     void (*exAdvTerminatedAdvSet)(
114         uint8_t status, uint8_t advHandle, uint16_t connectionHandle, uint8_t completedNumber, void *context);
115 } GapExAdvCallback;
116 
117 /**
118  * @brief       Advertising parameter structure
119  */
120 typedef struct {
121     uint16_t advIntervalMin;  /// Minimum advertising interval (0x0020-0x4000)
122     uint16_t advIntervalMax;  /// Maximum advertising interval (0x0020-0x4000)
123     uint8_t advChannelMap;    /// Used channel of Advertising
124     const BtAddr *peerAddr;   /// Target bluetooth address of directed advertising
125     uint8_t advFilterPolicy;  /// Advertising filter policy
126 } GapLeAdvParam;
127 
128 /**
129  * @brief       Extended advertising parameter structure
130  */
131 typedef struct {
132     uint32_t advIntervalMin;          /// Minimum advertising interval (0x000020-0xFFFFFF)
133     uint32_t advIntervalMax;          /// Maximum advertising interval (0x000020-0xFFFFFF)
134     uint8_t advChannelMap;            /// Used channel of Advertising
135     const BtAddr *peerAddr;           /// Target bluetooth address of directed advertising
136     uint8_t advFilterPolicy;          /// Advertising filter policy
137     uint8_t primaryAdvPhy;            /// Primary Advertising PHY
138     uint8_t secondaryAdvMaxSkip;      /// Maximum number that can be skipped before the AUX_ADV_IND.
139     uint8_t secondaryAdvPhy;          /// Secondary Advertising PHY
140     uint8_t advSid;                   /// Value of the Advertising SID subfield in the ADI field of the PDU
141     uint8_t scanRequestNotifyEnable;  /// Scan request notifications enabled (0x01 is enabled)
142 } GapLeExAdvParam;
143 
144 /// BLE legacy advertising type
145 #define GAP_ADV_TYPE_CONN_UNDIR 0x00
146 #define GAP_ADV_TYPE_CONN_DIR_HIGH_DUTY 0x01
147 #define GAP_ADV_TYPE_SCAN_UNDIR 0x02
148 #define GAP_ADV_TYPE_NON_CONN_UNDIR 0x03
149 #define GAP_ADV_TYPE_CONN_DIR_LOW_DUTY 0x04
150 
151 /**
152  * @brief       Legacy advertising callback structure
153  */
154 typedef struct {
155     void (*advSetParamResult)(uint8_t status, void *context);
156     void (*advReadTxPower)(uint8_t status, int8_t txPower, void *context);
157     void (*advSetDataResult)(uint8_t status, void *context);
158     void (*advSetScanRspDataResult)(uint8_t status, void *context);
159     void (*advSetEnableResult)(uint8_t status, void *context);
160 } GapAdvCallback;
161 
162 /// Scan filter policy
163 #define GAP_SCAN_NOT_USE_WL (0x00)
164 #define GAP_SCAN_USE_WL (0x01)
165 #define GAP_SCAN_NOT_USE_WL_AND_IDENTITY (0x02)
166 #define GAP_SCAN_USE_WL_AND_IDENTITY (0x03)
167 
168 /// Scan PHYs
169 #define GAP_EX_SCAN_PHY_1M (1 << 0)
170 #define GAP_EX_SCAN_PHY_CODED (1 << 2)
171 
172 /**
173  * @brief       BLE scan internal and window parameter structure
174  */
175 typedef struct {
176     uint16_t scanInterval;  /// scan internal
177     uint16_t scanWindow;    /// scan window
178 } GapLeScanParameter;
179 
180 /**
181  * @brief       BLE scan parameter structure
182  */
183 typedef struct {
184     uint8_t scanType;         /// scan type
185     GapLeScanParameter param;  /// scan internal and window parameter
186 } GapLeScanParam;
187 
188 /**
189  * @brief       Advertising report structure
190  */
191 typedef struct {
192     uint8_t dataLen;  /// Advertising data len
193     uint8_t *data;    /// Advertising data
194     int8_t rssi;      /// RSSI (127 is information not available)
195 } GapAdvReportParam;
196 
197 /**
198  * @brief       BLE scan result callback
199  */
200 typedef struct {
201     void (*advertisingReport)(
202         uint8_t advType, const BtAddr *addr, GapAdvReportParam reportParam, const BtAddr *currentAddr, void *context);
203     void (*scanSetParamResult)(uint8_t status, void *context);
204     void (*scanSetEnableResult)(uint8_t status, void *context);
205 } GapScanCallback;
206 
207 /**
208  * @brief       Extended advertising report structure
209  */
210 typedef struct {
211     uint8_t primaryPhy;            /// Advertiser PHY
212     uint8_t secondaryPhy;          /// Secondary advertiser PHY:
213     uint8_t advertisingSid;        /// Value of the Advertising SID subfield in the ADI field of the PDU
214     int8_t txPower;                /// TX power (127 is information not available)
215     int8_t rssi;                   /// RSSI (127 is information not available)
216     uint16_t periodicAdvInterval;  /// Periodic advertising interval
217     const BtAddr *directAddr;      /// Directed advertising event address
218     uint8_t dataLen;               /// Advertising data len
219     uint8_t *data;                 /// Advertising data
220 } GapExAdvReportParam;
221 
222 /**
223  * @brief       Directed advertising report structure
224  */
225 typedef struct {
226     const BtAddr *directAddr;  /// Directed advertising event address
227     int8_t rssi;               /// RSSI (127 is information not available)
228 } GapDirectedAdvReportParam;
229 
230 /**
231  * @brief       Extended scan result structure
232  */
233 typedef struct {
234     void (*exAdvertisingReport)(
235         uint8_t advType, const BtAddr *addr, GapExAdvReportParam reportParam, const BtAddr *currentAddr, void *context);
236     void (*directedAdvertisingReport)(uint8_t advType, const BtAddr *addr, GapDirectedAdvReportParam reportParam,
237         const BtAddr *currentAddr, void *context);
238     void (*scanExSetParamResult)(uint8_t status, void *context);
239     void (*scanExSetEnableResult)(uint8_t status, void *context);
240     void (*scanTimeoutEvent)(void *context);
241 } GapExScanCallback;
242 
243 /**
244  * @brief       BLE link layer control callback structure
245  */
246 typedef struct {
247     void (*leConnectionParameterReq)(const BtAddr *addr, uint16_t connIntervalMin, uint16_t connIntervalMax,
248         uint16_t connLatency, uint16_t timeout, void *context);
249     void (*leConnectionUpdateComplete)(uint8_t status, const BtAddr *addr, uint16_t connInterval, uint16_t connLatency,
250         uint16_t timeout, void *context);
251     void (*GapleSetHostChannelClassificationResult)(uint8_t result, void *context);
252     void (*GapleReadChannelMapResult)(uint8_t result, const BtAddr *addr, uint64_t channelMap, void *context);
253 } GapLeConnCallback;
254 
255 /**
256  * @brief       BLE connection parameter structure
257  */
258 typedef struct {
259     uint16_t connIntervalMin;  /// Minimum value for the connection interval(n * 1.25ms 0x0006-0x0c80)
260     uint16_t connIntervalMax;  /// Maximum value for the connection interval(n * 1.25ms 0x0006-0x0c80)
261     uint16_t connLatency;      /// Slave latency for the connection (0x0000-0x01F3)
262     uint16_t timeout;          /// Supervision timeout for the LE Link (n * 10ms 0x000A-0x0C80)
263     uint16_t minCeLen;         /// Minimum length of connection event (n * 0.625ms 0x0000-0xFFFF)
264     uint16_t maxCeLen;         /// Maximum length of connection event (n * 0.625ms 0x0000-0xFFFF)
265 } GapLeConnectionParameter;
266 
267 /// BLE OOB Authentication data present
268 #define GAP_LE_OOB_DATA_NOT_PRESENT 0x00
269 #define GAP_LE_OOB_DATA_PRESENT 0x01
270 
271 /// BLE authentication requirements
272 #define GAP_LE_AUTH_REQ_BONDING (1 << 0)
273 #define GAP_LE_AUTH_REQ_BIT_MITM (1 << 2)
274 #define GAP_LE_AUTH_REQ_BIT_SC (1 << 3)
275 #define GAP_LE_AUTH_REQ_BIT_KEYPRESS (1 << 4)
276 #define GAP_LE_AUTH_REQ_BIT_CT2 (1 << 5)
277 
278 /// BLE key distribution
279 #define GAP_LE_KEY_DIST_ENC_KEY (1 << 0)
280 #define GAP_LE_KEY_DIST_ID_KEY (1 << 1)
281 #define GAP_LE_KEY_DIST_SIGN_KEY (1 << 2)
282 
283 /**
284  * @brief       BLE pair feature structure
285  */
286 typedef struct {
287     uint8_t ioCapability;   /// IO Capability
288     uint8_t oobDataFlag;    /// OOB Authentication data present
289     uint8_t authReq;        /// Authentication requirements
290     uint8_t maxEncKeySize;  /// Maximum of Long Term Key size
291     uint8_t initKeyDis;     /// Initiator Key Distribution / Generation
292     uint8_t respKeyDis;     /// Responder Key Distribution / Generation
293 } GapLePairFeature;
294 
295 /**
296  * @brief       BLE encryption key structure
297  */
298 typedef struct {
299     uint8_t ltk[GAP_LTK_SIZE];  /// Long Term Key
300     uint64_t rand;              /// Random Number
301     uint16_t ediv;              /// Encrypted Diversifier
302     uint8_t keySize;            /// Encryption Key Size
303 } LeEncKey;
304 
305 /**
306  * @brief       BLE identity key structure
307  */
308 typedef struct {
309     BtAddr identityAddr;        /// Identity Address
310     uint8_t irk[GAP_IRK_SIZE];  /// Identity Resolving Key
311 } LeIdKey;
312 
313 /**
314  * @brief       BLE signature key structure
315  */
316 typedef struct {
317     uint8_t csrk[GAP_CSRK_SIZE];  /// Connection Signature Resolving Key
318     uint32_t counter;             /// SignCounter
319 } LeSignKey;
320 
321 /**
322  * @brief       BLE SignCounter type
323  */
324 typedef enum {
325     LOCAL_SIGN_COUNTER,
326     REMOTE_SIGN_COUNTER,
327 } GAP_SignCounterType;
328 
329 /**
330  * @brief       Signing Algorithm Info structure
331  */
332 typedef struct {
333     LeSignKey *localKey;
334     LeSignKey *remoteKey;
335 } GapSigningAlgorithmInfo;
336 
337 /**
338  * @brief       BLE security callback structure
339  */
340 typedef struct {
341     void (*encryptionComplete)(uint8_t status, const BtAddr *addr, void *context);
342     void (*leLocalEncryptionKeyReqEvent)(const BtAddr *addr, uint64_t rand, uint16_t ediv, void *context);
343     void (*leRemoteEncryptionKeyReqEvent)(const BtAddr *addr, void *context);
344     void (*GapRequestSigningAlgorithmInfo)(const BtAddr *addr, void *context);
345     void (*leSignCounterChangeNotification)(
346         const BtAddr *addr, GAP_SignCounterType type, uint32_t counter, void *context);
347 } GapLeSecurityCallback;
348 
349 /**
350  * @brief       level of LE security mode 1
351  */
352 typedef enum {
353     LE_MODE_1_LEVEL_1,
354     LE_MODE_1_LEVEL_2,
355     LE_MODE_1_LEVEL_3,
356     LE_MODE_1_LEVEL_4,
357 } GAP_LeSecMode1Level;
358 
359 /**
360  * @brief       level of LE security mode 2
361  */
362 typedef enum {
363     LE_MODE_2_LEVEL_1,
364     LE_MODE_2_LEVEL_2,
365 } GAP_LeSecMode2Level;
366 
367 /**
368  * @brief       BLE security status of le connection
369  */
370 typedef enum {
371     GAP_LE_NO_ENCRYPTION,
372     GAP_LE_UNAUTHENTICATED_ENCRYPTION,
373     GAP_LE_AUTHENTICATED_ENCRYPTION,
374 } GAP_LeSecurityStatus;
375 
376 /**
377  * @brief       BLE security result callback
378  * @param[in]   addr                target device address
379  * @param[in]   result              request result
380  * @param[in]   status              security status of le connection
381  * @param[in]   context             callback context
382  * @return      @c BT_SUCCESS      : The function is executed successfully.
383  *              @c otherwise        : The function is not executed successfully.
384  */
385 typedef void (*GapLeRequestSecurityResult)(
386     const BtAddr *addr, uint8_t result, GAP_LeSecurityStatus status, void *context);
387 
388 typedef struct {
389     LeEncKey *remoteEncKey;
390     LeIdKey *remoteIdKey;
391     LeSignKey *remoteSignKey;
392     LeEncKey *localEncKey;
393     LeSignKey *localSignKey;
394 } LePairedKeys;
395 
396 /**
397  * @brief       BLE pair callback structure
398  */
399 typedef struct {
400     void (*lePairFeatureReq)(const BtAddr *addr, bool localPair, void *context);
401     void (*lePairFeatureInd)(const BtAddr *addr, GapLePairFeature remoteFrature, void *context);
402     void (*lePairMethodNotify)(const BtAddr *addr, uint8_t pairMethod, void *context);
403     void (*lePairKeyPressNotification)(const BtAddr *addr, uint8_t pressType, void *context);
404     void (*lePairPassKeyReq)(const BtAddr *addr, void *context);
405     void (*lePairPassKeyNotification)(const BtAddr *addr, uint32_t number, void *context);
406     void (*lePairOobReq)(const BtAddr *addr, void *context);
407     void (*lePairScOobReq)(const BtAddr *addr, void *context);
408     void (*lePairScOobNotification)(const BtAddr *addr, GapOOBData *oobData, void *context);
409     void (*lePairScUserConfirmReq)(const BtAddr *addr, uint32_t number, void *context);
410     void (*lePairComplete)(const BtAddr *addr, uint8_t result, uint8_t keyType, void *context);
411     void (*lePairKeyNotify)(const BtAddr *addr, LePairedKeys LeKeys, void *context);
412 } GapLePairCallback;
413 
414 #define GAP_ENC_KEY_MIN_SIZE 0x07
415 #define GAP_ENC_KEY_MAX_SIZE 0x10
416 
417 /**
418  * @brief       BLE signature algorithm result
419  */
420 typedef enum {
421     GAP_SIGNATURE_OK,
422     GAP_SIGNATURE_ERR_EXECUTION,
423     GAP_SIGNATURE_ERR_COUNTER,
424     GAP_SIGNATURE_ERR_ALGORITHM,
425 } GAP_SignatureResult;
426 
427 /**
428  * @brief       BLE signature algorithm data PDU
429  */
430 typedef struct {
431     const uint8_t *data;
432     uint16_t dataLen;
433 } GapSignatureData;
434 
435 typedef void (*GAPSignatureGenerationResult)(
436     GAP_SignatureResult result, uint8_t signature[GAP_SIGNATURE_SIZE], void *context);
437 
438 typedef void (*GAPSignatureConfirmationResult)(GAP_SignatureResult result, void *context);
439 
440 /**
441  * @brief       Set BLE Roles
442  * @param[in]   role                BLE Roles
443  * @return      @c BT_SUCCESS      : The function is executed successfully.
444  *              @c otherwise        : The function is not executed successfully.
445  */
446 BTSTACK_API int GAPIF_LeSetRole(uint8_t role);
447 
448 /**
449  * @brief       Set Static Identity Address if controller does not have a Public Device Address
450  * @param[in/out]  addr             Static Identity Address
451  * @return      @c BT_SUCCESS      : The function is executed successfully.
452  *              @c otherwise        : The function is not executed successfully.
453  */
454 BTSTACK_API int GAPIF_LeSetStaticIdentityAddr(uint8_t addr[BT_ADDRESS_SIZE]);
455 
456 /**
457  * @brief       Generate a local resolvable private address
458  * @param[in]   callback            Generate RPA result function
459  * @param[in]   context             Generate RPA result function context
460  * @return      @c BT_SUCCESS      : The function is executed successfully.
461  *              @c otherwise        : The function is not executed successfully.
462  */
463 BTSTACK_API int GAPIF_LeGenResPriAddr(GenResPriAddrResult callback, void *context);
464 
465 /**
466  * @brief       Read the maximum length of intended advertising data supported by the Controller
467  * @param[out]  len                length of intended advertising data or scan response data
468  * @return      @c BT_SUCCESS      : The function is executed successfully.
469  *              @c otherwise        : The function is not executed successfully.
470  */
471 BTSTACK_API int GAPIF_LeExAdvGetMaxDataLen(uint16_t *len);
472 
473 /**
474  * @brief       Read the maximum number of advertising sets supported by the advertising Controller at the same time.
475  * @param[out]  num                maximum number of advertising sets
476  * @return      @c BT_SUCCESS      : The function is executed successfully.
477  *              @c otherwise        : The function is not executed successfully.
478  */
479 BTSTACK_API int GAPIF_LeExAdvGetMaxHandleNum(uint8_t *num);
480 
481 /**
482  * @brief       Register Extended advertising callback function
483  * @param[in]   callback            Extended advertising callback structure
484  * @param[in]   context             Extended advertising result callback context parameter
485  * @return      @c BT_SUCCESS      : The function is executed successfully.
486  *              @c otherwise        : The function is not executed successfully.
487  */
488 BTSTACK_API int GAPIF_RegisterExAdvCallback(const GapExAdvCallback *callback, void *context);
489 
490 /**
491  * @brief       Degegister Extended advertising callback function
492  * @return      @c BT_SUCCESS      : The function is executed successfully.
493  *              @c otherwise        : The function is not executed successfully.
494  */
495 BTSTACK_API int GAPIF_DeregisterExAdvCallback(void);
496 
497 /**
498  * @brief       Set the random device address used by advertising.
499  * @param[in]   advHandle           used to identify an advertising set (0x00-0xEF)
500  * @param[in]   addr                random device address
501  * @return      @c BT_SUCCESS      : The function is executed successfully.
502  *              @c otherwise        : The function is not executed successfully.
503  */
504 BTSTACK_API int GAPIF_LeExAdvSetRandAddr(uint8_t advHandle, const uint8_t addr[BT_ADDRESS_SIZE]);
505 
506 /**
507  * @brief       Set the advertising parameter used by advertising.
508  * @param[in]   advHandle           used to identify an advertising set (0x00-0xEF)
509  * @param[in]   properties          intended Advertising property
510  * @param[in]   txPower            advertising TX power
511  * @param[in]   advExParam          advertising parameter
512  * @return      @c BT_SUCCESS      : The function is executed successfully.
513  *              @c otherwise        : The function is not executed successfully.
514  */
515 BTSTACK_API int GAPIF_LeExAdvSetParam(
516     uint8_t advHandle, uint8_t properties, int8_t txPower, GapLeExAdvParam advExParam);
517 
518 /**
519  * @brief       Set the advertising data used by advertising.
520  * @param[in]   advHandle           used to identify an advertising set (0x00-0xEF)
521  * @param[in]   operation           intended Advertising operation
522  * @param[in]   fragmentPreference  fragment preference
523  * @param[in]   advDataLength       advertising data length
524  * @param[in]   advData             advertising data
525  * @return      @c BT_SUCCESS      : The function is executed successfully.
526  *              @c otherwise        : The function is not executed successfully.
527  */
528 BTSTACK_API int GAPIF_LeExAdvSetData(
529     uint8_t advHandle, uint8_t operation, uint8_t fragmentPreference, uint8_t advDataLength, const uint8_t *advData);
530 
531 /**
532  * @brief       Set the scan response data used by advertising.
533  * @param[in]   advHandle           used to identify an advertising set (0x00-0xEF)
534  * @param[in]   operation           intended Advertising operation
535  * @param[in]   fragmentPreference  fragment preference
536  * @param[in]   scanResponseDataLen scan response data length
537  * @param[in]   scanResponseData    scan response data
538  * @return      @c BT_SUCCESS      : The function is executed successfully.
539  *              @c otherwise        : The function is not executed successfully.
540  */
541 BTSTACK_API int GAPIF_LeExAdvSetScanRspData(uint8_t advHandle, uint8_t operation, uint8_t fragmentPreference,
542     uint8_t scanResponseDataLen, const uint8_t *scanResponseData);
543 
544 /**
545  * @brief       Set the advertising enable used by advertising.
546  * @param[in]   enable              advertising enable (0x00 is disable, 0x01 is enable)
547  * @param[in]   numberOfSet         number of parameter (When disabled, 0 is to disable all)
548  * @param[in]   advSet              advertising enable parameter
549  * @return      @c BT_SUCCESS      : The function is executed successfully.
550  *              @c otherwise        : The function is not executed successfully.
551  */
552 BTSTACK_API int GAPIF_LeExAdvSetEnable(uint8_t enable, uint8_t numberOfSet, const GapExAdvSet *advSet);
553 
554 /**
555  * @brief       Remove all advertising set of advertising.
556  * @return      @c BT_SUCCESS      : The function is executed successfully.
557  *              @c otherwise        : The function is not executed successfully.
558  */
559 BTSTACK_API int GAPIF_LeExAdvClearHandle(void);
560 
561 /**
562  * @brief       Register legacy advertising result callback
563  * @param[in]   callback            legacy advertising callback
564  * @param[in]   context             legacy advertising callback context parameter
565  * @return      @c BT_SUCCESS      : The function is executed successfully.
566  *              @c otherwise        : The function is not executed successfully.
567  */
568 BTSTACK_API int GAPIF_RegisterAdvCallback(const GapAdvCallback *callback, void *context);
569 
570 /**
571  * @brief       Deregister legacy advertising result callback
572  * @return      @c BT_SUCCESS      : The function is executed successfully.
573  *              @c otherwise        : The function is not executed successfully.
574  */
575 BTSTACK_API int GAPIF_DeregisterAdvCallback(void);
576 
577 /**
578  * @brief       Set legacy advertising parameter
579  * @param[in]   advType             legacy advertising type
580  * @param[in]   advParam            legacy advertising parameter
581  * @return      @c BT_SUCCESS      : The function is executed successfully.
582  *              @c otherwise        : The function is not executed successfully.
583  */
584 BTSTACK_API int GAPIF_LeAdvSetParam(uint8_t advType, GapLeAdvParam advParam);
585 
586 /**
587  * @brief       Read legacy advertising TX power
588  * @return      @c BT_SUCCESS      : The function is executed successfully.
589  *              @c otherwise        : The function is not executed successfully.
590  */
591 BTSTACK_API int GAPIF_LeAdvReadTxPower(void);
592 
593 /**
594  * @brief       Set legacy advertising data
595  * @param[in]   advDataLength       legacy advertising data length
596  * @param[in]   advData             legacy advertising data
597  * @return      @c BT_SUCCESS      : The function is executed successfully.
598  *              @c otherwise        : The function is not executed successfully.
599  */
600 BTSTACK_API int GAPIF_LeAdvSetData(uint8_t advDataLength, const uint8_t *advData);
601 
602 /**
603  * @brief       Set legacy advertising scan response data
604  * @param[in]   advDataLength       legacy advertising scan response data length
605  * @param[in]   advData             legacy advertising scan response data
606  * @return      @c BT_SUCCESS      : The function is executed successfully.
607  *              @c otherwise        : The function is not executed successfully.
608  */
609 BTSTACK_API int GAPIF_LeAdvSetScanRspData(uint8_t advDataLength, const uint8_t *advData);
610 
611 /**
612  * @brief       Set legacy advertising enable
613  * @param[in]   enable              advertising enable (0x00 is disable, 0x01 is enable)
614  * @return      @c BT_SUCCESS      : The function is executed successfully.
615  *              @c otherwise        : The function is not executed successfully.
616  */
617 BTSTACK_API int GAPIF_LeAdvSetEnable(uint8_t enable);
618 
619 /**
620  * @brief       Register scan result callback
621  * @param[in]   callback            scan result callback
622  * @param[in]   context             scan result callback context parameter
623  * @return      @c BT_SUCCESS      : The function is executed successfully.
624  *              @c otherwise        : The function is not executed successfully.
625  */
626 BTSTACK_API int GAPIF_RegisterScanCallback(const GapScanCallback *callback, void *context);
627 
628 /**
629  * @brief       Deregister scan result callback
630  * @return      @c BT_SUCCESS      : The function is executed successfully.
631  *              @c otherwise        : The function is not executed successfully.
632  */
633 BTSTACK_API int GAPIF_DeregisterScanCallback(void);
634 
635 /**
636  * @brief       Set scan parameter
637  * @param[in]   param               scan parameter
638  * @param[in]   scanFilterPolity    scan filter policy
639  * @return      @c BT_SUCCESS      : The function is executed successfully.
640  *              @c otherwise        : The function is not executed successfully.
641  */
642 BTSTACK_API int GAPIF_LeScanSetParam(GapLeScanParam param, uint8_t scanFilterPolity);
643 
644 /**
645  * @brief       Set scan enable
646  * @param[in]   scanEnable          scan enable (0x00 is disable, 0x01 is enable)
647  * @param[in]   filterDuplicates    filter duplicates (0x00 is disable, 0x01 is enable)
648  * @return      @c BT_SUCCESS      : The function is executed successfully.
649  *              @c otherwise        : The function is not executed successfully.
650  */
651 BTSTACK_API int GAPIF_LeScanSetEnable(uint8_t scanEnable, uint8_t filterDuplicates);
652 
653 /**
654  * @brief       Register extended scan result callback
655  * @param[in]   callback            extended scan result callback
656  * @param[in]   context             extended scan result callback context parameter
657  * @return      @c BT_SUCCESS      : The function is executed successfully.
658  *              @c otherwise        : The function is not executed successfully.
659  */
660 BTSTACK_API int GAPIF_RegisterExScanCallback(const GapExScanCallback *callback, void *context);
661 
662 /**
663  * @brief       Deregister extended scan result callback
664  * @return      @c BT_SUCCESS      : The function is executed successfully.
665  *              @c otherwise        : The function is not executed successfully.
666  */
667 BTSTACK_API int GAPIF_DeregisterExScanCallback(void);
668 
669 /**
670  * @brief       Set extended scan parameter
671  * @param[in]   scanFilterPolity    scan filter policy
672  * @param[in]   scanPhys            scan PHYs
673  * @param[in]   param               scan parameter
674  * @return      @c BT_SUCCESS      : The function is executed successfully.
675  *              @c otherwise        : The function is not executed successfully.
676  */
677 BTSTACK_API int GAPIF_LeExScanSetParam(uint8_t scanFilterPolity, uint8_t scanPhys, const GapLeScanParam param[]);
678 
679 /**
680  * @brief       Set extended scan parameter
681  * @param[in]   scanEnable          scan enable (0x00 is disable, 0x01 is enable)
682  * @param[in]   filterDuplicates    filter duplicates (0x00 is disable, 0x01 is enable)
683  * @param[in]   duration            (n * 10ms, 0 is scan continuously)
684  * @param[in]   period              (n * 1.28s, 0 is periodic scanning disabled)
685  * @return      @c BT_SUCCESS      : The function is executed successfully.
686  *              @c otherwise        : The function is not executed successfully.
687  */
688 BTSTACK_API int GAPIF_LeExScanSetEnable(
689     uint8_t scanEnable, uint8_t filterDuplicates, uint16_t duration, uint16_t period);
690 
691 /**
692  * @brief       Register link layer control callback
693  * @param[in]   callback            link layer control callback
694  * @param[in]   context             link layer control callback context parameter
695  * @return      @c BT_SUCCESS      : The function is executed successfully.
696  *              @c otherwise        : The function is not executed successfully.
697  */
698 BTSTACK_API int GAPIF_RegisterLeConnCallback(const GapLeConnCallback *callback, void *context);
699 
700 /**
701  * @brief       Deregister link layer control callback
702  * @return      @c BT_SUCCESS      : The function is executed successfully.
703  *              @c otherwise        : The function is not executed successfully.
704  */
705 BTSTACK_API int GAPIF_DeregisterLeConnCallback(void);
706 
707 /**
708  * @brief       Send Connection parameter update request
709  * @param[in]   addr                target device address
710  * @param[in]   connParam           connection parameter
711  * @return      @c BT_SUCCESS      : The function is executed successfully.
712  *              @c otherwise        : The function is not executed successfully.
713  */
714 BTSTACK_API int GAPIF_LeConnParamUpdate(const BtAddr *addr, const GapLeConnectionParameter *connParam);
715 
716 /**
717  * @brief       Respond Connection parameter update request
718  * @param[in]   addr                target device address
719  * @param[in]   accept              accept or reject
720  * @param[in]   connParam           connection parameter
721  * @return      @c BT_SUCCESS      : The function is executed successfully.
722  *              @c otherwise        : The function is not executed successfully.
723  */
724 BTSTACK_API int GAPIF_LeConnectionParameterRsp(
725     const BtAddr *addr, uint8_t accept, const GapLeConnectionParameter *connParam);
726 
727 /**
728  * @brief       Register BLE security callback
729  * @param[in]   callback            BLE security callback
730  * @param[in]   context             BLE security callback context parameter
731  * @return      @c BT_SUCCESS      : The function is executed successfully.
732  *              @c otherwise        : The function is not executed successfully.
733  */
734 BTSTACK_API int GAPIF_RegisterLeSecurityCallback(const GapLeSecurityCallback *callback, void *context);
735 
736 /**
737  * @brief       Deregister BLE security callback
738  * @return      @c BT_SUCCESS      : The function is executed successfully.
739  *              @c otherwise        : The function is not executed successfully.
740  */
741 BTSTACK_API int GAPIF_DeregisterLeSecurityCallback(void);
742 
743 /**
744  * @brief       Respond remote encryption key of target device
745  * @param[in]   addr                target device address
746  * @param[in]   accept              accept or reject
747  * @param[in]   remoteEncKey        remote encryption key
748  * @param[in]   keyType             remote encryption key type
749  * @return      @c BT_SUCCESS      : The function is executed successfully.
750  *              @c otherwise        : The function is not executed successfully.
751  */
752 BTSTACK_API int GAPIF_LeRemoteEncryptionKeyRsp(
753     const BtAddr *addr, uint8_t accept, LeEncKey remoteEncKey, uint8_t keyType);
754 
755 /**
756  * @brief       Respond local encryption key of target device
757  * @param[in]   addr                target device address
758  * @param[in]   accept              accept or reject
759  * @param[in]   localEncKey         local encryption key
760  * @param[in]   keyType             local encryption key type
761  * @return      @c BT_SUCCESS      : The function is executed successfully.
762  *              @c otherwise        : The function is not executed successfully.
763  */
764 BTSTACK_API int GAPIF_LeLocalEncryptionKeyRsp(
765     const BtAddr *addr, uint8_t accept, LeEncKey localEncKey, uint8_t keyType);
766 
767 /**
768  * @brief       Respond signing key of target device
769  * @param[in]   addr                target device address
770  * @param[in]   accept              accept or reject
771  * @param[in]   info                signing key info
772  * @return      @c BT_SUCCESS      : The function is executed successfully.
773  *              @c otherwise        : The function is not executed successfully.
774  */
775 BTSTACK_API int GAPIF_RequestSigningAlgorithmInfoRsp(const BtAddr *addr, uint8_t accept, GapSigningAlgorithmInfo info);
776 
777 /**
778  * @brief       Set BLE bondable mode
779  * @param[in]   mode                boneable mode
780  * @return      @c BT_SUCCESS      : The function is executed successfully.
781  *              @c otherwise        : The function is not executed successfully.
782  */
783 BTSTACK_API int GAPIF_LeSetBondMode(uint8_t mode);
784 
785 /**
786  * @brief       Set BLE security mode
787  * @param[in]   mode1Level          level of LE security mode 1
788  * @param[in]   mode2Level          level of LE security mode 2
789  * @return      @c BT_SUCCESS      : The function is executed successfully.
790  *              @c otherwise        : The function is not executed successfully.
791  */
792 BTSTACK_API int GAPIF_LeSetSecurityMode(GAP_LeSecMode1Level mode1Level, GAP_LeSecMode2Level mode2Level);
793 
794 /**
795  * @brief       Get security status of le connection
796  * @param[in]   addr                target device address
797  * @param[out]  status              security status of le connection
798  * @param[out]  encKeySize          encryption Key Size
799  * @return      @c BT_SUCCESS      : The function is executed successfully.
800  *              @c otherwise        : The function is not executed successfully.
801  */
802 BTSTACK_API int GAPIF_LeGetSecurityStatus(const BtAddr *addr, GAP_LeSecurityStatus *status, uint8_t *encKeySize);
803 
804 /**
805  * @brief       Request security of le connection
806  * @param[in]   addr                target device address
807  * @param[in]   status              security status of le connection
808  * @param[in]   callback            result callback
809  * @param[in]   context             result callback context parameter
810  * @return      @c BT_SUCCESS      : The function is executed successfully.
811  *              @c otherwise        : The function is not executed successfully.
812  */
813 BTSTACK_API int GAPIF_LeRequestSecurity(
814     const BtAddr *addr, GAP_LeSecurityStatus status, GapLeRequestSecurityResult callback, void *context);
815 
816 /**
817  * @brief       BLE bonding procedure
818  * @param[in]   addr                target device address
819  * @return      @c BT_SUCCESS      : The function is executed successfully.
820  *              @c otherwise        : The function is not executed successfully.
821  */
822 BTSTACK_API int GAPIF_LePair(const BtAddr *addr);
823 
824 /**
825  * @brief       Cancel BLE bonding procedure
826  * @param[in]   addr                target device address
827  * @return      @c BT_SUCCESS      : The function is executed successfully.
828  *              @c otherwise        : The function is not executed successfully.
829  */
830 BTSTACK_API int GAPIF_LeCancelPair(const BtAddr *addr);
831 
832 /**
833  * @brief       Set minimum of Long Term Key size
834  * @param[in]   minSize             minimum of Long Term Key size
835  * @return      @c BT_SUCCESS      : The function is executed successfully.
836  *              @c otherwise        : The function is not executed successfully.
837  */
838 BTSTACK_API int GAPIF_LeSetMinEncKeySize(uint8_t minSize);
839 
840 /**
841  * @brief       Register BLE pair callback
842  * @param[in]   callback            BLE pair callback
843  * @param[in]   context             BLE pair callback context parameter
844  * @return      @c BT_SUCCESS      : The function is executed successfully.
845  *              @c otherwise        : The function is not executed successfully.
846  */
847 BTSTACK_API int GAPIF_RegisterLePairCallback(const GapLePairCallback *callback, void *context);
848 
849 /**
850  * @brief       Deregister BLE pair callback
851  * @return      @c BT_SUCCESS      : The function is executed successfully.
852  *              @c otherwise        : The function is not executed successfully.
853  */
854 BTSTACK_API int GAPIF_DeregisterLePairCallback(void);
855 
856 /**
857  * @brief       Respond BLE pair feature request
858  * @param[in]   addr                target device address
859  * @param[in]   localFrature        local BLE pair feature
860  * @return      @c BT_SUCCESS      : The function is executed successfully.
861  *              @c otherwise        : The function is not executed successfully.
862  */
863 BTSTACK_API int GAPIF_LePairFeatureRsp(const BtAddr *addr, GapLePairFeature localFrature);
864 
865 /**
866  * @brief       Respond BLE pair passkey request
867  * @param[in]   addr                target device address
868  * @param[in]   accept              accept orr reject
869  * @param[in]   number              passkey number (000000-999999)
870  * @return      @c BT_SUCCESS      : The function is executed successfully.
871  *              @c otherwise        : The function is not executed successfully.
872  */
873 BTSTACK_API int GAPIF_LePairPassKeyRsp(const BtAddr *addr, uint8_t accept, uint32_t number);
874 
875 /**
876  * @brief       Respond BLE legacy OOB data request
877  * @param[in]   addr                target device address
878  * @param[in]   accept              accept orr reject
879  * @param[in]   oobData             legacy OOB data
880  * @return      @c BT_SUCCESS      : The function is executed successfully.
881  *              @c otherwise        : The function is not executed successfully.
882  */
883 BTSTACK_API int GAPIF_LePairOobRsp(const BtAddr *addr, uint8_t accept, uint8_t oobData[GAP_OOB_DATA_SIZE]);
884 
885 /**
886  * @brief       Respond BLE Secure connection OOB data request
887  * @param[in]   addr                target device address
888  * @param[in]   accept              accept orr reject
889  * @param[in]   oobDataC            Secure connection OOB confirm data
890  * @param[in]   oobDataR            Secure connection OOB random data
891  * @return      @c BT_SUCCESS      : The function is executed successfully.
892  *              @c otherwise        : The function is not executed successfully.
893  */
894 BTSTACK_API int GAPIF_LePairScOobRsp(const BtAddr *addr, uint8_t accept,
895     const uint8_t oobDataC[GAP_OOB_DATA_CONFIRM_SIZE], const uint8_t oobDataR[GAP_OOB_DATA_RANDOM_SIZE]);
896 
897 /**
898  * @brief       Respond user confirmation request
899  * @param[in]   addr                target device address
900  * @param[in]   accept              accept orr reject
901  * @return      @c BT_SUCCESS      : The function is executed successfully.
902  *              @c otherwise        : The function is not executed successfully.
903  */
904 BTSTACK_API int GAPIF_LePairScUserConfirmRsp(const BtAddr *addr, uint8_t accept);
905 
906 /**
907  * @brief       generation a data signature
908  * @param[in]   addr                target device address
909  * @param[in]   dataInfo            data PDU
910  * @param[in]   callback            result callback function
911  * @param[in]   context             result callback function context
912  * @return      @c BT_SUCCESS      : The function is executed successfully.
913  *              @c otherwise        : The function is not executed successfully.
914  */
915 BTSTACK_API int GAPIF_LeDataSignatureGenerationAsync(
916     const BtAddr *addr, GapSignatureData dataInfo, GAPSignatureGenerationResult callback, void *context);
917 
918 /**
919  * @brief       Confirmation a data signature
920  * @param[in]   addr                target device address
921  * @param[in]   dataInfo            data PDU
922  * @param[in]   signature           signature data
923  * @param[in]   callback            result callback function
924  * @param[in]   context             result callback function context
925  * @return      @c BT_SUCCESS      : The function is executed successfully.
926  *              @c otherwise        : The function is not executed successfully.
927  */
928 BTSTACK_API int GAPIF_LeDataSignatureConfirmationAsync(const BtAddr *addr, GapSignatureData dataInfo,
929     const uint8_t signature[GAP_SIGNATURE_SIZE], GAPSignatureConfirmationResult callback, void *context);
930 
931 #ifdef __cplusplus
932 }
933 #endif
934 
935 #endif /* GAP_LE_IF_H */
936