1macro_rules! ethernet_protocol {
7 ($(($variant:ident, $const:ident, $value:expr, $display:literal)),* $(,)?) => {
8 $(
9 const $const: u16 = $value;
10 )*
11
12 #[derive(Debug, PartialEq, Eq, Clone, Copy)]
13 #[non_exhaustive]
14 pub enum EthernetProtocol {
15 $($variant,)*
16 Other(u16),
17 }
18
19 impl EthernetProtocol {
20 pub fn value(&self) -> u16 {
21 match self {
22 $(Self::$variant => $const,)*
23 Self::Other(v) => *v,
24 }
25 }
26 }
27
28 impl From<u16> for EthernetProtocol {
29 fn from(d: u16) -> Self {
30 match d {
31 $($const => Self::$variant,)*
32 _ => Self::Other(d),
33 }
34 }
35 }
36
37 impl std::fmt::Display for EthernetProtocol {
38 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
39 match self {
40 $(Self::$variant => write!(f, $display),)*
41 Self::Other(v) => write!(f, "{v:#x}"),
42 }
43 }
44 }
45 };
46}
47
48ethernet_protocol! {
49 (Loop, ETH_P_LOOP, 0x0060, "loop"),
51 (Pup, ETH_P_PUP, 0x0200, "pup"),
52 (Pupat, ETH_P_PUPAT, 0x0201, "pupat"),
53 (Tsn, ETH_P_TSN, 0x22F0, "tsn"),
54 (Erspan2, ETH_P_ERSPAN2, 0x22EB, "erspan2"),
55 (Ip, ETH_P_IP, 0x0800, "ip"),
56 (X25, ETH_P_X25, 0x0805, "x25"),
57 (Arp, ETH_P_ARP, 0x0806, "arp"),
58 (Bpq, ETH_P_BPQ, 0x08FF, "bpq"),
59 (IeeePup, ETH_P_IEEEPUP, 0x0a00, "ieeepup"),
60 (IeeePupat, ETH_P_IEEEPUPAT, 0x0a01, "ieeepupat"),
61 (Batman, ETH_P_BATMAN, 0x4305, "batman"),
62 (Dec, ETH_P_DEC, 0x6000, "dec"),
63 (DnaDl, ETH_P_DNA_DL, 0x6001, "dna_dl"),
64 (DnaRc, ETH_P_DNA_RC, 0x6002, "dna_rc"),
65 (DnaRt, ETH_P_DNA_RT, 0x6003, "dna_rt"),
66 (Lat, ETH_P_LAT, 0x6004, "lat"),
67 (Diag, ETH_P_DIAG, 0x6005, "diag"),
68 (Cust, ETH_P_CUST, 0x6006, "cust"),
69 (Sca, ETH_P_SCA, 0x6007, "sca"),
70 (Teb, ETH_P_TEB, 0x6558, "teb"),
71 (Rarp, ETH_P_RARP, 0x8035, "rarp"),
72 (Atalk, ETH_P_ATALK, 0x809B, "atalk"),
73 (Aarp, ETH_P_AARP, 0x80F3, "aarp"),
74 (E8021Q, ETH_P_8021Q, 0x8100, "8021q"),
75 (Erspan, ETH_P_ERSPAN, 0x88BE, "erspan"),
76 (Ipx, ETH_P_IPX, 0x8137, "ipx"),
77 (Ipv6, ETH_P_IPV6, 0x86DD, "ipv6"),
78 (Pause, ETH_P_PAUSE, 0x8808, "pause"),
79 (Slow, ETH_P_SLOW, 0x8809, "slow"),
80 (Wccp, ETH_P_WCCP, 0x883E, "wccp"),
81 (MplsUc, ETH_P_MPLS_UC, 0x8847, "mpls_uc"),
82 (MplsMc, ETH_P_MPLS_MC, 0x8848, "mpls_mc"),
83 (Atmmpoa, ETH_P_ATMMPOA, 0x884c, "atmmpoa"),
84 (PppDisc, ETH_P_PPP_DISC, 0x8863, "ppp_disc"),
85 (PppSes, ETH_P_PPP_SES, 0x8864, "ppp_ses"),
86 (LinkCtl, ETH_P_LINK_CTL, 0x886c, "link_ctl"),
87 (Atmfate, ETH_P_ATMFATE, 0x8884, "atmfate"),
88 (Pae, ETH_P_PAE, 0x888E, "pae"),
89 (Profinet, ETH_P_PROFINET, 0x8892, "profinet"),
90 (Realtek, ETH_P_REALTEK, 0x8899, "realtek"),
91 (Aoe, ETH_P_AOE, 0x88A2, "aoe"),
92 (Ethercat, ETH_P_ETHERCAT, 0x88A4, "ethercat"),
93 (E8021Ad, ETH_P_8021AD, 0x88A8, "8021ad"),
94 (E802Ex1, ETH_P_802_EX1, 0x88B5, "802_ex1"),
95 (MxlGsw, ETH_P_MXLGSW, 0x88C3, "mxl_gsw"),
96 (Preauth, ETH_P_PREAUTH, 0x88C7, "preauth"),
97 (Tipc, ETH_P_TIPC, 0x88CA, "tipc"),
98 (Lldp, ETH_P_LLDP, 0x88CC, "lldp"),
99 (Mrp, ETH_P_MRP, 0x88E3, "mrp"),
100 (Macsec, ETH_P_MACSEC, 0x88E5, "macsec"),
101 (E8021Ah, ETH_P_8021AH, 0x88E7, "8021ah"),
102 (Mvrp, ETH_P_MVRP, 0x88F5, "mvrp"),
103 (E1588, ETH_P_1588, 0x88F7, "1588"),
104 (Ncsi, ETH_P_NCSI, 0x88F8, "ncsi"),
105 (Prp, ETH_P_PRP, 0x88FB, "prp"),
106 (Cfm, ETH_P_CFM, 0x8902, "cfm"),
107 (Fcoe, ETH_P_FCOE, 0x8906, "fcoe"),
108 (Iboe, ETH_P_IBOE, 0x8915, "iboe"),
109 (Tdls, ETH_P_TDLS, 0x890D, "tdls"),
110 (Fip, ETH_P_FIP, 0x8914, "fip"),
111 (E80221, ETH_P_80221, 0x8917, "80221"),
112 (Hsr, ETH_P_HSR, 0x892F, "hsr"),
113 (Nsh, ETH_P_NSH, 0x894F, "nsh"),
114 (Loopback, ETH_P_LOOPBACK, 0x9000, "loopback"),
115 (Qinq1, ETH_P_QINQ1, 0x9100, "qinq1"),
116 (Qinq2, ETH_P_QINQ2, 0x9200, "qinq2"),
117 (Qinq3, ETH_P_QINQ3, 0x9300, "qinq3"),
118 (Yt921x, ETH_P_YT921X, 0x9988, "yt921x"),
119 (Edsa, ETH_P_EDSA, 0xDADA, "edsa"),
120 (Dsa8021Q, ETH_P_DSA_8021Q, 0xDADB, "dsa_8021q"),
121 (DsaA5psw, ETH_P_DSA_A5PSW, 0xE001, "dsa_a5psw"),
122 (Ife, ETH_P_IFE, 0xED3E, "ife"),
123 (AfIucv, ETH_P_AF_IUCV, 0xFBFB, "af_iucv"),
124
125 (E802_3, ETH_P_802_3, 0x0001, "802_3"),
127 (Ax25, ETH_P_AX25, 0x0002, "ax25"),
128 (All, ETH_P_ALL, 0x0003, "all"),
129 (E802_2, ETH_P_802_2, 0x0004, "802_2"),
130 (Snap, ETH_P_SNAP, 0x0005, "snap"),
131 (Ddcmp, ETH_P_DDCMP, 0x0006, "ddcmp"),
132 (WanPpp, ETH_P_WAN_PPP, 0x0007, "wan_ppp"),
133 (PppMp, ETH_P_PPP_MP, 0x0008, "ppp_mp"),
134 (Localtalk, ETH_P_LOCALTALK, 0x0009, "localtalk"),
135 (Can, ETH_P_CAN, 0x000C, "can"),
136 (Canfd, ETH_P_CANFD, 0x000D, "canfd"),
137 (Canxl, ETH_P_CANXL, 0x000E, "canxl"),
138 (Ppptalk, ETH_P_PPPTALK, 0x0010, "ppptalk"),
139 (Tr802_2, ETH_P_TR_802_2, 0x0011, "tr_802_2"),
140 (Mobitex, ETH_P_MOBITEX, 0x0015, "mobitex"),
141 (Control, ETH_P_CONTROL, 0x0016, "control"),
142 (Irda, ETH_P_IRDA, 0x0017, "irda"),
143 (Econet, ETH_P_ECONET, 0x0018, "econet"),
144 (Hdlc, ETH_P_HDLC, 0x0019, "hdlc"),
145 (Arcnet, ETH_P_ARCNET, 0x001A, "arcnet"),
146 (Dsa, ETH_P_DSA, 0x001B, "dsa"),
147 (Trailer, ETH_P_TRAILER, 0x001C, "trailer"),
148 (Phonet, ETH_P_PHONET, 0x00F5, "phonet"),
149 (Ieee802154, ETH_P_IEEE802154, 0x00F6, "ieee802154"),
150 (Caif, ETH_P_CAIF, 0x00F7, "caif"),
151 (Xdsa, ETH_P_XDSA, 0x00F8, "xdsa"),
152 (Map, ETH_P_MAP, 0x00F9, "map"),
153 (Mctp, ETH_P_MCTP, 0x00FA, "mctp"),
154}
155
156impl From<EthernetProtocol> for u16 {
157 fn from(v: EthernetProtocol) -> u16 {
158 v.value()
159 }
160}