• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /// This type has been deprecated please use [IpNumber] instead.
2 ///
3 /// IPv6 headers have a field called `traffic_class` which has nothing
4 /// to do this enum. This unlucky coincedence got even the developer
5 /// of this library confused enough to write that the next header number
6 /// should be written into the `traffic_class` field instead of the
7 /// `next_header` field.
8 ///
9 /// To avoid such confusions in the future the enum has been renamed
10 /// to [IpNumber], which also closer to the name
11 /// "Assigned Internet Protocol Numbers" used on iana.org .
12 #[deprecated(since = "0.10.1", note = "Please use the type IpNumber instead")]
13 pub type IpTrafficClass = IpNumber;
14 
15 /// Identifiers for the next_header field in ipv6 headers and protocol field in ipv4 headers.
16 ///
17 /// You can access the underlying `u8` value by using `.0` and any `u8`
18 /// can be converted to an `IpNumber`:
19 ///
20 /// ```
21 /// use etherparse::IpNumber;
22 ///
23 /// assert_eq!(IpNumber::TCP.0, 6);
24 /// assert_eq!(IpNumber::TCP, IpNumber(6));
25 ///
26 /// // convert to IpNumber using the from & into trait
27 /// let ip_num: IpNumber = 6.into();
28 /// assert_eq!(IpNumber::TCP, ip_num);
29 ///
30 /// // convert to u8 using the from & into trait
31 /// let num: u8 = IpNumber::TCP.into();
32 /// assert_eq!(6, num);
33 /// ```
34 ///
35 /// The constants are also defined in the `ip_number` module so they can
36 /// be used without the need to write `IpNumber::` in front of them:
37 ///
38 /// ```
39 /// use etherparse::{ip_number::TCP, IpNumber};
40 ///
41 /// assert_eq!(TCP, IpNumber::TCP);
42 /// ```
43 ///
44 /// The list original values were copied from
45 /// <https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml>
46 #[derive(PartialEq, Eq, Clone, Copy, Hash, Ord, PartialOrd)]
47 pub struct IpNumber(pub u8);
48 
49 impl IpNumber {
50     /// IPv6 Hop-by-Hop Option \[[RFC8200](https://datatracker.ietf.org/doc/html/rfc8200)\]
51     pub const IPV6_HEADER_HOP_BY_HOP: IpNumber = Self(0);
52     /// Internet Control Message \[[RFC792](https://datatracker.ietf.org/doc/html/rfc792)\]
53     pub const ICMP: IpNumber = Self(1);
54     /// Internet Group Management \[[RFC1112](https://datatracker.ietf.org/doc/html/rfc1112)\]
55     pub const IGMP: IpNumber = Self(2);
56     /// Gateway-to-Gateway \[[RFC823](https://datatracker.ietf.org/doc/html/rfc823)\]
57     pub const GGP: IpNumber = Self(3);
58     /// IPv4 encapsulation \[[RFC2003](https://datatracker.ietf.org/doc/html/rfc2003)\]
59     pub const IPV4: IpNumber = Self(4);
60     /// Stream \[[RFC1190](https://datatracker.ietf.org/doc/html/rfc1190)\] \[[RFC1819](https://datatracker.ietf.org/doc/html/rfc1819)\]
61     pub const STREAM: IpNumber = Self(5);
62     /// Transmission Control \[[RFC793](https://datatracker.ietf.org/doc/html/rfc793)\]
63     pub const TCP: IpNumber = Self(6);
64     /// CBT \[Tony_Ballardie\]
65     pub const CBT: IpNumber = Self(7);
66     /// Exterior Gateway Protocol \[[RFC888](https://datatracker.ietf.org/doc/html/rfc888)\] \[David_Mills\]
67     pub const EGP: IpNumber = Self(8);
68     /// any private interior gateway (used by Cisco for their IGRP) \[Internet_Assigned_Numbers_Authority\]
69     pub const IGP: IpNumber = Self(9);
70     /// BBN RCC Monitoring \[Steve_Chipman\]
71     pub const BBN_RCC_MON: IpNumber = Self(10);
72     /// Network Voice Protocol \[[RFC741](https://datatracker.ietf.org/doc/html/rfc741)\]\[Steve_Casner\]
73     pub const NVP_II: IpNumber = Self(11);
74     /// PUP
75     pub const PUP: IpNumber = Self(12);
76     /// ARGUS (deprecated) \[Robert_W_Scheifler\]
77     pub const ARGUS: IpNumber = Self(13);
78     /// EMCON \[mystery contact\]
79     pub const EMCON: IpNumber = Self(14);
80     /// Cross Net Debugger \[Haverty, J., "XNET Formats for Internet Protocol Version 4", IEN 158, October 1980.\]\[Jack_Haverty\]
81     pub const XNET: IpNumber = Self(15);
82     /// Chaos \[J_Noel_Chiappa\]
83     pub const CHAOS: IpNumber = Self(16);
84     /// User Datagram \[[RFC768](https://datatracker.ietf.org/doc/html/rfc768)\]\[Jon_Postel\]
85     pub const UDP: IpNumber = Self(17);
86     /// Multiplexing \[Cohen, D. and J. Postel, "Multiplexing Protocol", IEN 90, USC/Information Sciences Institute, May 1979.\]\[Jon_Postel\]
87     pub const MUX: IpNumber = Self(18);
88     /// DCN Measurement Subsystems \[David_Mills\]
89     pub const DCN_MEAS: IpNumber = Self(19);
90     /// Host Monitoring \[[RFC869](https://datatracker.ietf.org/doc/html/rfc869)\]\[Bob_Hinden\]
91     pub const HMP: IpNumber = Self(20);
92     /// Packet Radio Measurement \[Zaw_Sing_Su\]
93     pub const PRM: IpNumber = Self(21);
94     /// XEROX NS IDP
95     pub const XNS_IDP: IpNumber = Self(22);
96     /// Trunk-1 \[Barry_Boehm\]
97     pub const TRUNK1: IpNumber = Self(23);
98     /// Trunk-2 \[Barry_Boehm\]
99     pub const TRUNK2: IpNumber = Self(24);
100     /// Leaf-1 \[Barry_Boehm\]
101     pub const LEAF1: IpNumber = Self(25);
102     /// Leaf-2 \[Barry_Boehm\]
103     pub const LEAF2: IpNumber = Self(26);
104     /// Reliable Data Protocol \[[RFC908](https://datatracker.ietf.org/doc/html/rfc908)\] \[Bob_Hinden\]
105     pub const RDP: IpNumber = Self(27);
106     /// Internet Reliable Transaction \[[RFC938](https://datatracker.ietf.org/doc/html/rfc938)\] \[Trudy_Miller\]
107     pub const IRTP: IpNumber = Self(28);
108     /// ISO Transport Protocol Class 4 \[[RFC905](https://datatracker.ietf.org/doc/html/rfc905)\] \[mystery contact\]
109     pub const ISO_TP4: IpNumber = Self(29);
110     /// Bulk Data Transfer Protocol \[[RFC969](https://datatracker.ietf.org/doc/html/rfc969)\] \[David_Clark\]
111     pub const NET_BLT: IpNumber = Self(30);
112     /// MFE Network Services Protocol \[Shuttleworth, B., "A Documentary of MFENet, a National Computer Network", UCRL-52317, Lawrence Livermore Labs, Livermore, California, June 1977.\] \[Barry_Howard\]
113     pub const MFE_NSP: IpNumber = Self(31);
114     /// MERIT Internodal Protocol \[Hans_Werner_Braun\]
115     pub const MERIT_INP: IpNumber = Self(32);
116     /// Datagram Congestion Control Protocol \[[RFC4340](https://datatracker.ietf.org/doc/html/rfc4340)\]
117     pub const DCCP: IpNumber = Self(33);
118     /// Third Party Connect Protocol \[Stuart_A_Friedberg\]
119     pub const THIRD_PARTY_CONNECT_PROTOCOL: IpNumber = Self(34);
120     /// Inter-Domain Policy Routing Protocol \[Martha_Steenstrup\]
121     pub const IDPR: IpNumber = Self(35);
122     /// XTP \[Greg_Chesson\]
123     pub const XTP: IpNumber = Self(36);
124     /// Datagram Delivery Protocol \[Wesley_Craig\]
125     pub const DDP: IpNumber = Self(37);
126     /// IDPR Control Message Transport Proto \[Martha_Steenstrup\]
127     pub const IDPR_CMTP: IpNumber = Self(38);
128     /// TP++ Transport Protocol \[Dirk_Fromhein\]
129     pub const TP_PLUS_PLUS: IpNumber = Self(39);
130     /// IL Transport Protocol \[Dave_Presotto\]
131     pub const IL: IpNumber = Self(40);
132     /// IPv6 encapsulation \[[RFC2473](https://datatracker.ietf.org/doc/html/rfc2473)\]
133     pub const IPV6: IpNumber = Self(41);
134     /// Source Demand Routing Protocol \[Deborah_Estrin\]
135     pub const SDRP: IpNumber = Self(42);
136     /// Routing Header for IPv6 \[Steve_Deering\]
137     pub const IPV6_ROUTE_HEADER: IpNumber = Self(43);
138     /// Fragment Header for IPv6 \[Steve_Deering\]
139     pub const IPV6_FRAGMENTATION_HEADER: IpNumber = Self(44);
140     /// Inter-Domain Routing Protocol \[Sue_Hares\]
141     pub const IDRP: IpNumber = Self(45);
142     /// Reservation Protocol \[[RFC2205](https://datatracker.ietf.org/doc/html/rfc2205)\]\[[RFC3209](https://datatracker.ietf.org/doc/html/rfc3209)\]\[Bob_Braden\]
143     pub const RSVP: IpNumber = Self(46);
144     /// Generic Routing Encapsulation \[[RFC2784](https://datatracker.ietf.org/doc/html/rfc2784)\]\[Tony_Li\]
145     pub const GRE: IpNumber = Self(47);
146     /// Dynamic Source Routing Protocol \[[RFC4728](https://datatracker.ietf.org/doc/html/rfc4728)\]
147     pub const DSR: IpNumber = Self(48);
148     /// BNA \[Gary Salamon\]
149     pub const BNA: IpNumber = Self(49);
150     /// Encapsulating Security Payload \[[RFC4303](https://datatracker.ietf.org/doc/html/rfc4303)\]
151     pub const ENCAPSULATING_SECURITY_PAYLOAD: IpNumber = Self(50);
152     /// Authentication Header \[[RFC4302](https://datatracker.ietf.org/doc/html/rfc4302)\]
153     pub const AUTHENTICATION_HEADER: IpNumber = Self(51);
154     /// Integrated Net Layer Security  TUBA \[K_Robert_Glenn\]
155     pub const INLSP: IpNumber = Self(52);
156     /// IP with Encryption (deprecated) \[John_Ioannidis\]
157     pub const SWIPE: IpNumber = Self(53);
158     /// NBMA Address Resolution Protocol \[[RFC1735](https://datatracker.ietf.org/doc/html/rfc1735)\]
159     pub const NARP: IpNumber = Self(54);
160     /// IP Mobility \[Charlie_Perkins\]
161     pub const MOBILE: IpNumber = Self(55);
162     /// Transport Layer Security Protocol using Kryptonet key management \[Christer_Oberg\]
163     pub const TLSP: IpNumber = Self(56);
164     /// SKIP \[Tom_Markson\]
165     pub const SKIP: IpNumber = Self(57);
166     /// ICMP for IPv6 \[[RFC8200](https://datatracker.ietf.org/doc/html/rfc8200)\]
167     pub const IPV6_ICMP: IpNumber = Self(58);
168     /// No Next Header for IPv6 \[[RFC8200](https://datatracker.ietf.org/doc/html/rfc8200)\]
169     pub const IPV6_NO_NEXT_HEADER: IpNumber = Self(59);
170     /// Destination Options for IPv6 \[[RFC8200](https://datatracker.ietf.org/doc/html/rfc8200)\]
171     pub const IPV6_DESTINATION_OPTIONS: IpNumber = Self(60);
172     /// any host internal protocol \[Internet_Assigned_Numbers_Authority\]
173     pub const ANY_HOST_INTERNAL_PROTOCOL: IpNumber = Self(61);
174     /// CFTP \[Forsdick, H., "CFTP", Network Message, Bolt Beranek and Newman, January 1982.\]\[Harry_Forsdick\]
175     pub const CFTP: IpNumber = Self(62);
176     /// any local network \[Internet_Assigned_Numbers_Authority\]
177     pub const ANY_LOCAL_NETWORK: IpNumber = Self(63);
178     /// SATNET and Backroom EXPAK \[Steven_Blumenthal\]
179     pub const SAT_EXPAK: IpNumber = Self(64);
180     /// Kryptolan \[Paul Liu\]
181     pub const KRYTOLAN: IpNumber = Self(65);
182     /// MIT Remote Virtual Disk Protocol \[Michael_Greenwald\]
183     pub const RVD: IpNumber = Self(66);
184     /// Internet Pluribus Packet Core \[Steven_Blumenthal\]
185     pub const IPPC: IpNumber = Self(67);
186     /// any distributed file system \[Internet_Assigned_Numbers_Authority\]
187     pub const ANY_DISTRIBUTED_FILE_SYSTEM: IpNumber = Self(68);
188     /// SATNET Monitoring \[Steven_Blumenthal\]
189     pub const SAT_MON: IpNumber = Self(69);
190     /// VISA Protocol \[Gene_Tsudik\]
191     pub const VISA: IpNumber = Self(70);
192     /// Internet Packet Core Utility \[Steven_Blumenthal\]
193     pub const IPCV: IpNumber = Self(71);
194     /// Computer Protocol Network Executive \[David Mittnacht\]
195     pub const CPNX: IpNumber = Self(72);
196     /// Computer Protocol Heart Beat \[David Mittnacht\]
197     pub const CPHB: IpNumber = Self(73);
198     /// Wang Span Network \[Victor Dafoulas\]
199     pub const WSN: IpNumber = Self(74);
200     /// Packet Video Protocol \[Steve_Casner\]
201     pub const PVP: IpNumber = Self(75);
202     /// Backroom SATNET Monitoring \[Steven_Blumenthal\]
203     pub const BR_SAT_MON: IpNumber = Self(76);
204     /// SUN ND PROTOCOL-Temporary \[William_Melohn\]
205     pub const SUN_ND: IpNumber = Self(77);
206     /// WIDEBAND Monitoring \[Steven_Blumenthal\]
207     pub const WB_MON: IpNumber = Self(78);
208     /// WIDEBAND EXPAK \[Steven_Blumenthal\]
209     pub const WB_EXPAK: IpNumber = Self(79);
210     /// ISO Internet Protocol \[Marshall_T_Rose\]
211     pub const ISO_IP: IpNumber = Self(80);
212     /// VMTP \[Dave_Cheriton\]
213     pub const VMTP: IpNumber = Self(81);
214     /// SECURE-VMTP \[Dave_Cheriton\]
215     pub const SECURE_VMTP: IpNumber = Self(82);
216     /// VINES \[Brian Horn\]
217     pub const VINES: IpNumber = Self(83);
218     /// Transaction Transport Protocol or Internet Protocol Traffic Manager \[Jim_Stevens\]
219     pub const TTP_OR_IPTM: IpNumber = Self(84);
220     /// NSFNET-IGP \[Hans_Werner_Braun\]
221     pub const NSFNET_IGP: IpNumber = Self(85);
222     /// Dissimilar Gateway Protocol \[M/A-COM Government Systems, "Dissimilar Gateway Protocol Specification, Draft Version", Contract no. CS901145, November 16, 1987.\]\[Mike_Little\]
223     pub const DGP: IpNumber = Self(86);
224     /// TCF \[Guillermo_A_Loyola\]
225     pub const TCF: IpNumber = Self(87);
226     /// EIGRP \[[RFC7868](https://datatracker.ietf.org/doc/html/rfc7868)\]
227     pub const EIGRP: IpNumber = Self(88);
228     /// OSPFIGP \[[RFC1583](https://datatracker.ietf.org/doc/html/rfc1583)\]\[[RFC2328](https://datatracker.ietf.org/doc/html/rfc2328)\]\[[RFC5340](https://datatracker.ietf.org/doc/html/rfc5340)\]\[John_Moy\]
229     pub const OSPFIGP: IpNumber = Self(89);
230     /// Sprite RPC Protocol \[Welch, B., "The Sprite Remote Procedure Call System", Technical Report, UCB/Computer Science Dept., 86/302, University of California at Berkeley, June 1986.\]\[Bruce Willins\]
231     pub const SPRITE_RPC: IpNumber = Self(90);
232     /// Locus Address Resolution Protocol \[Brian Horn\]
233     pub const LARP: IpNumber = Self(91);
234     /// Multicast Transport Protocol \[Susie_Armstrong\]
235     pub const MTP: IpNumber = Self(92);
236     /// AX.25 Frames \[Brian_Kantor\]
237     pub const AX25: IpNumber = Self(93);
238     /// IP-within-IP Encapsulation Protocol \[John_Ioannidis\]
239     pub const IPIP: IpNumber = Self(94);
240     /// Mobile Internetworking Control Pro. (deprecated) \[John_Ioannidis\]
241     pub const MICP: IpNumber = Self(95);
242     /// Semaphore Communications Sec. Pro. \[Howard_Hart\]
243     pub const SCC_SP: IpNumber = Self(96);
244     /// Ethernet-within-IP Encapsulation \[[RFC3378](https://datatracker.ietf.org/doc/html/rfc3378)\]
245     pub const ETHER_IP: IpNumber = Self(97);
246     /// Encapsulation Header \[[RFC1241](https://datatracker.ietf.org/doc/html/rfc1241)\]\[Robert_Woodburn\]
247     pub const ENCAP: IpNumber = Self(98);
248     /// GMTP \[\[RXB5\]\]
249     pub const GMTP: IpNumber = Self(100);
250     /// Ipsilon Flow Management Protocol \[Bob_Hinden\]\[November 1995, 1997.\]
251     pub const IFMP: IpNumber = Self(101);
252     /// PNNI over IP \[Ross_Callon\]
253     pub const PNNI: IpNumber = Self(102);
254     /// Protocol Independent Multicast \[[RFC7761](https://datatracker.ietf.org/doc/html/rfc7761)\]\[Dino_Farinacci\]
255     pub const PIM: IpNumber = Self(103);
256     /// ARIS \[Nancy_Feldman\]
257     pub const ARIS: IpNumber = Self(104);
258     /// SCPS \[Robert_Durst\]
259     pub const SCPS: IpNumber = Self(105);
260     /// QNX \[Michael_Hunter\]
261     pub const QNX: IpNumber = Self(106);
262     /// Active Networks \[Bob_Braden\]
263     pub const ACTIVE_NETWORKS: IpNumber = Self(107);
264     /// IP Payload Compression Protocol \[[RFC2393](https://datatracker.ietf.org/doc/html/rfc2393)\]
265     pub const IP_COMP: IpNumber = Self(108);
266     /// Sitara Networks Protocol \[Manickam_R_Sridhar\]
267     pub const SITRA_NETWORKS_PROTOCOL: IpNumber = Self(109);
268     /// Compaq Peer Protocol \[Victor_Volpe\]
269     pub const COMPAQ_PEER: IpNumber = Self(110);
270     /// IPX in IP \[CJ_Lee\]
271     pub const IPX_IN_IP: IpNumber = Self(111);
272     /// Virtual Router Redundancy Protocol \[[RFC5798](https://datatracker.ietf.org/doc/html/rfc5798)\]
273     pub const VRRP: IpNumber = Self(112);
274     /// PGM Reliable Transport Protocol \[Tony_Speakman\]
275     pub const PGM: IpNumber = Self(113);
276     /// any 0-hop protocol \[Internet_Assigned_Numbers_Authority\]
277     pub const ANY_ZERO_HOP_PROTOCOL: IpNumber = Self(114);
278     /// Layer Two Tunneling Protocol \[[RFC3931](https://datatracker.ietf.org/doc/html/rfc3931)\]\[Bernard_Aboba\]
279     pub const LAYER2_TUNNELING_PROTOCOL: IpNumber = Self(115);
280     /// D-II Data Exchange (DDX) \[John_Worley\]
281     pub const DDX: IpNumber = Self(116);
282     /// Interactive Agent Transfer Protocol \[John_Murphy\]
283     pub const IATP: IpNumber = Self(117);
284     /// Schedule Transfer Protocol \[Jean_Michel_Pittet\]
285     pub const STP: IpNumber = Self(118);
286     /// SpectraLink Radio Protocol \[Mark_Hamilton\]
287     pub const SRP: IpNumber = Self(119);
288     /// UTI \[Peter_Lothberg\]
289     pub const UTI: IpNumber = Self(120);
290     /// Simple Message Protocol \[Leif_Ekblad\]
291     pub const SIMPLE_MESSAGE_PROTOCOL: IpNumber = Self(121);
292     /// Simple Multicast Protocol (deprecated) \[Jon_Crowcroft\]\[draft-perlman-simple-multicast\]
293     pub const SM: IpNumber = Self(122);
294     /// Performance Transparency Protocol \[Michael_Welzl\]
295     pub const PTP: IpNumber = Self(123);
296     /// ISIS over IPv4 \[Tony_Przygienda\]
297     pub const ISIS_OVER_IPV4: IpNumber = Self(124);
298     /// FIRE \[Criag_Partridge\]
299     pub const FIRE: IpNumber = Self(125);
300     /// Combat Radio Transport Protocol \[Robert_Sautter\]
301     pub const CRTP: IpNumber = Self(126);
302     /// Combat Radio User Datagram \[Robert_Sautter\]
303     pub const CRUDP: IpNumber = Self(127);
304     /// SSCOPMCE \[Kurt_Waber\]
305     pub const SSCOPMCE: IpNumber = Self(128);
306     /// IPLT \[\[Hollbach\]\]
307     pub const IPLT: IpNumber = Self(129);
308     /// Secure Packet Shield \[Bill_McIntosh\]
309     pub const SPS: IpNumber = Self(130);
310     /// Private IP Encapsulation within IP \[Bernhard_Petri\]
311     pub const PIPE: IpNumber = Self(131);
312     /// Stream Control Transmission Protocol \[Randall_R_Stewart\]
313     pub const SCTP: IpNumber = Self(132);
314     /// Fibre Channel \[Murali_Rajagopal\]\[[RFC6172](https://datatracker.ietf.org/doc/html/rfc6172)\]
315     pub const FC: IpNumber = Self(133);
316     /// RSVP-E2E-IGNORE \[[RFC3175](https://datatracker.ietf.org/doc/html/rfc3175)\]
317     pub const RSVP_E2E_IGNORE: IpNumber = Self(134);
318     /// MobilityHeader \[[RFC6275](https://datatracker.ietf.org/doc/html/rfc6275)\]
319     pub const MOBILITY_HEADER: IpNumber = Self(135);
320     /// UDPLite \[[RFC3828](https://datatracker.ietf.org/doc/html/rfc3828)\]
321     pub const UDP_LITE: IpNumber = Self(136);
322     /// \[[RFC4023](https://datatracker.ietf.org/doc/html/rfc4023)\]
323     pub const MPLS_IN_IP: IpNumber = Self(137);
324     /// MANET Protocols \[[RFC5498](https://datatracker.ietf.org/doc/html/rfc5498)\]
325     pub const MANET: IpNumber = Self(138);
326     /// Host Identity Protocol \[[RFC7401](https://datatracker.ietf.org/doc/html/rfc7401)\]
327     pub const HIP: IpNumber = Self(139);
328     /// Shim6 Protocol \[[RFC5533](https://datatracker.ietf.org/doc/html/rfc5533)\]
329     pub const SHIM6: IpNumber = Self(140);
330     /// Wrapped Encapsulating Security Payload \[[RFC5840](https://datatracker.ietf.org/doc/html/rfc5840)\]
331     pub const WESP: IpNumber = Self(141);
332     /// Robust Header Compression \[[RFC5858](https://datatracker.ietf.org/doc/html/rfc5858)\]
333     pub const ROHC: IpNumber = Self(142);
334     /// Use for experimentation and testing
335     pub const EXPERIMENTAL_AND_TESTING_0: IpNumber = Self(253);
336     /// Use for experimentation and testing
337     pub const EXPERIMENTAL_AND_TESTING_1: IpNumber = Self(254);
338 }
339 
340 impl IpNumber {
341     /// Returns true if the given number is the internet number of an IPV6 extension header.
is_ipv6_ext_header_value(self) -> bool342     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     /// Returns the "keyword" string if known. Usually this is the abbreviation of the protocol.
361     ///
362     /// # Example
363     ///
364     /// ```
365     /// use etherparse::IpNumber;
366     ///
367     /// assert_eq!(IpNumber::UDP.keyword_str(), Some("UDP"));
368     ///
369     /// // Unassigned values return None
370     /// assert_eq!(IpNumber(145).keyword_str(), None);
371     /// ```
372     ///
373     /// # Data Source
374     ///
375     /// The strings were copied from <https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml>
376     /// on 2023-04-11.
keyword_str(self) -> Option<&'static str>377     pub fn keyword_str(self) -> Option<&'static str> {
378         // auto generated from CSV
379         // https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
380         // on 2023-04-11.
381         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     /// Returns the "protocol" string if known. Usually this the non abbreviated name of the protocol.
535     ///
536     /// # Example
537     ///
538     /// ```
539     /// use etherparse::IpNumber;
540     ///
541     /// assert_eq!(IpNumber::UDP.protocol_str(), Some("User Datagram"));
542     ///
543     /// // Unassigned values return None
544     /// assert_eq!(IpNumber(145).protocol_str(), None);
545     /// ```
546     ///
547     /// # Data Source
548     ///
549     /// The string was copied from <https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml>
550     /// on 2023-04-11.
protocol_str(self) -> Option<&'static str>551     pub fn protocol_str(self) -> Option<&'static str> {
552         // auto generated from CSV
553         // https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
554         // on 2023-04-11.
555         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 
709 impl Default for IpNumber {
710     #[inline]
default() -> Self711     fn default() -> Self {
712         // 255 chosen as it is not used by any
713         // protocol and is reserved.
714         Self(255)
715     }
716 }
717 
718 impl From<u8> for IpNumber {
719     #[inline]
from(val: u8) -> Self720     fn from(val: u8) -> Self {
721         Self(val)
722     }
723 }
724 
725 impl From<IpNumber> for u8 {
726     #[inline]
from(val: IpNumber) -> Self727     fn from(val: IpNumber) -> Self {
728         val.0
729     }
730 }
731 
732 impl core::fmt::Debug for IpNumber {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result733     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 
748 /// Constants for the ip protocol numbers for easy importing (e.g. `use ip_number::*;`).
749 ///
750 /// The constants only exist for convenience so you can import them
751 /// (`use ip_number::*`) without a need to write `IpNumber::` in front
752 /// of every constant.
753 ///
754 /// You can access the underlying `u8` value by using `.0` and any `u8`
755 /// can be converted to an `IpNumber`:
756 ///
757 /// ```
758 /// use etherparse::{ip_number::TCP, IpNumber};
759 ///
760 /// assert_eq!(TCP.0, 6);
761 /// assert_eq!(TCP, IpNumber(6));
762 /// let num: IpNumber = 6.into();
763 /// assert_eq!(TCP, num);
764 /// ```
765 ///
766 /// The list original values were copied from
767 /// <https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml>
768 pub mod ip_number {
769     use crate::IpNumber;
770 
771     /// IPv6 Hop-by-Hop Option \[[RFC8200](https://datatracker.ietf.org/doc/html/rfc8200)\]
772     pub const IPV6_HOP_BY_HOP: IpNumber = IpNumber::IPV6_HEADER_HOP_BY_HOP; // 0
773     /// IPv6 Hop-by-Hop Option \[[RFC8200](https://datatracker.ietf.org/doc/html/rfc8200)\]
774     pub const IPV6_HEADER_HOP_BY_HOP: IpNumber = IpNumber::IPV6_HEADER_HOP_BY_HOP; // 0
775     /// Internet Control Message \[[RFC792](https://datatracker.ietf.org/doc/html/rfc792)\]
776     pub const ICMP: IpNumber = IpNumber::ICMP; // 1
777     /// Internet Group Management \[[RFC1112](https://datatracker.ietf.org/doc/html/rfc1112)\]
778     pub const IGMP: IpNumber = IpNumber::IGMP; // 2
779     /// Gateway-to-Gateway \[[RFC823](https://datatracker.ietf.org/doc/html/rfc823)\]
780     pub const GGP: IpNumber = IpNumber::GGP; // 3
781     /// IPv4 encapsulation \[[RFC2003](https://datatracker.ietf.org/doc/html/rfc2003)\]
782     pub const IPV4: IpNumber = IpNumber::IPV4; // 4
783     /// Stream \[[RFC1190](https://datatracker.ietf.org/doc/html/rfc1190)\] \[[RFC1819](https://datatracker.ietf.org/doc/html/rfc1819)\]
784     pub const STREAM: IpNumber = IpNumber::STREAM; // 5
785     /// Transmission Control \[[RFC793](https://datatracker.ietf.org/doc/html/rfc793)\]
786     pub const TCP: IpNumber = IpNumber::TCP; // 6
787     /// CBT \[Tony_Ballardie\]
788     pub const CBT: IpNumber = IpNumber::CBT; // 7
789     /// Exterior Gateway Protocol \[[RFC888](https://datatracker.ietf.org/doc/html/rfc888)\] \[David_Mills\]
790     pub const EGP: IpNumber = IpNumber::EGP; // 8
791     /// any private interior gateway (used by Cisco for their IGRP) \[Internet_Assigned_Numbers_Authority\]
792     pub const IGP: IpNumber = IpNumber::IGP; // 9
793     /// BBN RCC Monitoring \[Steve_Chipman\]
794     pub const BBN_RCC_MON: IpNumber = IpNumber::BBN_RCC_MON; // 10
795     /// Network Voice Protocol \[[RFC741](https://datatracker.ietf.org/doc/html/rfc741)\]\[Steve_Casner\]
796     pub const NVP_II: IpNumber = IpNumber::NVP_II; // 11
797     /// PUP
798     pub const PUP: IpNumber = IpNumber::PUP; // 12
799     /// ARGUS (deprecated) \[Robert_W_Scheifler\]
800     pub const ARGUS: IpNumber = IpNumber::ARGUS; // 13
801     /// EMCON \[mystery contact\]
802     pub const EMCON: IpNumber = IpNumber::EMCON; // 14
803     /// Cross Net Debugger \[Haverty, J., "XNET Formats for Internet Protocol Version 4", IEN 158, October 1980.\]\[Jack_Haverty\]
804     pub const XNET: IpNumber = IpNumber::XNET; // 15
805     /// Chaos \[J_Noel_Chiappa\]
806     pub const CHAOS: IpNumber = IpNumber::CHAOS; // 16
807     /// User Datagram \[[RFC768](https://datatracker.ietf.org/doc/html/rfc768)\] \[Jon_Postel\]
808     pub const UDP: IpNumber = IpNumber::UDP; // 17
809     /// Multiplexing \[Cohen, D. and J. Postel, "Multiplexing Protocol", IEN 90, USC/Information Sciences Institute, May 1979.\]\[Jon_Postel\]
810     pub const MUX: IpNumber = IpNumber::MUX; // 18
811     /// DCN Measurement Subsystems \[David_Mills\]
812     pub const DCN_MEAS: IpNumber = IpNumber::DCN_MEAS; // 19
813     /// Host Monitoring \[[RFC869](https://datatracker.ietf.org/doc/html/rfc869)\]\[Bob_Hinden\]
814     pub const HMP: IpNumber = IpNumber::HMP; // 20
815     /// Packet Radio Measurement \[Zaw_Sing_Su\]
816     pub const PRM: IpNumber = IpNumber::PRM; // 21
817     /// XEROX NS IDP
818     pub const XNS_IDP: IpNumber = IpNumber::XNS_IDP; // 22
819     /// Trunk-1 \[Barry_Boehm\]
820     pub const TRUNK1: IpNumber = IpNumber::TRUNK1; // 23
821     /// Trunk-2 \[Barry_Boehm\]
822     pub const TRUNK2: IpNumber = IpNumber::TRUNK2; // 24
823     /// Leaf-1 \[Barry_Boehm\]
824     pub const LEAF1: IpNumber = IpNumber::LEAF1; // 25
825     /// Leaf-2 \[Barry_Boehm\]
826     pub const LEAF2: IpNumber = IpNumber::LEAF2; // 26
827     /// Reliable Data Protocol \[[RFC908](https://datatracker.ietf.org/doc/html/rfc908)\] \[Bob_Hinden\]
828     pub const RDP: IpNumber = IpNumber::RDP; // 27
829     /// Internet Reliable Transaction \[[RFC938](https://datatracker.ietf.org/doc/html/rfc938)\] \[Trudy_Miller\]
830     pub const IRTP: IpNumber = IpNumber::IRTP; // 28
831     /// ISO Transport Protocol Class 4 \[[RFC905](https://datatracker.ietf.org/doc/html/rfc905)\] \[mystery contact\]
832     pub const ISO_TP4: IpNumber = IpNumber::ISO_TP4; // 29
833     /// Bulk Data Transfer Protocol \[[RFC969](https://datatracker.ietf.org/doc/html/rfc969)\] \[David_Clark\]
834     pub const NET_BLT: IpNumber = IpNumber::NET_BLT; // 30
835     /// MFE Network Services Protocol \[Shuttleworth, B., "A Documentary of MFENet, a National Computer Network", UCRL-52317, Lawrence Livermore Labs, Livermore, California, June 1977.\] \[Barry_Howard\]
836     pub const MFE_NSP: IpNumber = IpNumber::MFE_NSP; // 31
837     /// MERIT Internodal Protocol \[Hans_Werner_Braun\]
838     pub const MERIT_INP: IpNumber = IpNumber::MERIT_INP; // 32
839     /// Datagram Congestion Control Protocol \[[RFC4340](https://datatracker.ietf.org/doc/html/rfc4340)\]
840     pub const DCCP: IpNumber = IpNumber::DCCP; // 33
841     /// Third Party Connect Protocol \[Stuart_A_Friedberg\]
842     pub const THIRD_PARTY_CONNECT_PROTOCOL: IpNumber = IpNumber::THIRD_PARTY_CONNECT_PROTOCOL; // 34
843     /// Inter-Domain Policy Routing Protocol \[Martha_Steenstrup\]
844     pub const IDPR: IpNumber = IpNumber::IDPR; // 35
845     /// XTP \[Greg_Chesson\]
846     pub const XTP: IpNumber = IpNumber::XTP; // 36
847     /// Datagram Delivery Protocol \[Wesley_Craig\]
848     pub const DDP: IpNumber = IpNumber::DDP; // 37
849     /// IDPR Control Message Transport Proto \[Martha_Steenstrup\]
850     pub const IDPR_CMTP: IpNumber = IpNumber::IDPR_CMTP; // 38
851     /// TP++ Transport Protocol \[Dirk_Fromhein\]
852     pub const TP_PLUS_PLUS: IpNumber = IpNumber::TP_PLUS_PLUS; // 39
853     /// IL Transport Protocol \[Dave_Presotto\]
854     pub const IL: IpNumber = IpNumber::IL; // 40
855     /// IPv6 encapsulation \[[RFC2473](https://datatracker.ietf.org/doc/html/rfc2473)\]
856     pub const IPV6: IpNumber = IpNumber::IPV6; // 41
857     /// Source Demand Routing Protocol \[Deborah_Estrin\]
858     pub const SDRP: IpNumber = IpNumber::SDRP; // 42
859     /// Routing Header for IPv6 \[Steve_Deering\]
860     pub const IPV6_ROUTE_HEADER: IpNumber = IpNumber::IPV6_ROUTE_HEADER; // 43
861     /// Routing Header for IPv6 \[Steve_Deering\]
862     pub const IPV6_ROUTE: IpNumber = IpNumber::IPV6_ROUTE_HEADER; // 43
863     /// Fragment Header for IPv6 \[Steve_Deering\]
864     pub const IPV6_FRAGMENTATION_HEADER: IpNumber = IpNumber::IPV6_FRAGMENTATION_HEADER; // 44
865     /// Fragment Header for IPv6 \[Steve_Deering\]
866     pub const IPV6_FRAG: IpNumber = IpNumber::IPV6_FRAGMENTATION_HEADER; // 44
867     /// Inter-Domain Routing Protocol \[Sue_Hares\]
868     pub const IDRP: IpNumber = IpNumber::IDRP; // 45
869     /// Reservation Protocol \[[RFC2205](https://datatracker.ietf.org/doc/html/rfc2205)\]\[[RFC3209](https://datatracker.ietf.org/doc/html/rfc3209)\]\[Bob_Braden\]
870     pub const RSVP: IpNumber = IpNumber::RSVP; // 46
871     /// Generic Routing Encapsulation \[[RFC2784](https://datatracker.ietf.org/doc/html/rfc2784)\]\[Tony_Li\]
872     pub const GRE: IpNumber = IpNumber::GRE; // 47
873     /// Dynamic Source Routing Protocol \[[RFC4728](https://datatracker.ietf.org/doc/html/rfc4728)\]
874     pub const DSR: IpNumber = IpNumber::DSR; // 48
875     /// BNA \[Gary Salamon\]
876     pub const BNA: IpNumber = IpNumber::BNA; // 49
877     /// Encapsulating Security Payload \[[RFC4303](https://datatracker.ietf.org/doc/html/rfc4303)\]
878     pub const ENCAP_SEC: IpNumber = IpNumber::ENCAPSULATING_SECURITY_PAYLOAD; // 50
879     /// Encapsulating Security Payload \[[RFC4303](https://datatracker.ietf.org/doc/html/rfc4303)\]
880     pub const ENCAPSULATING_SECURITY_PAYLOAD: IpNumber = IpNumber::ENCAPSULATING_SECURITY_PAYLOAD; // 50
881     /// Authentication Header \[[RFC4302](https://datatracker.ietf.org/doc/html/rfc4302)\]
882     pub const AUTH: IpNumber = IpNumber::AUTHENTICATION_HEADER; // 51
883     /// Authentication Header \[[RFC4302](https://datatracker.ietf.org/doc/html/rfc4302)\]
884     pub const AUTHENTICATION_HEADER: IpNumber = IpNumber::AUTHENTICATION_HEADER; // 51
885     /// Integrated Net Layer Security  TUBA \[K_Robert_Glenn\]
886     pub const INLSP: IpNumber = IpNumber::INLSP; // 52
887     /// IP with Encryption (deprecated) \[John_Ioannidis\]
888     pub const SWIPE: IpNumber = IpNumber::SWIPE; // 53
889     /// NBMA Address Resolution Protocol \[[RFC1735](https://datatracker.ietf.org/doc/html/rfc1735)\]
890     pub const NARP: IpNumber = IpNumber::NARP; // 54
891     /// IP Mobility \[Charlie_Perkins\]
892     pub const MOBILE: IpNumber = IpNumber::MOBILE; // 55
893     /// Transport Layer Security Protocol using Kryptonet key management \[Christer_Oberg\]
894     pub const TLSP: IpNumber = IpNumber::TLSP; // 56
895     /// SKIP \[Tom_Markson\]
896     pub const SKIP: IpNumber = IpNumber::SKIP; // 57
897     /// IPv6 ICMP next-header type \[[RFC4443](https://datatracker.ietf.org/doc/html/rfc4443)\]
898     pub const IPV6_ICMP: IpNumber = IpNumber::IPV6_ICMP; // 58
899     /// No Next Header for IPv6 \[[RFC8200](https://datatracker.ietf.org/doc/html/rfc8200)\]
900     pub const IPV6_NO_NEXT_HEADER: IpNumber = IpNumber::IPV6_NO_NEXT_HEADER; // 59
901     /// Destination Options for IPv6 \[[RFC8200](https://datatracker.ietf.org/doc/html/rfc8200)\]
902     pub const IPV6_DEST_OPTIONS: IpNumber = IpNumber::IPV6_DESTINATION_OPTIONS; // 60
903     /// Destination Options for IPv6 \[[RFC8200](https://datatracker.ietf.org/doc/html/rfc8200)\]
904     pub const IPV6_DESTINATION_OPTIONS: IpNumber = IpNumber::IPV6_DESTINATION_OPTIONS; // 60
905     /// any host internal protocol \[Internet_Assigned_Numbers_Authority\]
906     pub const ANY_HOST_INTERNAL_PROTOCOL: IpNumber = IpNumber::ANY_HOST_INTERNAL_PROTOCOL; // 61
907     /// CFTP \[Forsdick, H., "CFTP", Network Message, Bolt Beranek and Newman, January 1982.\]\[Harry_Forsdick\]
908     pub const CFTP: IpNumber = IpNumber::CFTP; // 62
909     /// any local network \[Internet_Assigned_Numbers_Authority\]
910     pub const ANY_LOCAL_NETWORK: IpNumber = IpNumber::ANY_LOCAL_NETWORK; // 63
911     /// SATNET and Backroom EXPAK \[Steven_Blumenthal\]
912     pub const SAT_EXPAK: IpNumber = IpNumber::SAT_EXPAK; // 64
913     /// Kryptolan \[Paul Liu\]
914     pub const KRYTOLAN: IpNumber = IpNumber::KRYTOLAN; // 65
915     /// MIT Remote Virtual Disk Protocol \[Michael_Greenwald\]
916     pub const RVD: IpNumber = IpNumber::RVD; // 66
917     /// Internet Pluribus Packet Core \[Steven_Blumenthal\]
918     pub const IPPC: IpNumber = IpNumber::IPPC; // 67
919     /// any distributed file system \[Internet_Assigned_Numbers_Authority\]
920     pub const ANY_DISTRIBUTED_FILE_SYSTEM: IpNumber = IpNumber::ANY_DISTRIBUTED_FILE_SYSTEM; // 68
921     /// SATNET Monitoring \[Steven_Blumenthal\]
922     pub const SAT_MON: IpNumber = IpNumber::SAT_MON; // 69
923     /// VISA Protocol \[Gene_Tsudik\]
924     pub const VISA: IpNumber = IpNumber::VISA; // 70
925     /// Internet Packet Core Utility \[Steven_Blumenthal\]
926     pub const IPCV: IpNumber = IpNumber::IPCV; // 71
927     /// Computer Protocol Network Executive \[David Mittnacht\]
928     pub const CPNX: IpNumber = IpNumber::CPNX; // 72
929     /// Computer Protocol Heart Beat \[David Mittnacht\]
930     pub const CPHB: IpNumber = IpNumber::CPHB; // 73
931     /// Wang Span Network \[Victor Dafoulas\]
932     pub const WSN: IpNumber = IpNumber::WSN; // 74
933     /// Packet Video Protocol \[Steve_Casner\]
934     pub const PVP: IpNumber = IpNumber::PVP; // 75
935     /// Backroom SATNET Monitoring \[Steven_Blumenthal\]
936     pub const BR_SAT_MON: IpNumber = IpNumber::BR_SAT_MON; // 76
937     /// SUN ND PROTOCOL-Temporary \[William_Melohn\]
938     pub const SUN_ND: IpNumber = IpNumber::SUN_ND; // 77
939     /// WIDEBAND Monitoring \[Steven_Blumenthal\]
940     pub const WB_MON: IpNumber = IpNumber::WB_MON; // 78
941     /// WIDEBAND EXPAK \[Steven_Blumenthal\]
942     pub const WB_EXPAK: IpNumber = IpNumber::WB_EXPAK; // 79
943     /// ISO Internet Protocol \[Marshall_T_Rose\]
944     pub const ISO_IP: IpNumber = IpNumber::ISO_IP; // 80
945     /// VMTP \[Dave_Cheriton\]
946     pub const VMTP: IpNumber = IpNumber::VMTP; // 81
947     /// SECURE-VMTP \[Dave_Cheriton\]
948     pub const SECURE_VMTP: IpNumber = IpNumber::SECURE_VMTP; // 82
949     /// VINES \[Brian Horn\]
950     pub const VINES: IpNumber = IpNumber::VINES; // 83
951     /// Transaction Transport Protocol or Internet Protocol Traffic Manager \[Jim_Stevens\]
952     pub const TTP_OR_IPTM: IpNumber = IpNumber::TTP_OR_IPTM; // 84
953     /// NSFNET-IGP \[Hans_Werner_Braun\]
954     pub const NSFNET_IGP: IpNumber = IpNumber::NSFNET_IGP; // 85
955     /// Dissimilar Gateway Protocol \[M/A-COM Government Systems, "Dissimilar Gateway Protocol Specification, Draft Version", Contract no. CS901145, November 16, 1987.\]\[Mike_Little\]
956     pub const DGP: IpNumber = IpNumber::DGP; // 86
957     /// TCF \[Guillermo_A_Loyola\]
958     pub const TCF: IpNumber = IpNumber::TCF; // 87
959     /// EIGRP \[[RFC7868](https://datatracker.ietf.org/doc/html/rfc7868)\]
960     pub const EIGRP: IpNumber = IpNumber::EIGRP; // 88
961     /// OSPFIGP \[[RFC1583](https://datatracker.ietf.org/doc/html/rfc1583)\]\[[RFC2328](https://datatracker.ietf.org/doc/html/rfc2328)\]\[[RFC5340](https://datatracker.ietf.org/doc/html/rfc5340)\]\[John_Moy\]
962     pub const OSPFIGP: IpNumber = IpNumber::OSPFIGP; // 89
963     /// Sprite RPC Protocol \[Welch, B., "The Sprite Remote Procedure Call System", Technical Report, UCB/Computer Science Dept., 86/302, University of California at Berkeley, June 1986.\]\[Bruce Willins\]
964     pub const SPRITE_RPC: IpNumber = IpNumber::SPRITE_RPC; // 90
965     /// Locus Address Resolution Protocol \[Brian Horn\]
966     pub const LARP: IpNumber = IpNumber::LARP; // 91
967     /// Multicast Transport Protocol \[Susie_Armstrong\]
968     pub const MTP: IpNumber = IpNumber::MTP; // 92
969     /// AX.25 Frames \[Brian_Kantor\]
970     pub const AX25: IpNumber = IpNumber::AX25; // 93
971     /// IP-within-IP Encapsulation Protocol \[John_Ioannidis\]
972     pub const IPIP: IpNumber = IpNumber::IPIP; // 94
973     /// Mobile Internetworking Control Pro. (deprecated) \[John_Ioannidis\]
974     pub const MICP: IpNumber = IpNumber::MICP; // 95
975     /// Semaphore Communications Sec. Pro. \[Howard_Hart\]
976     pub const SCC_SP: IpNumber = IpNumber::SCC_SP; // 96
977     /// Ethernet-within-IP Encapsulation \[[RFC3378](https://datatracker.ietf.org/doc/html/rfc3378)\]
978     pub const ETHER_IP: IpNumber = IpNumber::ETHER_IP; // 97
979     /// Encapsulation Header \[[RFC1241](https://datatracker.ietf.org/doc/html/rfc1241)\]\[Robert_Woodburn\]
980     pub const ENCAP: IpNumber = IpNumber::ENCAP; // 98
981     /// GMTP \[\[RXB5\]\]
982     pub const GMTP: IpNumber = IpNumber::GMTP; // 100
983     /// Ipsilon Flow Management Protocol \[Bob_Hinden\]\[November 1995, 1997.\]
984     pub const IFMP: IpNumber = IpNumber::IFMP; // 101
985     /// PNNI over IP \[Ross_Callon\]
986     pub const PNNI: IpNumber = IpNumber::PNNI; // 102
987     /// Protocol Independent Multicast \[[RFC7761](https://datatracker.ietf.org/doc/html/rfc7761)\]\[Dino_Farinacci\]
988     pub const PIM: IpNumber = IpNumber::PIM; // 103
989     /// ARIS \[Nancy_Feldman\]
990     pub const ARIS: IpNumber = IpNumber::ARIS; // 104
991     /// SCPS \[Robert_Durst\]
992     pub const SCPS: IpNumber = IpNumber::SCPS; // 105
993     /// QNX \[Michael_Hunter\]
994     pub const QNX: IpNumber = IpNumber::QNX; // 106
995     /// Active Networks \[Bob_Braden\]
996     pub const ACTIVE_NETWORKS: IpNumber = IpNumber::ACTIVE_NETWORKS; // 107
997     /// IP Payload Compression Protocol \[[RFC2393](https://datatracker.ietf.org/doc/html/rfc2393)\]
998     pub const IP_COMP: IpNumber = IpNumber::IP_COMP; // 108
999     /// Sitara Networks Protocol \[Manickam_R_Sridhar\]
1000     pub const SITRA_NETWORKS_PROTOCOL: IpNumber = IpNumber::SITRA_NETWORKS_PROTOCOL; // 109
1001     /// Compaq Peer Protocol \[Victor_Volpe\]
1002     pub const COMPAQ_PEER: IpNumber = IpNumber::COMPAQ_PEER; // 110
1003     /// IPX in IP \[CJ_Lee\]
1004     pub const IPX_IN_IP: IpNumber = IpNumber::IPX_IN_IP; // 111
1005     /// Virtual Router Redundancy Protocol \[[RFC5798](https://datatracker.ietf.org/doc/html/rfc5798)\]
1006     pub const VRRP: IpNumber = IpNumber::VRRP; // 112
1007     /// PGM Reliable Transport Protocol \[Tony_Speakman\]
1008     pub const PGM: IpNumber = IpNumber::PGM; // 113
1009     /// any 0-hop protocol \[Internet_Assigned_Numbers_Authority\]
1010     pub const ANY_ZERO_HOP_PROTOCOL: IpNumber = IpNumber::ANY_ZERO_HOP_PROTOCOL; // 114
1011     /// Layer Two Tunneling Protocol \[[RFC3931](https://datatracker.ietf.org/doc/html/rfc3931)\]\[Bernard_Aboba\]
1012     pub const LAYER2_TUNNELING_PROTOCOL: IpNumber = IpNumber::LAYER2_TUNNELING_PROTOCOL; // 115
1013     /// D-II Data Exchange (DDX) \[John_Worley\]
1014     pub const DDX: IpNumber = IpNumber::DDX; // 116
1015     /// Interactive Agent Transfer Protocol \[John_Murphy\]
1016     pub const IATP: IpNumber = IpNumber::IATP; // 117
1017     /// Schedule Transfer Protocol \[Jean_Michel_Pittet\]
1018     pub const STP: IpNumber = IpNumber::STP; // 118
1019     /// SpectraLink Radio Protocol \[Mark_Hamilton\]
1020     pub const SRP: IpNumber = IpNumber::SRP; // 119
1021     /// UTI \[Peter_Lothberg\]
1022     pub const UTI: IpNumber = IpNumber::UTI; // 120
1023     /// Simple Message Protocol \[Leif_Ekblad\]
1024     pub const SIMPLE_MESSAGE_PROTOCOL: IpNumber = IpNumber::SIMPLE_MESSAGE_PROTOCOL; // 121
1025     /// Simple Multicast Protocol (deprecated) \[Jon_Crowcroft\]\[draft-perlman-simple-multicast\]
1026     pub const SM: IpNumber = IpNumber::SM; // 122
1027     /// Performance Transparency Protocol \[Michael_Welzl\]
1028     pub const PTP: IpNumber = IpNumber::PTP; // 123
1029     /// ISIS over IPv4 \[Tony_Przygienda\]
1030     pub const ISIS_OVER_IPV4: IpNumber = IpNumber::ISIS_OVER_IPV4; // 124
1031     /// FIRE \[Criag_Partridge\]
1032     pub const FIRE: IpNumber = IpNumber::FIRE; // 125
1033     /// Combat Radio Transport Protocol \[Robert_Sautter\]
1034     pub const CRTP: IpNumber = IpNumber::CRTP; // 126
1035     /// Combat Radio User Datagram \[Robert_Sautter\]
1036     pub const CRUDP: IpNumber = IpNumber::CRUDP; // 127
1037     /// SSCOPMCE \[Kurt_Waber\]
1038     pub const SSCOPMCE: IpNumber = IpNumber::SSCOPMCE; // 128
1039     /// IPLT \[\[Hollbach\]\]
1040     pub const IPLT: IpNumber = IpNumber::IPLT; // 129
1041     /// Secure Packet Shield \[Bill_McIntosh\]
1042     pub const SPS: IpNumber = IpNumber::SPS; // 130
1043     /// Private IP Encapsulation within IP \[Bernhard_Petri\]
1044     pub const PIPE: IpNumber = IpNumber::PIPE; // 131
1045     /// Stream Control Transmission Protocol \[Randall_R_Stewart\]
1046     pub const SCTP: IpNumber = IpNumber::SCTP; // 132
1047     /// Fibre Channel \[Murali_Rajagopal\]\[[RFC6172](https://datatracker.ietf.org/doc/html/rfc6172)\]
1048     pub const FC: IpNumber = IpNumber::FC; // 133
1049     /// RSVP-E2E-IGNORE \[[RFC3175](https://datatracker.ietf.org/doc/html/rfc3175)\]
1050     pub const RSVP_E2E_IGNORE: IpNumber = IpNumber::RSVP_E2E_IGNORE; // 134
1051     /// MobilityHeader \[[RFC6275](https://datatracker.ietf.org/doc/html/rfc6275)\]
1052     pub const MOBILITY: IpNumber = IpNumber::MOBILITY_HEADER; // 135
1053     /// MobilityHeader \[[RFC6275](https://datatracker.ietf.org/doc/html/rfc6275)\]
1054     pub const MOBILITY_HEADER: IpNumber = IpNumber::MOBILITY_HEADER; // 135
1055     /// UDPLite \[[RFC3828](https://datatracker.ietf.org/doc/html/rfc3828)\]
1056     pub const UDP_LITE: IpNumber = IpNumber::UDP_LITE; // 136
1057     /// \[[RFC4023](https://datatracker.ietf.org/doc/html/rfc4023)\]
1058     pub const MPLS_IN_IP: IpNumber = IpNumber::MPLS_IN_IP; // 137
1059     /// MANET Protocols \[[RFC5498](https://datatracker.ietf.org/doc/html/rfc5498)\]
1060     pub const MANET: IpNumber = IpNumber::MANET; // 138
1061     /// Host Identity Protocol \[[RFC7401](https://datatracker.ietf.org/doc/html/rfc7401)\]
1062     pub const HIP: IpNumber = IpNumber::HIP; // 139
1063     /// Shim6 Protocol \[[RFC5533](https://datatracker.ietf.org/doc/html/rfc5533)\]
1064     pub const SHIM6: IpNumber = IpNumber::SHIM6; // 140
1065     /// Wrapped Encapsulating Security Payload \[[RFC5840](https://datatracker.ietf.org/doc/html/rfc5840)\]
1066     pub const WESP: IpNumber = IpNumber::WESP; // 141
1067     /// Robust Header Compression \[[RFC5858](https://datatracker.ietf.org/doc/html/rfc5858)\]
1068     pub const ROHC: IpNumber = IpNumber::ROHC; // 142
1069     /// Use for experimentation and testing
1070     pub const EXP0: IpNumber = IpNumber::EXPERIMENTAL_AND_TESTING_0; // 253
1071     /// Use for experimentation and testing
1072     pub const EXPERIMENTAL_AND_TESTING_0: IpNumber = IpNumber::EXPERIMENTAL_AND_TESTING_0; // 253
1073     /// Use for experimentation and testing
1074     pub const EXP1: IpNumber = IpNumber::EXPERIMENTAL_AND_TESTING_1; // 254
1075     /// Use for experimentation and testing
1076     pub const EXPERIMENTAL_AND_TESTING_1: IpNumber = IpNumber::EXPERIMENTAL_AND_TESTING_1;
1077     // 254
1078 }
1079 
1080 #[cfg(test)]
1081 mod 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]
is_ipv6_ext_header_value()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]
keyword_str()1117     fn keyword_str() {
1118         // auto generated from CSV
1119         // https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
1120         // on 2023-04-11.
1121         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]
protocol_str()1275     fn protocol_str() {
1276         // auto generated from CSV
1277         // https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
1278         // on 2023-04-11.
1279         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]
ip_number_eq_check()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]
default()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]
debug()1853     fn debug() {
1854         // keyword & protocol string exist
1855         assert_eq!(
1856             format!("{:?}", IpNumber::UDP),
1857             format!("17 (UDP - User Datagram)")
1858         );
1859         // only keyword string exist
1860         assert_eq!(
1861             format!("{:?}", IpNumber::MOBILITY_HEADER),
1862             format!("135 (Mobility Header)")
1863         );
1864         // only protocol string exist
1865         assert_eq!(
1866             format!("{:?}", IpNumber(253)),
1867             format!("253 (Use for experimentation and testing)")
1868         );
1869         // no keyword & no protocol string
1870         assert_eq!(format!("{:?}", IpNumber(145)), format!("145"));
1871     }
1872 
1873     #[test]
clone_eq_hash_ord()1874     fn clone_eq_hash_ord() {
1875         // clone eq
1876         let value = IpNumber::IPV6_HEADER_HOP_BY_HOP;
1877         assert_eq!(value, value.clone());
1878         // hash
1879         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         // order
1891         assert_eq!(value.cmp(&value.clone()), Ordering::Equal);
1892         assert!(value.ge(&value.clone()));
1893     }
1894 }
1895