You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by GitBox <gi...@apache.org> on 2018/12/21 14:00:11 UTC

[GitHub] rymanluk closed pull request #280: nimble/ll: Improvements for extended advertising

rymanluk closed pull request #280: nimble/ll: Improvements for extended advertising
URL: https://github.com/apache/mynewt-nimble/pull/280
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/nimble/controller/src/ble_ll_adv.c b/nimble/controller/src/ble_ll_adv.c
index 928e88ad..0de1e949 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,14 +1133,26 @@ 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;
     }
 
-    /* TargetA for directed connectable */
-    if ((advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) &&
-        (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE)) {
+    /* Note: this function does not calculate AUX_ADV_IND when advertising is
+     * scannable. Instead it is calculated in ble_ll_adv_aux_schedule_first().
+     *
+     * However this function calculates length of AUX_SCAN_RSP and according
+     * to BT 5.0 Vol 6 Part B, 2.3.2.3, TargetA shall not be include there.
+     *
+     * This is why TargetA is added to all directed advertising here unless it
+     * is scannable one.
+     *
+     * Note. TargetA shall not be also in AUX_CHAIN_IND
+     */
+    if (aux_data_offset == 0  &&
+        (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) &&
+            !(advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE)) {
         aux->ext_hdr |= (1 << BLE_LL_EXT_ADV_TARGETA_BIT);
         hdr_len += BLE_LL_EXT_ADV_TARGETA_SIZE;
     }
@@ -1265,7 +1285,16 @@ ble_ll_adv_aux_schedule_first(struct ble_ll_adv_sm *advsm)
                     /* AUX_CONN_RSP */
                     ble_ll_pdu_tx_time_get(14, advsm->sec_phy);
     } else if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE) {
-        /* Scheduled aux is calculated for AUX_SCAN_RSP, 1st aux is created separately */
+        /* For scannable advertising we need to calculate how much time we
+         * need for AUX_ADV_IND along with AUX_SCAN_REQ, AUX_SCAN_RSP and
+         * IFS in between.
+         *
+         * Note:
+         *  1. aux->payload_len, which calculated by above ble_ll_adv_aux_calulcate(),
+         * contains AUX_SCAN_RSP length.
+         *  2. length of AUX_ADV_IND is calculated by special function:
+         *      ble_ll_adv_aux_scannable_pdu_payload_len()
+         */
         max_usecs = ble_ll_pdu_tx_time_get(ble_ll_adv_aux_scannable_pdu_payload_len(advsm),
                                            advsm->sec_phy) +
                     BLE_LL_IFS +
@@ -2395,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;


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services