You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2022/02/22 19:53:01 UTC
[mynewt-nimble] 02/05: nimble/ll: Add conn_move_anchor
This is an automated email from the ASF dual-hosted git repository.
andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
commit bc196758299f20044f3032342d847a45552e9f84
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Fri Feb 4 14:03:19 2022 +0100
nimble/ll: Add conn_move_anchor
Central can move anchor to e.g. optimize scheduling.
---
nimble/controller/include/controller/ble_ll_conn.h | 4 +++
nimble/controller/include/controller/ble_ll_ctrl.h | 3 +-
nimble/controller/src/ble_ll_conn.c | 35 +++++++++++++++++++---
nimble/controller/src/ble_ll_conn_hci.c | 10 +++----
nimble/controller/src/ble_ll_ctrl.c | 17 ++++++-----
5 files changed, 51 insertions(+), 18 deletions(-)
diff --git a/nimble/controller/include/controller/ble_ll_conn.h b/nimble/controller/include/controller/ble_ll_conn.h
index 015bac75..9075e7e 100644
--- a/nimble/controller/include/controller/ble_ll_conn.h
+++ b/nimble/controller/include/controller/ble_ll_conn.h
@@ -397,6 +397,10 @@ uint8_t ble_ll_conn_calc_dci(struct ble_ll_conn_sm *conn, uint16_t latency);
void ble_ll_conn_get_anchor(struct ble_ll_conn_sm *connsm, uint16_t conn_event,
uint32_t *anchor, uint8_t *anchor_usecs);
+#if MYNEWT_VAL(BLE_LL_ROLE_CENTRAL)
+int ble_ll_conn_move_anchor(struct ble_ll_conn_sm *connsm, uint16_t offset);
+#endif
+
struct ble_ll_scan_addr_data;
struct ble_ll_scan_pdu_data;
diff --git a/nimble/controller/include/controller/ble_ll_ctrl.h b/nimble/controller/include/controller/ble_ll_ctrl.h
index ebac33d..423d13a 100644
--- a/nimble/controller/include/controller/ble_ll_ctrl.h
+++ b/nimble/controller/include/controller/ble_ll_ctrl.h
@@ -292,7 +292,8 @@ struct ble_ll_len_req
/* API */
struct ble_ll_conn_sm;
-void ble_ll_ctrl_proc_start(struct ble_ll_conn_sm *connsm, int ctrl_proc);
+void ble_ll_ctrl_proc_start(struct ble_ll_conn_sm *connsm, int ctrl_proc,
+ void *data);
void ble_ll_ctrl_proc_stop(struct ble_ll_conn_sm *connsm, int ctrl_proc);
int ble_ll_ctrl_rx_pdu(struct ble_ll_conn_sm *connsm, struct os_mbuf *om);
void ble_ll_ctrl_chk_proc_start(struct ble_ll_conn_sm *connsm);
diff --git a/nimble/controller/src/ble_ll_conn.c b/nimble/controller/src/ble_ll_conn.c
index f3e40a2..0243577 100644
--- a/nimble/controller/src/ble_ll_conn.c
+++ b/nimble/controller/src/ble_ll_conn.c
@@ -416,7 +416,7 @@ ble_ll_conn_chk_phy_upd_start(struct ble_ll_conn_sm *csm)
} else {
csm->phy_data.req_pref_tx_phys_mask = csm->phy_data.host_pref_tx_phys_mask;
csm->phy_data.req_pref_rx_phys_mask = csm->phy_data.host_pref_rx_phys_mask;
- ble_ll_ctrl_proc_start(csm, BLE_LL_CTRL_PROC_PHY_UPDATE);
+ ble_ll_ctrl_proc_start(csm, BLE_LL_CTRL_PROC_PHY_UPDATE, NULL);
rc = 0;
}
@@ -1530,7 +1530,7 @@ ble_ll_conn_auth_pyld_timer_cb(struct ble_npl_event *ev)
connsm = (struct ble_ll_conn_sm *)ble_npl_event_get_arg(ev);
ble_ll_auth_pyld_tmo_event_send(connsm);
- ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_LE_PING);
+ ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_LE_PING, NULL);
ble_ll_conn_auth_pyld_timer_start(connsm);
}
@@ -1994,6 +1994,32 @@ ble_ll_conn_get_anchor(struct ble_ll_conn_sm *connsm, uint16_t conn_event,
}
#endif
+#if MYNEWT_VAL(BLE_LL_ROLE_CENTRAL)
+int
+ble_ll_conn_move_anchor(struct ble_ll_conn_sm *connsm, uint16_t offset)
+{
+ struct ble_ll_conn_params cp = { };
+
+ BLE_LL_ASSERT(connsm->conn_role == BLE_LL_CONN_ROLE_CENTRAL);
+
+ if (IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_CONN_PARAM_REQ) ||
+ IS_PENDING_CTRL_PROC(connsm, BLE_LL_CTRL_PROC_CONN_UPDATE)) {
+ return -1;
+ }
+
+ /* Keep parameters, we just want to move anchor */
+ cp.interval_max = connsm->conn_itvl;
+ cp.interval_min = connsm->conn_itvl;
+ cp.latency = connsm->periph_latency;
+ cp.timeout = connsm->supervision_tmo;
+ cp.offset0 = offset;
+
+ ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_CONN_UPDATE, &cp);
+
+ return 0;
+}
+#endif
+
/**
* Called to move to the next connection event.
*
@@ -2363,7 +2389,8 @@ ble_ll_conn_created(struct ble_ll_conn_sm *connsm, struct ble_mbuf_hdr *rxhdr)
* models; for peripheral just assume central will initiate features xchg
* if it has some additional features to use.
*/
- ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_FEATURE_XCHG);
+ ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_FEATURE_XCHG,
+ NULL);
break;
#endif
#if MYNEWT_VAL(BLE_LL_ROLE_PERIPHERAL)
@@ -3542,7 +3569,7 @@ ble_ll_conn_set_global_chanmap(uint8_t num_used_chans, const uint8_t *chanmap)
/* Perform channel map update */
SLIST_FOREACH(connsm, &g_ble_ll_conn_active_list, act_sle) {
if (connsm->conn_role == BLE_LL_CONN_ROLE_CENTRAL) {
- ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_CHAN_MAP_UPD);
+ ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_CHAN_MAP_UPD, NULL);
}
}
#endif
diff --git a/nimble/controller/src/ble_ll_conn_hci.c b/nimble/controller/src/ble_ll_conn_hci.c
index 6664458..cd3deae 100644
--- a/nimble/controller/src/ble_ll_conn_hci.c
+++ b/nimble/controller/src/ble_ll_conn_hci.c
@@ -860,7 +860,7 @@ ble_ll_conn_hci_read_rem_features(const uint8_t *cmdbuf, uint8_t len)
}
#endif
- ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_FEATURE_XCHG);
+ ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_FEATURE_XCHG, NULL);
}
connsm->csmflags.cfbit.pending_hci_rd_features = 1;
@@ -980,7 +980,7 @@ ble_ll_conn_hci_update(const uint8_t *cmdbuf, uint8_t len)
hcu->handle = handle;
/* Start the control procedure */
- ble_ll_ctrl_proc_start(connsm, ctrl_proc);
+ ble_ll_ctrl_proc_start(connsm, ctrl_proc, NULL);
}
return rc;
@@ -1257,7 +1257,7 @@ ble_ll_conn_hci_rd_rem_ver_cmd(const uint8_t *cmdbuf, uint8_t len)
* be queued before the command status.
*/
if (!connsm->csmflags.cfbit.version_ind_sent) {
- ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_VERSION_XCHG);
+ ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_VERSION_XCHG, NULL);
} else {
connsm->pending_ctrl_procs |= (1 << BLE_LL_CTRL_PROC_VERSION_XCHG);
}
@@ -1483,7 +1483,7 @@ ble_ll_conn_hci_le_start_encrypt(const uint8_t *cmdbuf, uint8_t len)
connsm->enc_data.host_rand_num = le64toh(cmd->rand);
connsm->enc_data.enc_div = le16toh(cmd->div);
swap_buf(connsm->enc_data.enc_block.key, cmd->ltk, 16);
- ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_ENCRYPT);
+ ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_ENCRYPT, NULL);
rc = BLE_ERR_SUCCESS;
}
@@ -1633,7 +1633,7 @@ ble_ll_conn_req_peer_sca(const uint8_t *cmdbuf, uint8_t len,
return BLE_ERR_CTLR_BUSY;
}
- ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_SCA_UPDATE);
+ ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_SCA_UPDATE, NULL);
return 0;
}
diff --git a/nimble/controller/src/ble_ll_ctrl.c b/nimble/controller/src/ble_ll_ctrl.c
index 62272d7..a153a57 100644
--- a/nimble/controller/src/ble_ll_ctrl.c
+++ b/nimble/controller/src/ble_ll_ctrl.c
@@ -1960,7 +1960,7 @@ ble_ll_ctrl_initiate_dle(struct ble_ll_conn_sm *connsm)
return;
}
- ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_DATA_LEN_UPD);
+ ble_ll_ctrl_proc_start(connsm, BLE_LL_CTRL_PROC_DATA_LEN_UPD, NULL);
}
static void
@@ -2284,7 +2284,7 @@ ble_ll_ctrl_rx_chanmap_req(struct ble_ll_conn_sm *connsm, uint8_t *dptr)
* @param ctrl_proc
*/
static struct os_mbuf *
-ble_ll_ctrl_proc_init(struct ble_ll_conn_sm *connsm, int ctrl_proc)
+ble_ll_ctrl_proc_init(struct ble_ll_conn_sm *connsm, int ctrl_proc, void *data)
{
uint8_t len;
uint8_t opcode;
@@ -2303,7 +2303,7 @@ ble_ll_ctrl_proc_init(struct ble_ll_conn_sm *connsm, int ctrl_proc)
switch (ctrl_proc) {
case BLE_LL_CTRL_PROC_CONN_UPDATE:
opcode = BLE_LL_CTRL_CONN_UPDATE_IND;
- ble_ll_ctrl_conn_upd_make(connsm, ctrdata, NULL);
+ ble_ll_ctrl_conn_upd_make(connsm, ctrdata, data);
break;
case BLE_LL_CTRL_PROC_CHAN_MAP_UPD:
opcode = BLE_LL_CTRL_CHANNEL_MAP_REQ;
@@ -2452,7 +2452,7 @@ ble_ll_ctrl_terminate_start(struct ble_ll_conn_sm *connsm)
BLE_LL_ASSERT(connsm->disconnect_reason != 0);
ctrl_proc = BLE_LL_CTRL_PROC_TERMINATE;
- om = ble_ll_ctrl_proc_init(connsm, ctrl_proc);
+ om = ble_ll_ctrl_proc_init(connsm, ctrl_proc, NULL);
if (om) {
CONN_F_TERMINATE_STARTED(connsm) = 1;
@@ -2472,7 +2472,8 @@ ble_ll_ctrl_terminate_start(struct ble_ll_conn_sm *connsm)
* @param connsm Pointer to connection state machine.
*/
void
-ble_ll_ctrl_proc_start(struct ble_ll_conn_sm *connsm, int ctrl_proc)
+ble_ll_ctrl_proc_start(struct ble_ll_conn_sm *connsm, int ctrl_proc,
+ void *data)
{
struct os_mbuf *om;
@@ -2481,7 +2482,7 @@ ble_ll_ctrl_proc_start(struct ble_ll_conn_sm *connsm, int ctrl_proc)
om = NULL;
if (connsm->cur_ctrl_proc == BLE_LL_CTRL_PROC_IDLE) {
/* Initiate the control procedure. */
- om = ble_ll_ctrl_proc_init(connsm, ctrl_proc);
+ om = ble_ll_ctrl_proc_init(connsm, ctrl_proc, data);
if (om) {
/* Set the current control procedure */
connsm->cur_ctrl_proc = ctrl_proc;
@@ -2548,7 +2549,7 @@ ble_ll_ctrl_chk_proc_start(struct ble_ll_conn_sm *connsm)
ble_ll_hci_ev_rd_rem_ver(connsm, BLE_ERR_SUCCESS);
CLR_PENDING_CTRL_PROC(connsm, i);
} else {
- ble_ll_ctrl_proc_start(connsm, i);
+ ble_ll_ctrl_proc_start(connsm, i, NULL);
break;
}
}
@@ -2863,7 +2864,7 @@ ll_ctrl_send_rsp:
if (restart_encryption) {
/* XXX: what happens if this fails? Meaning we cant allocate
mbuf? */
- ble_ll_ctrl_proc_init(connsm, BLE_LL_CTRL_PROC_ENCRYPT);
+ ble_ll_ctrl_proc_init(connsm, BLE_LL_CTRL_PROC_ENCRYPT, NULL);
}
#endif
}