summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <dirbaio@dirbaio.net>2021-05-27 02:18:54 +0200
committerDario Nieuwenhuis <dirbaio@dirbaio.net>2021-05-27 02:18:54 +0200
commit79def1f5365952fdc9ccada9754da1592a20aaaa (patch)
treed4c13c07920213b5eca46726db11999b1c8549b2
parent6538f0ec4744407dc12047e23b4f1e24a64d5de7 (diff)
downloadnrf-softdevice-79def1f5365952fdc9ccada9754da1592a20aaaa.zip
Fix crash when rxing and txing simultaneously in l2cap
-rw-r--r--nrf-softdevice/src/ble/l2cap.rs12
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