aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Lilleengen <[email protected]>2024-12-03 15:13:22 +0100
committerUlf Lilleengen <[email protected]>2024-12-03 15:14:14 +0100
commit6065bc63021224b5d3650ad204b387eb622fd8c6 (patch)
tree8f11f8f41b1c5539fba7da2f43eb6d84ad6281b5
parent4acc0f84b084235b576de3b9e1d12a3472a5274b (diff)
Free tx buffer on ipc send failure
-rw-r--r--embassy-net-nrf91/src/lib.rs12
1 files changed, 9 insertions, 3 deletions
diff --git a/embassy-net-nrf91/src/lib.rs b/embassy-net-nrf91/src/lib.rs
index 80d08f7f5..110d0ff24 100644
--- a/embassy-net-nrf91/src/lib.rs
+++ b/embassy-net-nrf91/src/lib.rs
@@ -507,6 +507,7 @@ impl StateInner {
507 if data.is_empty() { 507 if data.is_empty() {
508 msg.data = ptr::null_mut(); 508 msg.data = ptr::null_mut();
509 msg.data_len = 0; 509 msg.data_len = 0;
510 self.send_message_raw(msg)
510 } else { 511 } else {
511 assert!(data.len() <= TX_BUF_SIZE); 512 assert!(data.len() <= TX_BUF_SIZE);
512 let buf_idx = self.find_free_tx_buf().ok_or(NoFreeBufs)?; 513 let buf_idx = self.find_free_tx_buf().ok_or(NoFreeBufs)?;
@@ -517,10 +518,15 @@ impl StateInner {
517 self.tx_buf_used[buf_idx] = true; 518 self.tx_buf_used[buf_idx] = true;
518 519
519 fence(Ordering::SeqCst); // synchronize copy_nonoverlapping (non-volatile) with volatile writes below. 520 fence(Ordering::SeqCst); // synchronize copy_nonoverlapping (non-volatile) with volatile writes below.
521 if let Err(e) = self.send_message_raw(msg) {
522 msg.data = ptr::null_mut();
523 msg.data_len = 0;
524 self.tx_buf_used[buf_idx] = false;
525 Err(e)
526 } else {
527 Ok(())
528 }
520 } 529 }
521
522 // TODO free data buf if send_message_raw fails.
523 self.send_message_raw(msg)
524 } 530 }
525 531
526 fn send_message_raw(&mut self, msg: &Message) -> Result<(), NoFreeBufs> { 532 fn send_message_raw(&mut self, msg: &Message) -> Result<(), NoFreeBufs> {