X-Git-Url: https://code.octet-stream.net/m17rt/blobdiff_plain/bc6fb90d7053082e7aaf261f4da8905c49e9fe01..1b1501ac34de485da9af1e159c7b220e60ff86c0:/m17app/src/app.rs?ds=sidebyside diff --git a/m17app/src/app.rs b/m17app/src/app.rs index ae01976..0abfab6 100644 --- a/m17app/src/app.rs +++ b/m17app/src/app.rs @@ -1,8 +1,10 @@ use crate::adapter::{PacketAdapter, StreamAdapter}; +use crate::error::M17Error; use crate::link_setup::LinkSetup; use crate::tnc::Tnc; +use crate::{LsfFrame, PacketType, StreamFrame}; use m17core::kiss::{KissBuffer, KissCommand, KissFrame}; -use m17core::protocol::{EncryptionType, LsfFrame, PacketType, StreamFrame}; +use m17core::protocol::EncryptionType; use log::debug; use std::collections::HashMap; @@ -84,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]); @@ -97,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) { @@ -282,3 +292,33 @@ fn spawn_writer(mut tnc: T, event_rx: mpsc::Receiver) { } }); } + +#[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 + }) + ); + } +}