]> code.octet-stream.net Git - m17rt/blobdiff - m17app/src/app.rs
Add and test error if packet payload is too large
[m17rt] / m17app / src / app.rs
index 7f17df64a4f5898ba1de7cff2b0b364484f7bc55..0abfab640b51937b9076b45cea922ea43c4e954a 100644 (file)
@@ -1,4 +1,5 @@
 use crate::adapter::{PacketAdapter, StreamAdapter};
+use crate::error::M17Error;
 use crate::link_setup::LinkSetup;
 use crate::tnc::Tnc;
 use crate::{LsfFrame, PacketType, StreamFrame};
@@ -85,11 +86,18 @@ pub struct TxHandle {
 }
 
 impl TxHandle {
-    pub fn transmit_packet(&self, link_setup: &LinkSetup, packet_type: PacketType, payload: &[u8]) {
+    pub fn transmit_packet(
+        &self,
+        link_setup: &LinkSetup,
+        packet_type: PacketType,
+        payload: &[u8],
+    ) -> Result<(), M17Error> {
         let (pack_type, pack_type_len) = packet_type.as_proto();
         if pack_type_len + payload.len() > 823 {
-            // TODO: error for invalid transmission type
-            return;
+            return Err(M17Error::PacketTooLarge {
+                provided: payload.len(),
+                capacity: 823 - pack_type_len,
+            });
         }
         let mut full_payload = vec![];
         full_payload.extend_from_slice(&pack_type[0..pack_type_len]);
@@ -98,6 +106,7 @@ impl TxHandle {
         full_payload.extend_from_slice(&crc.to_be_bytes());
         let kiss_frame = KissFrame::new_full_packet(&link_setup.raw.0, &full_payload).unwrap();
         let _ = self.event_tx.send(TncControlEvent::Kiss(kiss_frame));
+        Ok(())
     }
 
     pub fn transmit_stream_start(&self, link_setup: &LinkSetup) {
@@ -283,3 +292,33 @@ fn spawn_writer<T: Tnc>(mut tnc: T, event_rx: mpsc::Receiver<TncControlEvent>) {
         }
     });
 }
+
+#[cfg(test)]
+mod tests {
+    use crate::{link_setup::M17Address, test_util::NullTnc};
+
+    use super::*;
+
+    #[test]
+    fn packet_payload_len() {
+        let app = M17App::new(NullTnc);
+        let res = app.tx().transmit_packet(
+            &LinkSetup::new_packet(&M17Address::new_broadcast(), &M17Address::new_broadcast()),
+            PacketType::Raw,
+            &[0u8; 100],
+        );
+        assert_eq!(res, Ok(()));
+        let res = app.tx().transmit_packet(
+            &LinkSetup::new_packet(&M17Address::new_broadcast(), &M17Address::new_broadcast()),
+            PacketType::Raw,
+            &[0u8; 900],
+        );
+        assert_eq!(
+            res,
+            Err(M17Error::PacketTooLarge {
+                provided: 900,
+                capacity: 822
+            })
+        );
+    }
+}