xref: /nrf52832-nimble/packages/NimBLE-latest/nimble/controller/include/controller/ble_ll_adv.h (revision 042d53a763ad75cb1465103098bb88c245d95138)
1*042d53a7SEvalZero /*
2*042d53a7SEvalZero  * Licensed to the Apache Software Foundation (ASF) under one
3*042d53a7SEvalZero  * or more contributor license agreements.  See the NOTICE file
4*042d53a7SEvalZero  * distributed with this work for additional information
5*042d53a7SEvalZero  * regarding copyright ownership.  The ASF licenses this file
6*042d53a7SEvalZero  * to you under the Apache License, Version 2.0 (the
7*042d53a7SEvalZero  * "License"); you may not use this file except in compliance
8*042d53a7SEvalZero  * with the License.  You may obtain a copy of the License at
9*042d53a7SEvalZero  *
10*042d53a7SEvalZero  *  http://www.apache.org/licenses/LICENSE-2.0
11*042d53a7SEvalZero  *
12*042d53a7SEvalZero  * Unless required by applicable law or agreed to in writing,
13*042d53a7SEvalZero  * software distributed under the License is distributed on an
14*042d53a7SEvalZero  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15*042d53a7SEvalZero  * KIND, either express or implied.  See the License for the
16*042d53a7SEvalZero  * specific language governing permissions and limitations
17*042d53a7SEvalZero  * under the License.
18*042d53a7SEvalZero  */
19*042d53a7SEvalZero 
20*042d53a7SEvalZero #ifndef H_BLE_LL_ADV_
21*042d53a7SEvalZero #define H_BLE_LL_ADV_
22*042d53a7SEvalZero 
23*042d53a7SEvalZero #include "syscfg/syscfg.h"
24*042d53a7SEvalZero 
25*042d53a7SEvalZero #ifdef __cplusplus
26*042d53a7SEvalZero extern "C" {
27*042d53a7SEvalZero #endif
28*042d53a7SEvalZero 
29*042d53a7SEvalZero /*
30*042d53a7SEvalZero  * ADV event timing
31*042d53a7SEvalZero  *      T_advEvent = advInterval + advDelay
32*042d53a7SEvalZero  *
33*042d53a7SEvalZero  *      advInterval: increments of 625 usecs
34*042d53a7SEvalZero  *      advDelay: RAND[0, 10] msecs
35*042d53a7SEvalZero  *
36*042d53a7SEvalZero  */
37*042d53a7SEvalZero #define BLE_LL_ADV_ITVL                 (625)           /* usecs */
38*042d53a7SEvalZero #define BLE_LL_ADV_ITVL_MIN             (32)            /* units */
39*042d53a7SEvalZero #define BLE_LL_ADV_ITVL_MAX             (16384)         /* units */
40*042d53a7SEvalZero #define BLE_LL_ADV_ITVL_MS_MIN          (20)            /* msecs */
41*042d53a7SEvalZero #define BLE_LL_ADV_ITVL_MS_MAX          (10240)         /* msecs */
42*042d53a7SEvalZero #define BLE_LL_ADV_ITVL_SCAN_MIN        (160)           /* units */
43*042d53a7SEvalZero #define BLE_LL_ADV_ITVL_SCAN_MS_MIN     (100)           /* msecs */
44*042d53a7SEvalZero #define BLE_LL_ADV_ITVL_NONCONN_MS_MIN  (100)           /* msecs */
45*042d53a7SEvalZero #define BLE_LL_ADV_DELAY_MS_MIN         (0)             /* msecs */
46*042d53a7SEvalZero #define BLE_LL_ADV_DELAY_MS_MAX         (10)            /* msecs */
47*042d53a7SEvalZero #define BLE_LL_ADV_PDU_ITVL_LD_MS_MAX   (10)            /* msecs */
48*042d53a7SEvalZero #define BLE_LL_ADV_PDU_ITVL_HD_MS_MAX   (3750)          /* usecs */
49*042d53a7SEvalZero #define BLE_LL_ADV_STATE_HD_MAX         (1280)          /* msecs */
50*042d53a7SEvalZero 
51*042d53a7SEvalZero /* Maximum advertisement data length */
52*042d53a7SEvalZero #define BLE_ADV_LEGACY_DATA_MAX_LEN     (31)
53*042d53a7SEvalZero #define BLE_ADV_LEGACY_MAX_PKT_LEN      (37)
54*042d53a7SEvalZero 
55*042d53a7SEvalZero #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
56*042d53a7SEvalZero #define BLE_ADV_DATA_MAX_LEN            MYNEWT_VAL(BLE_EXT_ADV_MAX_SIZE)
57*042d53a7SEvalZero #else
58*042d53a7SEvalZero #define BLE_ADV_DATA_MAX_LEN            BLE_ADV_LEGACY_DATA_MAX_LEN
59*042d53a7SEvalZero #endif
60*042d53a7SEvalZero 
61*042d53a7SEvalZero /*
62*042d53a7SEvalZero  * ADV_IND
63*042d53a7SEvalZero  *      -> AdvA     (6 bytes)
64*042d53a7SEvalZero  *      -> AdvData  (0 - 31 bytes)
65*042d53a7SEvalZero  *
66*042d53a7SEvalZero  *  The advertising address (AdvA) is a public address (TxAdd=0) or random
67*042d53a7SEvalZero  *  address (TxAdd = 1)
68*042d53a7SEvalZero  */
69*042d53a7SEvalZero #define BLE_ADV_IND_MIN_LEN             (6)
70*042d53a7SEvalZero #define BLE_ADV_IND_MAX_LEN             (37)
71*042d53a7SEvalZero 
72*042d53a7SEvalZero /*
73*042d53a7SEvalZero  * ADV_DIRECT_IND
74*042d53a7SEvalZero  *      -> AdvA     (6 bytes)
75*042d53a7SEvalZero  *      -> InitA    (6 bytes)
76*042d53a7SEvalZero  *
77*042d53a7SEvalZero  *  AdvA is the advertisers public address (TxAdd=0) or random address
78*042d53a7SEvalZero  *  (TxAdd = 1).
79*042d53a7SEvalZero  *
80*042d53a7SEvalZero  *  InitA is the initiators public or random address. This is the address
81*042d53a7SEvalZero  *  to which this packet is addressed.
82*042d53a7SEvalZero  *
83*042d53a7SEvalZero  */
84*042d53a7SEvalZero #define BLE_ADV_DIRECT_IND_LEN          (12)
85*042d53a7SEvalZero 
86*042d53a7SEvalZero /*
87*042d53a7SEvalZero  * ADV_NONCONN_IND
88*042d53a7SEvalZero  *      -> AdvA     (6 bytes)
89*042d53a7SEvalZero  *      -> AdvData  (0 - 31 bytes)
90*042d53a7SEvalZero  *
91*042d53a7SEvalZero  *  The advertising address (AdvA) is a public address (TxAdd=0) or random
92*042d53a7SEvalZero  *  address (TxAdd = 1)
93*042d53a7SEvalZero  *
94*042d53a7SEvalZero  */
95*042d53a7SEvalZero #define BLE_ADV_NONCONN_IND_MIN_LEN     (6)
96*042d53a7SEvalZero #define BLE_ADV_NONCONN_IND_MAX_LEN     (37)
97*042d53a7SEvalZero 
98*042d53a7SEvalZero /*
99*042d53a7SEvalZero  * ADV_SCAN_IND
100*042d53a7SEvalZero  *      -> AdvA     (6 bytes)
101*042d53a7SEvalZero  *      -> AdvData  (0 - 31 bytes)
102*042d53a7SEvalZero  *
103*042d53a7SEvalZero  *  The advertising address (AdvA) is a public address (TxAdd=0) or random
104*042d53a7SEvalZero  *  address (TxAdd = 1)
105*042d53a7SEvalZero  *
106*042d53a7SEvalZero  */
107*042d53a7SEvalZero #define BLE_ADV_SCAN_IND_MIN_LEN        (6)
108*042d53a7SEvalZero #define BLE_ADV_SCAN_IND_MAX_LEN        (37)
109*042d53a7SEvalZero 
110*042d53a7SEvalZero /*---- HCI ----*/
111*042d53a7SEvalZero struct ble_ll_adv_sm;
112*042d53a7SEvalZero struct ble_ll_conn_sm;
113*042d53a7SEvalZero 
114*042d53a7SEvalZero /* Start an advertiser */
115*042d53a7SEvalZero int ble_ll_adv_start_req(uint8_t adv_chanmask, uint8_t adv_type,
116*042d53a7SEvalZero                          uint8_t *init_addr, uint16_t adv_itvl, void *handle);
117*042d53a7SEvalZero 
118*042d53a7SEvalZero /* Start or stop advertising */
119*042d53a7SEvalZero int ble_ll_adv_set_enable(uint8_t instance, uint8_t enable, int duration,
120*042d53a7SEvalZero                           uint8_t event);
121*042d53a7SEvalZero 
122*042d53a7SEvalZero /* Set advertising data */
123*042d53a7SEvalZero int ble_ll_adv_set_adv_data(uint8_t *cmd, uint8_t cmd_len, uint8_t instance,
124*042d53a7SEvalZero                             uint8_t operation);
125*042d53a7SEvalZero 
126*042d53a7SEvalZero /* Set scan response data */
127*042d53a7SEvalZero int ble_ll_adv_set_scan_rsp_data(uint8_t *cmd, uint8_t cmd_len,
128*042d53a7SEvalZero                                  uint8_t instance, uint8_t operation);
129*042d53a7SEvalZero 
130*042d53a7SEvalZero /* Set advertising parameters */
131*042d53a7SEvalZero int ble_ll_adv_set_adv_params(uint8_t *cmd);
132*042d53a7SEvalZero 
133*042d53a7SEvalZero /* Read advertising channel power */
134*042d53a7SEvalZero int ble_ll_adv_read_txpwr(uint8_t *rspbuf, uint8_t *rsplen);
135*042d53a7SEvalZero 
136*042d53a7SEvalZero /*---- API used by BLE LL ----*/
137*042d53a7SEvalZero /* Send the connection complete event */
138*042d53a7SEvalZero void ble_ll_adv_send_conn_comp_ev(struct ble_ll_conn_sm *connsm,
139*042d53a7SEvalZero                                   struct ble_mbuf_hdr *rxhdr);
140*042d53a7SEvalZero 
141*042d53a7SEvalZero /* Returns local resolvable private address */
142*042d53a7SEvalZero uint8_t *ble_ll_adv_get_local_rpa(struct ble_ll_adv_sm *advsm);
143*042d53a7SEvalZero 
144*042d53a7SEvalZero /* Returns peer resolvable private address */
145*042d53a7SEvalZero uint8_t *ble_ll_adv_get_peer_rpa(struct ble_ll_adv_sm *advsm);
146*042d53a7SEvalZero 
147*042d53a7SEvalZero /* Called to initialize advertising functionality. */
148*042d53a7SEvalZero void ble_ll_adv_init(void);
149*042d53a7SEvalZero 
150*042d53a7SEvalZero /* Called when LL wait for response timer expires in advertising state */
151*042d53a7SEvalZero void ble_ll_adv_wfr_timer_exp(void);
152*042d53a7SEvalZero 
153*042d53a7SEvalZero /* Called to reset the advertiser. */
154*042d53a7SEvalZero void ble_ll_adv_reset(void);
155*042d53a7SEvalZero 
156*042d53a7SEvalZero /* Called on rx pdu start when in advertising state */
157*042d53a7SEvalZero int ble_ll_adv_rx_isr_start(uint8_t pdu_type);
158*042d53a7SEvalZero 
159*042d53a7SEvalZero /* Called on rx pdu end when in advertising state */
160*042d53a7SEvalZero int ble_ll_adv_rx_isr_end(uint8_t pdu_type, struct os_mbuf *rxpdu, int crcok);
161*042d53a7SEvalZero 
162*042d53a7SEvalZero /* Processes received packets at the link layer task */
163*042d53a7SEvalZero void ble_ll_adv_rx_pkt_in(uint8_t ptype, uint8_t *rxbuf,
164*042d53a7SEvalZero                           struct ble_mbuf_hdr *hdr);
165*042d53a7SEvalZero 
166*042d53a7SEvalZero /* Boolean function denoting whether or not the whitelist can be changed */
167*042d53a7SEvalZero int ble_ll_adv_can_chg_whitelist(void);
168*042d53a7SEvalZero 
169*042d53a7SEvalZero /*
170*042d53a7SEvalZero  * Called when an advertising event has been removed from the scheduler
171*042d53a7SEvalZero  * without being run.
172*042d53a7SEvalZero  */
173*042d53a7SEvalZero void ble_ll_adv_event_rmvd_from_sched(struct ble_ll_adv_sm *advsm);
174*042d53a7SEvalZero 
175*042d53a7SEvalZero /* Called to halt currently running advertising event */
176*042d53a7SEvalZero void ble_ll_adv_halt(void);
177*042d53a7SEvalZero 
178*042d53a7SEvalZero /* Called to determine if advertising is enabled */
179*042d53a7SEvalZero uint8_t ble_ll_adv_enabled(void);
180*042d53a7SEvalZero 
181*042d53a7SEvalZero int ble_ll_adv_set_random_addr(uint8_t *addr, uint8_t instance);
182*042d53a7SEvalZero int ble_ll_adv_remove(uint8_t instance);
183*042d53a7SEvalZero int ble_ll_adv_clear_all(void);
184*042d53a7SEvalZero int ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen);
185*042d53a7SEvalZero int ble_ll_adv_ext_set_adv_data(uint8_t *cmdbuf, uint8_t cmdlen);
186*042d53a7SEvalZero int ble_ll_adv_ext_set_scan_rsp(uint8_t *cmdbuf, uint8_t cmdlen);
187*042d53a7SEvalZero int ble_ll_adv_ext_set_enable(uint8_t *cmdbuf, uint8_t len);
188*042d53a7SEvalZero 
189*042d53a7SEvalZero /* Called to notify adv code about RPA rotation */
190*042d53a7SEvalZero void ble_ll_adv_rpa_timeout(void);
191*042d53a7SEvalZero 
192*042d53a7SEvalZero #ifdef __cplusplus
193*042d53a7SEvalZero }
194*042d53a7SEvalZero #endif
195*042d53a7SEvalZero 
196*042d53a7SEvalZero #endif /* H_BLE_LL_ADV_ */
197