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/03/29 11:52:57 UTC

[GitHub] rymanluk closed pull request #18: nimble/ll: Portion of fixes for the nimble controller.

rymanluk closed pull request #18: nimble/ll: Portion of fixes for the nimble controller.
URL: https://github.com/apache/mynewt-nimble/pull/18
 
 
   

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/include/controller/ble_ll_conn.h b/nimble/controller/include/controller/ble_ll_conn.h
index 149861e7..1d04acb1 100644
--- a/nimble/controller/include/controller/ble_ll_conn.h
+++ b/nimble/controller/include/controller/ble_ll_conn.h
@@ -337,7 +337,6 @@ struct ble_ll_conn_sm
 #define CONN_F_LE_PING_SUPP(csm)    ((csm)->csmflags.cfbit.le_ping_supp)
 #define CONN_F_TERMINATE_STARTED(csm) ((csm)->csmflags.cfbit.terminate_started)
 #define CONN_F_CSA2_SUPP(csm)       ((csm)->csmflags.cfbit.csa2_supp)
-#define CONN_F_TERMINATE_STARTED(csm) ((csm)->csmflags.cfbit.terminate_started)
 #define CONN_F_HOST_PHY_UPDATE(csm) ((csm)->csmflags.cfbit.host_phy_update)
 #define CONN_F_PHY_UPDATE_SCHED(csm) ((csm)->csmflags.cfbit.phy_update_sched)
 #define CONN_F_CTRLR_PHY_UPDATE(csm) ((csm)->csmflags.cfbit.ctrlr_phy_update)
diff --git a/nimble/controller/include/controller/ble_ll_ctrl.h b/nimble/controller/include/controller/ble_ll_ctrl.h
index 3a9a8c7b..fa50c98f 100644
--- a/nimble/controller/include/controller/ble_ll_ctrl.h
+++ b/nimble/controller/include/controller/ble_ll_ctrl.h
@@ -277,6 +277,7 @@ void ble_ll_hci_ev_send_adv_set_terminated(uint8_t status, uint8_t adv_handle,
 int ble_ll_hci_ev_phy_update(struct ble_ll_conn_sm *connsm, uint8_t status);
 void ble_ll_calc_session_key(struct ble_ll_conn_sm *connsm);
 void ble_ll_ctrl_phy_update_proc_complete(struct ble_ll_conn_sm *connsm);
+void ble_ll_ctrl_initiate_dle(struct ble_ll_conn_sm *connsm);
 
 #ifdef __cplusplus
 }
diff --git a/nimble/controller/src/ble_ll_adv.c b/nimble/controller/src/ble_ll_adv.c
index fbf1a6fa..9af18144 100644
--- a/nimble/controller/src/ble_ll_adv.c
+++ b/nimble/controller/src/ble_ll_adv.c
@@ -133,6 +133,7 @@ struct ble_ll_adv_sm
 #define BLE_LL_ADV_SM_FLAG_CONN_RSP_TXD         0x08
 #define BLE_LL_ADV_SM_FLAG_ACTIVE_CHANSET_MASK  0x30 /* use helpers! */
 #define BLE_LL_ADV_SM_FLAG_ADV_DATA_INCOMPLETE  0x40
+#define BLE_LL_ADV_SM_FLAG_ADV_TERMINATE_EVT    0x80
 
 #define ADV_DATA_LEN(_advsm) \
                 ((_advsm->adv_data) ? OS_MBUF_PKTLEN(advsm->adv_data) : 0)
@@ -2004,6 +2005,7 @@ ble_ll_adv_set_adv_data(uint8_t *cmd, uint8_t instance, uint8_t operation)
 int
 ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen)
 {
+    int rc;
     uint8_t adv_filter_policy;
     uint8_t adv_chanmask;
     uint8_t own_addr_type;
@@ -2017,15 +2019,17 @@ ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen)
     uint8_t sec_phy;
     uint8_t sid;
     uint8_t scan_req_notif;
-    int8_t tx_power;
+    int8_t tx_power = 0;
 
     if (cmdbuf[0] >= BLE_ADV_INSTANCES) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
