MYNEWT-698: Unhandled exception in controller in ble_ll_conn_end Not sure what happened but only some of the fix was committed in the prior commit. This is the actual fix for this issue.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/612f8efe Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/612f8efe Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/612f8efe Branch: refs/heads/nrf_cputime Commit: 612f8efe462f27641cc4fd87993f7a3a079ec67b Parents: 3538765 Author: William San Filippo <[email protected]> Authored: Wed Mar 29 21:07:33 2017 -0700 Committer: William San Filippo <[email protected]> Committed: Wed Mar 29 21:07:33 2017 -0700 ---------------------------------------------------------------------- net/nimble/controller/src/ble_ll_conn.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/612f8efe/net/nimble/controller/src/ble_ll_conn.c ---------------------------------------------------------------------- diff --git a/net/nimble/controller/src/ble_ll_conn.c b/net/nimble/controller/src/ble_ll_conn.c index 0ca72d0..171d938 100644 --- a/net/nimble/controller/src/ble_ll_conn.c +++ b/net/nimble/controller/src/ble_ll_conn.c @@ -2396,6 +2396,19 @@ init_rx_isr_exit: rxpdu = ble_ll_rxpdu_alloc(pyld_len + BLE_LL_PDU_HDR_LEN); if (rxpdu == NULL) { ble_phy_disable(); + + /* + * XXX: possible allocate the PDU when we start initiating? + * I cannot say I like this solution, but if we cannot allocate a PDU + * to hand up to the LL, we need to remove the connection we just + * scheduled since the connection state machine will not get processed + * by link layer properly. For now, just remove it from the scheduler + */ + if (CONN_F_CONN_REQ_TXD(connsm) == 1) { + CONN_F_CONN_REQ_TXD(connsm) = 0; + ble_ll_sched_rmv_elem(&connsm->conn_sch); + } + ble_phy_rx(); rc = 0; } else {
