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