blob: f0f0a2c6321aca7d03e608afd3a71413b04d3cc7 [file] [log] [blame]
Andreas Wundsam40e14f72013-05-06 14:49:08 -07001package org.openflow.types;
2
Yotam Harchol161a5d52013-07-25 17:17:48 -07003import org.jboss.netty.buffer.ChannelBuffer;
Yotam Harchold7b84202013-07-26 16:08:10 -07004
Yotam Harchol161a5d52013-07-25 17:17:48 -07005
6/**
7 * EtherType field representation.
8 *
9 * @author Yotam Harchol (yotam.harchol@bigswitch.com)
10 */
11public class EthType implements OFValueType {
12 static final int LENGTH = 2;
13
14 private final int rawValue;
15
16 static final int ETH_TYPE_VAL_IPv4 = 0x0800; // Internet Protocol version 4 (IPv4)
17 static final int ETH_TYPE_VAL_ARP = 0x0806; // Address Resolution Protocol (ARP)
18 static final int ETH_TYPE_VAL_WAKE_ON_LAN = 0x0842; // Wake-on-LAN[3]
19 static final int ETH_TYPE_VAL_TRILL = 0x22F3; // IETF TRILL Protocol
20 static final int ETH_TYPE_VAL_DECNET_IV = 0x6003; // DECnet Phase IV
21 static final int ETH_TYPE_VAL_REV_ARP = 0x8035; // Reverse Address Resolution Protocol
22 static final int ETH_TYPE_VAL_APPLE_TALK = 0x809B; // AppleTalk (Ethertalk)
23 static final int ETH_TYPE_VAL_APPLE_TALK_ARP = 0x80F3; // AppleTalk Address Resolution Protocol (AARP)
24 static final int ETH_TYPE_VAL_VLAN_FRAME = 0x8100; // VLAN-tagged frame (IEEE 802.1Q) & Shortest Path Bridging IEEE 802.1aq[4]
25 static final int ETH_TYPE_VAL_IPX_8137 = 0x8137; // IPX
26 static final int ETH_TYPE_VAL_IPX_8138 = 0x8138; // IPX
27 static final int ETH_TYPE_VAL_QNX = 0x8204; // QNX Qnet
28 static final int ETH_TYPE_VAL_IPv6 = 0x86DD; // Internet Protocol Version 6 (IPv6)
29 static final int ETH_TYPE_VAL_ETH_FLOW = 0x8808; // Ethernet flow control
30 static final int ETH_TYPE_VAL_SLOW_PROTOCOLS = 0x8809; // Slow Protocols (IEEE 802.3)
31 static final int ETH_TYPE_VAL_COBRANET = 0x8819; // CobraNet
32 static final int ETH_TYPE_VAL_MPLS_UNICAST = 0x8847; // MPLS unicast
33 static final int ETH_TYPE_VAL_MPLS_MULTICAST = 0x8848; // MPLS multicast
34 static final int ETH_TYPE_VAL_PPPoE_DISCOVERY = 0x8863; // PPPoE Discovery Stage
35 static final int ETH_TYPE_VAL_PPPoE_SESSION = 0x8864; // PPPoE Session Stage
36 static final int ETH_TYPE_VAL_JUMBO_FRAMES = 0x8870; // Jumbo Frames
37 static final int ETH_TYPE_VAL_HOMEPLUG_10 = 0x887B; // HomePlug 1.0 MME
38 static final int ETH_TYPE_VAL_EAP_OVER_LAN = 0x888E; // EAP over LAN (IEEE 802.1X)
39 static final int ETH_TYPE_VAL_PROFINET = 0x8892; // PROFINET Protocol
40 static final int ETH_TYPE_VAL_HYPERSCSI = 0x889A; // HyperSCSI (SCSI over Ethernet)
41 static final int ETH_TYPE_VAL_ATA_OVER_ETH = 0x88A2; // ATA over Ethernet
42 static final int ETH_TYPE_VAL_ETHERCAT = 0x88A4; // EtherCAT Protocol
43 static final int ETH_TYPE_VAL_BRIDGING = 0x88A8; // Provider Bridging (IEEE 802.1ad) & Shortest Path Bridging IEEE 802.1aq[5]
44 static final int ETH_TYPE_VAL_POWERLINK = 0x88AB; // Ethernet Powerlink[citation needed]
45 static final int ETH_TYPE_VAL_LLDP = 0x88CC; // Link Layer Discovery Protocol (LLDP)
46 static final int ETH_TYPE_VAL_SERCOS = 0x88CD; // SERCOS III
47 static final int ETH_TYPE_VAL_HOMEPLUG_AV = 0x88E1; // HomePlug AV MME[citation needed]
48 static final int ETH_TYPE_VAL_MRP = 0x88E3; // Media Redundancy Protocol (IEC62439-2)
49 static final int ETH_TYPE_VAL_MAC_SEC = 0x88E5; // MAC security (IEEE 802.1AE)
50 static final int ETH_TYPE_VAL_PTP = 0x88F7; // Precision Time Protocol (IEEE 1588)
51 static final int ETH_TYPE_VAL_CFM = 0x8902; // IEEE 802.1ag Connectivity Fault Management (CFM) Protocol / ITU-T Recommendation Y.1731 (OAM)
52 static final int ETH_TYPE_VAL_FCoE = 0x8906; // Fibre Channel over Ethernet (FCoE)
53 static final int ETH_TYPE_VAL_FCoE_INIT = 0x8914; // FCoE Initialization Protocol
54 static final int ETH_TYPE_VAL_RoCE = 0x8915; // RDMA over Converged Ethernet (RoCE)
55 static final int ETH_TYPE_VAL_HSR = 0x892F; // High-availability Seamless Redundancy (HSR)
56 static final int ETH_TYPE_VAL_CONF_TEST = 0x9000; // Ethernet Configuration Testing Protocol[6]
57 static final int ETH_TYPE_VAL_Q_IN_Q = 0x9100; // Q-in-Q
58 static final int ETH_TYPE_VAL_LLT = 0xCAFE; // Veritas Low Latency Transport (LLT)[7] for Veritas Cluster Server
59
60 public static final EthType ETH_TYPE_IPv4 = new EthType(ETH_TYPE_VAL_IPv4);
61 public static final EthType ETH_TYPE_ARP = new EthType(ETH_TYPE_VAL_ARP);
62 public static final EthType ETH_TYPE_WAKE_ON_LAN = new EthType(ETH_TYPE_VAL_WAKE_ON_LAN);
63 public static final EthType ETH_TYPE_TRILL = new EthType(ETH_TYPE_VAL_TRILL);
64 public static final EthType ETH_TYPE_DECNET_IV = new EthType(ETH_TYPE_VAL_DECNET_IV);
65 public static final EthType ETH_TYPE_REV_ARP = new EthType(ETH_TYPE_VAL_REV_ARP );
66 public static final EthType ETH_TYPE_APPLE_TALK = new EthType(ETH_TYPE_VAL_APPLE_TALK);
67 public static final EthType ETH_TYPE_APPLE_TALK_ARP = new EthType(ETH_TYPE_VAL_APPLE_TALK_ARP);
68 public static final EthType ETH_TYPE_VLAN_FRAME = new EthType(ETH_TYPE_VAL_VLAN_FRAME );
69 public static final EthType ETH_TYPE_IPX_8137 = new EthType(ETH_TYPE_VAL_IPX_8137 );
70 public static final EthType ETH_TYPE_IPX_8138 = new EthType(ETH_TYPE_VAL_IPX_8138 );
71 public static final EthType ETH_TYPE_QNX = new EthType(ETH_TYPE_VAL_QNX );
72 public static final EthType ETH_TYPE_IPv6 = new EthType(ETH_TYPE_VAL_IPv6 );
73 public static final EthType ETH_TYPE_ETH_FLOW = new EthType(ETH_TYPE_VAL_ETH_FLOW);
74 public static final EthType ETH_TYPE_SLOW_PROTOCOLS = new EthType(ETH_TYPE_VAL_SLOW_PROTOCOLS );
75 public static final EthType ETH_TYPE_COBRANET = new EthType(ETH_TYPE_VAL_COBRANET );
76 public static final EthType ETH_TYPE_MPLS_UNICAST = new EthType(ETH_TYPE_VAL_MPLS_UNICAST );
77 public static final EthType ETH_TYPE_MPLS_MULTICAST = new EthType(ETH_TYPE_VAL_MPLS_MULTICAST );
78 public static final EthType ETH_TYPE_PPPoE_DISCOVERY = new EthType(ETH_TYPE_VAL_PPPoE_DISCOVERY);
79 public static final EthType ETH_TYPE_PPPoE_SESSION = new EthType(ETH_TYPE_VAL_PPPoE_SESSION );
80 public static final EthType ETH_TYPE_JUMBO_FRAMES = new EthType(ETH_TYPE_VAL_JUMBO_FRAMES );
81 public static final EthType ETH_TYPE_HOMEPLUG_10 = new EthType(ETH_TYPE_VAL_HOMEPLUG_10 );
82 public static final EthType ETH_TYPE_EAP_OVER_LAN = new EthType(ETH_TYPE_VAL_EAP_OVER_LAN );
83 public static final EthType ETH_TYPE_PROFINET = new EthType(ETH_TYPE_VAL_PROFINET );
84 public static final EthType ETH_TYPE_HYPERSCSI = new EthType(ETH_TYPE_VAL_HYPERSCSI );
85 public static final EthType ETH_TYPE_ATA_OVER_ETH = new EthType(ETH_TYPE_VAL_ATA_OVER_ETH);
86 public static final EthType ETH_TYPE_ETHERCAT = new EthType(ETH_TYPE_VAL_ETHERCAT );
87 public static final EthType ETH_TYPE_BRIDGING = new EthType(ETH_TYPE_VAL_BRIDGING );
88 public static final EthType ETH_TYPE_POWERLINK = new EthType(ETH_TYPE_VAL_POWERLINK );
89 public static final EthType ETH_TYPE_LLDP = new EthType(ETH_TYPE_VAL_LLDP );
90 public static final EthType ETH_TYPE_SERCOS = new EthType(ETH_TYPE_VAL_SERCOS );
91 public static final EthType ETH_TYPE_HOMEPLUG_AV = new EthType(ETH_TYPE_VAL_HOMEPLUG_AV );
92 public static final EthType ETH_TYPE_MRP = new EthType(ETH_TYPE_VAL_MRP );
93 public static final EthType ETH_TYPE_MAC_SEC = new EthType(ETH_TYPE_VAL_MAC_SEC);
94 public static final EthType ETH_TYPE_PTP = new EthType(ETH_TYPE_VAL_PTP );
95 public static final EthType ETH_TYPE_CFM = new EthType(ETH_TYPE_VAL_CFM );
96 public static final EthType ETH_TYPE_FCoE = new EthType(ETH_TYPE_VAL_FCoE );
97 public static final EthType ETH_TYPE_FCoE_INIT = new EthType(ETH_TYPE_VAL_FCoE_INIT );
98 public static final EthType ETH_TYPE_RoCE = new EthType(ETH_TYPE_VAL_RoCE );
99 public static final EthType ETH_TYPE_HSR = new EthType(ETH_TYPE_VAL_HSR );
100 public static final EthType ETH_TYPE_CONF_TEST = new EthType(ETH_TYPE_VAL_CONF_TEST );
101 public static final EthType ETH_TYPE_Q_IN_Q = new EthType(ETH_TYPE_VAL_Q_IN_Q );
102 public static final EthType ETH_TYPE_LLT = new EthType(ETH_TYPE_VAL_LLT );
103
104 private EthType(int type) {
105 this.rawValue = type;
106 }
107
108 @Override
109 public int getLength() {
110 return LENGTH;
111 }
112
Yotam Harchol161a5d52013-07-25 17:17:48 -0700113 public static EthType of(int type) {
114 switch (type) {
115 case ETH_TYPE_VAL_IPv4:
116 return ETH_TYPE_IPv4;
117 case ETH_TYPE_VAL_ARP:
118 return ETH_TYPE_ARP;
119 case ETH_TYPE_VAL_WAKE_ON_LAN:
120 return ETH_TYPE_WAKE_ON_LAN;
121 case ETH_TYPE_VAL_TRILL:
122 return ETH_TYPE_TRILL;
123 case ETH_TYPE_VAL_DECNET_IV:
124 return ETH_TYPE_DECNET_IV;
125 case ETH_TYPE_VAL_REV_ARP:
126 return ETH_TYPE_REV_ARP;
127 case ETH_TYPE_VAL_APPLE_TALK:
128 return ETH_TYPE_APPLE_TALK;
129 case ETH_TYPE_VAL_APPLE_TALK_ARP:
130 return ETH_TYPE_APPLE_TALK_ARP;
131 case ETH_TYPE_VAL_VLAN_FRAME:
132 return ETH_TYPE_VLAN_FRAME;
133 case ETH_TYPE_VAL_IPX_8137:
134 return ETH_TYPE_IPX_8137;
135 case ETH_TYPE_VAL_IPX_8138:
136 return ETH_TYPE_IPX_8138;
137 case ETH_TYPE_VAL_QNX:
138 return ETH_TYPE_QNX;
139 case ETH_TYPE_VAL_IPv6:
140 return ETH_TYPE_IPv6;
141 case ETH_TYPE_VAL_ETH_FLOW:
142 return ETH_TYPE_ETH_FLOW;
143 case ETH_TYPE_VAL_SLOW_PROTOCOLS:
144 return ETH_TYPE_SLOW_PROTOCOLS;
145 case ETH_TYPE_VAL_COBRANET:
146 return ETH_TYPE_COBRANET;
147 case ETH_TYPE_VAL_MPLS_UNICAST:
148 return ETH_TYPE_MPLS_UNICAST;
149 case ETH_TYPE_VAL_MPLS_MULTICAST:
150 return ETH_TYPE_MPLS_MULTICAST;
151 case ETH_TYPE_VAL_PPPoE_DISCOVERY:
152 return ETH_TYPE_PPPoE_DISCOVERY;
153 case ETH_TYPE_VAL_PPPoE_SESSION:
154 return ETH_TYPE_PPPoE_SESSION;
155 case ETH_TYPE_VAL_JUMBO_FRAMES:
156 return ETH_TYPE_JUMBO_FRAMES;
157 case ETH_TYPE_VAL_HOMEPLUG_10:
158 return ETH_TYPE_HOMEPLUG_10;
159 case ETH_TYPE_VAL_EAP_OVER_LAN:
160 return ETH_TYPE_EAP_OVER_LAN;
161 case ETH_TYPE_VAL_PROFINET:
162 return ETH_TYPE_PROFINET;
163 case ETH_TYPE_VAL_HYPERSCSI:
164 return ETH_TYPE_HYPERSCSI;
165 case ETH_TYPE_VAL_ATA_OVER_ETH:
166 return ETH_TYPE_ATA_OVER_ETH;
167 case ETH_TYPE_VAL_ETHERCAT:
168 return ETH_TYPE_ETHERCAT;
169 case ETH_TYPE_VAL_BRIDGING:
170 return ETH_TYPE_BRIDGING;
171 case ETH_TYPE_VAL_POWERLINK:
172 return ETH_TYPE_POWERLINK;
173 case ETH_TYPE_VAL_LLDP:
174 return ETH_TYPE_LLDP;
175 case ETH_TYPE_VAL_SERCOS:
176 return ETH_TYPE_SERCOS;
177 case ETH_TYPE_VAL_HOMEPLUG_AV:
178 return ETH_TYPE_HOMEPLUG_AV;
179 case ETH_TYPE_VAL_MRP:
180 return ETH_TYPE_MRP;
181 case ETH_TYPE_VAL_MAC_SEC:
182 return ETH_TYPE_MAC_SEC;
183 case ETH_TYPE_VAL_PTP:
184 return ETH_TYPE_PTP;
185 case ETH_TYPE_VAL_CFM:
186 return ETH_TYPE_CFM;
187 case ETH_TYPE_VAL_FCoE:
188 return ETH_TYPE_FCoE;
189 case ETH_TYPE_VAL_FCoE_INIT:
190 return ETH_TYPE_FCoE_INIT;
191 case ETH_TYPE_VAL_RoCE:
192 return ETH_TYPE_RoCE;
193 case ETH_TYPE_VAL_HSR:
194 return ETH_TYPE_HSR;
195 case ETH_TYPE_VAL_CONF_TEST:
196 return ETH_TYPE_CONF_TEST;
197 case ETH_TYPE_VAL_Q_IN_Q:
198 return ETH_TYPE_Q_IN_Q;
199 case ETH_TYPE_VAL_LLT:
200 return ETH_TYPE_LLT;
201 default:
202 // TODO: What's here?
203 return new EthType(type);
204 }
205 }
206
207 @Override
208 public boolean equals(Object obj) {
209 if (!(obj instanceof EthType))
210 return false;
211 EthType o = (EthType)obj;
212 if (o.rawValue != this.rawValue)
213 return false;
214 return true;
215 }
216
217 @Override
218 public int hashCode() {
219 final int prime = 37;
220 int result = 1;
221 result = prime * result + rawValue;
222 return result;
223 }
224
225 @Override
226 public String toString() {
227 return Integer.toHexString(rawValue);
228 }
Yotam Harchold7b84202013-07-26 16:08:10 -0700229
230 public void write2Bytes(ChannelBuffer c) {
231 c.writeShort(this.rawValue);
232 }
233
234 public static EthType read2Bytes(ChannelBuffer c) {
235 return EthType.of(c.readUnsignedShort());
Yotam Harchol161a5d52013-07-25 17:17:48 -0700236 }
Andreas Wundsam40e14f72013-05-06 14:49:08 -0700237
238}