atmos/kernel/
usb_rndis.rs1pub const RNDIS_PACKET_MSG: u32 = 0x0000_0001;
26
27pub const RNDIS_HEADER_MIN: usize = 44;
29
30pub const ETH_MIN_LEN: usize = 14;
32
33#[derive(Debug, PartialEq, Eq, Clone, Copy)]
35pub enum ExtractError {
36 TooShortForHeader { got: usize },
38 NotAPacketMessage { message_type: u32 },
40 DataOutOfRange {
42 abs_offset: usize,
43 data_len: usize,
44 recv_len: usize,
45 },
46 FrameTooShort { got: usize },
48}
49
50pub fn rndis_frame_range(
54 recv_len: usize,
55 message_type: u32,
56 data_offset: u32,
57 data_length: u32,
58) -> Result<(usize, usize), ExtractError> {
59 if recv_len < RNDIS_HEADER_MIN {
60 return Err(ExtractError::TooShortForHeader { got: recv_len });
61 }
62 if message_type != RNDIS_PACKET_MSG {
63 return Err(ExtractError::NotAPacketMessage { message_type });
64 }
65 let abs_offset = 8usize.saturating_add(data_offset as usize);
67 let data_len = data_length as usize;
68 let end = match abs_offset.checked_add(data_len) {
69 Some(e) => e,
70 None => {
71 return Err(ExtractError::DataOutOfRange {
72 abs_offset,
73 data_len,
74 recv_len,
75 })
76 }
77 };
78 if end > recv_len {
79 return Err(ExtractError::DataOutOfRange {
80 abs_offset,
81 data_len,
82 recv_len,
83 });
84 }
85 if data_len < ETH_MIN_LEN {
86 return Err(ExtractError::FrameTooShort { got: data_len });
87 }
88 Ok((abs_offset, end))
89}
90
91pub fn ecm_frame_range(recv_len: usize) -> Result<(usize, usize), ExtractError> {
94 if recv_len < ETH_MIN_LEN {
95 return Err(ExtractError::FrameTooShort { got: recv_len });
96 }
97 Ok((0, recv_len))
98}