1use super::arp::ArpHeader;
111use super::detect::{
112 detect_gre_variant, detect_mpls_inner_protocol, detect_udp_tunnel, find_ipv6_upper_protocol,
113 is_stt_port, NextLayer, TunnelType,
114};
115use super::ether::EtherHeader;
116pub use super::header::{Header, UnknownProto};
118use super::icmp::IcmpHeader;
119use super::icmp6::Icmp6Header;
120use super::ipv4::Ipv4Header;
121use super::ipv6::Ipv6Header;
122use super::null::NullHeader;
123use super::protocol::{EtherProto, IpProto};
124use super::sctp::SctpHeader;
125use super::sll::{SllHeader, Sllv2Header};
126use super::tcp::TcpHeader;
127use super::tunnel::geneve::GeneveHeader;
128use super::tunnel::gre::GreHeader;
129use super::tunnel::gtpv1::Gtpv1Header;
130use super::tunnel::gtpv2::Gtpv2Header;
131use super::tunnel::ipip::IpipTunnel;
132use super::tunnel::l2tp::{L2tpv2Header, L2tpv3SessionHeader};
133use super::tunnel::mpls::MplsLabelStack;
134use super::tunnel::nvgre::NvgreHeader;
135use super::tunnel::pbb::PbbHeader;
136use super::tunnel::pptp::PptpGreHeader;
137use super::tunnel::stt::SttPacket;
138use super::tunnel::teredo::TeredoPacket;
139use super::tunnel::vxlan::VxlanHeader;
140use super::udp::UdpHeader;
141use super::{HeaderParser, PacketHeaderError};
142
143#[derive(Debug, Clone, Copy, PartialEq, Eq)]
147pub enum LinkType {
148 Ethernet,
150 Sll,
152 Sllv2,
154 Null,
156 RawIpv4,
158 RawIpv6,
160}
161
162pub struct PacketIter<'a> {
167 remaining: &'a [u8],
169 next_layer: NextLayer,
171 done: bool,
173 last_udp_ports: Option<(u16, u16)>,
175}
176
177impl<'a> PacketIter<'a> {
178 pub fn new(buf: &'a [u8], link_type: LinkType) -> Self {
194 Self {
195 remaining: buf,
196 next_layer: NextLayer::Link(link_type),
197 done: false,
198 last_udp_ports: None,
199 }
200 }
201
202 #[inline]
211 pub fn guess_link_type(buf: &[u8]) -> LinkType {
212 if buf.is_empty() {
214 return LinkType::Ethernet;
215 }
216
217 let first_byte = buf[0];
221 let version = first_byte >> 4;
222
223 if version == 4 {
224 let ihl = first_byte & 0x0F;
226 if (5..=15).contains(&ihl) {
227 return LinkType::RawIpv4;
228 }
229 } else if version == 6 {
230 return LinkType::RawIpv6;
232 }
233
234 if buf.len() >= 4 {
236 let le_val = u32::from_le_bytes([buf[0], buf[1], buf[2], buf[3]]);
237 let be_val = u32::from_be_bytes([buf[0], buf[1], buf[2], buf[3]]);
238
239 let is_valid_af = |v: u32| matches!(v, 2 | 10 | 24 | 28 | 30);
241
242 if is_valid_af(le_val) || is_valid_af(be_val) {
243 if buf.len() >= 5 {
245 let next_version = buf[4] >> 4;
246 if next_version == 4 || next_version == 6 {
247 return LinkType::Null;
248 }
249 }
250 }
251 }
252
253 if buf.len() >= 14 {
255 let ether_type = u16::from_be_bytes([buf[12], buf[13]]);
256
257 match ether_type {
260 0x0800 | 0x86DD | 0x0806 | 0x8100 | 0x88A8 | 0x8847 | 0x8848 | 0x8863 | 0x8864 => {
261 return LinkType::Ethernet;
262 }
263 _ => {}
264 }
265 }
266
267 if buf.len() >= 16 {
269 let packet_type = u16::from_be_bytes([buf[0], buf[1]]);
270 let protocol = u16::from_be_bytes([buf[14], buf[15]]);
271
272 if packet_type <= 4 {
275 match protocol {
276 0x0800 | 0x86DD | 0x0806 | 0x8100 => {
277 return LinkType::Sll;
278 }
279 _ => {}
280 }
281 }
282 }
283
284 if buf.len() >= 20 {
286 let protocol = u16::from_be_bytes([buf[0], buf[1]]);
287 let packet_type = buf[10]; if packet_type <= 4 {
290 match protocol {
291 0x0800 | 0x86DD | 0x0806 | 0x8100 => {
292 return LinkType::Sllv2;
293 }
294 _ => {}
295 }
296 }
297 }
298
299 LinkType::Ethernet
301 }
302
303 pub fn from_network_layer(buf: &'a [u8], ether_proto: EtherProto) -> Self {
313 Self {
314 remaining: buf,
315 next_layer: NextLayer::Network(ether_proto),
316 done: false,
317 last_udp_ports: None,
318 }
319 }
320
321 pub fn from_transport_layer(buf: &'a [u8], ip_proto: IpProto) -> Self {
331 Self {
332 remaining: buf,
333 next_layer: NextLayer::Transport(ip_proto),
334 done: false,
335 last_udp_ports: None,
336 }
337 }
338
339 pub fn remaining(&self) -> &'a [u8] {
343 self.remaining
344 }
345
346 pub fn is_done(&self) -> bool {
348 self.done
349 }
350
351 fn parse_link(&mut self, link_type: LinkType) -> Option<Result<Header<'a>, PacketHeaderError>> {
353 match link_type {
354 LinkType::Ethernet => match EtherHeader::from_bytes(self.remaining) {
355 Ok((eth, rest)) => {
356 let next_proto = eth.inner_type();
357 self.remaining = rest;
358 self.next_layer = NextLayer::Network(next_proto);
359 Some(Ok(Header::Ethernet(eth)))
360 }
361 Err(e) => {
362 self.done = true;
363 Some(Err(e))
364 }
365 },
366 LinkType::Sll => match SllHeader::from_bytes(self.remaining) {
367 Ok((sll, rest)) => {
368 let next_proto = sll.protocol();
369 self.remaining = rest;
370 self.next_layer = NextLayer::Network(next_proto);
371 Some(Ok(Header::Sll(sll)))
372 }
373 Err(e) => {
374 self.done = true;
375 Some(Err(e))
376 }
377 },
378 LinkType::Sllv2 => match Sllv2Header::from_bytes(self.remaining) {
379 Ok((sll, rest)) => {
380 let next_proto = sll.protocol();
381 self.remaining = rest;
382 self.next_layer = NextLayer::Network(next_proto);
383 Some(Ok(Header::Sllv2(sll)))
384 }
385 Err(e) => {
386 self.done = true;
387 Some(Err(e))
388 }
389 },
390 LinkType::Null => match NullHeader::from_bytes(self.remaining) {
391 Ok((null, rest)) => {
392 let next_proto = null.protocol();
393 self.remaining = rest;
394 self.next_layer = NextLayer::Network(next_proto);
395 Some(Ok(Header::Null(null)))
396 }
397 Err(e) => {
398 self.done = true;
399 Some(Err(e))
400 }
401 },
402 LinkType::RawIpv4 => {
403 self.next_layer = NextLayer::Network(EtherProto::IPV4);
404 self.next()
405 }
406 LinkType::RawIpv6 => {
407 self.next_layer = NextLayer::Network(EtherProto::IPV6);
408 self.next()
409 }
410 }
411 }
412
413 fn parse_network(
415 &mut self,
416 ether_proto: EtherProto,
417 ) -> Option<Result<Header<'a>, PacketHeaderError>> {
418 match ether_proto {
419 EtherProto::IPV4 => match Ipv4Header::from_bytes(self.remaining) {
420 Ok((ipv4, rest)) => {
421 let proto = ipv4.protocol();
422 self.remaining = rest;
423 if proto != IpProto::IP_ENCAP && proto != IpProto::IPV6 {
425 self.next_layer = NextLayer::Transport(proto);
426 Some(Ok(Header::Ipv4(ipv4)))
427 } else if proto == IpProto::IP_ENCAP {
428 self.next_layer = NextLayer::Network(EtherProto::IPV4);
430 Some(Ok(Header::Ipip(IpipTunnel::ipip(ipv4))))
431 } else {
432 self.next_layer = NextLayer::Network(EtherProto::IPV6);
434 Some(Ok(Header::Ipip(IpipTunnel::sit(ipv4))))
435 }
436 }
437 Err(e) => {
438 self.done = true;
439 Some(Err(e))
440 }
441 },
442 EtherProto::IPV6 => match Ipv6Header::from_bytes(self.remaining) {
443 Ok((ipv6, rest)) => {
444 let next_proto = if ipv6.raw_extensions.is_empty() {
447 ipv6.next_header()
448 } else {
449 find_ipv6_upper_protocol(&ipv6)
450 };
451 self.remaining = rest;
452 if next_proto != IpProto::IP_ENCAP && next_proto != IpProto::IPV6 {
454 self.next_layer = NextLayer::Transport(next_proto);
455 Some(Ok(Header::Ipv6(ipv6)))
456 } else if next_proto == IpProto::IP_ENCAP {
457 self.next_layer = NextLayer::Network(EtherProto::IPV4);
459 Some(Ok(Header::Ipip(IpipTunnel::ip4in6(ipv6))))
460 } else {
461 self.next_layer = NextLayer::Network(EtherProto::IPV6);
463 Some(Ok(Header::Ipip(IpipTunnel::ip6tnl(ipv6))))
464 }
465 }
466 Err(e) => {
467 self.done = true;
468 Some(Err(e))
469 }
470 },
471 EtherProto::ARP => match ArpHeader::from_bytes(self.remaining) {
472 Ok((arp, rest)) => {
473 self.remaining = rest;
474 self.next_layer = NextLayer::Done;
475 Some(Ok(Header::Arp(arp)))
476 }
477 Err(e) => {
478 self.done = true;
479 Some(Err(e))
480 }
481 },
482 EtherProto::MPLS_UC | EtherProto::MPLS_MC => {
483 self.next_layer = NextLayer::Tunnel(TunnelType::Mpls);
485 self.next()
486 }
487 EtherProto::TEB => {
488 self.next_layer = NextLayer::Link(LinkType::Ethernet);
490 self.next()
491 }
492 EtherProto::VLAN_8021AH | EtherProto::VLAN_8021AD => {
493 self.next_layer = NextLayer::Tunnel(TunnelType::Pbb);
496 self.next()
497 }
498 _ => {
499 let header = Header::Unknown {
501 proto: UnknownProto::Ether(ether_proto),
502 data: self.remaining,
503 };
504 self.remaining = &[];
505 self.done = true;
506 Some(Ok(header))
507 }
508 }
509 }
510
511 fn parse_transport(
513 &mut self,
514 ip_proto: IpProto,
515 ) -> Option<Result<Header<'a>, PacketHeaderError>> {
516 match ip_proto {
517 IpProto::TCP => match TcpHeader::from_bytes(self.remaining) {
518 Ok((tcp, rest)) => {
519 let src_port = tcp.src_port();
520 let dst_port = tcp.dst_port();
521
522 if is_stt_port(dst_port) || is_stt_port(src_port) {
524 self.next_layer = NextLayer::Tunnel(TunnelType::Stt);
525 } else {
526 self.next_layer = NextLayer::Done;
527 }
528
529 self.remaining = rest;
530 Some(Ok(Header::Tcp(tcp)))
531 }
532 Err(e) => {
533 self.done = true;
534 Some(Err(e))
535 }
536 },
537 IpProto::UDP => match UdpHeader::from_bytes(self.remaining) {
538 Ok((udp, rest)) => {
539 let src_port = udp.src_port();
540 let dst_port = udp.dst_port();
541 self.last_udp_ports = Some((src_port, dst_port));
542
543 if let Some(tunnel_type) = detect_udp_tunnel(src_port, dst_port, rest) {
545 self.remaining = rest;
546 self.next_layer = NextLayer::Tunnel(tunnel_type);
547 } else {
548 self.remaining = rest;
549 self.next_layer = NextLayer::Done;
550 }
551 Some(Ok(Header::Udp(udp)))
552 }
553 Err(e) => {
554 self.done = true;
555 Some(Err(e))
556 }
557 },
558 IpProto::SCTP => match SctpHeader::from_bytes(self.remaining) {
559 Ok((sctp, rest)) => {
560 self.remaining = rest;
561 self.next_layer = NextLayer::Done;
562 Some(Ok(Header::Sctp(sctp)))
563 }
564 Err(e) => {
565 self.done = true;
566 Some(Err(e))
567 }
568 },
569 IpProto::ICMP => match IcmpHeader::from_bytes(self.remaining) {
570 Ok((icmp, rest)) => {
571 self.remaining = rest;
572 self.next_layer = NextLayer::Done;
573 Some(Ok(Header::Icmp(icmp)))
574 }
575 Err(e) => {
576 self.done = true;
577 Some(Err(e))
578 }
579 },
580 IpProto::IPV6_ICMP => match Icmp6Header::from_bytes(self.remaining) {
581 Ok((icmp6, rest)) => {
582 self.remaining = rest;
583 self.next_layer = NextLayer::Done;
584 Some(Ok(Header::Icmp6(icmp6)))
585 }
586 Err(e) => {
587 self.done = true;
588 Some(Err(e))
589 }
590 },
591 IpProto::GRE => {
592 let tunnel_type = detect_gre_variant(self.remaining);
594 self.next_layer = NextLayer::Tunnel(tunnel_type);
595 self.next()
596 }
597 IpProto::L2TP => {
598 self.next_layer = NextLayer::Tunnel(TunnelType::L2tpv3);
600 self.next()
601 }
602
603 IpProto::IPV6_NONXT => {
604 self.next_layer = NextLayer::Done;
606 self.done = true;
607 None
608 }
609 _ => {
610 let header = Header::Unknown {
612 proto: UnknownProto::Ip(ip_proto),
613 data: self.remaining,
614 };
615 self.remaining = &[];
616 self.done = true;
617 Some(Ok(header))
618 }
619 }
620 }
621
622 fn parse_tunnel(
624 &mut self,
625 tunnel_type: TunnelType,
626 ) -> Option<Result<Header<'a>, PacketHeaderError>> {
627 match tunnel_type {
628 TunnelType::Vxlan => match VxlanHeader::from_bytes(self.remaining) {
629 Ok((vxlan, rest)) => {
630 self.remaining = rest;
631 self.next_layer = NextLayer::Link(LinkType::Ethernet);
633 Some(Ok(Header::Vxlan(vxlan)))
634 }
635 Err(e) => {
636 self.done = true;
637 Some(Err(e))
638 }
639 },
640 TunnelType::Geneve => match GeneveHeader::from_bytes(self.remaining) {
641 Ok((geneve, rest)) => {
642 let inner_proto = geneve.protocol_type();
644 self.remaining = rest;
645 self.next_layer = NextLayer::Network(inner_proto);
646 Some(Ok(Header::Geneve(geneve)))
647 }
648 Err(e) => {
649 self.done = true;
650 Some(Err(e))
651 }
652 },
653 TunnelType::Gre => match GreHeader::from_bytes(self.remaining) {
654 Ok((gre, rest)) => {
655 let inner_proto = gre.protocol_type();
656 self.remaining = rest;
657
658 if inner_proto == EtherProto::TEB {
660 self.next_layer = NextLayer::Link(LinkType::Ethernet);
661 } else {
662 self.next_layer = NextLayer::Network(inner_proto);
663 }
664 Some(Ok(Header::Gre(gre)))
665 }
666 Err(e) => {
667 self.done = true;
668 Some(Err(e))
669 }
670 },
671 TunnelType::Mpls => {
672 match MplsLabelStack::parse(self.remaining) {
674 Some((mpls_stack, payload)) => {
675 self.remaining = payload;
676
677 if let Some(next) = detect_mpls_inner_protocol(payload) {
679 self.next_layer = next;
680 } else {
681 self.next_layer = NextLayer::Done;
682 }
683 Some(Ok(Header::Mpls(mpls_stack)))
684 }
685 None => {
686 self.done = true;
687 Some(Err(PacketHeaderError::TooShort("MPLS")))
688 }
689 }
690 }
691 TunnelType::Teredo => {
692 match TeredoPacket::parse(self.remaining) {
694 Ok(teredo) => {
695 self.remaining = teredo.ipv6_payload();
697 self.next_layer = NextLayer::Network(EtherProto::IPV6);
698 Some(Ok(Header::Teredo(Box::new(teredo))))
699 }
700 Err(e) => {
701 self.done = true;
702 Some(Err(e))
703 }
704 }
705 }
706 TunnelType::Gtpv1 => match Gtpv1Header::from_bytes(self.remaining) {
707 Ok((gtpv1, rest)) => {
708 self.remaining = rest;
709
710 if gtpv1.is_gpdu() && !rest.is_empty() {
712 let version = (rest[0] & 0xF0) >> 4;
714 match version {
715 4 => self.next_layer = NextLayer::Network(EtherProto::IPV4),
716 6 => self.next_layer = NextLayer::Network(EtherProto::IPV6),
717 _ => self.next_layer = NextLayer::Done,
718 }
719 } else {
720 self.next_layer = NextLayer::Done;
722 }
723 Some(Ok(Header::Gtpv1(gtpv1)))
724 }
725 Err(e) => {
726 self.done = true;
727 Some(Err(e))
728 }
729 },
730 TunnelType::Gtpv2 => match Gtpv2Header::from_bytes(self.remaining) {
731 Ok((gtpv2, rest)) => {
732 self.remaining = rest;
733 self.next_layer = NextLayer::Done;
735 Some(Ok(Header::Gtpv2(gtpv2)))
736 }
737 Err(e) => {
738 self.done = true;
739 Some(Err(e))
740 }
741 },
742 TunnelType::L2tpv2 => match L2tpv2Header::from_bytes(self.remaining) {
743 Ok((l2tpv2, rest)) => {
744 self.remaining = rest;
745 self.next_layer = NextLayer::Done;
749 Some(Ok(Header::L2tpv2(l2tpv2)))
750 }
751 Err(e) => {
752 self.done = true;
753 Some(Err(e))
754 }
755 },
756 TunnelType::L2tpv3 => {
757 match L2tpv3SessionHeader::parse_with_cookie_len(self.remaining, 0) {
760 Ok((l2tpv3, rest)) => {
761 self.remaining = rest;
762 if !rest.is_empty() {
765 let first_byte = rest[0];
767 if first_byte == 0x00 || (first_byte & 0xF0) == 0x00 {
768 self.next_layer = NextLayer::Link(LinkType::Ethernet);
770 } else {
771 self.next_layer = NextLayer::Done;
772 }
773 } else {
774 self.next_layer = NextLayer::Done;
775 }
776 Some(Ok(Header::L2tpv3(l2tpv3)))
777 }
778 Err(e) => {
779 self.done = true;
780 Some(Err(e))
781 }
782 }
783 }
784 TunnelType::Nvgre => match NvgreHeader::from_bytes(self.remaining) {
785 Ok((nvgre, rest)) => {
786 self.remaining = rest;
787 self.next_layer = NextLayer::Link(LinkType::Ethernet);
789 Some(Ok(Header::Nvgre(nvgre)))
790 }
791 Err(e) => {
792 self.done = true;
793 Some(Err(e))
794 }
795 },
796 TunnelType::Pbb => {
797 match PbbHeader::parse(self.remaining) {
799 Ok((pbb, rest)) => {
800 self.remaining = rest;
801 self.next_layer = NextLayer::Link(LinkType::Ethernet);
803 Some(Ok(Header::Pbb(pbb)))
804 }
805 Err(e) => {
806 self.done = true;
807 Some(Err(e))
808 }
809 }
810 }
811 TunnelType::Stt => {
812 match SttPacket::parse(self.remaining) {
814 Some(stt) => {
815 self.remaining = stt.payload;
816 self.next_layer = NextLayer::Link(LinkType::Ethernet);
818 Some(Ok(Header::Stt(stt)))
819 }
820 None => {
821 self.done = true;
822 Some(Err(PacketHeaderError::TooShort("STT")))
823 }
824 }
825 }
826 TunnelType::Pptp => match PptpGreHeader::from_bytes(self.remaining) {
827 Ok((pptp, rest)) => {
828 self.remaining = rest;
829 self.next_layer = NextLayer::Done;
832 Some(Ok(Header::Pptp(pptp)))
833 }
834 Err(e) => {
835 self.done = true;
836 Some(Err(e))
837 }
838 },
839 }
840 }
841}
842
843impl<'a> Iterator for PacketIter<'a> {
844 type Item = Result<Header<'a>, PacketHeaderError>;
845
846 #[inline(always)]
847 fn next(&mut self) -> Option<Self::Item> {
848 if self.done {
849 return None;
850 }
851
852 if self.remaining.is_empty() {
853 self.done = true;
854 return None;
855 }
856
857 match self.next_layer {
858 NextLayer::Link(link_type) => self.parse_link(link_type),
859 NextLayer::Network(ether_proto) => self.parse_network(ether_proto),
860 NextLayer::Transport(ip_proto) => self.parse_transport(ip_proto),
861 NextLayer::Tunnel(tunnel_type) => self.parse_tunnel(tunnel_type),
862 NextLayer::Done => {
863 self.done = true;
864 None
865 }
866 }
867 }
868}
869
870pub trait PacketIterExt {
872 fn headers(&self, link_type: LinkType) -> PacketIter<'_>;
874}
875
876impl PacketIterExt for [u8] {
877 fn headers(&self, link_type: LinkType) -> PacketIter<'_> {
878 PacketIter::new(self, link_type)
879 }
880}
881
882pub fn collect_headers(
907 buf: &[u8],
908 link_type: LinkType,
909) -> Result<Vec<Header<'_>>, PacketHeaderError> {
910 let mut headers = Vec::new();
911 for result in PacketIter::new(buf, link_type) {
912 headers.push(result?);
913 }
914 Ok(headers)
915}
916
917#[cfg(test)]
918mod tests {
919 use super::*;
920 use std::mem::size_of;
921
922 #[test]
923 fn test_structure_sizes() {
924 use crate::packet::arp::ArpHeaderFull;
925 use crate::packet::ether::EtherHeaderVlan;
926 use crate::packet::ipv4::Ipv4HeaderOpt;
927 use crate::packet::ipv6::Ipv6HeaderExt;
928 use crate::packet::tcp::TcpHeaderOpt;
929 use crate::packet::tunnel::geneve::GeneveHeaderOpt;
930 use crate::packet::tunnel::gre::GreHeaderOpt;
931 use crate::packet::tunnel::gtpv1::Gtpv1HeaderOpt;
932 use crate::packet::tunnel::gtpv2::Gtpv2HeaderOpt;
933 use crate::packet::tunnel::ipip::IpipTunnel;
934 use crate::packet::tunnel::l2tp::{L2tpv2HeaderOpt, L2tpv3SessionHeaderCookie};
935 use crate::packet::tunnel::mpls::MplsLabelStack;
936 use crate::packet::tunnel::pbb::PbbHeader;
937 use crate::packet::tunnel::pptp::PptpGreHeaderOpt;
938 use crate::packet::tunnel::stt::SttPacket;
939 use crate::packet::tunnel::teredo::TeredoPacket;
940
941 println!("\n=== Structure Sizes ===");
942 println!("PacketIter: {} bytes", size_of::<PacketIter>());
943 println!("NextLayer: {} bytes", size_of::<NextLayer>());
944 println!("TunnelType: {} bytes", size_of::<TunnelType>());
945 println!("Header: {} bytes", size_of::<Header>());
946 println!(
947 "Option<Result<Header, PacketHeaderError>>: {} bytes",
948 size_of::<Option<Result<Header, crate::packet::PacketHeaderError>>>()
949 );
950 println!("&[u8]: {} bytes", size_of::<&[u8]>());
951 println!("EtherProto: {} bytes", size_of::<EtherProto>());
952 println!("IpProto: {} bytes", size_of::<IpProto>());
953
954 println!("\n=== Potential Optimization ===");
955 println!(
956 "Box<TeredoPacket>: {} bytes",
957 size_of::<Box<TeredoPacket>>()
958 );
959 println!("Box<IpipTunnel>: {} bytes", size_of::<Box<IpipTunnel>>());
960 println!("If we Box Teredo, Header would be ~40 bytes (IpipTunnel is largest)");
961 println!("If we Box both Teredo and IpipTunnel, Header would be ~32 bytes (MplsLabelStack/EtherHeaderVlan)");
962
963 println!("\n=== Header Variant Inner Types (sorted by size) ===");
964 println!("\n=== Header Variant Inner Types (sorted by size) ===");
965 println!(
966 "TeredoPacket: {} bytes <-- LARGEST, causes Header to be 104 bytes!",
967 size_of::<TeredoPacket>()
968 );
969 println!(
970 "IpipTunnel: {} bytes <-- second largest",
971 size_of::<IpipTunnel>()
972 );
973 println!("SttPacket: {} bytes", size_of::<SttPacket>());
974 println!("MplsLabelStack: {} bytes", size_of::<MplsLabelStack>());
975 println!("EtherHeaderVlan: {} bytes", size_of::<EtherHeaderVlan>());
976 println!("Ipv4HeaderOpt: {} bytes", size_of::<Ipv4HeaderOpt>());
977 println!("Ipv6HeaderExt: {} bytes", size_of::<Ipv6HeaderExt>());
978 println!("ArpHeaderFull: {} bytes", size_of::<ArpHeaderFull>());
979 println!("TcpHeaderOpt: {} bytes", size_of::<TcpHeaderOpt>());
980 println!("GeneveHeaderOpt: {} bytes", size_of::<GeneveHeaderOpt>());
981 println!("GreHeaderOpt: {} bytes", size_of::<GreHeaderOpt>());
982 println!("Gtpv1HeaderOpt: {} bytes", size_of::<Gtpv1HeaderOpt>());
983 println!("Gtpv2HeaderOpt: {} bytes", size_of::<Gtpv2HeaderOpt>());
984 println!("L2tpv2HeaderOpt: {} bytes", size_of::<L2tpv2HeaderOpt>());
985 println!(
986 "L2tpv3SessionHeaderCookie: {} bytes",
987 size_of::<L2tpv3SessionHeaderCookie>()
988 );
989 println!("PptpGreHeaderOpt: {} bytes", size_of::<PptpGreHeaderOpt>());
990 println!("PbbHeader: {} bytes", size_of::<PbbHeader>());
991
992 println!("\n=== Summary ===");
993 println!(
994 "Current Header size: {} bytes (dominated by TeredoPacket)",
995 size_of::<Header>()
996 );
997 println!("Most common headers (Ethernet+IPv4+TCP) are only 24-32 bytes each");
998 println!(
999 "Every iteration copies {} bytes even for simple TCP packets!",
1000 size_of::<Header>()
1001 );
1002 println!("========================\n");
1003 }
1004
1005 fn create_eth_ipv4_tcp_packet() -> Vec<u8> {
1007 let mut packet = Vec::new();
1008
1009 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&40u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(6); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[192, 168, 1, 1]); packet.extend_from_slice(&[192, 168, 1, 2]); packet.extend_from_slice(&80u16.to_be_bytes()); packet.extend_from_slice(&443u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00, 0x00, 0x01]); packet.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); packet.push(0x50); packet.push(0x02); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet
1038 }
1039
1040 fn create_eth_ipv4_udp_packet() -> Vec<u8> {
1042 let mut packet = Vec::new();
1043
1044 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&28u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(17); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[10, 0, 0, 1]); packet.extend_from_slice(&[10, 0, 0, 2]); packet.extend_from_slice(&53u16.to_be_bytes()); packet.extend_from_slice(&53u16.to_be_bytes()); packet.extend_from_slice(&8u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet
1068 }
1069
1070 fn create_eth_arp_packet() -> Vec<u8> {
1072 let mut packet = Vec::new();
1073
1074 packet.extend_from_slice(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff]); packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x08, 0x06]); packet.extend_from_slice(&1u16.to_be_bytes()); packet.extend_from_slice(&0x0800u16.to_be_bytes()); packet.push(6); packet.push(4); packet.extend_from_slice(&1u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]);
1088 packet.extend_from_slice(&[192, 168, 1, 1]);
1090 packet.extend_from_slice(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
1092 packet.extend_from_slice(&[192, 168, 1, 2]);
1094
1095 packet
1096 }
1097
1098 #[test]
1099 fn test_eth_ipv4_tcp_iteration() {
1100 let packet = create_eth_ipv4_tcp_packet();
1101 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1102
1103 let header = iter.next().unwrap().unwrap();
1105 assert!(matches!(header, Header::Ethernet(_)));
1106 assert_eq!(header.name(), "Ethernet");
1107 assert!(header.is_link_layer());
1108
1109 let header = iter.next().unwrap().unwrap();
1111 assert!(matches!(header, Header::Ipv4(_)));
1112 assert_eq!(header.name(), "IPv4");
1113 assert!(header.is_network_layer());
1114
1115 let header = iter.next().unwrap().unwrap();
1117 assert!(matches!(header, Header::Tcp(_)));
1118 assert_eq!(header.name(), "TCP");
1119 assert!(header.is_transport_layer());
1120
1121 assert!(iter.next().is_none());
1123 assert!(iter.is_done());
1124 }
1125
1126 #[test]
1127 fn test_eth_ipv4_udp_iteration() {
1128 let packet = create_eth_ipv4_udp_packet();
1129 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1130
1131 let header = iter.next().unwrap().unwrap();
1133 assert!(matches!(header, Header::Ethernet(_)));
1134
1135 let header = iter.next().unwrap().unwrap();
1137 assert!(matches!(header, Header::Ipv4(_)));
1138
1139 let header = iter.next().unwrap().unwrap();
1141 assert!(matches!(header, Header::Udp(_)));
1142
1143 assert!(iter.next().is_none());
1145 }
1146
1147 #[test]
1148 fn test_eth_arp_iteration() {
1149 let packet = create_eth_arp_packet();
1150 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1151
1152 let header = iter.next().unwrap().unwrap();
1154 assert!(matches!(header, Header::Ethernet(_)));
1155
1156 let header = iter.next().unwrap().unwrap();
1158 assert!(matches!(header, Header::Arp(_)));
1159
1160 assert!(iter.next().is_none());
1162 }
1163
1164 #[test]
1165 fn test_raw_ipv4_iteration() {
1166 let packet = create_eth_ipv4_tcp_packet();
1167 let ipv4_packet = &packet[14..];
1169
1170 let mut iter = PacketIter::new(ipv4_packet, LinkType::RawIpv4);
1171
1172 let header = iter.next().unwrap().unwrap();
1174 assert!(matches!(header, Header::Ipv4(_)));
1175
1176 let header = iter.next().unwrap().unwrap();
1178 assert!(matches!(header, Header::Tcp(_)));
1179
1180 assert!(iter.next().is_none());
1182 }
1183
1184 #[test]
1185 fn test_null_loopback_ipv4_iteration() {
1186 let mut packet = Vec::new();
1188
1189 packet.extend_from_slice(&[0x02, 0x00, 0x00, 0x00]);
1191
1192 packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&40u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(6); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[127, 0, 0, 1]); packet.extend_from_slice(&[127, 0, 0, 1]); packet.extend_from_slice(&8080u16.to_be_bytes()); packet.extend_from_slice(&80u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00, 0x00, 0x01]); packet.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); packet.push(0x50); packet.push(0x02); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); let mut iter = PacketIter::new(&packet, LinkType::Null);
1216
1217 let header = iter.next().unwrap().unwrap();
1219 assert!(matches!(header, Header::Null(_)));
1220 assert_eq!(header.name(), "Null/Loopback");
1221
1222 let header = iter.next().unwrap().unwrap();
1224 assert!(matches!(header, Header::Ipv4(_)));
1225
1226 let header = iter.next().unwrap().unwrap();
1228 assert!(matches!(header, Header::Tcp(_)));
1229
1230 assert!(iter.next().is_none());
1232 }
1233
1234 #[test]
1235 fn test_null_loopback_ipv6_iteration() {
1236 let mut packet = Vec::new();
1238
1239 packet.extend_from_slice(&[0x1e, 0x00, 0x00, 0x00]);
1241
1242 packet.push(0x60); packet.extend_from_slice(&[0x00, 0x00, 0x00]); packet.extend_from_slice(&8u16.to_be_bytes()); packet.push(17); packet.push(64); packet.extend_from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
1250 packet.extend_from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
1252
1253 packet.extend_from_slice(&53u16.to_be_bytes()); packet.extend_from_slice(&53u16.to_be_bytes()); packet.extend_from_slice(&8u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); let mut iter = PacketIter::new(&packet, LinkType::Null);
1260
1261 let header = iter.next().unwrap().unwrap();
1263 assert!(matches!(header, Header::Null(_)));
1264
1265 let header = iter.next().unwrap().unwrap();
1267 assert!(matches!(header, Header::Ipv6(_)));
1268
1269 let header = iter.next().unwrap().unwrap();
1271 assert!(matches!(header, Header::Udp(_)));
1272
1273 assert!(iter.next().is_none());
1275 }
1276
1277 #[test]
1278 fn test_from_network_layer() {
1279 let packet = create_eth_ipv4_tcp_packet();
1280 let ipv4_packet = &packet[14..];
1282
1283 let mut iter = PacketIter::from_network_layer(ipv4_packet, EtherProto::IPV4);
1284
1285 let header = iter.next().unwrap().unwrap();
1287 assert!(matches!(header, Header::Ipv4(_)));
1288
1289 let header = iter.next().unwrap().unwrap();
1291 assert!(matches!(header, Header::Tcp(_)));
1292
1293 assert!(iter.next().is_none());
1295 }
1296
1297 #[test]
1298 fn test_from_transport_layer() {
1299 let packet = create_eth_ipv4_tcp_packet();
1300 let tcp_packet = &packet[34..];
1302
1303 let mut iter = PacketIter::from_transport_layer(tcp_packet, IpProto::TCP);
1304
1305 let header = iter.next().unwrap().unwrap();
1307 assert!(matches!(header, Header::Tcp(_)));
1308
1309 assert!(iter.next().is_none());
1311 }
1312
1313 #[test]
1314 fn test_remaining_payload() {
1315 let mut packet = create_eth_ipv4_tcp_packet();
1316 packet.extend_from_slice(b"Hello, World!");
1318
1319 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1320
1321 while iter.next().is_some() {}
1323
1324 assert_eq!(iter.remaining(), b"Hello, World!");
1326 }
1327
1328 #[test]
1329 fn test_error_on_short_buffer() {
1330 let packet = vec![0u8; 5]; let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1333
1334 let result = iter.next().unwrap();
1335 assert!(result.is_err());
1336
1337 assert!(iter.is_done());
1339 assert!(iter.next().is_none());
1340 }
1341
1342 #[test]
1343 fn test_unknown_ether_proto() {
1344 let mut packet = Vec::new();
1345
1346 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x99, 0x99]); packet.extend_from_slice(b"unknown protocol data");
1353
1354 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1355
1356 let header = iter.next().unwrap().unwrap();
1358 assert!(matches!(header, Header::Ethernet(_)));
1359
1360 let header = iter.next().unwrap().unwrap();
1362 assert!(header.is_unknown());
1363 if let Header::Unknown { proto, data } = header {
1364 assert!(matches!(proto, UnknownProto::Ether(_)));
1365 assert_eq!(data, b"unknown protocol data");
1366 }
1367
1368 assert!(iter.next().is_none());
1370 }
1371
1372 #[test]
1373 fn test_unknown_ip_proto() {
1374 let mut packet = Vec::new();
1375
1376 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&30u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(200); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[192, 168, 1, 1]); packet.extend_from_slice(&[192, 168, 1, 2]); packet.extend_from_slice(b"unknown");
1395
1396 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1397
1398 iter.next().unwrap().unwrap();
1400
1401 iter.next().unwrap().unwrap();
1403
1404 let header = iter.next().unwrap().unwrap();
1406 assert!(header.is_unknown());
1407 if let Header::Unknown { proto, .. } = header {
1408 assert!(matches!(proto, UnknownProto::Ip(_)));
1409 }
1410
1411 assert!(iter.next().is_none());
1413 }
1414
1415 #[test]
1416 fn test_collect_headers() {
1417 let packet = create_eth_ipv4_tcp_packet();
1418
1419 let headers = collect_headers(&packet, LinkType::Ethernet).unwrap();
1420
1421 assert_eq!(headers.len(), 3);
1422 assert!(matches!(headers[0], Header::Ethernet(_)));
1423 assert!(matches!(headers[1], Header::Ipv4(_)));
1424 assert!(matches!(headers[2], Header::Tcp(_)));
1425 }
1426
1427 #[test]
1428 fn test_collect_headers_error() {
1429 let packet = vec![0u8; 5]; let result = collect_headers(&packet, LinkType::Ethernet);
1432 assert!(result.is_err());
1433 }
1434
1435 #[test]
1436 fn test_empty_buffer() {
1437 let packet: Vec<u8> = vec![];
1438 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1439
1440 assert!(iter.next().is_none());
1441 assert!(iter.is_done());
1442 }
1443
1444 #[test]
1445 fn test_packet_iter_ext_trait() {
1446 let packet = create_eth_ipv4_tcp_packet();
1447
1448 let headers: Vec<_> = packet
1449 .headers(LinkType::Ethernet)
1450 .filter_map(Result::ok)
1451 .collect();
1452
1453 assert_eq!(headers.len(), 3);
1454 }
1455
1456 #[test]
1457 fn test_header_display() {
1458 let packet = create_eth_ipv4_tcp_packet();
1459 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1460
1461 while let Some(Ok(header)) = iter.next() {
1462 let _ = format!("{}", header);
1464 }
1465 }
1466
1467 fn create_eth_ipv6_icmp6_packet() -> Vec<u8> {
1469 let mut packet = Vec::new();
1470
1471 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x86, 0xdd]); packet.extend_from_slice(&[0x60, 0x00, 0x00, 0x00]); packet.extend_from_slice(&8u16.to_be_bytes()); packet.push(58); packet.push(64); packet.extend_from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
1483 packet.extend_from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]);
1485
1486 packet.push(128); packet.push(0); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x01]); packet.extend_from_slice(&[0x00, 0x01]); packet
1494 }
1495
1496 fn create_eth_ipv6_udp_packet() -> Vec<u8> {
1498 let mut packet = Vec::new();
1499
1500 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x86, 0xdd]); packet.extend_from_slice(&[0x60, 0x00, 0x00, 0x00]); packet.extend_from_slice(&8u16.to_be_bytes()); packet.push(17); packet.push(64); packet.extend_from_slice(&[0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
1512 packet.extend_from_slice(&[0x20, 0x01, 0x0d, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]);
1514
1515 packet.extend_from_slice(&53u16.to_be_bytes()); packet.extend_from_slice(&53u16.to_be_bytes()); packet.extend_from_slice(&8u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet
1522 }
1523
1524 #[test]
1525 fn test_eth_ipv6_icmp6_iteration() {
1526 let packet = create_eth_ipv6_icmp6_packet();
1527 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1528
1529 let header = iter.next().unwrap().unwrap();
1531 assert!(matches!(header, Header::Ethernet(_)));
1532
1533 let header = iter.next().unwrap().unwrap();
1535 assert!(matches!(header, Header::Ipv6(_)));
1536 assert_eq!(header.name(), "IPv6");
1537
1538 let header = iter.next().unwrap().unwrap();
1540 assert!(matches!(header, Header::Icmp6(_)));
1541 assert_eq!(header.name(), "ICMPv6");
1542
1543 assert!(iter.next().is_none());
1545 }
1546
1547 #[test]
1548 fn test_eth_ipv6_udp_iteration() {
1549 let packet = create_eth_ipv6_udp_packet();
1550 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1551
1552 let header = iter.next().unwrap().unwrap();
1554 assert!(matches!(header, Header::Ethernet(_)));
1555
1556 let header = iter.next().unwrap().unwrap();
1558 assert!(matches!(header, Header::Ipv6(_)));
1559
1560 let header = iter.next().unwrap().unwrap();
1562 assert!(matches!(header, Header::Udp(_)));
1563
1564 assert!(iter.next().is_none());
1566 }
1567
1568 #[test]
1569 fn test_raw_ipv6_iteration() {
1570 let packet = create_eth_ipv6_udp_packet();
1571 let ipv6_packet = &packet[14..];
1573
1574 let mut iter = PacketIter::new(ipv6_packet, LinkType::RawIpv6);
1575
1576 let header = iter.next().unwrap().unwrap();
1578 assert!(matches!(header, Header::Ipv6(_)));
1579
1580 let header = iter.next().unwrap().unwrap();
1582 assert!(matches!(header, Header::Udp(_)));
1583
1584 assert!(iter.next().is_none());
1586 }
1587
1588 fn create_vxlan_packet() -> Vec<u8> {
1592 let mut packet = Vec::new();
1593
1594 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&72u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(17); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[10, 0, 0, 1]); packet.extend_from_slice(&[10, 0, 0, 2]); packet.extend_from_slice(&12345u16.to_be_bytes()); packet.extend_from_slice(&4789u16.to_be_bytes()); packet.extend_from_slice(&52u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x08, 0x00, 0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00, 0x64, 0x00]); packet.extend_from_slice(&[0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff]); packet.extend_from_slice(&[0x11, 0x22, 0x33, 0x44, 0x55, 0x66]); packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&20u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(6); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[192, 168, 1, 1]); packet.extend_from_slice(&[192, 168, 1, 2]); packet
1639 }
1640
1641 #[test]
1642 fn test_vxlan_tunnel_iteration() {
1643 let packet = create_vxlan_packet();
1644 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1645
1646 let header = iter.next().unwrap().unwrap();
1648 assert!(matches!(header, Header::Ethernet(_)));
1649 assert!(header.is_link_layer());
1650
1651 let header = iter.next().unwrap().unwrap();
1653 assert!(matches!(header, Header::Ipv4(_)));
1654 assert!(header.is_network_layer());
1655
1656 let header = iter.next().unwrap().unwrap();
1658 assert!(matches!(header, Header::Udp(_)));
1659 assert!(header.is_transport_layer());
1660
1661 let header = iter.next().unwrap().unwrap();
1663 assert!(matches!(header, Header::Vxlan(_)));
1664 assert!(header.is_tunnel());
1665 assert_eq!(header.name(), "VXLAN");
1666
1667 let header = iter.next().unwrap().unwrap();
1669 assert!(matches!(header, Header::Ethernet(_)));
1670
1671 let header = iter.next().unwrap().unwrap();
1673 assert!(matches!(header, Header::Ipv4(_)));
1674
1675 }
1678
1679 fn create_gre_packet() -> Vec<u8> {
1681 let mut packet = Vec::new();
1682
1683 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&44u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(47); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[10, 0, 0, 1]); packet.extend_from_slice(&[10, 0, 0, 2]); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&28u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(1); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[192, 168, 1, 1]); packet.extend_from_slice(&[192, 168, 1, 2]); packet.push(8); packet.push(0); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x01]); packet.extend_from_slice(&[0x00, 0x01]); packet
1724 }
1725
1726 #[test]
1727 fn test_gre_tunnel_iteration() {
1728 let packet = create_gre_packet();
1729 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1730
1731 let header = iter.next().unwrap().unwrap();
1733 assert!(matches!(header, Header::Ethernet(_)));
1734
1735 let header = iter.next().unwrap().unwrap();
1737 assert!(matches!(header, Header::Ipv4(_)));
1738
1739 let header = iter.next().unwrap().unwrap();
1741 assert!(matches!(header, Header::Gre(_)));
1742 assert!(header.is_tunnel());
1743 assert_eq!(header.name(), "GRE");
1744
1745 let header = iter.next().unwrap().unwrap();
1747 assert!(matches!(header, Header::Ipv4(_)));
1748
1749 let header = iter.next().unwrap().unwrap();
1751 assert!(matches!(header, Header::Icmp(_)));
1752
1753 assert!(iter.next().is_none());
1755 }
1756
1757 fn create_mpls_packet() -> Vec<u8> {
1759 let mut packet = Vec::new();
1760
1761 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x88, 0x47]); packet.extend_from_slice(&[0x00, 0x3E, 0x81, 0x40]);
1773
1774 packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&28u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(17); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[10, 0, 0, 1]); packet.extend_from_slice(&[10, 0, 0, 2]); packet.extend_from_slice(&53u16.to_be_bytes()); packet.extend_from_slice(&53u16.to_be_bytes()); packet.extend_from_slice(&8u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet
1793 }
1794
1795 #[test]
1796 fn test_mpls_tunnel_iteration() {
1797 let packet = create_mpls_packet();
1798 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1799
1800 let header = iter.next().unwrap().unwrap();
1802 assert!(matches!(header, Header::Ethernet(_)));
1803
1804 let header = iter.next().unwrap().unwrap();
1806 assert!(matches!(header, Header::Mpls(_)));
1807 assert!(header.is_tunnel());
1808 assert_eq!(header.name(), "MPLS");
1809
1810 let header = iter.next().unwrap().unwrap();
1812 assert!(matches!(header, Header::Ipv4(_)));
1813
1814 let header = iter.next().unwrap().unwrap();
1816 assert!(matches!(header, Header::Udp(_)));
1817
1818 assert!(iter.next().is_none());
1820 }
1821
1822 #[test]
1823 fn test_ip_in_ip_encapsulation() {
1824 let mut packet = Vec::new();
1825
1826 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&40u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(4); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[10, 0, 0, 1]); packet.extend_from_slice(&[10, 0, 0, 2]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&28u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(1); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[192, 168, 1, 1]); packet.extend_from_slice(&[192, 168, 1, 2]); packet.push(8); packet.push(0); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x01]); packet.extend_from_slice(&[0x00, 0x01]); let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1863
1864 let header = iter.next().unwrap().unwrap();
1866 assert!(matches!(header, Header::Ethernet(_)));
1867
1868 let header = iter.next().unwrap().unwrap();
1870 assert!(
1871 matches!(header, Header::Ipip(_)),
1872 "Expected Ipip, got {:?}",
1873 header
1874 );
1875 if let Header::Ipip(tunnel) = &header {
1876 assert_eq!(
1877 tunnel.tunnel_type(),
1878 super::super::tunnel::ipip::IpipType::Ipip
1879 );
1880 assert!(tunnel.outer_ipv4().is_some());
1881 }
1882
1883 let header = iter.next().unwrap().unwrap();
1885 assert!(matches!(header, Header::Ipv4(_)));
1886
1887 let header = iter.next().unwrap().unwrap();
1889 assert!(matches!(header, Header::Icmp(_)));
1890
1891 assert!(iter.next().is_none());
1893 }
1894
1895 #[test]
1896 fn test_header_is_tunnel() {
1897 let packet = create_vxlan_packet();
1898 let headers: Vec<_> = PacketIter::new(&packet, LinkType::Ethernet)
1899 .filter_map(Result::ok)
1900 .collect();
1901
1902 let tunnel_count = headers.iter().filter(|h| h.is_tunnel()).count();
1904 assert_eq!(tunnel_count, 1); }
1906
1907 #[test]
1908 fn test_collect_headers_with_tunnel() {
1909 let packet = create_gre_packet();
1910
1911 let headers = collect_headers(&packet, LinkType::Ethernet).unwrap();
1912
1913 assert_eq!(headers.len(), 5);
1915 assert!(matches!(headers[0], Header::Ethernet(_)));
1916 assert!(matches!(headers[1], Header::Ipv4(_)));
1917 assert!(matches!(headers[2], Header::Gre(_)));
1918 assert!(matches!(headers[3], Header::Ipv4(_)));
1919 assert!(matches!(headers[4], Header::Icmp(_)));
1920 }
1921
1922 #[test]
1923 fn test_l2tpv2_tunnel_detection() {
1924 let mut packet = Vec::new();
1925
1926 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&38u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(17); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[10, 0, 0, 1]); packet.extend_from_slice(&[10, 0, 0, 2]); packet.extend_from_slice(&1701u16.to_be_bytes()); packet.extend_from_slice(&1701u16.to_be_bytes()); packet.extend_from_slice(&18u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&0x0002u16.to_be_bytes()); packet.extend_from_slice(&0x0001u16.to_be_bytes()); packet.extend_from_slice(&0x0001u16.to_be_bytes()); let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
1956
1957 let header = iter.next().unwrap().unwrap();
1959 assert!(matches!(header, Header::Ethernet(_)));
1960
1961 let header = iter.next().unwrap().unwrap();
1963 assert!(matches!(header, Header::Ipv4(_)));
1964
1965 let header = iter.next().unwrap().unwrap();
1967 assert!(matches!(header, Header::Udp(_)));
1968
1969 let header = iter.next().unwrap().unwrap();
1971 assert!(matches!(header, Header::L2tpv2(_)));
1972 assert!(header.is_tunnel());
1973 assert_eq!(header.name(), "L2TPv2");
1974 }
1975
1976 #[test]
1977 fn test_nvgre_tunnel_detection() {
1978 let mut packet = Vec::new();
1979
1980 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&44u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(47); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[10, 0, 0, 1]); packet.extend_from_slice(&[10, 0, 0, 2]); packet.extend_from_slice(&0x2000u16.to_be_bytes()); packet.extend_from_slice(&0x6558u16.to_be_bytes()); packet.extend_from_slice(&0x00010001u32.to_be_bytes()); packet.extend_from_slice(&[0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff]); packet.extend_from_slice(&[0x11, 0x22, 0x33, 0x44, 0x55, 0x66]); packet.extend_from_slice(&[0x08, 0x00]); let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
2008
2009 let header = iter.next().unwrap().unwrap();
2011 assert!(matches!(header, Header::Ethernet(_)));
2012
2013 let header = iter.next().unwrap().unwrap();
2015 assert!(matches!(header, Header::Ipv4(_)));
2016
2017 let header = iter.next().unwrap().unwrap();
2019 assert!(matches!(header, Header::Nvgre(_)));
2020 assert!(header.is_tunnel());
2021 assert_eq!(header.name(), "NVGRE");
2022
2023 let header = iter.next().unwrap().unwrap();
2025 assert!(matches!(header, Header::Ethernet(_)));
2026 }
2027
2028 #[test]
2029 fn test_pptp_tunnel_detection() {
2030 let mut packet = Vec::new();
2031
2032 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&32u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(47); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[10, 0, 0, 1]); packet.extend_from_slice(&[10, 0, 0, 2]); packet.extend_from_slice(&0x3001u16.to_be_bytes()); packet.extend_from_slice(&0x880Bu16.to_be_bytes()); packet.extend_from_slice(&0x0004u16.to_be_bytes()); packet.extend_from_slice(&0x0001u16.to_be_bytes()); packet.extend_from_slice(&0x00000001u32.to_be_bytes()); let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
2058
2059 let header = iter.next().unwrap().unwrap();
2061 assert!(matches!(header, Header::Ethernet(_)));
2062
2063 let header = iter.next().unwrap().unwrap();
2065 assert!(matches!(header, Header::Ipv4(_)));
2066
2067 let header = iter.next().unwrap().unwrap();
2069 assert!(matches!(header, Header::Pptp(_)));
2070 assert!(header.is_tunnel());
2071 assert_eq!(header.name(), "PPTP");
2072 }
2073
2074 #[test]
2075 fn test_pbb_tunnel_detection() {
2076 let mut packet = Vec::new();
2077
2078 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x88, 0xE7]); packet.extend_from_slice(&[0x88, 0xE7]); packet.extend_from_slice(&[0x00, 0x00, 0x01, 0x00]); packet.extend_from_slice(&[0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff]); packet.extend_from_slice(&[0x11, 0x22, 0x33, 0x44, 0x55, 0x66]); packet.extend_from_slice(&[0x08, 0x00]); let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
2093
2094 let header = iter.next().unwrap().unwrap();
2096 assert!(matches!(header, Header::Ethernet(_)));
2097
2098 let header = iter.next().unwrap().unwrap();
2100 assert!(matches!(header, Header::Pbb(_)));
2101 assert!(header.is_tunnel());
2102 assert_eq!(header.name(), "PBB");
2103
2104 let header = iter.next().unwrap().unwrap();
2106 assert!(matches!(header, Header::Ethernet(_)));
2107 }
2108
2109 #[test]
2110 fn test_stt_tunnel_detection() {
2111 let mut packet = Vec::new();
2112
2113 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]); packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]); packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&100u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(6); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[10, 0, 0, 1]); packet.extend_from_slice(&[10, 0, 0, 2]); packet.extend_from_slice(&12345u16.to_be_bytes()); packet.extend_from_slice(&7471u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00, 0x00, 0x01]); packet.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); packet.push(0x50); packet.push(0x02); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&0u16.to_be_bytes()); packet.extend_from_slice(&0u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); packet.push(0x50); packet.push(0x00); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(0x00); packet.push(0x00); packet.push(0x00); packet.push(0x00); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff]); packet.extend_from_slice(&[0x11, 0x22, 0x33, 0x44, 0x55, 0x66]); packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45); packet.push(0x00); packet.extend_from_slice(&20u16.to_be_bytes()); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[0x00, 0x00]); packet.push(64); packet.push(1); packet.extend_from_slice(&[0x00, 0x00]); packet.extend_from_slice(&[192, 168, 1, 1]); packet.extend_from_slice(&[192, 168, 1, 2]); let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
2179
2180 let header = iter.next().unwrap().unwrap();
2182 assert!(matches!(header, Header::Ethernet(_)));
2183
2184 let header = iter.next().unwrap().unwrap();
2186 assert!(matches!(header, Header::Ipv4(_)));
2187
2188 let header = iter.next().unwrap().unwrap();
2190 assert!(matches!(header, Header::Tcp(_)));
2191
2192 let header = iter.next().unwrap().unwrap();
2194 assert!(matches!(header, Header::Stt(_)));
2195 assert!(header.is_tunnel());
2196 assert_eq!(header.name(), "STT");
2197
2198 let header = iter.next().unwrap().unwrap();
2200 assert!(matches!(header, Header::Ethernet(_)));
2201
2202 let header = iter.next().unwrap().unwrap();
2204 assert!(matches!(header, Header::Ipv4(_)));
2205 }
2206
2207 #[test]
2208 fn test_gre_variant_detection() {
2209 let mut packet = Vec::new();
2211
2212 packet.extend_from_slice(&[0x00, 0x11, 0x22, 0x33, 0x44, 0x55]);
2214 packet.extend_from_slice(&[0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb]);
2215 packet.extend_from_slice(&[0x08, 0x00]);
2216
2217 packet.push(0x45);
2219 packet.push(0x00);
2220 packet.extend_from_slice(&32u16.to_be_bytes());
2221 packet.extend_from_slice(&[0x00, 0x00]);
2222 packet.extend_from_slice(&[0x00, 0x00]);
2223 packet.push(64);
2224 packet.push(47); packet.extend_from_slice(&[0x00, 0x00]);
2226 packet.extend_from_slice(&[10, 0, 0, 1]);
2227 packet.extend_from_slice(&[10, 0, 0, 2]);
2228
2229 packet.extend_from_slice(&0x0000u16.to_be_bytes()); packet.extend_from_slice(&0x0800u16.to_be_bytes()); packet.push(0x45);
2235 packet.push(0x00);
2236 packet.extend_from_slice(&20u16.to_be_bytes());
2237 packet.extend_from_slice(&[0x00, 0x00]);
2238 packet.extend_from_slice(&[0x00, 0x00]);
2239 packet.push(64);
2240 packet.push(1); packet.extend_from_slice(&[0x00, 0x00]);
2242 packet.extend_from_slice(&[192, 168, 1, 1]);
2243 packet.extend_from_slice(&[192, 168, 1, 2]);
2244
2245 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
2246
2247 iter.next(); iter.next(); let header = iter.next().unwrap().unwrap();
2252 assert!(matches!(header, Header::Gre(_)));
2253 assert_eq!(header.name(), "GRE");
2254 }
2255
2256 #[test]
2257 fn test_guess_link_type_raw_ipv4() {
2258 let packet = vec![
2260 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0xc0, 0xa8, 0x01, 0x01, 0xc0, 0xa8, 0x01, 0x02, ];
2265 assert_eq!(PacketIter::guess_link_type(&packet), LinkType::RawIpv4);
2266 }
2267
2268 #[test]
2269 fn test_guess_link_type_raw_ipv6() {
2270 let packet = vec![
2272 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, ];
2275 assert_eq!(PacketIter::guess_link_type(&packet), LinkType::RawIpv6);
2276 }
2277
2278 #[test]
2279 fn test_guess_link_type_null_ipv4() {
2280 let packet = vec![
2282 0x02, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x28, ];
2285 assert_eq!(PacketIter::guess_link_type(&packet), LinkType::Null);
2286 }
2287
2288 #[test]
2289 fn test_guess_link_type_null_ipv6_darwin() {
2290 let packet = vec![
2292 0x1e, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, ];
2295 assert_eq!(PacketIter::guess_link_type(&packet), LinkType::Null);
2296 }
2297
2298 #[test]
2299 fn test_guess_link_type_ethernet_ipv4() {
2300 let packet = vec![
2302 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0x08, 0x00, 0x45, 0x00, ];
2307 assert_eq!(PacketIter::guess_link_type(&packet), LinkType::Ethernet);
2308 }
2309
2310 #[test]
2311 fn test_guess_link_type_ethernet_ipv6() {
2312 let packet = vec![
2314 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0x86, 0xdd, 0x60, 0x00, ];
2319 assert_eq!(PacketIter::guess_link_type(&packet), LinkType::Ethernet);
2320 }
2321
2322 #[test]
2323 fn test_guess_link_type_ethernet_arp() {
2324 let packet = vec![
2326 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x08, 0x06, ];
2330 assert_eq!(PacketIter::guess_link_type(&packet), LinkType::Ethernet);
2331 }
2332
2333 #[test]
2334 fn test_guess_link_type_sll() {
2335 let packet = vec![
2337 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, ];
2345 assert_eq!(PacketIter::guess_link_type(&packet), LinkType::Sll);
2346 }
2347
2348 #[test]
2349 fn test_guess_link_type_sllv2() {
2350 let packet = vec![
2352 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x06, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x00, 0x00, ];
2361 assert_eq!(PacketIter::guess_link_type(&packet), LinkType::Sllv2);
2362 }
2363
2364 #[test]
2365 fn test_guess_link_type_empty() {
2366 let packet: Vec<u8> = vec![];
2367 assert_eq!(PacketIter::guess_link_type(&packet), LinkType::Ethernet);
2369 }
2370
2371 #[test]
2372 fn test_guess_constructor_ipv4() {
2373 let packet = vec![
2375 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0xc0, 0xa8,
2376 0x01, 0x01, 0xc0, 0xa8, 0x01, 0x02,
2377 ];
2378
2379 let link_type = PacketIter::guess_link_type(&packet);
2380 let mut iter = PacketIter::new(&packet, link_type);
2381 let first = iter.next().unwrap().unwrap();
2382 assert!(matches!(first, Header::Ipv4(_)));
2383 }
2384
2385 #[test]
2386 fn test_guess_constructor_ethernet() {
2387 let packet = create_eth_ipv4_tcp_packet();
2388 let link_type = PacketIter::guess_link_type(&packet);
2389 let mut iter = PacketIter::new(&packet, link_type);
2390
2391 let first = iter.next().unwrap().unwrap();
2392 assert!(matches!(first, Header::Ethernet(_)));
2393
2394 let second = iter.next().unwrap().unwrap();
2395 assert!(matches!(second, Header::Ipv4(_)));
2396 }
2397
2398 #[test]
2399 fn test_gre_over_raw_ip() {
2400 let mut packet = Vec::new();
2402
2403 packet.push(0x45);
2405 packet.push(0x00);
2406 packet.extend_from_slice(&52u16.to_be_bytes());
2407 packet.extend_from_slice(&[0x00, 0x00]);
2408 packet.extend_from_slice(&[0x00, 0x00]);
2409 packet.push(64);
2410 packet.push(47); packet.extend_from_slice(&[0x00, 0x00]);
2412 packet.extend_from_slice(&[10, 0, 0, 1]);
2413 packet.extend_from_slice(&[10, 0, 0, 2]);
2414
2415 packet.extend_from_slice(&[0x00, 0x00]);
2417 packet.extend_from_slice(&[0x08, 0x00]); packet.push(0x45);
2421 packet.push(0x00);
2422 packet.extend_from_slice(&28u16.to_be_bytes());
2423 packet.extend_from_slice(&[0x00, 0x00]);
2424 packet.extend_from_slice(&[0x00, 0x00]);
2425 packet.push(64);
2426 packet.push(1); packet.extend_from_slice(&[0x00, 0x00]);
2428 packet.extend_from_slice(&[192, 168, 1, 1]);
2429 packet.extend_from_slice(&[192, 168, 1, 2]);
2430
2431 packet.push(8);
2433 packet.push(0);
2434 packet.extend_from_slice(&[0x00, 0x00]);
2435 packet.extend_from_slice(&[0x00, 0x01]);
2436 packet.extend_from_slice(&[0x00, 0x01]);
2437
2438 let mut iter = PacketIter::new(&packet, LinkType::RawIpv4);
2439
2440 let h1 = iter.next().unwrap().unwrap();
2442 assert!(matches!(h1, Header::Ipv4(_)));
2443 if let Header::Ipv4(ipv4) = h1 {
2444 assert_eq!(ipv4.protocol(), IpProto::GRE);
2445 }
2446
2447 let h2 = iter.next().unwrap().unwrap();
2449 assert!(matches!(h2, Header::Gre(_)));
2450
2451 let h3 = iter.next().unwrap().unwrap();
2453 assert!(matches!(h3, Header::Ipv4(_)));
2454 if let Header::Ipv4(ipv4) = h3 {
2455 assert_eq!(ipv4.protocol(), IpProto::ICMP);
2456 }
2457
2458 let h4 = iter.next().unwrap().unwrap();
2460 assert!(matches!(h4, Header::Icmp(_)));
2461
2462 assert!(iter.next().is_none());
2464 }
2465
2466 #[test]
2467 fn test_gre_over_ethernet_ospf_packet() {
2468 let packet: Vec<u8> = vec![
2470 0xcc, 0x01, 0x0f, 0x80, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x08, 0x00,
2471 0x45, 0xc0, 0x00, 0x64, 0x00, 0x0f, 0x00, 0x00, 0xff, 0x2f, 0x16, 0x47, 0xc0, 0xa8,
2472 0x0c, 0x01, 0xc0, 0xa8, 0x17, 0x03, 0x00, 0x00, 0x08, 0x00, 0x45, 0xc0, 0x00, 0x4c,
2473 0x00, 0x27, 0x00, 0x00, 0x01, 0x59, 0x0a, 0xc4, 0xc0, 0xa8, 0x0d, 0x01, 0xe0, 0x00,
2474 0x00, 0x05, 0x02, 0x01, 0x00, 0x2c, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
2475 0xea, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
2476 0xff, 0x00, 0x00, 0x0a, 0x12, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00,
2477 0x00, 0x00, 0x00, 0x00, 0xff, 0xf6, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00,
2478 0x00, 0x01,
2479 ];
2480
2481 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
2482
2483 let h1 = iter.next().unwrap().unwrap();
2485 assert!(matches!(h1, Header::Ethernet(_)));
2486 if let Header::Ethernet(eth) = h1 {
2487 assert_eq!(eth.protocol(), EtherProto::IPV4);
2488 }
2489
2490 let h2 = iter.next().unwrap().unwrap();
2492 assert!(matches!(h2, Header::Ipv4(_)));
2493 if let Header::Ipv4(ipv4) = h2 {
2494 assert_eq!(ipv4.protocol(), IpProto::GRE);
2495 }
2496
2497 let h3 = iter.next().unwrap().unwrap();
2499 assert!(matches!(h3, Header::Gre(_)), "Expected GRE, got {:?}", h3);
2500
2501 let h4 = iter.next().unwrap().unwrap();
2503 assert!(matches!(h4, Header::Ipv4(_)));
2504 if let Header::Ipv4(ipv4) = h4 {
2505 assert_eq!(ipv4.protocol(), IpProto::from(89u8)); }
2507
2508 let h5 = iter.next().unwrap().unwrap();
2510 assert!(
2511 matches!(h5, Header::Unknown { .. }),
2512 "Expected Unknown for OSPF, got {:?}",
2513 h5
2514 );
2515 }
2516
2517 #[test]
2518 fn test_ipv4_in_ipv6_tunnel() {
2519 let packet: Vec<u8> = vec![
2522 0x00, 0x90, 0x1a, 0x41, 0x65, 0x41, 0x00, 0x16, 0xcf, 0x41, 0x9c, 0x20, 0x86, 0xdd,
2523 0x60, 0x00, 0x00, 0x00, 0x00, 0x28, 0x04, 0x40, 0x20, 0x02, 0x46, 0x37, 0xd5, 0xd3,
2524 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x37, 0xd5, 0xd3, 0x20, 0x01, 0x48, 0x60,
2525 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x45, 0x00,
2526 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06, 0x3b, 0x6b, 0x46, 0x37, 0xd5, 0xd3,
2527 0xc0, 0x58, 0x63, 0x01, 0x7a, 0x69, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2528 0x00, 0x00, 0x50, 0x02, 0x20, 0x00, 0xd5, 0xc4, 0x00, 0x00,
2529 ];
2530
2531 let mut iter = PacketIter::new(&packet, LinkType::Ethernet);
2532
2533 let h1 = iter.next().unwrap().unwrap();
2535 assert!(
2536 matches!(h1, Header::Ethernet(_)),
2537 "Expected Ethernet, got {:?}",
2538 h1
2539 );
2540 if let Header::Ethernet(eth) = h1 {
2541 assert_eq!(eth.protocol(), EtherProto::IPV6);
2542 }
2543
2544 let h2 = iter.next().unwrap().unwrap();
2546 assert!(matches!(h2, Header::Ipip(_)), "Expected Ipip, got {:?}", h2);
2547 if let Header::Ipip(tunnel) = &h2 {
2548 assert_eq!(
2549 tunnel.tunnel_type(),
2550 super::super::tunnel::ipip::IpipType::Ip4in6,
2551 "Expected Ip4in6 tunnel type, got {:?}",
2552 tunnel.tunnel_type()
2553 );
2554 assert!(tunnel.outer_ipv6().is_some());
2555 let outer = tunnel.outer_ipv6().unwrap();
2556 assert_eq!(outer.next_header(), IpProto::from(4u8));
2557 }
2558
2559 let h3 = iter.next().unwrap().unwrap();
2561 assert!(matches!(h3, Header::Ipv4(_)), "Expected Ipv4, got {:?}", h3);
2562 if let Header::Ipv4(ipv4) = h3 {
2563 assert_eq!(ipv4.protocol(), IpProto::TCP);
2564 }
2565
2566 let h4 = iter.next().unwrap().unwrap();
2568 assert!(matches!(h4, Header::Tcp(_)), "Expected Tcp, got {:?}", h4);
2569
2570 assert!(iter.next().is_none());
2572 }
2573}