+        rc = BLE_ERR_INV_HCI_CMD_PARMS;
+        goto done;
     }
 
     advsm = &g_ble_ll_adv_sm[cmdbuf[0]];
     if (advsm->adv_enabled) {
-        return BLE_ERR_CMD_DISALLOWED;
+        rc = BLE_ERR_CMD_DISALLOWED;
+        goto done;
     }
 
     props = get_le16(&cmdbuf[1]);
@@ -2034,13 +2038,15 @@ ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen)
     adv_itvl_max = cmdbuf[8] << 16 | cmdbuf[7] << 8 | cmdbuf[6];
 
     if (props & ~BLE_HCI_LE_SET_EXT_ADV_PROP_MASK) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
+        rc = BLE_ERR_INV_HCI_CMD_PARMS;
+        goto done;
     }
 
     if (props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) {
         if (ADV_DATA_LEN(advsm) > BLE_ADV_LEGACY_DATA_MAX_LEN ||
             SCAN_RSP_DATA_LEN(advsm) > BLE_SCAN_RSP_LEGACY_DATA_MAX_LEN) {
-            return BLE_ERR_INV_HCI_CMD_PARMS;
+            rc = BLE_ERR_INV_HCI_CMD_PARMS;
+            goto done;
         }
 
         /* if legacy bit is set possible values are limited */
@@ -2052,12 +2058,14 @@ ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen)
         case BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY_NONCONN:
             break;
         default:
-            return BLE_ERR_INV_HCI_CMD_PARMS;
+            rc = BLE_ERR_INV_HCI_CMD_PARMS;
+            goto done;
         }
     } else {
         /* HD directed advertising allowed only on legacy PDUs */
         if (props & BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED) {
-            return BLE_ERR_INV_HCI_CMD_PARMS;
+            rc = BLE_ERR_INV_HCI_CMD_PARMS;
+            goto done;
         }
 
         /* if ext advertising PDUs are used then it shall not be both
@@ -2065,7 +2073,8 @@ ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen)
          */
         if ((props & BLE_HCI_LE_SET_EXT_ADV_PROP_CONNECTABLE) &&
             (props & BLE_HCI_LE_SET_EXT_ADV_PROP_SCANNABLE)) {
-            return BLE_ERR_INV_HCI_CMD_PARMS;
+            rc = BLE_ERR_INV_HCI_CMD_PARMS;
+            goto done;
         }
     }
 
@@ -2075,7 +2084,8 @@ ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen)
 
     if (props & BLE_HCI_LE_SET_EXT_ADV_PROP_HD_DIRECTED) {
         if (ADV_DATA_LEN(advsm) || SCAN_RSP_DATA_LEN(advsm)) {
-            return BLE_ERR_INV_HCI_CMD_PARMS;
+            rc = BLE_ERR_INV_HCI_CMD_PARMS;
+            goto done;
         }
 
         /* Ignore min/max interval */
@@ -2090,13 +2100,15 @@ ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen)
     if ((adv_itvl_min > adv_itvl_max) || (adv_itvl_min < min_itvl) ||
         (adv_itvl_min > BLE_HCI_ADV_ITVL_MAX) ||
         (adv_itvl_max > BLE_HCI_ADV_ITVL_MAX)) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
+        rc = BLE_ERR_INV_HCI_CMD_PARMS;
+        goto done;
     }
 
     /* There are only three adv channels, so check for any outside the range */
     adv_chanmask = cmdbuf[9];
     if (((adv_chanmask & 0xF8) != 0) || (adv_chanmask == 0)) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
+        rc = BLE_ERR_INV_HCI_CMD_PARMS;
+        goto done;
     }
 
     /* Check own and peer address type */
@@ -2105,7 +2117,8 @@ ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen)
 
     if ((own_addr_type > BLE_HCI_ADV_OWN_ADDR_MAX) ||
         (peer_addr_type > BLE_HCI_ADV_PEER_ADDR_MAX)) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
+        rc = BLE_ERR_INV_HCI_CMD_PARMS;
+        goto done;
     }
 
 #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_PRIVACY) == 1)
