You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ry...@apache.org on 2018/12/21 14:00:17 UTC
[mynewt-nimble] 02/02: nimble/ll: Add support to advertise
anonymously
This is an automated email from the ASF dual-hosted git repository.
rymek pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
commit 86e128baeb39431e2e1dbd7d3b4d936a430caa52
Author: Ćukasz Rymanowski <lu...@codecoup.pl>
AuthorDate: Fri Dec 21 14:42:32 2018 +0100
nimble/ll: Add support to advertise anonymously
---
nimble/controller/src/ble_ll_adv.c | 56 ++++++++++++++++++++++++--------------
1 file changed, 36 insertions(+), 20 deletions(-)
diff --git a/nimble/controller/src/ble_ll_adv.c b/nimble/controller/src/ble_ll_adv.c
index 54563ba..0de1e94 100644
--- a/nimble/controller/src/ble_ll_adv.c
+++ b/nimble/controller/src/ble_ll_adv.c
@@ -500,11 +500,6 @@ ble_ll_adv_aux_pdu_make(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte)
/* It's the same for AUX_ADV_IND and AUX_CHAIN_IND */
pdu_type = BLE_ADV_PDU_TYPE_AUX_ADV_IND;
- /* Set TxAdd to random if needed. */
- if (advsm->flags & BLE_LL_ADV_SM_FLAG_TX_ADD) {
- pdu_type |= BLE_ADV_PDU_HDR_TXADD_RAND;
- }
-
/* We do not create scannable PDUs here - this is handled separately */
adv_mode = 0;
if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE) {
@@ -519,6 +514,12 @@ ble_ll_adv_aux_pdu_make(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_byte)
dptr += 1;
if (aux->ext_hdr & (1 << BLE_LL_EXT_ADV_ADVA_BIT)) {
+
+ /* Set TxAdd to random if needed. */
+ if (advsm->flags & BLE_LL_ADV_SM_FLAG_TX_ADD) {
+ pdu_type |= BLE_ADV_PDU_HDR_TXADD_RAND;
+ }
+
memcpy(dptr, advsm->adva, BLE_LL_EXT_ADV_ADVA_SIZE);
dptr += BLE_LL_EXT_ADV_ADVA_SIZE;
}
@@ -592,11 +593,6 @@ ble_ll_adv_aux_scannable_pdu_make(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_b
pdu_type = BLE_ADV_PDU_TYPE_AUX_ADV_IND;
- /* Set TxAdd to random if needed. */
- if (advsm->flags & BLE_LL_ADV_SM_FLAG_TX_ADD) {
- pdu_type |= BLE_ADV_PDU_HDR_TXADD_RAND;
- }
-
ext_hdr_len = &dptr[0];
ext_hdr = &dptr[1];
dptr += 2;
@@ -605,11 +601,18 @@ ble_ll_adv_aux_scannable_pdu_make(uint8_t *dptr, void *pducb_arg, uint8_t *hdr_b
*ext_hdr_len = BLE_LL_EXT_ADV_FLAGS_SIZE;
*ext_hdr = 0;
- /* AdvA always */
- *ext_hdr_len += BLE_LL_EXT_ADV_ADVA_SIZE;
- *ext_hdr |= (1 << BLE_LL_EXT_ADV_ADVA_BIT);
- memcpy(dptr, advsm->adva, BLE_LL_EXT_ADV_ADVA_SIZE);
- dptr += BLE_LL_EXT_ADV_ADVA_SIZE;
+ /* AdvA when non anonymous */
+ if (!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_ANON_ADV)) {
+ /* Set TxAdd to random if needed. */
+ if (advsm->flags & BLE_LL_ADV_SM_FLAG_TX_ADD) {
+ pdu_type |= BLE_ADV_PDU_HDR_TXADD_RAND;
+ }
+
+ *ext_hdr_len += BLE_LL_EXT_ADV_ADVA_SIZE;
+ *ext_hdr |= (1 << BLE_LL_EXT_ADV_ADVA_BIT);
+ memcpy(dptr, advsm->adva, BLE_LL_EXT_ADV_ADVA_SIZE);
+ dptr += BLE_LL_EXT_ADV_ADVA_SIZE;
+ }
/* TargetA only for directed */
if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) {
@@ -1079,9 +1082,14 @@ ble_ll_adv_aux_scannable_pdu_payload_len(struct ble_ll_adv_sm *advsm)
{
uint8_t len;
- /* Flags, AdvA and ADI always */
- len = BLE_LL_EXT_ADV_HDR_LEN + BLE_LL_EXT_ADV_FLAGS_SIZE +
- BLE_LL_EXT_ADV_ADVA_SIZE + BLE_LL_EXT_ADV_DATA_INFO_SIZE;
+ /* Flags, ADI always */
+ len = BLE_LL_EXT_ADV_HDR_LEN + BLE_LL_EXT_ADV_FLAGS_SIZE
+ + BLE_LL_EXT_ADV_DATA_INFO_SIZE;
+
+ /* AdvA if not anonymous */
+ if (!(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_ANON_ADV)) {
+ len += BLE_LL_EXT_ADV_ADVA_SIZE;
+ }
/* TargetA only for directed */
if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) {
@@ -1125,7 +1133,8 @@ ble_ll_adv_aux_calculate(struct ble_ll_adv_sm *advsm,
}
/* AdvA for 1st PDU in chain (i.e. AUX_ADV_IND or AUX_SCAN_RSP) */
- if (aux_data_offset == 0) {
+ if (aux_data_offset == 0 &&
+ !(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_ANON_ADV)) {
aux->ext_hdr |= (1 << BLE_LL_EXT_ADV_ADVA_BIT);
hdr_len += BLE_LL_EXT_ADV_ADVA_SIZE;
}
@@ -2415,7 +2424,14 @@ ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen)
advsm->adv_txpwr = ble_phy_txpower_round(tx_power);
}
- advsm->own_addr_type = own_addr_type;
+ if (!(props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) &&
+ (props & BLE_HCI_LE_SET_EXT_ADV_PROP_ANON_ADV)) {
+ /* For anonymous don't care about address type */
+ advsm->own_addr_type = 0;
+ } else {
+ advsm->own_addr_type = own_addr_type;
+ }
+
advsm->peer_addr_type = peer_addr_type;
advsm->adv_filter_policy = adv_filter_policy;
advsm->adv_chanmask = adv_chanmask;