diff options
author | Dario Nieuwenhuis <dirbaio@dirbaio.net> | 2021-05-27 02:18:54 +0200 |
---|---|---|
committer | Dario Nieuwenhuis <dirbaio@dirbaio.net> | 2021-05-27 02:18:54 +0200 |
commit | 79def1f5365952fdc9ccada9754da1592a20aaaa (patch) | |
tree | d4c13c07920213b5eca46726db11999b1c8549b2 | |
parent | 6538f0ec4744407dc12047e23b4f1e24a64d5de7 (diff) | |
download | nrf-softdevice-79def1f5365952fdc9ccada9754da1592a20aaaa.zip |
Fix crash when rxing and txing simultaneously in l2cap
-rw-r--r-- | nrf-softdevice/src/ble/l2cap.rs | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/nrf-softdevice/src/ble/l2cap.rs b/nrf-softdevice/src/ble/l2cap.rs index b5bf219..dc64b34 100644 --- a/nrf-softdevice/src/ble/l2cap.rs +++ b/nrf-softdevice/src/ble/l2cap.rs @@ -378,10 +378,12 @@ impl<P: Packet> Channel<P> { } portal(conn_handle) - .wait_once(|ble_evt| unsafe { + .wait_many(|ble_evt| unsafe { match (*ble_evt).header.evt_id as u32 { - raw::BLE_GAP_EVTS_BLE_GAP_EVT_DISCONNECTED => Err(RxError::Disconnected), - raw::BLE_L2CAP_EVTS_BLE_L2CAP_EVT_CH_RELEASED => Err(RxError::Disconnected), + raw::BLE_GAP_EVTS_BLE_GAP_EVT_DISCONNECTED => Some(Err(RxError::Disconnected)), + raw::BLE_L2CAP_EVTS_BLE_L2CAP_EVT_CH_RELEASED => { + Some(Err(RxError::Disconnected)) + } raw::BLE_L2CAP_EVTS_BLE_L2CAP_EVT_CH_RX => { let l2cap_evt = get_union_field(ble_evt, &(*ble_evt).evt.l2cap_evt); let evt = &l2cap_evt.params.rx; @@ -389,9 +391,9 @@ impl<P: Packet> Channel<P> { let ptr = unwrap!(NonNull::new(evt.sdu_buf.p_data)); let len = evt.sdu_len; let pkt = Packet::from_raw_parts(ptr, len as usize); - Ok(pkt) + Some(Ok(pkt)) } - _ => unreachable!(), + _ => None, } }) .await |