@@ -2116,7 +2129,8 @@ ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen)
 #else
     /* If we dont support privacy some address types wont work */
     if (own_addr_type > BLE_HCI_ADV_OWN_ADDR_RANDOM) {
-        return BLE_ERR_UNSUPPORTED;
+        rc = BLE_ERR_UNSUPPORTED;
+        goto done;
     }
 #endif
 
@@ -2124,30 +2138,37 @@ ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen)
     /* Check filter policy (valid only for undirected */
     if (!(props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) &&
          adv_filter_policy > BLE_HCI_ADV_FILT_MAX) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
+        rc = BLE_ERR_INV_HCI_CMD_PARMS;
+        goto done;
     }
 
     pri_phy = cmdbuf[20];
     if (pri_phy != BLE_HCI_LE_PHY_1M && pri_phy != BLE_HCI_LE_PHY_CODED) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
+        rc = BLE_ERR_INV_HCI_CMD_PARMS;
+        goto done;
     }
 
     sec_phy = cmdbuf[22];
     if (sec_phy != BLE_HCI_LE_PHY_1M && sec_phy != BLE_HCI_LE_PHY_2M &&
             sec_phy != BLE_HCI_LE_PHY_CODED) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
+        rc = BLE_ERR_INV_HCI_CMD_PARMS;
+        goto done;
     }
 
     sid = cmdbuf[23];
     if (sid > 0x0f) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
+        rc = BLE_ERR_INV_HCI_CMD_PARMS;
+        goto done;
     }
 
     scan_req_notif = cmdbuf[24];
     if (scan_req_notif > 0x01) {
-        return BLE_ERR_INV_HCI_CMD_PARMS;
+        rc = BLE_ERR_INV_HCI_CMD_PARMS;
+        goto done;
     }
 
+    rc = BLE_ERR_SUCCESS;
+
     if (props & BLE_HCI_LE_SET_EXT_ADV_PROP_DIRECTED) {
         memcpy(advsm->peer_addr, &cmdbuf[12], BLE_DEV_ADDR_LEN);
     }
@@ -2188,10 +2209,14 @@ ble_ll_adv_ext_set_param(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen)
         advsm->flags &= ~BLE_LL_ADV_SM_FLAG_SCAN_REQ_NOTIF;
     }
 
-    rspbuf[0] = advsm->adv_txpwr;
+    advsm->flags |= BLE_LL_ADV_SM_FLAG_ADV_TERMINATE_EVT;
+
+done:
+    /* Update TX power */
+    rspbuf[0] = ble_phy_txpower_round(tx_power);
     *rsplen = 1;
 
-    return 0;
+    return rc;
 }
 
 int
@@ -3000,7 +3025,8 @@ ble_ll_adv_done(struct ble_ll_adv_sm *advsm)
         /* Legacy PDUs need to be stop here, for ext adv it will be stopped when
          * AUX is done.
          */
