net_wire/icmpv6/
message.rs1use super::types::Icmpv6Type;
4use crate::error::ParseError;
5
6pub(super) const HEADER_LENGTH: usize = 4;
7
8#[derive(Clone, Copy, Debug, Eq, PartialEq)]
13pub struct Icmpv6Message<'a> {
14 bytes: &'a [u8],
15}
16
17impl<'a> Icmpv6Message<'a> {
18 #[inline]
20 pub fn parse(bytes: &'a [u8]) -> Result<Self, ParseError> {
21 if bytes.len() < HEADER_LENGTH {
22 return Err(ParseError::Truncated {
23 minimum: HEADER_LENGTH,
24 available: bytes.len(),
25 });
26 }
27 Ok(Self { bytes })
28 }
29
30 #[inline]
32 pub fn message_type(&self) -> Icmpv6Type {
33 Icmpv6Type::new(self.bytes[0])
34 }
35
36 #[inline]
38 pub fn code(&self) -> u8 {
39 self.bytes[1]
40 }
41
42 #[inline]
44 pub fn checksum(&self) -> u16 {
45 u16::from_be_bytes([self.bytes[2], self.bytes[3]])
46 }
47
48 #[inline]
50 pub fn body(&self) -> &'a [u8] {
51 &self.bytes[HEADER_LENGTH..]
52 }
53
54 #[inline]
56 pub fn as_bytes(&self) -> &'a [u8] {
57 self.bytes
58 }
59}
60
61#[derive(Debug, Eq, PartialEq)]
63pub struct Icmpv6MessageMut<'a> {
64 bytes: &'a mut [u8],
65}
66
67impl<'a> Icmpv6MessageMut<'a> {
68 #[inline]
70 pub fn parse(bytes: &'a mut [u8]) -> Result<Self, ParseError> {
71 if bytes.len() < HEADER_LENGTH {
72 return Err(ParseError::Truncated {
73 minimum: HEADER_LENGTH,
74 available: bytes.len(),
75 });
76 }
77 Ok(Self { bytes })
78 }
79
80 pub(crate) fn from_validated(bytes: &'a mut [u8]) -> Self {
81 Self { bytes }
82 }
83
84 #[inline]
86 pub fn message_type(&self) -> Icmpv6Type {
87 Icmpv6Type::new(self.bytes[0])
88 }
89
90 #[inline]
92 pub fn code(&self) -> u8 {
93 self.bytes[1]
94 }
95
96 #[inline]
98 pub fn checksum(&self) -> u16 {
99 u16::from_be_bytes([self.bytes[2], self.bytes[3]])
100 }
101
102 #[inline]
104 pub fn body(&self) -> &[u8] {
105 &self.bytes[HEADER_LENGTH..]
106 }
107
108 #[inline]
110 pub fn body_mut(&mut self) -> &mut [u8] {
111 &mut self.bytes[HEADER_LENGTH..]
112 }
113
114 #[inline]
116 pub fn as_bytes(&self) -> &[u8] {
117 self.bytes
118 }
119
120 #[inline]
122 pub fn as_bytes_mut(&mut self) -> &mut [u8] {
123 self.bytes
124 }
125
126 #[inline]
128 pub fn set_message_type(&mut self, value: Icmpv6Type) {
129 self.bytes[0] = value.raw();
130 }
131
132 #[inline]
134 pub fn set_code(&mut self, value: u8) {
135 self.bytes[1] = value;
136 }
137
138 #[inline]
140 pub fn set_checksum(&mut self, value: u16) {
141 self.bytes[2..4].copy_from_slice(&value.to_be_bytes());
142 }
143}