diff options
Diffstat (limited to 'src/protocol')
| -rw-r--r-- | src/protocol/ethernet.rs | 15 | ||||
| -rw-r--r-- | src/protocol/grev0.rs | 26 | ||||
| -rw-r--r-- | src/protocol/grev1.rs | 13 | ||||
| -rw-r--r-- | src/protocol/gtpv1.rs | 22 | ||||
| -rw-r--r-- | src/protocol/icmp.rs | 11 | ||||
| -rw-r--r-- | src/protocol/icmpv6.rs | 11 | ||||
| -rw-r--r-- | src/protocol/ipv4.rs | 13 | ||||
| -rw-r--r-- | src/protocol/ipv6.rs | 46 | ||||
| -rw-r--r-- | src/protocol/l2tp.rs | 44 | ||||
| -rw-r--r-- | src/protocol/mod.rs | 3 | ||||
| -rw-r--r-- | src/protocol/ppp.rs | 13 | ||||
| -rw-r--r-- | src/protocol/pppoe.rs | 252 | ||||
| -rw-r--r-- | src/protocol/pptp.rs | 121 | ||||
| -rw-r--r-- | src/protocol/udp.rs | 13 | ||||
| -rw-r--r-- | src/protocol/vlan.rs | 13 |
15 files changed, 490 insertions, 126 deletions
diff --git a/src/protocol/ethernet.rs b/src/protocol/ethernet.rs index d3b9fc0..396dc22 100644 --- a/src/protocol/ethernet.rs +++ b/src/protocol/ethernet.rs @@ -203,11 +203,16 @@ mod tests { assert_eq!(EthHeader::decode(&bytes), Ok((LAST_SLICE, expectation))); // example - let ethernet = EthHeader::decode(&bytes); - if let Ok((payload, header)) = ethernet { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + let result = EthHeader::decode(&bytes); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } + + // assert_eq!(1, 0); } } diff --git a/src/protocol/grev0.rs b/src/protocol/grev0.rs index 8ef5a20..88a43f1 100644 --- a/src/protocol/grev0.rs +++ b/src/protocol/grev0.rs @@ -238,11 +238,16 @@ mod tests { // example let result = GREv0Header::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } + + // assert_eq!(1, 0); } #[test] @@ -325,10 +330,15 @@ mod tests { // example let result = GREv0Header::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } + + // assert_eq!(1, 0); } } diff --git a/src/protocol/grev1.rs b/src/protocol/grev1.rs index a16bab6..ed2d2f2 100644 --- a/src/protocol/grev1.rs +++ b/src/protocol/grev1.rs @@ -177,10 +177,15 @@ mod tests { // example let result = GREv1Header::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } + + // assert_eq!(1, 0); } } diff --git a/src/protocol/gtpv1.rs b/src/protocol/gtpv1.rs index 9acfc0f..bc01b41 100644 --- a/src/protocol/gtpv1.rs +++ b/src/protocol/gtpv1.rs @@ -206,10 +206,13 @@ mod tests { // example let result = GTPv1Header::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -272,10 +275,13 @@ mod tests { // example let result = GTPv1Header::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); diff --git a/src/protocol/icmp.rs b/src/protocol/icmp.rs index fee8749..991a191 100644 --- a/src/protocol/icmp.rs +++ b/src/protocol/icmp.rs @@ -136,10 +136,13 @@ mod tests { // example let result = ICMPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); diff --git a/src/protocol/icmpv6.rs b/src/protocol/icmpv6.rs index 26728f4..9bd58d2 100644 --- a/src/protocol/icmpv6.rs +++ b/src/protocol/icmpv6.rs @@ -170,10 +170,13 @@ mod tests { // example let result = ICMPv6Header::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); diff --git a/src/protocol/ipv4.rs b/src/protocol/ipv4.rs index 61dce29..7606b1e 100644 --- a/src/protocol/ipv4.rs +++ b/src/protocol/ipv4.rs @@ -179,10 +179,15 @@ mod tests { // example let result = IPv4Header::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } + + // assert_eq!(1, 0); } } diff --git a/src/protocol/ipv6.rs b/src/protocol/ipv6.rs index 639c023..8ee78c3 100644 --- a/src/protocol/ipv6.rs +++ b/src/protocol/ipv6.rs @@ -231,11 +231,16 @@ mod tests { // example let result = IPv6Header::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } + + // assert_eq!(1, 0); } #[test] @@ -305,10 +310,13 @@ mod tests { // example let result = IPv6Header::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -378,10 +386,13 @@ mod tests { // example let result = IPv6Header::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -500,10 +511,13 @@ mod tests { // example let result = IPv6Header::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); diff --git a/src/protocol/l2tp.rs b/src/protocol/l2tp.rs index ebed837..90c5ea5 100644 --- a/src/protocol/l2tp.rs +++ b/src/protocol/l2tp.rs @@ -464,10 +464,13 @@ mod tests { // example let result = L2TPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -513,10 +516,13 @@ mod tests { // example let result = L2TPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -565,10 +571,13 @@ mod tests { // example let result = L2TPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -776,10 +785,13 @@ mod tests { // example let result = L2TPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs index 16b9963..db1b38c 100644 --- a/src/protocol/mod.rs +++ b/src/protocol/mod.rs @@ -16,4 +16,5 @@ pub mod l2tp; pub mod grev0; pub mod grev1; pub mod pptp; -pub mod ppp;
\ No newline at end of file +pub mod ppp; +pub mod pppoe;
\ No newline at end of file diff --git a/src/protocol/ppp.rs b/src/protocol/ppp.rs index 558e9a6..97fa0e5 100644 --- a/src/protocol/ppp.rs +++ b/src/protocol/ppp.rs @@ -106,10 +106,15 @@ mod tests { // example let result = PPPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } + + // assert_eq!(1, 0); } } diff --git a/src/protocol/pppoe.rs b/src/protocol/pppoe.rs new file mode 100644 index 0000000..fbd8448 --- /dev/null +++ b/src/protocol/pppoe.rs @@ -0,0 +1,252 @@ +use crate::protocol::codec::Decode; +use crate::protocol::ppp::PPPProtocol; +use nom::bits; +use nom::error::Error; +use nom::number; +use nom::sequence; +use nom::IResult; + +/****************************************************************************** + * Struct + ******************************************************************************/ + +/* + * RFC 2516 - A Method for Transmitting PPP Over Ethernet (PPPoE) + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | VER | TYPE | CODE | SESSION_ID | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | LENGTH | payload ~ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * https://datatracker.ietf.org/doc/html/rfc2516 + * https://info.support.huawei.com/info-finder/encyclopedia/zh/PPPoE.html + */ + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum PPPoECode { + SessionData, // Session Data + PADI, // Active Discovery Initiation + PADO, // Active Discovery Offer + PADR, // Active Discovery Request + PADS, // Active Discovery Session-confirmation + PADT, // Active Discovery Terminate + Other(u8), +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum PPPoETagType { + EndOfList, + ServiceName, + ACName, + HostUniq, + ACcookie, + VendorSpecific, + RelaySessionId, + ServiceNameError, + ACSystemError, + GenericError, + Other(u16), +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PPPoETag { + pub tag_type: PPPoETagType, + pub tag_length: u16, + pub tag_value: Vec<u8>, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum PPPoEStage { + Discovery(Vec<PPPoETag>), + Session(PPPProtocol), +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PPPoEHeader { + pub version: u8, // 4 bits + pub type_: u8, // 4 bits + pub code: PPPoECode, // 8 bits + pub session_id: u16, // 16 bits + pub payload_length: u16, // 16 bits + pub stage: PPPoEStage, +} + +/****************************************************************************** + * API + ******************************************************************************/ + +impl From<u8> for PPPoECode { + fn from(raw: u8) -> Self { + match raw { + 0x00 => PPPoECode::SessionData, + 0x09 => PPPoECode::PADI, + 0x07 => PPPoECode::PADO, + 0x19 => PPPoECode::PADR, + 0x65 => PPPoECode::PADS, + 0xa7 => PPPoECode::PADT, + other => PPPoECode::Other(other), + } + } +} + +impl From<u16> for PPPoETagType { + fn from(raw: u16) -> Self { + match raw { + 0x0000 => PPPoETagType::EndOfList, + 0x0101 => PPPoETagType::ServiceName, + 0x0102 => PPPoETagType::ACName, + 0x0103 => PPPoETagType::HostUniq, + 0x0104 => PPPoETagType::ACcookie, + 0x0105 => PPPoETagType::VendorSpecific, + 0x0110 => PPPoETagType::RelaySessionId, + 0x0201 => PPPoETagType::ServiceNameError, + 0x0202 => PPPoETagType::ACSystemError, + 0x0203 => PPPoETagType::GenericError, + other => PPPoETagType::Other(other), + } + } +} + +fn version_type_decode(input: &[u8]) -> IResult<&[u8], (u8, u8)> { + bits::bits::<_, _, Error<_>, _, _>(sequence::tuple(( + bits::streaming::take(4u8), + bits::streaming::take(4u8), + )))(input) +} + +fn pppoe_tag_decode(input: &[u8]) -> IResult<&[u8], PPPoETag> { + let (input, tag_type) = number::complete::be_u16(input)?; + let (input, tag_length) = number::complete::be_u16(input)?; + let (input, tag_value) = nom::bytes::complete::take(tag_length)(input)?; + Ok(( + input, + PPPoETag { + tag_type: tag_type.into(), + tag_length, + tag_value: tag_value.to_vec(), + }, + )) +} + +fn pppoe_tags_decode(input: &[u8]) -> IResult<&[u8], Vec<PPPoETag>> { + let mut tags = Vec::new(); + let mut remain = input; + loop { + let (input, tag) = pppoe_tag_decode(remain)?; + let tag_type = tag.tag_type; + remain = input; + tags.push(tag); + if remain.is_empty() || tag_type == PPPoETagType::EndOfList { + break; + } + } + Ok((remain, tags)) +} + +impl Decode for PPPoEHeader { + type Iterm = PPPoEHeader; + fn decode(input: &[u8]) -> IResult<&[u8], PPPoEHeader> { + let (input, (version, type_)) = version_type_decode(input)?; + /* + * https://datatracker.ietf.org/doc/html/rfc2516 + * + * The VER field is four bits and MUST be set to 0x1 for this version of the PPPoE specification. + * The TYPE field is four bits and MUST be set to 0x1 for this version of the PPPoE specification. + */ + match (version, type_) { + (0x1, 0x1) => {} + _ => { + return Err(nom::Err::Error(Error::new( + input, + nom::error::ErrorKind::Verify, + ))) + } + } + let (input, code) = number::complete::be_u8(input)?; + let (input, session_id) = number::complete::be_u16(input)?; + let (input, payload_length) = number::complete::be_u16(input)?; + let (input, stage) = match code.into() { + PPPoECode::SessionData => { + let (input, ppp_protocol) = PPPProtocol::decode(input)?; + (input, PPPoEStage::Session(ppp_protocol)) + } + _ => { + let (remain, tags) = pppoe_tags_decode(input)?; + (remain, PPPoEStage::Discovery(tags)) + } + }; + + Ok(( + input, + PPPoEHeader { + version, + type_, + code: code.into(), + session_id, + payload_length, + stage, + }, + )) + } +} + +/****************************************************************************** + * TEST + ******************************************************************************/ + +#[cfg(test)] +mod tests { + use super::PPPoECode; + use super::PPPoEHeader; + use super::PPPoEStage; + use crate::protocol::codec::Decode; + use crate::protocol::ppp::PPPProtocol; + const LAST_SLICE: &'static [u8] = &[0xff]; + + #[test] + fn pppoe_header_decode() { + /* + * PPP-over-Ethernet Session + * 0001 .... = Version: 1 + * .... 0001 = Type: 1 + * Code: Session Data (0x00) + * Session ID: 0xb4bc + * Payload Length: 544 + * Point-to-Point Protocol + * Protocol: Internet Protocol version 4 (0x0021) + */ + + let bytes = [ + 0x11, 0x00, 0xb4, 0xbc, 0x02, 0x20, /* PPPoE */ + 0x00, 0x21, /* PPP */ + 0xff, /* Payload */ + ]; + + let expectation = PPPoEHeader { + version: 1, + type_: 1, + code: PPPoECode::SessionData, + session_id: 0xb4bc, + payload_length: 544, + stage: PPPoEStage::Session(PPPProtocol::IPv4), + }; + + assert_eq!(PPPoEHeader::decode(&bytes), Ok((LAST_SLICE, expectation))); + + // example + let result = PPPoEHeader::decode(&bytes); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } + } + + // assert_eq!(1, 0); + } +} diff --git a/src/protocol/pptp.rs b/src/protocol/pptp.rs index ce8bd58..ed64a26 100644 --- a/src/protocol/pptp.rs +++ b/src/protocol/pptp.rs @@ -204,10 +204,13 @@ mod tests { // example let result = PPTPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -274,10 +277,13 @@ mod tests { // example let result = PPTPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -316,10 +322,13 @@ mod tests { // example let result = PPTPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -358,10 +367,13 @@ mod tests { // example let result = PPTPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -398,10 +410,13 @@ mod tests { // example let result = PPTPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -441,10 +456,13 @@ mod tests { // example let result = PPTPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -516,10 +534,13 @@ mod tests { // example let result = PPTPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -568,10 +589,13 @@ mod tests { // example let result = PPTPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -639,10 +663,13 @@ mod tests { // example let result = PPTPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -704,10 +731,13 @@ mod tests { // example let result = PPTPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); @@ -759,10 +789,13 @@ mod tests { // example let result = PPTPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } // assert_eq!(1, 0); diff --git a/src/protocol/udp.rs b/src/protocol/udp.rs index 625c9e9..1d7b43b 100644 --- a/src/protocol/udp.rs +++ b/src/protocol/udp.rs @@ -100,10 +100,15 @@ mod tests { // example let result = UDPHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } + + // assert_eq!(1, 0); } } diff --git a/src/protocol/vlan.rs b/src/protocol/vlan.rs index 17a82e1..6a1dbe0 100644 --- a/src/protocol/vlan.rs +++ b/src/protocol/vlan.rs @@ -84,10 +84,15 @@ mod tests { // example let result = VLANHeader::decode(&bytes); - if let Ok((payload, header)) = result { - println!("return: {:?}, payload: {}", header, payload.len()); - } else { - println!("return: Incomplete data"); + match result { + Ok((payload, header)) => { + println!("OK: {:?}, payload: {}", header, payload.len()); + } + Err(e) => { + println!("ERR: {:?}", e); + } } + + // assert_eq!(1, 0); } } |