-        if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) {
+        if ((advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) &&
+                        (advsm->flags & BLE_LL_ADV_SM_FLAG_ADV_TERMINATE_EVT)) {
             ble_ll_hci_ev_send_adv_set_terminated(BLE_ERR_DIR_ADV_TMO,
                                                   advsm->adv_instance, 0, 0);
 
@@ -3040,7 +3066,8 @@ ble_ll_adv_done(struct ble_ll_adv_sm *advsm)
         /* Legacy PDUs need to be stop here, for ext adv it will be stopped when
          * AUX is done.
          */
-        if (advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) {
+        if ((advsm->props & BLE_HCI_LE_SET_EXT_ADV_PROP_LEGACY) &&
+                        (advsm->flags & BLE_LL_ADV_SM_FLAG_ADV_TERMINATE_EVT)) {
             ble_ll_hci_ev_send_adv_set_terminated(BLE_RR_LIMIT_REACHED,
                                                   advsm->adv_instance, 0,
                                                   advsm->events);
@@ -3130,8 +3157,8 @@ ble_ll_adv_sec_done(struct ble_ll_adv_sm *advsm)
     ble_ll_scan_chk_resume();
 
     /* Check if advertising timed out */
-    if (advsm->duration &&
-        aux->start_time >= advsm->adv_end_time) {
+    if ((advsm->duration && aux->start_time >= advsm->adv_end_time) &&
+                    (advsm->flags & BLE_LL_ADV_SM_FLAG_ADV_TERMINATE_EVT)) {
         ble_ll_hci_ev_send_adv_set_terminated(BLE_ERR_DIR_ADV_TMO,
                                               advsm->adv_instance, 0, 0);
 
@@ -3150,7 +3177,8 @@ ble_ll_adv_sec_done(struct ble_ll_adv_sm *advsm)
         return;
     }
 
-    if (advsm->events_max && (advsm->events >= advsm->events_max)) {
+    if ((advsm->events_max && (advsm->events >= advsm->events_max)) &&
+                    (advsm->flags & BLE_LL_ADV_SM_FLAG_ADV_TERMINATE_EVT)) {
         ble_ll_hci_ev_send_adv_set_terminated(BLE_RR_LIMIT_REACHED,
                                               advsm->adv_instance, 0,
                                               advsm->events);
@@ -3243,8 +3271,10 @@ ble_ll_adv_send_conn_comp_ev(struct ble_ll_conn_sm *connsm,
     ble_ll_conn_comp_event_send(connsm, BLE_ERR_SUCCESS, evbuf, advsm);
 
 #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
-    ble_ll_hci_ev_send_adv_set_terminated(0, advsm->adv_instance,
+    if (advsm->flags & BLE_LL_ADV_SM_FLAG_ADV_TERMINATE_EVT) {
+        ble_ll_hci_ev_send_adv_set_terminated(0, advsm->adv_instance,
                                           connsm->conn_handle, advsm->events);
+    }
 #endif
 
 #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_CSA2) == 1)
diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c
index 9123cf62..e5e5bfbb 100644
--- a/nimble/controller/src/ble_ll_conn.c
+++ b/nimble/controller/src/ble_ll_conn.c
@@ -3615,7 +3615,7 @@ ble_ll_conn_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr)
     uint8_t rem_bytes;
     uint8_t opcode = 0;
     uint8_t rx_pyld_len;
-    uint32_t endtime;
+    uint32_t begtime;
     uint32_t add_usecs;
     struct os_mbuf *txpdu;
     struct ble_ll_conn_sm *connsm;
@@ -3652,7 +3652,7 @@ ble_ll_conn_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr)
      * but for the 32768 crystal we add the time it takes to send the packet
      * to the 'additional usecs' field to save some calculations.
      */
-    endtime = rxhdr->beg_cputime;
+    begtime = rxhdr->beg_cputime;
 #if BLE_LL_BT5_PHY_SUPPORTED
     rx_phy_mode = connsm->phy_data.rx_phy_mode;
 #else
@@ -3687,7 +3687,8 @@ ble_ll_conn_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr)
         connsm->cons_rxd_bad_crc = 0;
 
         /* Set last valid received pdu time (resets supervision timer) */
-        connsm->last_rxd_pdu_cputime = endtime;
+        connsm->last_rxd_pdu_cputime = begtime +
+                                        os_cputime_usecs_to_ticks(add_usecs);
 
         /*
          * Check for valid LLID before proceeding. We have seen some weird
@@ -3834,7 +3835,7 @@ ble_ll_conn_rx_isr_end(uint8_t *rxbuf, struct ble_mbuf_hdr *rxhdr)
     if (rx_pyld_len && CONN_F_ENCRYPTED(connsm)) {
         rx_pyld_len += BLE_LL_DATA_MIC_LEN;
     }
-    if (reply && ble_ll_conn_can_send_next_pdu(connsm, endtime, add_usecs)) {
+    if (reply && ble_ll_conn_can_send_next_pdu(connsm, begtime, add_usecs)) {
         rc = ble_ll_conn_tx_data_pdu(connsm);
     }
 
diff --git a/nimble/controller/src/ble_ll_conn_hci.c b/nimble/controller/src/ble_ll_conn_hci.c
index c6ea897a..859b7c3a 100644
--- a/nimble/controller/src/ble_ll_conn_hci.c
+++ b/nimble/controller/src/ble_ll_conn_hci.c
@@ -931,7 +931,8 @@ ble_ll_conn_hci_update(uint8_t *cmdbuf)
 }
 
 int
-ble_ll_conn_hci_param_reply(uint8_t *cmdbuf, int positive_reply)
+ble_ll_conn_hci_param_reply(uint8_t *cmdbuf, int positive_reply,
+                            uint8_t *rspbuf, uint8_t *rsplen)
 {
     int rc;
     uint8_t ble_err;
@@ -942,18 +943,19 @@ ble_ll_conn_hci_param_reply(uint8_t *cmdbuf, int positive_reply)
     struct os_mbuf *om;
     struct ble_ll_conn_sm *connsm;
 
+    handle = get_le16(cmdbuf);
+
     /* See if we support this feature */
     if ((ble_ll_read_supp_features() & BLE_LL_FEAT_CONN_PARM_REQ) == 0) {
-        return BLE_ERR_UNKNOWN_HCI_CMD;
+        rc = BLE_ERR_UNKNOWN_HCI_CMD;
+        goto done;
     }
 
-    /* If no connection handle exit with error */
-    handle = get_le16(cmdbuf);
-
     /* If we dont have a handle we cant do anything */
     connsm = ble_ll_conn_find_active_conn(handle);
     if (!connsm) {
-        return BLE_ERR_UNK_CONN_ID;
+        rc = BLE_ERR_UNK_CONN_ID;
+        goto done;
     }
 
     /* Make sure connection parameters are valid if this is a positive reply */
@@ -992,6 +994,9 @@ ble_ll_conn_hci_param_reply(uint8_t *cmdbuf, int positive_reply)
            some state to tell us this happened */
     }
 
+done:
+    put_le16(rspbuf, handle);
+    *rsplen = sizeof(uint16_t);
     return rc;
 }
 
@@ -1248,27 +1253,30 @@ ble_ll_conn_hci_set_data_len(uint8_t *cmdbuf, uint8_t *rspbuf, uint8_t *rsplen)
     connsm = ble_ll_conn_find_active_conn(handle);
     if (!connsm) {
         rc = BLE_ERR_UNK_CONN_ID;
-    } else {
-        txoctets = get_le16(cmdbuf + 2);
-        txtime = get_le16(cmdbuf + 4);
+        goto done;
+    }
 
-        /* Make sure it is valid */
-        if (!ble_ll_chk_txrx_octets(txoctets) ||
-            !ble_ll_chk_txrx_time(txtime)) {
-            rc = BLE_ERR_INV_HCI_CMD_PARMS;
-        } else {
-            rc = BLE_ERR_SUCCESS;
-        }
+    txoctets = get_le16(cmdbuf + 2);
+    txtime = get_le16(cmdbuf + 4);
+
+    /* Make sure it is valid */
+    if (!ble_ll_chk_txrx_octets(txoctets) ||
+        !ble_ll_chk_txrx_time(txtime)) {
+        rc = BLE_ERR_INV_HCI_CMD_PARMS;
+        goto done;
+    }
 
-        /* XXX: should I check against max supported? I think so */
+    rc = BLE_ERR_SUCCESS;
+    if (connsm->max_tx_time != txtime ||
+        connsm->max_tx_octets != txoctets) {
 
-        /*
-         * XXX: For now; we will simply ignore what the host asks as we are
-         * allowed to do so by the spec. If we implement this and something
-         * changes we need to send data length change event.
-         */
+        connsm->max_tx_time = txtime;
+        connsm->max_tx_octets = txoctets;
+
+        ble_ll_ctrl_initiate_dle(connsm);
     }
 
+done:
     put_le16(rspbuf, handle);
     *rsplen = sizeof(uint16_t);
     return rc;
diff --git a/nimble/controller/src/ble_ll_conn_priv.h b/nimble/controller/src/ble_ll_conn_priv.h
index 02e99ed8..a015a532 100644
--- a/nimble/controller/src/ble_ll_conn_priv.h
+++ b/nimble/controller/src/ble_ll_conn_priv.h
@@ -146,7 +146,8 @@ int ble_ll_conn_hci_rd_rem_ver_cmd(uint8_t *cmdbuf);
 int ble_ll_conn_create(uint8_t *cmdbuf);
 int ble_ll_conn_hci_update(uint8_t *cmdbuf);
 int ble_ll_conn_hci_set_chan_class(uint8_t *cmdbuf);
-int ble_ll_conn_hci_param_reply(uint8_t *cmdbuf, int negative_reply);
+int ble_ll_conn_hci_param_reply(uint8_t *cmdbuf, int negative_reply,
+                                uint8_t *rspbuf, uint8_t *rsplen);
 int ble_ll_conn_create_cancel(void);
 void ble_ll_conn_num_comp_pkts_event_send(struct ble_ll_conn_sm *connsm);
 void ble_ll_conn_comp_event_send(struct ble_ll_conn_sm *connsm, uint8_t status,
diff --git a/nimble/controller/src/ble_ll_ctrl.c b/nimble/controller/src/ble_ll_ctrl.c
index a528eaae..2055dc0a 100644
--- a/nimble/controller/src/ble_ll_ctrl.c
+++ b/nimble/controller/src/ble_ll_ctrl.c
@@ -325,11 +325,18 @@ ble_ll_ctrl_conn_param_pdu_proc(struct ble_ll_conn_sm *connsm, uint8_t *dptr,
      * need to know before we indicate to the host that they are acceptable.
      */
     if (indicate) {
+        /* If Host masked out Remote Connection Parameter Request Event, we need to
+         * send Reject back to the remote device
+         */
+        if (!ble_ll_hci_is_le_event_enabled(BLE_HCI_LE_SUBEV_REM_CONN_PARM_REQ)){
+            ble_err = BLE_ERR_UNSUPP_REM_FEATURE;
+            goto conn_param_pdu_exit;
+        }
+
         /*
          * Send event to host. At this point we leave and wait to get
          * an answer.
          */
-        /* XXX: what about masked out event? */
         ble_ll_hci_ev_rem_conn_parm_req(connsm, req);
         connsm->host_reply_opcode = opcode;
         connsm->csmflags.cfbit.awaiting_host_reply = 1;
@@ -1500,7 +1507,7 @@ ble_ll_ctrl_rx_conn_update(struct ble_ll_conn_sm *connsm, uint8_t *dptr)
     return rsp_opcode;
 }
 
-static void
+void
 ble_ll_ctrl_initiate_dle(struct ble_ll_conn_sm *connsm)
 {
     if (!(connsm->conn_features & BLE_LL_FEAT_DATA_LEN_EXT)) {
diff --git a/nimble/controller/src/ble_ll_hci.c b/nimble/controller/src/ble_ll_hci.c
index 6e29df07..7459746a 100644
--- a/nimble/controller/src/ble_ll_hci.c
+++ b/nimble/controller/src/ble_ll_hci.c
@@ -765,10 +765,10 @@ ble_ll_hci_le_cmd_proc(uint8_t *cmdbuf, uint16_t ocf, uint8_t *rsplen)
         rc = ble_ll_hci_le_read_supp_states(rspbuf, rsplen);
         break;
     case BLE_HCI_OCF_LE_REM_CONN_PARAM_NRR:
-        rc = ble_ll_conn_hci_param_reply(cmdbuf, 0);
+        rc = ble_ll_conn_hci_param_reply(cmdbuf, 0, rspbuf, rsplen);
         break;
     case BLE_HCI_OCF_LE_REM_CONN_PARAM_RR:
-        rc = ble_ll_conn_hci_param_reply(cmdbuf, 1);
+        rc = ble_ll_conn_hci_param_reply(cmdbuf, 1, rspbuf, rsplen);
         break;
 #if (MYNEWT_VAL(BLE_LL_CFG_FEAT_DATA_LEN_EXT) == 1)
     case BLE_HCI_OCF_LE_SET_DATA_LEN:


 

----------------------------------------------------------------
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