1#[deprecated(since = "0.10.1", note = "Please use the type IpNumber instead")]
13pub type IpTrafficClass = IpNumber;
14
15#[derive(PartialEq, Eq, Clone, Copy, Hash, Ord, PartialOrd)]
47pub struct IpNumber(pub u8);
48
49impl IpNumber {
50 pub const IPV6_HEADER_HOP_BY_HOP: IpNumber = Self(0);
52 pub const ICMP: IpNumber = Self(1);
54 pub const IGMP: IpNumber = Self(2);
56 pub const GGP: IpNumber = Self(3);
58 pub const IPV4: IpNumber = Self(4);
60 pub const STREAM: IpNumber = Self(5);
62 pub const TCP: IpNumber = Self(6);
64 pub const CBT: IpNumber = Self(7);
66 pub const EGP: IpNumber = Self(8);
68 pub const IGP: IpNumber = Self(9);
70 pub const BBN_RCC_MON: IpNumber = Self(10);
72 pub const NVP_II: IpNumber = Self(11);
74 pub const PUP: IpNumber = Self(12);
76 pub const ARGUS: IpNumber = Self(13);
78 pub const EMCON: IpNumber = Self(14);
80 pub const XNET: IpNumber = Self(15);
82 pub const CHAOS: IpNumber = Self(16);
84 pub const UDP: IpNumber = Self(17);
86 pub const MUX: IpNumber = Self(18);
88 pub const DCN_MEAS: IpNumber = Self(19);
90 pub const HMP: IpNumber = Self(20);
92 pub const PRM: IpNumber = Self(21);
94 pub const XNS_IDP: IpNumber = Self(22);
96 pub const TRUNK1: IpNumber = Self(23);
98 pub const TRUNK2: IpNumber = Self(24);
100 pub const LEAF1: IpNumber = Self(25);
102 pub const LEAF2: IpNumber = Self(26);
104 pub const RDP: IpNumber = Self(27);
106 pub const IRTP: IpNumber = Self(28);
108 pub const ISO_TP4: IpNumber = Self(29);
110 pub const NET_BLT: IpNumber = Self(30);
112 pub const MFE_NSP: IpNumber = Self(31);
114 pub const MERIT_INP: IpNumber = Self(32);
116 pub const DCCP: IpNumber = Self(33);
118 pub const THIRD_PARTY_CONNECT_PROTOCOL: IpNumber = Self(34);
120 pub const IDPR: IpNumber = Self(35);
122 pub const XTP: IpNumber = Self(36);
124 pub const DDP: IpNumber = Self(37);
126 pub const IDPR_CMTP: IpNumber = Self(38);
128 pub const TP_PLUS_PLUS: IpNumber = Self(39);
130 pub const IL: IpNumber = Self(40);
132 pub const IPV6: IpNumber = Self(41);
134 pub const SDRP: IpNumber = Self(42);
136 pub const IPV6_ROUTE_HEADER: IpNumber = Self(43);
138 pub const IPV6_FRAGMENTATION_HEADER: IpNumber = Self(44);
140 pub const IDRP: IpNumber = Self(45);
142 pub const RSVP: IpNumber = Self(46);
144 pub const GRE: IpNumber = Self(47);
146 pub const DSR: IpNumber = Self(48);
148 pub const BNA: IpNumber = Self(49);
150 pub const ENCAPSULATING_SECURITY_PAYLOAD: IpNumber = Self(50);
152 pub const AUTHENTICATION_HEADER: IpNumber = Self(51);
154 pub const INLSP: IpNumber = Self(52);
156 pub const SWIPE: IpNumber = Self(53);
158 pub const NARP: IpNumber = Self(54);
160 pub const MOBILE: IpNumber = Self(55);
162 pub const TLSP: IpNumber = Self(56);
164 pub const SKIP: IpNumber = Self(57);
166 pub const IPV6_ICMP: IpNumber = Self(58);
168 pub const IPV6_NO_NEXT_HEADER: IpNumber = Self(59);
170 pub const IPV6_DESTINATION_OPTIONS: IpNumber = Self(60);
172 pub const ANY_HOST_INTERNAL_PROTOCOL: IpNumber = Self(61);
174 pub const CFTP: IpNumber = Self(62);
176 pub const ANY_LOCAL_NETWORK: IpNumber = Self(63);
178 pub const SAT_EXPAK: IpNumber = Self(64);
180 pub const KRYTOLAN: IpNumber = Self(65);
182 pub const RVD: IpNumber = Self(66);
184 pub const IPPC: IpNumber = Self(67);
186 pub const ANY_DISTRIBUTED_FILE_SYSTEM: IpNumber = Self(68);
188 pub const SAT_MON: IpNumber = Self(69);
190 pub const VISA: IpNumber = Self(70);
192 pub const IPCV: IpNumber = Self(71);
194 pub const CPNX: IpNumber = Self(72);
196 pub const CPHB: IpNumber = Self(73);
198 pub const WSN: IpNumber = Self(74);
200 pub const PVP: IpNumber = Self(75);
202 pub const BR_SAT_MON: IpNumber = Self(76);
204 pub const SUN_ND: IpNumber = Self(77);
206 pub const WB_MON: IpNumber = Self(78);
208 pub const WB_EXPAK: IpNumber = Self(79);
210 pub const ISO_IP: IpNumber = Self(80);
212 pub const VMTP: IpNumber = Self(81);
214 pub const SECURE_VMTP: IpNumber = Self(82);
216 pub const VINES: IpNumber = Self(83);
218 pub const TTP_OR_IPTM: IpNumber = Self(84);
220 pub const NSFNET_IGP: IpNumber = Self(85);
222 pub const DGP: IpNumber = Self(86);
224 pub const TCF: IpNumber = Self(87);
226 pub const EIGRP: IpNumber = Self(88);
228 pub const OSPFIGP: IpNumber = Self(89);
230 pub const SPRITE_RPC: IpNumber = Self(90);
232 pub const LARP: IpNumber = Self(91);
234 pub const MTP: IpNumber = Self(92);
236 pub const AX25: IpNumber = Self(93);
238 pub const IPIP: IpNumber = Self(94);
240 pub const MICP: IpNumber = Self(95);
242 pub const SCC_SP: IpNumber = Self(96);
244 pub const ETHER_IP: IpNumber = Self(97);
246 pub const ENCAP: IpNumber = Self(98);
248 pub const GMTP: IpNumber = Self(100);
250 pub const IFMP: IpNumber = Self(101);
252 pub const PNNI: IpNumber = Self(102);
254 pub const PIM: IpNumber = Self(103);
256 pub const ARIS: IpNumber = Self(104);
258 pub const SCPS: IpNumber = Self(105);
260 pub const QNX: IpNumber = Self(106);
262 pub const ACTIVE_NETWORKS: IpNumber = Self(107);
264 pub const IP_COMP: IpNumber = Self(108);
266 pub const SITRA_NETWORKS_PROTOCOL: IpNumber = Self(109);
268 pub const COMPAQ_PEER: IpNumber = Self(110);
270 pub const IPX_IN_IP: IpNumber = Self(111);
272 pub const VRRP: IpNumber = Self(112);
274 pub const PGM: IpNumber = Self(113);
276 pub const ANY_ZERO_HOP_PROTOCOL: IpNumber = Self(114);
278 pub const LAYER2_TUNNELING_PROTOCOL: IpNumber = Self(115);
280 pub const DDX: IpNumber = Self(116);
282 pub const IATP: IpNumber = Self(117);
284 pub const STP: IpNumber = Self(118);
286 pub const SRP: IpNumber = Self(119);
288 pub const UTI: IpNumber = Self(120);
290 pub const SIMPLE_MESSAGE_PROTOCOL: IpNumber = Self(121);
292 pub const SM: IpNumber = Self(122);
294 pub const PTP: IpNumber = Self(123);
296 pub const ISIS_OVER_IPV4: IpNumber = Self(124);
298 pub const FIRE: IpNumber = Self(125);
300 pub const CRTP: IpNumber = Self(126);
302 pub const CRUDP: IpNumber = Self(127);
304 pub const SSCOPMCE: IpNumber = Self(128);
306 pub const IPLT: IpNumber = Self(129);
308 pub const SPS: IpNumber = Self(130);
310 pub const PIPE: IpNumber = Self(131);
312 pub const SCTP: IpNumber = Self(132);
314 pub const FC: IpNumber = Self(133);
316 pub const RSVP_E2E_IGNORE: IpNumber = Self(134);
318 pub const MOBILITY_HEADER: IpNumber = Self(135);
320 pub const UDP_LITE: IpNumber = Self(136);
322 pub const MPLS_IN_IP: IpNumber = Self(137);
324 pub const MANET: IpNumber = Self(138);
326 pub const HIP: IpNumber = Self(139);
328 pub const SHIM6: IpNumber = Self(140);
330 pub const WESP: IpNumber = Self(141);
332 pub const ROHC: IpNumber = Self(142);
334 pub const EXPERIMENTAL_AND_TESTING_0: IpNumber = Self(253);
336 pub const EXPERIMENTAL_AND_TESTING_1: IpNumber = Self(254);
338}
339
340impl IpNumber {
341 pub fn is_ipv6_ext_header_value(self) -> bool {
343 use crate::ip_number::*;
344 matches!(
345 self,
346 IPV6_HOP_BY_HOP
347 | IPV6_ROUTE
348 | IPV6_FRAG
349 | ENCAP_SEC
350 | AUTH
351 | IPV6_DEST_OPTIONS
352 | MOBILITY
353 | HIP
354 | SHIM6
355 | EXP0
356 | EXP1
357 )
358 }
359
360 pub fn keyword_str(self) -> Option<&'static str> {
378 match self.0 {
382 0 => Some("HOPOPT"),
383 1 => Some("ICMP"),
384 2 => Some("IGMP"),
385 3 => Some("GGP"),
386 4 => Some("IPv4"),
387 5 => Some("ST"),
388 6 => Some("TCP"),
389 7 => Some("CBT"),
390 8 => Some("EGP"),
391 9 => Some("IGP"),
392 10 => Some("BBN-RCC-MON"),
393 11 => Some("NVP-II"),
394 12 => Some("PUP"),
395 13 => Some("ARGUS (deprecated)"),
396 14 => Some("EMCON"),
397 15 => Some("XNET"),
398 16 => Some("CHAOS"),
399 17 => Some("UDP"),
400 18 => Some("MUX"),
401 19 => Some("DCN-MEAS"),
402 20 => Some("HMP"),
403 21 => Some("PRM"),
404 22 => Some("XNS-IDP"),
405 23 => Some("TRUNK-1"),
406 24 => Some("TRUNK-2"),
407 25 => Some("LEAF-1"),
408 26 => Some("LEAF-2"),
409 27 => Some("RDP"),
410 28 => Some("IRTP"),
411 29 => Some("ISO-TP4"),
412 30 => Some("NETBLT"),
413 31 => Some("MFE-NSP"),
414 32 => Some("MERIT-INP"),
415 33 => Some("DCCP"),
416 34 => Some("3PC"),
417 35 => Some("IDPR"),
418 36 => Some("XTP"),
419 37 => Some("DDP"),
420 38 => Some("IDPR-CMTP"),
421 39 => Some("TP++"),
422 40 => Some("IL"),
423 41 => Some("IPv6"),
424 42 => Some("SDRP"),
425 43 => Some("IPv6-Route"),
426 44 => Some("IPv6-Frag"),
427 45 => Some("IDRP"),
428 46 => Some("RSVP"),
429 47 => Some("GRE"),
430 48 => Some("DSR"),
431 49 => Some("BNA"),
432 50 => Some("ESP"),
433 51 => Some("AH"),
434 52 => Some("I-NLSP"),
435 53 => Some("SWIPE (deprecated)"),
436 54 => Some("NARP"),
437 55 => Some("MOBILE"),
438 56 => Some("TLSP"),
439 57 => Some("SKIP"),
440 58 => Some("IPv6-ICMP"),
441 59 => Some("IPv6-NoNxt"),
442 60 => Some("IPv6-Opts"),
443 61 => None,
444 62 => Some("CFTP"),
445 63 => None,
446 64 => Some("SAT-EXPAK"),
447 65 => Some("KRYPTOLAN"),
448 66 => Some("RVD"),
449 67 => Some("IPPC"),
450 68 => None,
451 69 => Some("SAT-MON"),
452 70 => Some("VISA"),
453 71 => Some("IPCV"),
454 72 => Some("CPNX"),
455 73 => Some("CPHB"),
456 74 => Some("WSN"),
457 75 => Some("PVP"),
458 76 => Some("BR-SAT-MON"),
459 77 => Some("SUN-ND"),
460 78 => Some("WB-MON"),
461 79 => Some("WB-EXPAK"),
462 80 => Some("ISO-IP"),
463 81 => Some("VMTP"),
464 82 => Some("SECURE-VMTP"),
465 83 => Some("VINES"),
466 84 => Some("IPTM"),
467 85 => Some("NSFNET-IGP"),
468 86 => Some("DGP"),
469 87 => Some("TCF"),
470 88 => Some("EIGRP"),
471 89 => Some("OSPFIGP"),
472 90 => Some("Sprite-RPC"),
473 91 => Some("LARP"),
474 92 => Some("MTP"),
475 93 => Some("AX.25"),
476 94 => Some("IPIP"),
477 95 => Some("MICP (deprecated)"),
478 96 => Some("SCC-SP"),
479 97 => Some("ETHERIP"),
480 98 => Some("ENCAP"),
481 99 => None,
482 100 => Some("GMTP"),
483 101 => Some("IFMP"),
484 102 => Some("PNNI"),
485 103 => Some("PIM"),
486 104 => Some("ARIS"),
487 105 => Some("SCPS"),
488 106 => Some("QNX"),
489 107 => Some("A/N"),
490 108 => Some("IPComp"),
491 109 => Some("SNP"),
492 110 => Some("Compaq-Peer"),
493 111 => Some("IPX-in-IP"),
494 112 => Some("VRRP"),
495 113 => Some("PGM"),
496 114 => None,
497 115 => Some("L2TP"),
498 116 => Some("DDX"),
499 117 => Some("IATP"),
500 118 => Some("STP"),
501 119 => Some("SRP"),
502 120 => Some("UTI"),
503 121 => Some("SMP"),
504 122 => Some("SM (deprecated)"),
505 123 => Some("PTP"),
506 124 => Some("ISIS over IPv4"),
507 125 => Some("FIRE"),
508 126 => Some("CRTP"),
509 127 => Some("CRUDP"),
510 128 => Some("SSCOPMCE"),
511 129 => Some("IPLT"),
512 130 => Some("SPS"),
513 131 => Some("PIPE"),
514 132 => Some("SCTP"),
515 133 => Some("FC"),
516 134 => Some("RSVP-E2E-IGNORE"),
517 135 => Some("Mobility Header"),
518 136 => Some("UDPLite"),
519 137 => Some("MPLS-in-IP"),
520 138 => Some("manet"),
521 139 => Some("HIP"),
522 140 => Some("Shim6"),
523 141 => Some("WESP"),
524 142 => Some("ROHC"),
525 143 => Some("Ethernet"),
526 144 => Some("AGGFRAG"),
527 145..=252 => None,
528 253 => None,
529 254 => None,
530 255 => Some("Reserved"),
531 }
532 }
533
534 pub fn protocol_str(self) -> Option<&'static str> {
552 match self.0 {
556 0 => Some("IPv6 Hop-by-Hop Option"),
557 1 => Some("Internet Control Message"),
558 2 => Some("Internet Group Management"),
559 3 => Some("Gateway-to-Gateway"),
560 4 => Some("IPv4 encapsulation"),
561 5 => Some("Stream"),
562 6 => Some("Transmission Control"),
563 7 => Some("CBT"),
564 8 => Some("Exterior Gateway Protocol"),
565 9 => Some("any private interior gateway (used by Cisco for their IGRP)"),
566 10 => Some("BBN RCC Monitoring"),
567 11 => Some("Network Voice Protocol"),
568 12 => Some("PUP"),
569 13 => Some("ARGUS"),
570 14 => Some("EMCON"),
571 15 => Some("Cross Net Debugger"),
572 16 => Some("Chaos"),
573 17 => Some("User Datagram"),
574 18 => Some("Multiplexing"),
575 19 => Some("DCN Measurement Subsystems"),
576 20 => Some("Host Monitoring"),
577 21 => Some("Packet Radio Measurement"),
578 22 => Some("XEROX NS IDP"),
579 23 => Some("Trunk-1"),
580 24 => Some("Trunk-2"),
581 25 => Some("Leaf-1"),
582 26 => Some("Leaf-2"),
583 27 => Some("Reliable Data Protocol"),
584 28 => Some("Internet Reliable Transaction"),
585 29 => Some("ISO Transport Protocol Class 4"),
586 30 => Some("Bulk Data Transfer Protocol"),
587 31 => Some("MFE Network Services Protocol"),
588 32 => Some("MERIT Internodal Protocol"),
589 33 => Some("Datagram Congestion Control Protocol"),
590 34 => Some("Third Party Connect Protocol"),
591 35 => Some("Inter-Domain Policy Routing Protocol"),
592 36 => Some("XTP"),
593 37 => Some("Datagram Delivery Protocol"),
594 38 => Some("IDPR Control Message Transport Proto"),
595 39 => Some("TP++ Transport Protocol"),
596 40 => Some("IL Transport Protocol"),
597 41 => Some("IPv6 encapsulation"),
598 42 => Some("Source Demand Routing Protocol"),
599 43 => Some("Routing Header for IPv6"),
600 44 => Some("Fragment Header for IPv6"),
601 45 => Some("Inter-Domain Routing Protocol"),
602 46 => Some("Reservation Protocol"),
603 47 => Some("Generic Routing Encapsulation"),
604 48 => Some("Dynamic Source Routing Protocol"),
605 49 => Some("BNA"),
606 50 => Some("Encap Security Payload"),
607 51 => Some("Authentication Header"),
608 52 => Some("Integrated Net Layer Security TUBA"),
609 53 => Some("IP with Encryption"),
610 54 => Some("NBMA Address Resolution Protocol"),
611 55 => Some("IP Mobility"),
612 56 => Some("Transport Layer Security Protocol using Kryptonet key management"),
613 57 => Some("SKIP"),
614 58 => Some("ICMP for IPv6"),
615 59 => Some("No Next Header for IPv6"),
616 60 => Some("Destination Options for IPv6"),
617 61 => Some("any host internal protocol"),
618 62 => Some("CFTP"),
619 63 => Some("any local network"),
620 64 => Some("SATNET and Backroom EXPAK"),
621 65 => Some("Kryptolan"),
622 66 => Some("MIT Remote Virtual Disk Protocol"),
623 67 => Some("Internet Pluribus Packet Core"),
624 68 => Some("any distributed file system"),
625 69 => Some("SATNET Monitoring"),
626 70 => Some("VISA Protocol"),
627 71 => Some("Internet Packet Core Utility"),
628 72 => Some("Computer Protocol Network Executive"),
629 73 => Some("Computer Protocol Heart Beat"),
630 74 => Some("Wang Span Network"),
631 75 => Some("Packet Video Protocol"),
632 76 => Some("Backroom SATNET Monitoring"),
633 77 => Some("SUN ND PROTOCOL-Temporary"),
634 78 => Some("WIDEBAND Monitoring"),
635 79 => Some("WIDEBAND EXPAK"),
636 80 => Some("ISO Internet Protocol"),
637 81 => Some("VMTP"),
638 82 => Some("SECURE-VMTP"),
639 83 => Some("VINES"),
640 84 => Some("Internet Protocol Traffic Manager"),
641 85 => Some("NSFNET-IGP"),
642 86 => Some("Dissimilar Gateway Protocol"),
643 87 => Some("TCF"),
644 88 => Some("EIGRP"),
645 89 => Some("OSPFIGP"),
646 90 => Some("Sprite RPC Protocol"),
647 91 => Some("Locus Address Resolution Protocol"),
648 92 => Some("Multicast Transport Protocol"),
649 93 => Some("AX.25 Frames"),
650 94 => Some("IP-within-IP Encapsulation Protocol"),
651 95 => Some("Mobile Internetworking Control Pro."),
652 96 => Some("Semaphore Communications Sec. Pro."),
653 97 => Some("Ethernet-within-IP Encapsulation"),
654 98 => Some("Encapsulation Header"),
655 99 => Some("any private encryption scheme"),
656 100 => Some("GMTP"),
657 101 => Some("Ipsilon Flow Management Protocol"),
658 102 => Some("PNNI over IP"),
659 103 => Some("Protocol Independent Multicast"),
660 104 => Some("ARIS"),
661 105 => Some("SCPS"),
662 106 => Some("QNX"),
663 107 => Some("Active Networks"),
664 108 => Some("IP Payload Compression Protocol"),
665 109 => Some("Sitara Networks Protocol"),
666 110 => Some("Compaq Peer Protocol"),
667 111 => Some("IPX in IP"),
668 112 => Some("Virtual Router Redundancy Protocol"),
669 113 => Some("PGM Reliable Transport Protocol"),
670 114 => Some("any 0-hop protocol"),
671 115 => Some("Layer Two Tunneling Protocol"),
672 116 => Some("D-II Data Exchange (DDX)"),
673 117 => Some("Interactive Agent Transfer Protocol"),
674 118 => Some("Schedule Transfer Protocol"),
675 119 => Some("SpectraLink Radio Protocol"),
676 120 => Some("UTI"),
677 121 => Some("Simple Message Protocol"),
678 122 => Some("Simple Multicast Protocol"),
679 123 => Some("Performance Transparency Protocol"),
680 124 => None,
681 125 => None,
682 126 => Some("Combat Radio Transport Protocol"),
683 127 => Some("Combat Radio User Datagram"),
684 128 => None,
685 129 => None,
686 130 => Some("Secure Packet Shield"),
687 131 => Some("Private IP Encapsulation within IP"),
688 132 => Some("Stream Control Transmission Protocol"),
689 133 => Some("Fibre Channel"),
690 134 => None,
691 135 => None,
692 136 => None,
693 137 => None,
694 138 => Some("MANET Protocols"),
695 139 => Some("Host Identity Protocol"),
696 140 => Some("Shim6 Protocol"),
697 141 => Some("Wrapped Encapsulating Security Payload"),
698 142 => Some("Robust Header Compression"),
699 143 => Some("Ethernet"),
700 144 => Some("AGGFRAG encapsulation payload for ESP"),
701 145..=252 => None,
702 253 => Some("Use for experimentation and testing"),
703 254 => Some("Use for experimentation and testing"),
704 255 => None,
705 }
706 }
707}
708
709impl Default for IpNumber {
710 #[inline]
711 fn default() -> Self {
712 Self(255)
715 }
716}
717
718impl From<u8> for IpNumber {
719 #[inline]
720 fn from(val: u8) -> Self {
721 Self(val)
722 }
723}
724
725impl From<IpNumber> for u8 {
726 #[inline]
727 fn from(val: IpNumber) -> Self {
728 val.0
729 }
730}
731
732impl core::fmt::Debug for IpNumber {
733 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
734 if let Some(keyword) = self.keyword_str() {
735 if let Some(protocol) = self.protocol_str() {
736 write!(f, "{} ({} - {})", self.0, keyword, protocol)
737 } else {
738 write!(f, "{} ({})", self.0, keyword)
739 }
740 } else if let Some(protocol) = self.protocol_str() {
741 write!(f, "{} ({})", self.0, protocol)
742 } else {
743 write!(f, "{}", self.0)
744 }
745 }
746}
747
748pub mod ip_number {
769 use crate::IpNumber;
770
771 pub const IPV6_HOP_BY_HOP: IpNumber = IpNumber::IPV6_HEADER_HOP_BY_HOP; pub const IPV6_HEADER_HOP_BY_HOP: IpNumber = IpNumber::IPV6_HEADER_HOP_BY_HOP; pub const ICMP: IpNumber = IpNumber::ICMP; pub const IGMP: IpNumber = IpNumber::IGMP; pub const GGP: IpNumber = IpNumber::GGP; pub const IPV4: IpNumber = IpNumber::IPV4; pub const STREAM: IpNumber = IpNumber::STREAM; pub const TCP: IpNumber = IpNumber::TCP; pub const CBT: IpNumber = IpNumber::CBT; pub const EGP: IpNumber = IpNumber::EGP; pub const IGP: IpNumber = IpNumber::IGP; pub const BBN_RCC_MON: IpNumber = IpNumber::BBN_RCC_MON; pub const NVP_II: IpNumber = IpNumber::NVP_II; pub const PUP: IpNumber = IpNumber::PUP; pub const ARGUS: IpNumber = IpNumber::ARGUS; pub const EMCON: IpNumber = IpNumber::EMCON; pub const XNET: IpNumber = IpNumber::XNET; pub const CHAOS: IpNumber = IpNumber::CHAOS; pub const UDP: IpNumber = IpNumber::UDP; pub const MUX: IpNumber = IpNumber::MUX; pub const DCN_MEAS: IpNumber = IpNumber::DCN_MEAS; pub const HMP: IpNumber = IpNumber::HMP; pub const PRM: IpNumber = IpNumber::PRM; pub const XNS_IDP: IpNumber = IpNumber::XNS_IDP; pub const TRUNK1: IpNumber = IpNumber::TRUNK1; pub const TRUNK2: IpNumber = IpNumber::TRUNK2; pub const LEAF1: IpNumber = IpNumber::LEAF1; pub const LEAF2: IpNumber = IpNumber::LEAF2; pub const RDP: IpNumber = IpNumber::RDP; pub const IRTP: IpNumber = IpNumber::IRTP; pub const ISO_TP4: IpNumber = IpNumber::ISO_TP4; pub const NET_BLT: IpNumber = IpNumber::NET_BLT; pub const MFE_NSP: IpNumber = IpNumber::MFE_NSP; pub const MERIT_INP: IpNumber = IpNumber::MERIT_INP; pub const DCCP: IpNumber = IpNumber::DCCP; pub const THIRD_PARTY_CONNECT_PROTOCOL: IpNumber = IpNumber::THIRD_PARTY_CONNECT_PROTOCOL; pub const IDPR: IpNumber = IpNumber::IDPR; pub const XTP: IpNumber = IpNumber::XTP; pub const DDP: IpNumber = IpNumber::DDP; pub const IDPR_CMTP: IpNumber = IpNumber::IDPR_CMTP; pub const TP_PLUS_PLUS: IpNumber = IpNumber::TP_PLUS_PLUS; pub const IL: IpNumber = IpNumber::IL; pub const IPV6: IpNumber = IpNumber::IPV6; pub const SDRP: IpNumber = IpNumber::SDRP; pub const IPV6_ROUTE_HEADER: IpNumber = IpNumber::IPV6_ROUTE_HEADER; pub const IPV6_ROUTE: IpNumber = IpNumber::IPV6_ROUTE_HEADER; pub const IPV6_FRAGMENTATION_HEADER: IpNumber = IpNumber::IPV6_FRAGMENTATION_HEADER; pub const IPV6_FRAG: IpNumber = IpNumber::IPV6_FRAGMENTATION_HEADER; pub const IDRP: IpNumber = IpNumber::IDRP; pub const RSVP: IpNumber = IpNumber::RSVP; pub const GRE: IpNumber = IpNumber::GRE; pub const DSR: IpNumber = IpNumber::DSR; pub const BNA: IpNumber = IpNumber::BNA; pub const ENCAP_SEC: IpNumber = IpNumber::ENCAPSULATING_SECURITY_PAYLOAD; pub const ENCAPSULATING_SECURITY_PAYLOAD: IpNumber = IpNumber::ENCAPSULATING_SECURITY_PAYLOAD; pub const AUTH: IpNumber = IpNumber::AUTHENTICATION_HEADER; pub const AUTHENTICATION_HEADER: IpNumber = IpNumber::AUTHENTICATION_HEADER; pub const INLSP: IpNumber = IpNumber::INLSP; pub const SWIPE: IpNumber = IpNumber::SWIPE; pub const NARP: IpNumber = IpNumber::NARP; pub const MOBILE: IpNumber = IpNumber::MOBILE; pub const TLSP: IpNumber = IpNumber::TLSP; pub const SKIP: IpNumber = IpNumber::SKIP; pub const IPV6_ICMP: IpNumber = IpNumber::IPV6_ICMP; pub const IPV6_NO_NEXT_HEADER: IpNumber = IpNumber::IPV6_NO_NEXT_HEADER; pub const IPV6_DEST_OPTIONS: IpNumber = IpNumber::IPV6_DESTINATION_OPTIONS; pub const IPV6_DESTINATION_OPTIONS: IpNumber = IpNumber::IPV6_DESTINATION_OPTIONS; pub const ANY_HOST_INTERNAL_PROTOCOL: IpNumber = IpNumber::ANY_HOST_INTERNAL_PROTOCOL; pub const CFTP: IpNumber = IpNumber::CFTP; pub const ANY_LOCAL_NETWORK: IpNumber = IpNumber::ANY_LOCAL_NETWORK; pub const SAT_EXPAK: IpNumber = IpNumber::SAT_EXPAK; pub const KRYTOLAN: IpNumber = IpNumber::KRYTOLAN; pub const RVD: IpNumber = IpNumber::RVD; pub const IPPC: IpNumber = IpNumber::IPPC; pub const ANY_DISTRIBUTED_FILE_SYSTEM: IpNumber = IpNumber::ANY_DISTRIBUTED_FILE_SYSTEM; pub const SAT_MON: IpNumber = IpNumber::SAT_MON; pub const VISA: IpNumber = IpNumber::VISA; pub const IPCV: IpNumber = IpNumber::IPCV; pub const CPNX: IpNumber = IpNumber::CPNX; pub const CPHB: IpNumber = IpNumber::CPHB; pub const WSN: IpNumber = IpNumber::WSN; pub const PVP: IpNumber = IpNumber::PVP; pub const BR_SAT_MON: IpNumber = IpNumber::BR_SAT_MON; pub const SUN_ND: IpNumber = IpNumber::SUN_ND; pub const WB_MON: IpNumber = IpNumber::WB_MON; pub const WB_EXPAK: IpNumber = IpNumber::WB_EXPAK; pub const ISO_IP: IpNumber = IpNumber::ISO_IP; pub const VMTP: IpNumber = IpNumber::VMTP; pub const SECURE_VMTP: IpNumber = IpNumber::SECURE_VMTP; pub const VINES: IpNumber = IpNumber::VINES; pub const TTP_OR_IPTM: IpNumber = IpNumber::TTP_OR_IPTM; pub const NSFNET_IGP: IpNumber = IpNumber::NSFNET_IGP; pub const DGP: IpNumber = IpNumber::DGP; pub const TCF: IpNumber = IpNumber::TCF; pub const EIGRP: IpNumber = IpNumber::EIGRP; pub const OSPFIGP: IpNumber = IpNumber::OSPFIGP; pub const SPRITE_RPC: IpNumber = IpNumber::SPRITE_RPC; pub const LARP: IpNumber = IpNumber::LARP; pub const MTP: IpNumber = IpNumber::MTP; pub const AX25: IpNumber = IpNumber::AX25; pub const IPIP: IpNumber = IpNumber::IPIP; pub const MICP: IpNumber = IpNumber::MICP; pub const SCC_SP: IpNumber = IpNumber::SCC_SP; pub const ETHER_IP: IpNumber = IpNumber::ETHER_IP; pub const ENCAP: IpNumber = IpNumber::ENCAP; pub const GMTP: IpNumber = IpNumber::GMTP; pub const IFMP: IpNumber = IpNumber::IFMP; pub const PNNI: IpNumber = IpNumber::PNNI; pub const PIM: IpNumber = IpNumber::PIM; pub const ARIS: IpNumber = IpNumber::ARIS; pub const SCPS: IpNumber = IpNumber::SCPS; pub const QNX: IpNumber = IpNumber::QNX; pub const ACTIVE_NETWORKS: IpNumber = IpNumber::ACTIVE_NETWORKS; pub const IP_COMP: IpNumber = IpNumber::IP_COMP; pub const SITRA_NETWORKS_PROTOCOL: IpNumber = IpNumber::SITRA_NETWORKS_PROTOCOL; pub const COMPAQ_PEER: IpNumber = IpNumber::COMPAQ_PEER; pub const IPX_IN_IP: IpNumber = IpNumber::IPX_IN_IP; pub const VRRP: IpNumber = IpNumber::VRRP; pub const PGM: IpNumber = IpNumber::PGM; pub const ANY_ZERO_HOP_PROTOCOL: IpNumber = IpNumber::ANY_ZERO_HOP_PROTOCOL; pub const LAYER2_TUNNELING_PROTOCOL: IpNumber = IpNumber::LAYER2_TUNNELING_PROTOCOL; pub const DDX: IpNumber = IpNumber::DDX; pub const IATP: IpNumber = IpNumber::IATP; pub const STP: IpNumber = IpNumber::STP; pub const SRP: IpNumber = IpNumber::SRP; pub const UTI: IpNumber = IpNumber::UTI; pub const SIMPLE_MESSAGE_PROTOCOL: IpNumber = IpNumber::SIMPLE_MESSAGE_PROTOCOL; pub const SM: IpNumber = IpNumber::SM; pub const PTP: IpNumber = IpNumber::PTP; pub const ISIS_OVER_IPV4: IpNumber = IpNumber::ISIS_OVER_IPV4; pub const FIRE: IpNumber = IpNumber::FIRE; pub const CRTP: IpNumber = IpNumber::CRTP; pub const CRUDP: IpNumber = IpNumber::CRUDP; pub const SSCOPMCE: IpNumber = IpNumber::SSCOPMCE; pub const IPLT: IpNumber = IpNumber::IPLT; pub const SPS: IpNumber = IpNumber::SPS; pub const PIPE: IpNumber = IpNumber::PIPE; pub const SCTP: IpNumber = IpNumber::SCTP; pub const FC: IpNumber = IpNumber::FC; pub const RSVP_E2E_IGNORE: IpNumber = IpNumber::RSVP_E2E_IGNORE; pub const MOBILITY: IpNumber = IpNumber::MOBILITY_HEADER; pub const MOBILITY_HEADER: IpNumber = IpNumber::MOBILITY_HEADER; pub const UDP_LITE: IpNumber = IpNumber::UDP_LITE; pub const MPLS_IN_IP: IpNumber = IpNumber::MPLS_IN_IP; pub const MANET: IpNumber = IpNumber::MANET; pub const HIP: IpNumber = IpNumber::HIP; pub const SHIM6: IpNumber = IpNumber::SHIM6; pub const WESP: IpNumber = IpNumber::WESP; pub const ROHC: IpNumber = IpNumber::ROHC; pub const EXP0: IpNumber = IpNumber::EXPERIMENTAL_AND_TESTING_0; pub const EXPERIMENTAL_AND_TESTING_0: IpNumber = IpNumber::EXPERIMENTAL_AND_TESTING_0; pub const EXP1: IpNumber = IpNumber::EXPERIMENTAL_AND_TESTING_1; pub const EXPERIMENTAL_AND_TESTING_1: IpNumber = IpNumber::EXPERIMENTAL_AND_TESTING_1;
1077 }
1079
1080#[cfg(test)]
1081mod tests {
1082 use super::*;
1083 use core::{
1084 cmp::Ordering,
1085 hash::{Hash, Hasher},
1086 };
1087 use proptest::prelude::*;
1088 use std::{collections::hash_map::DefaultHasher, format};
1089
1090 #[test]
1091 fn is_ipv6_ext_header_value() {
1092 use crate::ip_number::*;
1093 use crate::IpNumber;
1094 let ext_ids = [
1095 IPV6_HOP_BY_HOP,
1096 IPV6_ROUTE,
1097 IPV6_FRAG,
1098 ENCAP_SEC,
1099 AUTH,
1100 IPV6_DEST_OPTIONS,
1101 MOBILITY,
1102 HIP,
1103 SHIM6,
1104 EXP0,
1105 EXP1,
1106 ];
1107
1108 for i in 0..std::u8::MAX {
1109 assert_eq!(
1110 ext_ids.contains(&IpNumber(i)),
1111 IpNumber(i).is_ipv6_ext_header_value()
1112 );
1113 }
1114 }
1115
1116 #[test]
1117 fn keyword_str() {
1118 assert_eq!(IpNumber(0).keyword_str(), Some("HOPOPT"));
1122 assert_eq!(IpNumber(1).keyword_str(), Some("ICMP"));
1123 assert_eq!(IpNumber(2).keyword_str(), Some("IGMP"));
1124 assert_eq!(IpNumber(3).keyword_str(), Some("GGP"));
1125 assert_eq!(IpNumber(4).keyword_str(), Some("IPv4"));
1126 assert_eq!(IpNumber(5).keyword_str(), Some("ST"));
1127 assert_eq!(IpNumber(6).keyword_str(), Some("TCP"));
1128 assert_eq!(IpNumber(7).keyword_str(), Some("CBT"));
1129 assert_eq!(IpNumber(8).keyword_str(), Some("EGP"));
1130 assert_eq!(IpNumber(9).keyword_str(), Some("IGP"));
1131 assert_eq!(IpNumber(10).keyword_str(), Some("BBN-RCC-MON"));
1132 assert_eq!(IpNumber(11).keyword_str(), Some("NVP-II"));
1133 assert_eq!(IpNumber(12).keyword_str(), Some("PUP"));
1134 assert_eq!(IpNumber(13).keyword_str(), Some("ARGUS (deprecated)"));
1135 assert_eq!(IpNumber(14).keyword_str(), Some("EMCON"));
1136 assert_eq!(IpNumber(15).keyword_str(), Some("XNET"));
1137 assert_eq!(IpNumber(16).keyword_str(), Some("CHAOS"));
1138 assert_eq!(IpNumber(17).keyword_str(), Some("UDP"));
1139 assert_eq!(IpNumber(18).keyword_str(), Some("MUX"));
1140 assert_eq!(IpNumber(19).keyword_str(), Some("DCN-MEAS"));
1141 assert_eq!(IpNumber(20).keyword_str(), Some("HMP"));
1142 assert_eq!(IpNumber(21).keyword_str(), Some("PRM"));
1143 assert_eq!(IpNumber(22).keyword_str(), Some("XNS-IDP"));
1144 assert_eq!(IpNumber(23).keyword_str(), Some("TRUNK-1"));
1145 assert_eq!(IpNumber(24).keyword_str(), Some("TRUNK-2"));
1146 assert_eq!(IpNumber(25).keyword_str(), Some("LEAF-1"));
1147 assert_eq!(IpNumber(26).keyword_str(), Some("LEAF-2"));
1148 assert_eq!(IpNumber(27).keyword_str(), Some("RDP"));
1149 assert_eq!(IpNumber(28).keyword_str(), Some("IRTP"));
1150 assert_eq!(IpNumber(29).keyword_str(), Some("ISO-TP4"));
1151 assert_eq!(IpNumber(30).keyword_str(), Some("NETBLT"));
1152 assert_eq!(IpNumber(31).keyword_str(), Some("MFE-NSP"));
1153 assert_eq!(IpNumber(32).keyword_str(), Some("MERIT-INP"));
1154 assert_eq!(IpNumber(33).keyword_str(), Some("DCCP"));
1155 assert_eq!(IpNumber(34).keyword_str(), Some("3PC"));
1156 assert_eq!(IpNumber(35).keyword_str(), Some("IDPR"));
1157 assert_eq!(IpNumber(36).keyword_str(), Some("XTP"));
1158 assert_eq!(IpNumber(37).keyword_str(), Some("DDP"));
1159 assert_eq!(IpNumber(38).keyword_str(), Some("IDPR-CMTP"));
1160 assert_eq!(IpNumber(39).keyword_str(), Some("TP++"));
1161 assert_eq!(IpNumber(40).keyword_str(), Some("IL"));
1162 assert_eq!(IpNumber(41).keyword_str(), Some("IPv6"));
1163 assert_eq!(IpNumber(42).keyword_str(), Some("SDRP"));
1164 assert_eq!(IpNumber(43).keyword_str(), Some("IPv6-Route"));
1165 assert_eq!(IpNumber(44).keyword_str(), Some("IPv6-Frag"));
1166 assert_eq!(IpNumber(45).keyword_str(), Some("IDRP"));
1167 assert_eq!(IpNumber(46).keyword_str(), Some("RSVP"));
1168 assert_eq!(IpNumber(47).keyword_str(), Some("GRE"));
1169 assert_eq!(IpNumber(48).keyword_str(), Some("DSR"));
1170 assert_eq!(IpNumber(49).keyword_str(), Some("BNA"));
1171 assert_eq!(IpNumber(50).keyword_str(), Some("ESP"));
1172 assert_eq!(IpNumber(51).keyword_str(), Some("AH"));
1173 assert_eq!(IpNumber(52).keyword_str(), Some("I-NLSP"));
1174 assert_eq!(IpNumber(53).keyword_str(), Some("SWIPE (deprecated)"));
1175 assert_eq!(IpNumber(54).keyword_str(), Some("NARP"));
1176 assert_eq!(IpNumber(55).keyword_str(), Some("MOBILE"));
1177 assert_eq!(IpNumber(56).keyword_str(), Some("TLSP"));
1178 assert_eq!(IpNumber(57).keyword_str(), Some("SKIP"));
1179 assert_eq!(IpNumber(58).keyword_str(), Some("IPv6-ICMP"));
1180 assert_eq!(IpNumber(59).keyword_str(), Some("IPv6-NoNxt"));
1181 assert_eq!(IpNumber(60).keyword_str(), Some("IPv6-Opts"));
1182 assert_eq!(IpNumber(61).keyword_str(), None);
1183 assert_eq!(IpNumber(62).keyword_str(), Some("CFTP"));
1184 assert_eq!(IpNumber(63).keyword_str(), None);
1185 assert_eq!(IpNumber(64).keyword_str(), Some("SAT-EXPAK"));
1186 assert_eq!(IpNumber(65).keyword_str(), Some("KRYPTOLAN"));
1187 assert_eq!(IpNumber(66).keyword_str(), Some("RVD"));
1188 assert_eq!(IpNumber(67).keyword_str(), Some("IPPC"));
1189 assert_eq!(IpNumber(68).keyword_str(), None);
1190 assert_eq!(IpNumber(69).keyword_str(), Some("SAT-MON"));
1191 assert_eq!(IpNumber(70).keyword_str(), Some("VISA"));
1192 assert_eq!(IpNumber(71).keyword_str(), Some("IPCV"));
1193 assert_eq!(IpNumber(72).keyword_str(), Some("CPNX"));
1194 assert_eq!(IpNumber(73).keyword_str(), Some("CPHB"));
1195 assert_eq!(IpNumber(74).keyword_str(), Some("WSN"));
1196 assert_eq!(IpNumber(75).keyword_str(), Some("PVP"));
1197 assert_eq!(IpNumber(76).keyword_str(), Some("BR-SAT-MON"));
1198 assert_eq!(IpNumber(77).keyword_str(), Some("SUN-ND"));
1199 assert_eq!(IpNumber(78).keyword_str(), Some("WB-MON"));
1200 assert_eq!(IpNumber(79).keyword_str(), Some("WB-EXPAK"));
1201 assert_eq!(IpNumber(80).keyword_str(), Some("ISO-IP"));
1202 assert_eq!(IpNumber(81).keyword_str(), Some("VMTP"));
1203 assert_eq!(IpNumber(82).keyword_str(), Some("SECURE-VMTP"));
1204 assert_eq!(IpNumber(83).keyword_str(), Some("VINES"));
1205 assert_eq!(IpNumber(84).keyword_str(), Some("IPTM"));
1206 assert_eq!(IpNumber(85).keyword_str(), Some("NSFNET-IGP"));
1207 assert_eq!(IpNumber(86).keyword_str(), Some("DGP"));
1208 assert_eq!(IpNumber(87).keyword_str(), Some("TCF"));
1209 assert_eq!(IpNumber(88).keyword_str(), Some("EIGRP"));
1210 assert_eq!(IpNumber(89).keyword_str(), Some("OSPFIGP"));
1211 assert_eq!(IpNumber(90).keyword_str(), Some("Sprite-RPC"));
1212 assert_eq!(IpNumber(91).keyword_str(), Some("LARP"));
1213 assert_eq!(IpNumber(92).keyword_str(), Some("MTP"));
1214 assert_eq!(IpNumber(93).keyword_str(), Some("AX.25"));
1215 assert_eq!(IpNumber(94).keyword_str(), Some("IPIP"));
1216 assert_eq!(IpNumber(95).keyword_str(), Some("MICP (deprecated)"));
1217 assert_eq!(IpNumber(96).keyword_str(), Some("SCC-SP"));
1218 assert_eq!(IpNumber(97).keyword_str(), Some("ETHERIP"));
1219 assert_eq!(IpNumber(98).keyword_str(), Some("ENCAP"));
1220 assert_eq!(IpNumber(99).keyword_str(), None);
1221 assert_eq!(IpNumber(100).keyword_str(), Some("GMTP"));
1222 assert_eq!(IpNumber(101).keyword_str(), Some("IFMP"));
1223 assert_eq!(IpNumber(102).keyword_str(), Some("PNNI"));
1224 assert_eq!(IpNumber(103).keyword_str(), Some("PIM"));
1225 assert_eq!(IpNumber(104).keyword_str(), Some("ARIS"));
1226 assert_eq!(IpNumber(105).keyword_str(), Some("SCPS"));
1227 assert_eq!(IpNumber(106).keyword_str(), Some("QNX"));
1228 assert_eq!(IpNumber(107).keyword_str(), Some("A/N"));
1229 assert_eq!(IpNumber(108).keyword_str(), Some("IPComp"));
1230 assert_eq!(IpNumber(109).keyword_str(), Some("SNP"));
1231 assert_eq!(IpNumber(110).keyword_str(), Some("Compaq-Peer"));
1232 assert_eq!(IpNumber(111).keyword_str(), Some("IPX-in-IP"));
1233 assert_eq!(IpNumber(112).keyword_str(), Some("VRRP"));
1234 assert_eq!(IpNumber(113).keyword_str(), Some("PGM"));
1235 assert_eq!(IpNumber(114).keyword_str(), None);
1236 assert_eq!(IpNumber(115).keyword_str(), Some("L2TP"));
1237 assert_eq!(IpNumber(116).keyword_str(), Some("DDX"));
1238 assert_eq!(IpNumber(117).keyword_str(), Some("IATP"));
1239 assert_eq!(IpNumber(118).keyword_str(), Some("STP"));
1240 assert_eq!(IpNumber(119).keyword_str(), Some("SRP"));
1241 assert_eq!(IpNumber(120).keyword_str(), Some("UTI"));
1242 assert_eq!(IpNumber(121).keyword_str(), Some("SMP"));
1243 assert_eq!(IpNumber(122).keyword_str(), Some("SM (deprecated)"));
1244 assert_eq!(IpNumber(123).keyword_str(), Some("PTP"));
1245 assert_eq!(IpNumber(124).keyword_str(), Some("ISIS over IPv4"));
1246 assert_eq!(IpNumber(125).keyword_str(), Some("FIRE"));
1247 assert_eq!(IpNumber(126).keyword_str(), Some("CRTP"));
1248 assert_eq!(IpNumber(127).keyword_str(), Some("CRUDP"));
1249 assert_eq!(IpNumber(128).keyword_str(), Some("SSCOPMCE"));
1250 assert_eq!(IpNumber(129).keyword_str(), Some("IPLT"));
1251 assert_eq!(IpNumber(130).keyword_str(), Some("SPS"));
1252 assert_eq!(IpNumber(131).keyword_str(), Some("PIPE"));
1253 assert_eq!(IpNumber(132).keyword_str(), Some("SCTP"));
1254 assert_eq!(IpNumber(133).keyword_str(), Some("FC"));
1255 assert_eq!(IpNumber(134).keyword_str(), Some("RSVP-E2E-IGNORE"));
1256 assert_eq!(IpNumber(135).keyword_str(), Some("Mobility Header"));
1257 assert_eq!(IpNumber(136).keyword_str(), Some("UDPLite"));
1258 assert_eq!(IpNumber(137).keyword_str(), Some("MPLS-in-IP"));
1259 assert_eq!(IpNumber(138).keyword_str(), Some("manet"));
1260 assert_eq!(IpNumber(139).keyword_str(), Some("HIP"));
1261 assert_eq!(IpNumber(140).keyword_str(), Some("Shim6"));
1262 assert_eq!(IpNumber(141).keyword_str(), Some("WESP"));
1263 assert_eq!(IpNumber(142).keyword_str(), Some("ROHC"));
1264 assert_eq!(IpNumber(143).keyword_str(), Some("Ethernet"));
1265 assert_eq!(IpNumber(144).keyword_str(), Some("AGGFRAG"));
1266 for i in 145u8..=252 {
1267 assert_eq!(IpNumber(i).keyword_str(), None);
1268 }
1269 assert_eq!(IpNumber(253).keyword_str(), None);
1270 assert_eq!(IpNumber(254).keyword_str(), None);
1271 assert_eq!(IpNumber(255).keyword_str(), Some("Reserved"));
1272 }
1273
1274 #[test]
1275 fn protocol_str() {
1276 assert_eq!(IpNumber(0).protocol_str(), Some("IPv6 Hop-by-Hop Option"));
1280 assert_eq!(IpNumber(1).protocol_str(), Some("Internet Control Message"));
1281 assert_eq!(
1282 IpNumber(2).protocol_str(),
1283 Some("Internet Group Management")
1284 );
1285 assert_eq!(IpNumber(3).protocol_str(), Some("Gateway-to-Gateway"));
1286 assert_eq!(IpNumber(4).protocol_str(), Some("IPv4 encapsulation"));
1287 assert_eq!(IpNumber(5).protocol_str(), Some("Stream"));
1288 assert_eq!(IpNumber(6).protocol_str(), Some("Transmission Control"));
1289 assert_eq!(IpNumber(7).protocol_str(), Some("CBT"));
1290 assert_eq!(
1291 IpNumber(8).protocol_str(),
1292 Some("Exterior Gateway Protocol")
1293 );
1294 assert_eq!(
1295 IpNumber(9).protocol_str(),
1296 Some("any private interior gateway (used by Cisco for their IGRP)")
1297 );
1298 assert_eq!(IpNumber(10).protocol_str(), Some("BBN RCC Monitoring"));
1299 assert_eq!(IpNumber(11).protocol_str(), Some("Network Voice Protocol"));
1300 assert_eq!(IpNumber(12).protocol_str(), Some("PUP"));
1301 assert_eq!(IpNumber(13).protocol_str(), Some("ARGUS"));
1302 assert_eq!(IpNumber(14).protocol_str(), Some("EMCON"));
1303 assert_eq!(IpNumber(15).protocol_str(), Some("Cross Net Debugger"));
1304 assert_eq!(IpNumber(16).protocol_str(), Some("Chaos"));
1305 assert_eq!(IpNumber(17).protocol_str(), Some("User Datagram"));
1306 assert_eq!(IpNumber(18).protocol_str(), Some("Multiplexing"));
1307 assert_eq!(
1308 IpNumber(19).protocol_str(),
1309 Some("DCN Measurement Subsystems")
1310 );
1311 assert_eq!(IpNumber(20).protocol_str(), Some("Host Monitoring"));
1312 assert_eq!(
1313 IpNumber(21).protocol_str(),
1314 Some("Packet Radio Measurement")
1315 );
1316 assert_eq!(IpNumber(22).protocol_str(), Some("XEROX NS IDP"));
1317 assert_eq!(IpNumber(23).protocol_str(), Some("Trunk-1"));
1318 assert_eq!(IpNumber(24).protocol_str(), Some("Trunk-2"));
1319 assert_eq!(IpNumber(25).protocol_str(), Some("Leaf-1"));
1320 assert_eq!(IpNumber(26).protocol_str(), Some("Leaf-2"));
1321 assert_eq!(IpNumber(27).protocol_str(), Some("Reliable Data Protocol"));
1322 assert_eq!(
1323 IpNumber(28).protocol_str(),
1324 Some("Internet Reliable Transaction")
1325 );
1326 assert_eq!(
1327 IpNumber(29).protocol_str(),
1328 Some("ISO Transport Protocol Class 4")
1329 );
1330 assert_eq!(
1331 IpNumber(30).protocol_str(),
1332 Some("Bulk Data Transfer Protocol")
1333 );
1334 assert_eq!(
1335 IpNumber(31).protocol_str(),
1336 Some("MFE Network Services Protocol")
1337 );
1338 assert_eq!(
1339 IpNumber(32).protocol_str(),
1340 Some("MERIT Internodal Protocol")
1341 );
1342 assert_eq!(
1343 IpNumber(33).protocol_str(),
1344 Some("Datagram Congestion Control Protocol")
1345 );
1346 assert_eq!(
1347 IpNumber(34).protocol_str(),
1348 Some("Third Party Connect Protocol")
1349 );
1350 assert_eq!(
1351 IpNumber(35).protocol_str(),
1352 Some("Inter-Domain Policy Routing Protocol")
1353 );
1354 assert_eq!(IpNumber(36).protocol_str(), Some("XTP"));
1355 assert_eq!(
1356 IpNumber(37).protocol_str(),
1357 Some("Datagram Delivery Protocol")
1358 );
1359 assert_eq!(
1360 IpNumber(38).protocol_str(),
1361 Some("IDPR Control Message Transport Proto")
1362 );
1363 assert_eq!(IpNumber(39).protocol_str(), Some("TP++ Transport Protocol"));
1364 assert_eq!(IpNumber(40).protocol_str(), Some("IL Transport Protocol"));
1365 assert_eq!(IpNumber(41).protocol_str(), Some("IPv6 encapsulation"));
1366 assert_eq!(
1367 IpNumber(42).protocol_str(),
1368 Some("Source Demand Routing Protocol")
1369 );
1370 assert_eq!(IpNumber(43).protocol_str(), Some("Routing Header for IPv6"));
1371 assert_eq!(
1372 IpNumber(44).protocol_str(),
1373 Some("Fragment Header for IPv6")
1374 );
1375 assert_eq!(
1376 IpNumber(45).protocol_str(),
1377 Some("Inter-Domain Routing Protocol")
1378 );
1379 assert_eq!(IpNumber(46).protocol_str(), Some("Reservation Protocol"));
1380 assert_eq!(
1381 IpNumber(47).protocol_str(),
1382 Some("Generic Routing Encapsulation")
1383 );
1384 assert_eq!(
1385 IpNumber(48).protocol_str(),
1386 Some("Dynamic Source Routing Protocol")
1387 );
1388 assert_eq!(IpNumber(49).protocol_str(), Some("BNA"));
1389 assert_eq!(IpNumber(50).protocol_str(), Some("Encap Security Payload"));
1390 assert_eq!(IpNumber(51).protocol_str(), Some("Authentication Header"));
1391 assert_eq!(
1392 IpNumber(52).protocol_str(),
1393 Some("Integrated Net Layer Security TUBA")
1394 );
1395 assert_eq!(IpNumber(53).protocol_str(), Some("IP with Encryption"));
1396 assert_eq!(
1397 IpNumber(54).protocol_str(),
1398 Some("NBMA Address Resolution Protocol")
1399 );
1400 assert_eq!(IpNumber(55).protocol_str(), Some("IP Mobility"));
1401 assert_eq!(
1402 IpNumber(56).protocol_str(),
1403 Some("Transport Layer Security Protocol using Kryptonet key management")
1404 );
1405 assert_eq!(IpNumber(57).protocol_str(), Some("SKIP"));
1406 assert_eq!(IpNumber(58).protocol_str(), Some("ICMP for IPv6"));
1407 assert_eq!(IpNumber(59).protocol_str(), Some("No Next Header for IPv6"));
1408 assert_eq!(
1409 IpNumber(60).protocol_str(),
1410 Some("Destination Options for IPv6")
1411 );
1412 assert_eq!(
1413 IpNumber(61).protocol_str(),
1414 Some("any host internal protocol")
1415 );
1416 assert_eq!(IpNumber(62).protocol_str(), Some("CFTP"));
1417 assert_eq!(IpNumber(63).protocol_str(), Some("any local network"));
1418 assert_eq!(
1419 IpNumber(64).protocol_str(),
1420 Some("SATNET and Backroom EXPAK")
1421 );
1422 assert_eq!(IpNumber(65).protocol_str(), Some("Kryptolan"));
1423 assert_eq!(
1424 IpNumber(66).protocol_str(),
1425 Some("MIT Remote Virtual Disk Protocol")
1426 );
1427 assert_eq!(
1428 IpNumber(67).protocol_str(),
1429 Some("Internet Pluribus Packet Core")
1430 );
1431 assert_eq!(
1432 IpNumber(68).protocol_str(),
1433 Some("any distributed file system")
1434 );
1435 assert_eq!(IpNumber(69).protocol_str(), Some("SATNET Monitoring"));
1436 assert_eq!(IpNumber(70).protocol_str(), Some("VISA Protocol"));
1437 assert_eq!(
1438 IpNumber(71).protocol_str(),
1439 Some("Internet Packet Core Utility")
1440 );
1441 assert_eq!(
1442 IpNumber(72).protocol_str(),
1443 Some("Computer Protocol Network Executive")
1444 );
1445 assert_eq!(
1446 IpNumber(73).protocol_str(),
1447 Some("Computer Protocol Heart Beat")
1448 );
1449 assert_eq!(IpNumber(74).protocol_str(), Some("Wang Span Network"));
1450 assert_eq!(IpNumber(75).protocol_str(), Some("Packet Video Protocol"));
1451 assert_eq!(
1452 IpNumber(76).protocol_str(),
1453 Some("Backroom SATNET Monitoring")
1454 );
1455 assert_eq!(
1456 IpNumber(77).protocol_str(),
1457 Some("SUN ND PROTOCOL-Temporary")
1458 );
1459 assert_eq!(IpNumber(78).protocol_str(), Some("WIDEBAND Monitoring"));
1460 assert_eq!(IpNumber(79).protocol_str(), Some("WIDEBAND EXPAK"));
1461 assert_eq!(IpNumber(80).protocol_str(), Some("ISO Internet Protocol"));
1462 assert_eq!(IpNumber(81).protocol_str(), Some("VMTP"));
1463 assert_eq!(IpNumber(82).protocol_str(), Some("SECURE-VMTP"));
1464 assert_eq!(IpNumber(83).protocol_str(), Some("VINES"));
1465 assert_eq!(
1466 IpNumber(84).protocol_str(),
1467 Some("Internet Protocol Traffic Manager")
1468 );
1469 assert_eq!(IpNumber(85).protocol_str(), Some("NSFNET-IGP"));
1470 assert_eq!(
1471 IpNumber(86).protocol_str(),
1472 Some("Dissimilar Gateway Protocol")
1473 );
1474 assert_eq!(IpNumber(87).protocol_str(), Some("TCF"));
1475 assert_eq!(IpNumber(88).protocol_str(), Some("EIGRP"));
1476 assert_eq!(IpNumber(89).protocol_str(), Some("OSPFIGP"));
1477 assert_eq!(IpNumber(90).protocol_str(), Some("Sprite RPC Protocol"));
1478 assert_eq!(
1479 IpNumber(91).protocol_str(),
1480 Some("Locus Address Resolution Protocol")
1481 );
1482 assert_eq!(
1483 IpNumber(92).protocol_str(),
1484 Some("Multicast Transport Protocol")
1485 );
1486 assert_eq!(IpNumber(93).protocol_str(), Some("AX.25 Frames"));
1487 assert_eq!(
1488 IpNumber(94).protocol_str(),
1489 Some("IP-within-IP Encapsulation Protocol")
1490 );
1491 assert_eq!(
1492 IpNumber(95).protocol_str(),
1493 Some("Mobile Internetworking Control Pro.")
1494 );
1495 assert_eq!(
1496 IpNumber(96).protocol_str(),
1497 Some("Semaphore Communications Sec. Pro.")
1498 );
1499 assert_eq!(
1500 IpNumber(97).protocol_str(),
1501 Some("Ethernet-within-IP Encapsulation")
1502 );
1503 assert_eq!(IpNumber(98).protocol_str(), Some("Encapsulation Header"));
1504 assert_eq!(
1505 IpNumber(99).protocol_str(),
1506 Some("any private encryption scheme")
1507 );
1508 assert_eq!(IpNumber(100).protocol_str(), Some("GMTP"));
1509 assert_eq!(
1510 IpNumber(101).protocol_str(),
1511 Some("Ipsilon Flow Management Protocol")
1512 );
1513 assert_eq!(IpNumber(102).protocol_str(), Some("PNNI over IP"));
1514 assert_eq!(
1515 IpNumber(103).protocol_str(),
1516 Some("Protocol Independent Multicast")
1517 );
1518 assert_eq!(IpNumber(104).protocol_str(), Some("ARIS"));
1519 assert_eq!(IpNumber(105).protocol_str(), Some("SCPS"));
1520 assert_eq!(IpNumber(106).protocol_str(), Some("QNX"));
1521 assert_eq!(IpNumber(107).protocol_str(), Some("Active Networks"));
1522 assert_eq!(
1523 IpNumber(108).protocol_str(),
1524 Some("IP Payload Compression Protocol")
1525 );
1526 assert_eq!(
1527 IpNumber(109).protocol_str(),
1528 Some("Sitara Networks Protocol")
1529 );
1530 assert_eq!(IpNumber(110).protocol_str(), Some("Compaq Peer Protocol"));
1531 assert_eq!(IpNumber(111).protocol_str(), Some("IPX in IP"));
1532 assert_eq!(
1533 IpNumber(112).protocol_str(),
1534 Some("Virtual Router Redundancy Protocol")
1535 );
1536 assert_eq!(
1537 IpNumber(113).protocol_str(),
1538 Some("PGM Reliable Transport Protocol")
1539 );
1540 assert_eq!(IpNumber(114).protocol_str(), Some("any 0-hop protocol"));
1541 assert_eq!(
1542 IpNumber(115).protocol_str(),
1543 Some("Layer Two Tunneling Protocol")
1544 );
1545 assert_eq!(
1546 IpNumber(116).protocol_str(),
1547 Some("D-II Data Exchange (DDX)")
1548 );
1549 assert_eq!(
1550 IpNumber(117).protocol_str(),
1551 Some("Interactive Agent Transfer Protocol")
1552 );
1553 assert_eq!(
1554 IpNumber(118).protocol_str(),
1555 Some("Schedule Transfer Protocol")
1556 );
1557 assert_eq!(
1558 IpNumber(119).protocol_str(),
1559 Some("SpectraLink Radio Protocol")
1560 );
1561 assert_eq!(IpNumber(120).protocol_str(), Some("UTI"));
1562 assert_eq!(
1563 IpNumber(121).protocol_str(),
1564 Some("Simple Message Protocol")
1565 );
1566 assert_eq!(
1567 IpNumber(122).protocol_str(),
1568 Some("Simple Multicast Protocol")
1569 );
1570 assert_eq!(
1571 IpNumber(123).protocol_str(),
1572 Some("Performance Transparency Protocol")
1573 );
1574 assert_eq!(IpNumber(124).protocol_str(), None);
1575 assert_eq!(IpNumber(125).protocol_str(), None);
1576 assert_eq!(
1577 IpNumber(126).protocol_str(),
1578 Some("Combat Radio Transport Protocol")
1579 );
1580 assert_eq!(
1581 IpNumber(127).protocol_str(),
1582 Some("Combat Radio User Datagram")
1583 );
1584 assert_eq!(IpNumber(128).protocol_str(), None);
1585 assert_eq!(IpNumber(129).protocol_str(), None);
1586 assert_eq!(IpNumber(130).protocol_str(), Some("Secure Packet Shield"));
1587 assert_eq!(
1588 IpNumber(131).protocol_str(),
1589 Some("Private IP Encapsulation within IP")
1590 );
1591 assert_eq!(
1592 IpNumber(132).protocol_str(),
1593 Some("Stream Control Transmission Protocol")
1594 );
1595 assert_eq!(IpNumber(133).protocol_str(), Some("Fibre Channel"));
1596 assert_eq!(IpNumber(134).protocol_str(), None);
1597 assert_eq!(IpNumber(135).protocol_str(), None);
1598 assert_eq!(IpNumber(136).protocol_str(), None);
1599 assert_eq!(IpNumber(137).protocol_str(), None);
1600 assert_eq!(IpNumber(138).protocol_str(), Some("MANET Protocols"));
1601 assert_eq!(IpNumber(139).protocol_str(), Some("Host Identity Protocol"));
1602 assert_eq!(IpNumber(140).protocol_str(), Some("Shim6 Protocol"));
1603 assert_eq!(
1604 IpNumber(141).protocol_str(),
1605 Some("Wrapped Encapsulating Security Payload")
1606 );
1607 assert_eq!(
1608 IpNumber(142).protocol_str(),
1609 Some("Robust Header Compression")
1610 );
1611 assert_eq!(IpNumber(143).protocol_str(), Some("Ethernet"));
1612 assert_eq!(
1613 IpNumber(144).protocol_str(),
1614 Some("AGGFRAG encapsulation payload for ESP")
1615 );
1616 for i in 145u8..=252 {
1617 assert_eq!(IpNumber(i).protocol_str(), None);
1618 }
1619 assert_eq!(
1620 IpNumber(253).protocol_str(),
1621 Some("Use for experimentation and testing")
1622 );
1623 assert_eq!(
1624 IpNumber(254).protocol_str(),
1625 Some("Use for experimentation and testing")
1626 );
1627 assert_eq!(IpNumber(255).protocol_str(), None);
1628 }
1629
1630 #[test]
1631 fn ip_number_eq_check() {
1632 use crate::ip_number::*;
1633 use crate::IpNumber;
1634 let pairs = &[
1635 (IPV6_HOP_BY_HOP, IpNumber::IPV6_HEADER_HOP_BY_HOP),
1636 (IPV6_HEADER_HOP_BY_HOP, IpNumber::IPV6_HEADER_HOP_BY_HOP),
1637 (ICMP, IpNumber::ICMP),
1638 (IGMP, IpNumber::IGMP),
1639 (GGP, IpNumber::GGP),
1640 (IPV4, IpNumber::IPV4),
1641 (STREAM, IpNumber::STREAM),
1642 (TCP, IpNumber::TCP),
1643 (CBT, IpNumber::CBT),
1644 (EGP, IpNumber::EGP),
1645 (IGP, IpNumber::IGP),
1646 (BBN_RCC_MON, IpNumber::BBN_RCC_MON),
1647 (NVP_II, IpNumber::NVP_II),
1648 (PUP, IpNumber::PUP),
1649 (ARGUS, IpNumber::ARGUS),
1650 (EMCON, IpNumber::EMCON),
1651 (XNET, IpNumber::XNET),
1652 (CHAOS, IpNumber::CHAOS),
1653 (UDP, IpNumber::UDP),
1654 (MUX, IpNumber::MUX),
1655 (DCN_MEAS, IpNumber::DCN_MEAS),
1656 (HMP, IpNumber::HMP),
1657 (PRM, IpNumber::PRM),
1658 (XNS_IDP, IpNumber::XNS_IDP),
1659 (TRUNK1, IpNumber::TRUNK1),
1660 (TRUNK2, IpNumber::TRUNK2),
1661 (LEAF1, IpNumber::LEAF1),
1662 (LEAF2, IpNumber::LEAF2),
1663 (RDP, IpNumber::RDP),
1664 (IRTP, IpNumber::IRTP),
1665 (ISO_TP4, IpNumber::ISO_TP4),
1666 (NET_BLT, IpNumber::NET_BLT),
1667 (MFE_NSP, IpNumber::MFE_NSP),
1668 (MERIT_INP, IpNumber::MERIT_INP),
1669 (DCCP, IpNumber::DCCP),
1670 (
1671 THIRD_PARTY_CONNECT_PROTOCOL,
1672 IpNumber::THIRD_PARTY_CONNECT_PROTOCOL,
1673 ),
1674 (IDPR, IpNumber::IDPR),
1675 (XTP, IpNumber::XTP),
1676 (DDP, IpNumber::DDP),
1677 (IDPR_CMTP, IpNumber::IDPR_CMTP),
1678 (TP_PLUS_PLUS, IpNumber::TP_PLUS_PLUS),
1679 (IL, IpNumber::IL),
1680 (IPV6, IpNumber::IPV6),
1681 (SDRP, IpNumber::SDRP),
1682 (IPV6_ROUTE_HEADER, IpNumber::IPV6_ROUTE_HEADER),
1683 (IPV6_ROUTE, IpNumber::IPV6_ROUTE_HEADER),
1684 (
1685 IPV6_FRAGMENTATION_HEADER,
1686 IpNumber::IPV6_FRAGMENTATION_HEADER,
1687 ),
1688 (IPV6_FRAG, IpNumber::IPV6_FRAGMENTATION_HEADER),
1689 (IDRP, IpNumber::IDRP),
1690 (RSVP, IpNumber::RSVP),
1691 (GRE, IpNumber::GRE),
1692 (DSR, IpNumber::DSR),
1693 (BNA, IpNumber::BNA),
1694 (ENCAP_SEC, IpNumber::ENCAPSULATING_SECURITY_PAYLOAD),
1695 (
1696 ENCAPSULATING_SECURITY_PAYLOAD,
1697 IpNumber::ENCAPSULATING_SECURITY_PAYLOAD,
1698 ),
1699 (AUTH, IpNumber::AUTHENTICATION_HEADER),
1700 (AUTHENTICATION_HEADER, IpNumber::AUTHENTICATION_HEADER),
1701 (INLSP, IpNumber::INLSP),
1702 (SWIPE, IpNumber::SWIPE),
1703 (NARP, IpNumber::NARP),
1704 (MOBILE, IpNumber::MOBILE),
1705 (TLSP, IpNumber::TLSP),
1706 (SKIP, IpNumber::SKIP),
1707 (IPV6_ICMP, IpNumber::IPV6_ICMP),
1708 (IPV6_NO_NEXT_HEADER, IpNumber::IPV6_NO_NEXT_HEADER),
1709 (IPV6_DEST_OPTIONS, IpNumber::IPV6_DESTINATION_OPTIONS),
1710 (IPV6_DESTINATION_OPTIONS, IpNumber::IPV6_DESTINATION_OPTIONS),
1711 (
1712 ANY_HOST_INTERNAL_PROTOCOL,
1713 IpNumber::ANY_HOST_INTERNAL_PROTOCOL,
1714 ),
1715 (CFTP, IpNumber::CFTP),
1716 (ANY_LOCAL_NETWORK, IpNumber::ANY_LOCAL_NETWORK),
1717 (SAT_EXPAK, IpNumber::SAT_EXPAK),
1718 (KRYTOLAN, IpNumber::KRYTOLAN),
1719 (RVD, IpNumber::RVD),
1720 (IPPC, IpNumber::IPPC),
1721 (
1722 ANY_DISTRIBUTED_FILE_SYSTEM,
1723 IpNumber::ANY_DISTRIBUTED_FILE_SYSTEM,
1724 ),
1725 (SAT_MON, IpNumber::SAT_MON),
1726 (VISA, IpNumber::VISA),
1727 (IPCV, IpNumber::IPCV),
1728 (CPNX, IpNumber::CPNX),
1729 (CPHB, IpNumber::CPHB),
1730 (WSN, IpNumber::WSN),
1731 (PVP, IpNumber::PVP),
1732 (BR_SAT_MON, IpNumber::BR_SAT_MON),
1733 (SUN_ND, IpNumber::SUN_ND),
1734 (WB_MON, IpNumber::WB_MON),
1735 (WB_EXPAK, IpNumber::WB_EXPAK),
1736 (ISO_IP, IpNumber::ISO_IP),
1737 (VMTP, IpNumber::VMTP),
1738 (SECURE_VMTP, IpNumber::SECURE_VMTP),
1739 (VINES, IpNumber::VINES),
1740 (TTP_OR_IPTM, IpNumber::TTP_OR_IPTM),
1741 (NSFNET_IGP, IpNumber::NSFNET_IGP),
1742 (DGP, IpNumber::DGP),
1743 (TCF, IpNumber::TCF),
1744 (EIGRP, IpNumber::EIGRP),
1745 (OSPFIGP, IpNumber::OSPFIGP),
1746 (SPRITE_RPC, IpNumber::SPRITE_RPC),
1747 (LARP, IpNumber::LARP),
1748 (MTP, IpNumber::MTP),
1749 (AX25, IpNumber::AX25),
1750 (IPIP, IpNumber::IPIP),
1751 (MICP, IpNumber::MICP),
1752 (SCC_SP, IpNumber::SCC_SP),
1753 (ETHER_IP, IpNumber::ETHER_IP),
1754 (ENCAP, IpNumber::ENCAP),
1755 (GMTP, IpNumber::GMTP),
1756 (IFMP, IpNumber::IFMP),
1757 (PNNI, IpNumber::PNNI),
1758 (PIM, IpNumber::PIM),
1759 (ARIS, IpNumber::ARIS),
1760 (SCPS, IpNumber::SCPS),
1761 (QNX, IpNumber::QNX),
1762 (ACTIVE_NETWORKS, IpNumber::ACTIVE_NETWORKS),
1763 (IP_COMP, IpNumber::IP_COMP),
1764 (SITRA_NETWORKS_PROTOCOL, IpNumber::SITRA_NETWORKS_PROTOCOL),
1765 (COMPAQ_PEER, IpNumber::COMPAQ_PEER),
1766 (IPX_IN_IP, IpNumber::IPX_IN_IP),
1767 (VRRP, IpNumber::VRRP),
1768 (PGM, IpNumber::PGM),
1769 (ANY_ZERO_HOP_PROTOCOL, IpNumber::ANY_ZERO_HOP_PROTOCOL),
1770 (
1771 LAYER2_TUNNELING_PROTOCOL,
1772 IpNumber::LAYER2_TUNNELING_PROTOCOL,
1773 ),
1774 (DDX, IpNumber::DDX),
1775 (IATP, IpNumber::IATP),
1776 (STP, IpNumber::STP),
1777 (SRP, IpNumber::SRP),
1778 (UTI, IpNumber::UTI),
1779 (SIMPLE_MESSAGE_PROTOCOL, IpNumber::SIMPLE_MESSAGE_PROTOCOL),
1780 (SM, IpNumber::SM),
1781 (PTP, IpNumber::PTP),
1782 (ISIS_OVER_IPV4, IpNumber::ISIS_OVER_IPV4),
1783 (FIRE, IpNumber::FIRE),
1784 (CRTP, IpNumber::CRTP),
1785 (CRUDP, IpNumber::CRUDP),
1786 (SSCOPMCE, IpNumber::SSCOPMCE),
1787 (IPLT, IpNumber::IPLT),
1788 (SPS, IpNumber::SPS),
1789 (PIPE, IpNumber::PIPE),
1790 (SCTP, IpNumber::SCTP),
1791 (FC, IpNumber::FC),
1792 (RSVP_E2E_IGNORE, IpNumber::RSVP_E2E_IGNORE),
1793 (MOBILITY, IpNumber::MOBILITY_HEADER),
1794 (MOBILITY_HEADER, IpNumber::MOBILITY_HEADER),
1795 (UDP_LITE, IpNumber::UDP_LITE),
1796 (MPLS_IN_IP, IpNumber::MPLS_IN_IP),
1797 (MANET, IpNumber::MANET),
1798 (HIP, IpNumber::HIP),
1799 (SHIM6, IpNumber::SHIM6),
1800 (WESP, IpNumber::WESP),
1801 (ROHC, IpNumber::ROHC),
1802 (EXP0, IpNumber::EXPERIMENTAL_AND_TESTING_0),
1803 (
1804 EXPERIMENTAL_AND_TESTING_0,
1805 IpNumber::EXPERIMENTAL_AND_TESTING_0,
1806 ),
1807 (EXP1, IpNumber::EXPERIMENTAL_AND_TESTING_1),
1808 (
1809 EXPERIMENTAL_AND_TESTING_1,
1810 IpNumber::EXPERIMENTAL_AND_TESTING_1,
1811 ),
1812 ];
1813 for (raw, enum_value) in pairs {
1814 assert_eq!(*raw, *enum_value);
1815 }
1816 }
1817
1818 #[test]
1819 fn default() {
1820 let actual: IpNumber = Default::default();
1821 assert_eq!(actual, IpNumber(255));
1822 }
1823
1824 proptest! {
1825 #[test]
1826 fn into(num in any::<u8>()) {
1827 {
1828 let converted: u8 = IpNumber(num).into();
1829 assert_eq!(converted, num);
1830 }
1831 {
1832 let converted: IpNumber = num.into();
1833 assert_eq!(converted, IpNumber(num));
1834 }
1835 }
1836 }
1837
1838 proptest! {
1839 #[test]
1840 fn from(num in any::<u8>()) {
1841 {
1842 let converted: u8 = u8::from(IpNumber(num));
1843 assert_eq!(converted, num);
1844 }
1845 {
1846 let converted: IpNumber = IpNumber::from(num);
1847 assert_eq!(converted, IpNumber(num));
1848 }
1849 }
1850 }
1851
1852 #[test]
1853 fn debug() {
1854 assert_eq!(
1856 format!("{:?}", IpNumber::UDP),
1857 format!("17 (UDP - User Datagram)")
1858 );
1859 assert_eq!(
1861 format!("{:?}", IpNumber::MOBILITY_HEADER),
1862 format!("135 (Mobility Header)")
1863 );
1864 assert_eq!(
1866 format!("{:?}", IpNumber(253)),
1867 format!("253 (Use for experimentation and testing)")
1868 );
1869 assert_eq!(format!("{:?}", IpNumber(145)), format!("145"));
1871 }
1872
1873 #[test]
1874 fn clone_eq_hash_ord() {
1875 let value = IpNumber::IPV6_HEADER_HOP_BY_HOP;
1877 assert_eq!(value, value.clone());
1878 let a_hash = {
1880 let mut s = DefaultHasher::new();
1881 value.hash(&mut s);
1882 s.finish()
1883 };
1884 let b_hash = {
1885 let mut s = DefaultHasher::new();
1886 value.hash(&mut s);
1887 s.finish()
1888 };
1889 assert_eq!(a_hash, b_hash);
1890 assert_eq!(value.cmp(&value.clone()), Ordering::Equal);
1892 assert!(value.ge(&value.clone()));
1893 }
1894}