small fixes to ethtype pattern
Change-Id: Ic58c426821952f66aa21bc828d36fd4f83d8da0d
Showing
14 changed files
with
215 additions
and
133 deletions
... | @@ -16,11 +16,13 @@ | ... | @@ -16,11 +16,13 @@ |
16 | 16 | ||
17 | package org.onosproject.aaa.packet; | 17 | package org.onosproject.aaa.packet; |
18 | 18 | ||
19 | -import org.onlab.packet.ARP; | 19 | +import org.onlab.packet.Deserializer; |
20 | +import org.onlab.packet.EthType; | ||
20 | import org.onlab.packet.Ethernet; | 21 | import org.onlab.packet.Ethernet; |
21 | -import org.onlab.packet.IPv4; | 22 | +import org.onlab.packet.IPacket; |
22 | -import org.onlab.packet.IPv6; | 23 | + |
23 | -import org.onlab.packet.LLDP; | 24 | +import java.util.HashMap; |
25 | +import java.util.Map; | ||
24 | 26 | ||
25 | /** | 27 | /** |
26 | * Created by jono on 5/19/15. | 28 | * Created by jono on 5/19/15. |
... | @@ -29,17 +31,21 @@ public final class EAPEthernet extends Ethernet { | ... | @@ -29,17 +31,21 @@ public final class EAPEthernet extends Ethernet { |
29 | 31 | ||
30 | public static final short TYPE_PAE = (short) 0x888e; | 32 | public static final short TYPE_PAE = (short) 0x888e; |
31 | 33 | ||
34 | + private static final Map<Short, Deserializer<? extends IPacket>> ETHERTYPE_DESERIALIZER_MAP = | ||
35 | + new HashMap<>(); | ||
36 | + | ||
32 | private EAPEthernet() { | 37 | private EAPEthernet() { |
33 | 38 | ||
34 | } | 39 | } |
35 | 40 | ||
36 | static { | 41 | static { |
37 | - Ethernet.ETHER_TYPE_CLASS_MAP.put(org.onlab.packet.Ethernet.TYPE_ARP, ARP.class); | 42 | + for (EthType.EtherType ethType : EthType.EtherType.values()) { |
38 | - org.onlab.packet.Ethernet.ETHER_TYPE_CLASS_MAP.put(org.onlab.packet.Ethernet.TYPE_RARP, ARP.class); | 43 | + if (ethType.deserializer() != null) { |
39 | - org.onlab.packet.Ethernet.ETHER_TYPE_CLASS_MAP.put(org.onlab.packet.Ethernet.TYPE_IPV4, IPv4.class); | 44 | + ETHERTYPE_DESERIALIZER_MAP.put(ethType.ethType().toShort(), |
40 | - org.onlab.packet.Ethernet.ETHER_TYPE_CLASS_MAP.put(org.onlab.packet.Ethernet.TYPE_IPV6, IPv6.class); | 45 | + ethType.deserializer()); |
41 | - org.onlab.packet.Ethernet.ETHER_TYPE_CLASS_MAP.put(org.onlab.packet.Ethernet.TYPE_LLDP, LLDP.class); | 46 | + } |
42 | - org.onlab.packet.Ethernet.ETHER_TYPE_CLASS_MAP.put(org.onlab.packet.Ethernet.TYPE_BSN, LLDP.class); | 47 | + } |
43 | - org.onlab.packet.Ethernet.ETHER_TYPE_CLASS_MAP.put(TYPE_PAE, EAPOL.class); | 48 | + ETHERTYPE_DESERIALIZER_MAP.put((short) 0x888e, EAPOL.deserializer()); |
44 | } | 49 | } |
50 | + | ||
45 | } | 51 | } | ... | ... |
... | @@ -19,12 +19,15 @@ | ... | @@ -19,12 +19,15 @@ |
19 | package org.onosproject.aaa.packet; | 19 | package org.onosproject.aaa.packet; |
20 | 20 | ||
21 | import org.onlab.packet.BasePacket; | 21 | import org.onlab.packet.BasePacket; |
22 | +import org.onlab.packet.Deserializer; | ||
22 | import org.onlab.packet.Ethernet; | 23 | import org.onlab.packet.Ethernet; |
23 | import org.onlab.packet.IPacket; | 24 | import org.onlab.packet.IPacket; |
24 | import org.onlab.packet.MacAddress; | 25 | import org.onlab.packet.MacAddress; |
25 | 26 | ||
26 | import java.nio.ByteBuffer; | 27 | import java.nio.ByteBuffer; |
27 | 28 | ||
29 | +import static org.onlab.packet.PacketUtils.checkInput; | ||
30 | + | ||
28 | /** | 31 | /** |
29 | * | 32 | * |
30 | */ | 33 | */ |
... | @@ -133,29 +136,8 @@ public class EAPOL extends BasePacket { | ... | @@ -133,29 +136,8 @@ public class EAPOL extends BasePacket { |
133 | return data; | 136 | return data; |
134 | } | 137 | } |
135 | 138 | ||
136 | - @Override | ||
137 | - public IPacket deserialize(final byte[] data, final int offset, | ||
138 | - final int length) { | ||
139 | - final ByteBuffer bb = ByteBuffer.wrap(data, offset, length); | ||
140 | 139 | ||
141 | 140 | ||
142 | - //deserialize the EAPOL header | ||
143 | - this.version = bb.get(); | ||
144 | - this.eapolType = bb.get(); | ||
145 | - this.packetLength = bb.getShort(); | ||
146 | - | ||
147 | - if (this.packetLength > 0) { | ||
148 | - //deserialize the EAP Payload | ||
149 | - this.payload = new EAP(); | ||
150 | - | ||
151 | - this.payload = this.payload.deserialize(data, bb.position(), length - 4); | ||
152 | - this.payload.setParent(this); | ||
153 | - } | ||
154 | - | ||
155 | - | ||
156 | - return this; | ||
157 | - } | ||
158 | - | ||
159 | @Override | 141 | @Override |
160 | public int hashCode() { | 142 | public int hashCode() { |
161 | final int prime = 3889; | 143 | final int prime = 3889; |
... | @@ -196,5 +178,51 @@ public class EAPOL extends BasePacket { | ... | @@ -196,5 +178,51 @@ public class EAPOL extends BasePacket { |
196 | eth.setPad(true); | 178 | eth.setPad(true); |
197 | return eth; | 179 | return eth; |
198 | } | 180 | } |
181 | + | ||
182 | + public static Deserializer<EAPOL> deserializer() { | ||
183 | + return (data, offset, length) -> { | ||
184 | + checkInput(data, offset, length, 0); | ||
185 | + | ||
186 | + EAPOL eapol = new EAPOL(); | ||
187 | + final ByteBuffer bb = ByteBuffer.wrap(data, offset, length); | ||
188 | + eapol.setVersion(bb.get()); | ||
189 | + eapol.setEapolType(bb.get()); | ||
190 | + eapol.setPacketLength(bb.getShort()); | ||
191 | + | ||
192 | + if (eapol.packetLength > 0) { | ||
193 | + //deserialize the EAP Payload | ||
194 | + eapol.payload = new EAP(); | ||
195 | + | ||
196 | + eapol.payload = eapol.payload.deserialize(data, bb.position(), length - 4); | ||
197 | + eapol.payload.setParent(eapol); | ||
198 | + } | ||
199 | + return eapol; | ||
200 | + }; | ||
201 | + } | ||
202 | + | ||
203 | + @Override | ||
204 | + public IPacket deserialize(final byte[] data, final int offset, | ||
205 | + final int length) { | ||
206 | + final ByteBuffer bb = ByteBuffer.wrap(data, offset, length); | ||
207 | + | ||
208 | + | ||
209 | + //deserialize the EAPOL header | ||
210 | + this.version = bb.get(); | ||
211 | + this.eapolType = bb.get(); | ||
212 | + this.packetLength = bb.getShort(); | ||
213 | + | ||
214 | + if (this.packetLength > 0) { | ||
215 | + //deserialize the EAP Payload | ||
216 | + this.payload = new EAP(); | ||
217 | + | ||
218 | + this.payload = this.payload.deserialize(data, bb.position(), length - 4); | ||
219 | + this.payload.setParent(this); | ||
220 | + } | ||
221 | + | ||
222 | + | ||
223 | + return this; | ||
224 | + } | ||
225 | + | ||
226 | + | ||
199 | } | 227 | } |
200 | 228 | ... | ... |
... | @@ -19,6 +19,7 @@ import com.google.common.base.MoreObjects; | ... | @@ -19,6 +19,7 @@ import com.google.common.base.MoreObjects; |
19 | import com.google.common.collect.ImmutableList; | 19 | import com.google.common.collect.ImmutableList; |
20 | import com.google.common.collect.Lists; | 20 | import com.google.common.collect.Lists; |
21 | import org.apache.commons.collections.ListUtils; | 21 | import org.apache.commons.collections.ListUtils; |
22 | +import org.onlab.packet.EthType; | ||
22 | import org.onlab.packet.IpAddress; | 23 | import org.onlab.packet.IpAddress; |
23 | import org.onlab.packet.MacAddress; | 24 | import org.onlab.packet.MacAddress; |
24 | import org.onlab.packet.MplsLabel; | 25 | import org.onlab.packet.MplsLabel; |
... | @@ -309,6 +310,11 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { | ... | @@ -309,6 +310,11 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { |
309 | 310 | ||
310 | @Override | 311 | @Override |
311 | public Builder popMpls(int etherType) { | 312 | public Builder popMpls(int etherType) { |
313 | + return add(Instructions.popMpls(new EthType(etherType))); | ||
314 | + } | ||
315 | + | ||
316 | + @Override | ||
317 | + public Builder popMpls(EthType etherType) { | ||
312 | return add(Instructions.popMpls(etherType)); | 318 | return add(Instructions.popMpls(etherType)); |
313 | } | 319 | } |
314 | 320 | ... | ... |
... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.net.flow; | 16 | package org.onosproject.net.flow; |
17 | 17 | ||
18 | +import org.onlab.packet.EthType; | ||
18 | import org.onlab.packet.IpAddress; | 19 | import org.onlab.packet.IpAddress; |
19 | import org.onlab.packet.MacAddress; | 20 | import org.onlab.packet.MacAddress; |
20 | import org.onlab.packet.MplsLabel; | 21 | import org.onlab.packet.MplsLabel; |
... | @@ -197,9 +198,18 @@ public interface TrafficTreatment { | ... | @@ -197,9 +198,18 @@ public interface TrafficTreatment { |
197 | * @param etherType an ether type | 198 | * @param etherType an ether type |
198 | * @return a treatment builder. | 199 | * @return a treatment builder. |
199 | */ | 200 | */ |
201 | + @Deprecated | ||
200 | Builder popMpls(int etherType); | 202 | Builder popMpls(int etherType); |
201 | 203 | ||
202 | /** | 204 | /** |
205 | + * Pops MPLS ether type and set the new ethertype. | ||
206 | + * | ||
207 | + * @param etherType an ether type | ||
208 | + * @return a treatment builder. | ||
209 | + */ | ||
210 | + Builder popMpls(EthType etherType); | ||
211 | + | ||
212 | + /** | ||
203 | * Sets the mpls label. | 213 | * Sets the mpls label. |
204 | * | 214 | * |
205 | * @param mplsLabel MPLS label. | 215 | * @param mplsLabel MPLS label. | ... | ... |
... | @@ -25,8 +25,9 @@ import static com.google.common.base.MoreObjects.toStringHelper; | ... | @@ -25,8 +25,9 @@ import static com.google.common.base.MoreObjects.toStringHelper; |
25 | * Implementation of Ethernet type criterion (16 bits unsigned integer). | 25 | * Implementation of Ethernet type criterion (16 bits unsigned integer). |
26 | */ | 26 | */ |
27 | public final class EthTypeCriterion implements Criterion { | 27 | public final class EthTypeCriterion implements Criterion { |
28 | - private static final int MASK = 0xffff; | 28 | + |
29 | - private final EthType ethType; // Ethernet type value: 16 bits | 29 | + |
30 | + private final EthType ethType; | ||
30 | 31 | ||
31 | /** | 32 | /** |
32 | * Constructor. | 33 | * Constructor. |
... | @@ -35,7 +36,7 @@ public final class EthTypeCriterion implements Criterion { | ... | @@ -35,7 +36,7 @@ public final class EthTypeCriterion implements Criterion { |
35 | * integer) | 36 | * integer) |
36 | */ | 37 | */ |
37 | EthTypeCriterion(int ethType) { | 38 | EthTypeCriterion(int ethType) { |
38 | - this.ethType = new EthType(ethType & MASK); | 39 | + this.ethType = new EthType(ethType); |
39 | } | 40 | } |
40 | 41 | ||
41 | /** | 42 | /** | ... | ... |
... | @@ -15,7 +15,7 @@ | ... | @@ -15,7 +15,7 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.net.flow.instructions; | 16 | package org.onosproject.net.flow.instructions; |
17 | 17 | ||
18 | -import org.onlab.packet.Ethernet; | 18 | +import org.onlab.packet.EthType; |
19 | import org.onlab.packet.IpAddress; | 19 | import org.onlab.packet.IpAddress; |
20 | import org.onlab.packet.MacAddress; | 20 | import org.onlab.packet.MacAddress; |
21 | import org.onlab.packet.MplsLabel; | 21 | import org.onlab.packet.MplsLabel; |
... | @@ -265,7 +265,7 @@ public final class Instructions { | ... | @@ -265,7 +265,7 @@ public final class Instructions { |
265 | public static Instruction pushMpls() { | 265 | public static Instruction pushMpls() { |
266 | return new L2ModificationInstruction.PushHeaderInstructions( | 266 | return new L2ModificationInstruction.PushHeaderInstructions( |
267 | L2ModificationInstruction.L2SubType.MPLS_PUSH, | 267 | L2ModificationInstruction.L2SubType.MPLS_PUSH, |
268 | - Ethernet.MPLS_UNICAST); | 268 | + EthType.EtherType.MPLS_UNICAST.ethType()); |
269 | } | 269 | } |
270 | 270 | ||
271 | /** | 271 | /** |
... | @@ -276,7 +276,7 @@ public final class Instructions { | ... | @@ -276,7 +276,7 @@ public final class Instructions { |
276 | public static Instruction popMpls() { | 276 | public static Instruction popMpls() { |
277 | return new L2ModificationInstruction.PushHeaderInstructions( | 277 | return new L2ModificationInstruction.PushHeaderInstructions( |
278 | L2ModificationInstruction.L2SubType.MPLS_POP, | 278 | L2ModificationInstruction.L2SubType.MPLS_POP, |
279 | - Ethernet.MPLS_UNICAST); | 279 | + EthType.EtherType.MPLS_UNICAST.ethType()); |
280 | } | 280 | } |
281 | 281 | ||
282 | /** | 282 | /** |
... | @@ -285,9 +285,23 @@ public final class Instructions { | ... | @@ -285,9 +285,23 @@ public final class Instructions { |
285 | * @param etherType Ethernet type to set | 285 | * @param etherType Ethernet type to set |
286 | * @return a L2 modification. | 286 | * @return a L2 modification. |
287 | */ | 287 | */ |
288 | + @Deprecated | ||
288 | public static Instruction popMpls(int etherType) { | 289 | public static Instruction popMpls(int etherType) { |
289 | checkNotNull(etherType, "Ethernet type cannot be null"); | 290 | checkNotNull(etherType, "Ethernet type cannot be null"); |
290 | return new L2ModificationInstruction.PushHeaderInstructions( | 291 | return new L2ModificationInstruction.PushHeaderInstructions( |
292 | + L2ModificationInstruction.L2SubType.MPLS_POP, new EthType(etherType)); | ||
293 | + } | ||
294 | + | ||
295 | + | ||
296 | + /** | ||
297 | + * Creates a pop MPLS header instruction with a particular ethertype. | ||
298 | + * | ||
299 | + * @param etherType Ethernet type to set | ||
300 | + * @return a L2 modification. | ||
301 | + */ | ||
302 | + public static Instruction popMpls(EthType etherType) { | ||
303 | + checkNotNull(etherType, "Ethernet type cannot be null"); | ||
304 | + return new L2ModificationInstruction.PushHeaderInstructions( | ||
291 | L2ModificationInstruction.L2SubType.MPLS_POP, etherType); | 305 | L2ModificationInstruction.L2SubType.MPLS_POP, etherType); |
292 | } | 306 | } |
293 | 307 | ||
... | @@ -308,7 +322,8 @@ public final class Instructions { | ... | @@ -308,7 +322,8 @@ public final class Instructions { |
308 | */ | 322 | */ |
309 | public static Instruction pushVlan() { | 323 | public static Instruction pushVlan() { |
310 | return new L2ModificationInstruction.PushHeaderInstructions( | 324 | return new L2ModificationInstruction.PushHeaderInstructions( |
311 | - L2ModificationInstruction.L2SubType.VLAN_PUSH, Ethernet.TYPE_VLAN); | 325 | + L2ModificationInstruction.L2SubType.VLAN_PUSH, |
326 | + EthType.EtherType.VLAN.ethType()); | ||
312 | } | 327 | } |
313 | 328 | ||
314 | /** | 329 | /** | ... | ... |
... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.net.flow.instructions; | 16 | package org.onosproject.net.flow.instructions; |
17 | 17 | ||
18 | +import org.onlab.packet.EthType; | ||
18 | import org.onlab.packet.MacAddress; | 19 | import org.onlab.packet.MacAddress; |
19 | import org.onlab.packet.MplsLabel; | 20 | import org.onlab.packet.MplsLabel; |
20 | import org.onlab.packet.VlanId; | 21 | import org.onlab.packet.VlanId; |
... | @@ -145,16 +146,16 @@ public abstract class L2ModificationInstruction implements Instruction { | ... | @@ -145,16 +146,16 @@ public abstract class L2ModificationInstruction implements Instruction { |
145 | public static final class PushHeaderInstructions extends | 146 | public static final class PushHeaderInstructions extends |
146 | L2ModificationInstruction { | 147 | L2ModificationInstruction { |
147 | 148 | ||
148 | - private static final int MASK = 0xffff; | 149 | + |
149 | private final L2SubType subtype; | 150 | private final L2SubType subtype; |
150 | - private final int ethernetType; // Ethernet type value: 16 bits | 151 | + private final EthType ethernetType; // Ethernet type value: 16 bits |
151 | 152 | ||
152 | - PushHeaderInstructions(L2SubType subType, int ethernetType) { | 153 | + PushHeaderInstructions(L2SubType subType, EthType ethernetType) { |
153 | this.subtype = subType; | 154 | this.subtype = subType; |
154 | - this.ethernetType = ethernetType & MASK; | 155 | + this.ethernetType = ethernetType; |
155 | } | 156 | } |
156 | 157 | ||
157 | - public int ethernetType() { | 158 | + public EthType ethernetType() { |
158 | return ethernetType; | 159 | return ethernetType; |
159 | } | 160 | } |
160 | 161 | ||
... | @@ -166,7 +167,7 @@ public abstract class L2ModificationInstruction implements Instruction { | ... | @@ -166,7 +167,7 @@ public abstract class L2ModificationInstruction implements Instruction { |
166 | @Override | 167 | @Override |
167 | public String toString() { | 168 | public String toString() { |
168 | return toStringHelper(subtype().toString()) | 169 | return toStringHelper(subtype().toString()) |
169 | - .add("ethernetType", String.format("0x%04x", ethernetType())) | 170 | + .add("ethernetType", ethernetType()) |
170 | .toString(); | 171 | .toString(); |
171 | } | 172 | } |
172 | 173 | ... | ... |
... | @@ -119,7 +119,8 @@ public final class EncodeInstructionCodec { | ... | @@ -119,7 +119,8 @@ public final class EncodeInstructionCodec { |
119 | final L2ModificationInstruction.PushHeaderInstructions pushHeaderInstructions = | 119 | final L2ModificationInstruction.PushHeaderInstructions pushHeaderInstructions = |
120 | (L2ModificationInstruction.PushHeaderInstructions) instruction; | 120 | (L2ModificationInstruction.PushHeaderInstructions) instruction; |
121 | 121 | ||
122 | - result.put(InstructionCodec.ETHERNET_TYPE, pushHeaderInstructions.ethernetType()); | 122 | + result.put(InstructionCodec.ETHERNET_TYPE, |
123 | + pushHeaderInstructions.ethernetType().toShort()); | ||
123 | break; | 124 | break; |
124 | 125 | ||
125 | default: | 126 | default: | ... | ... |
... | @@ -247,15 +247,15 @@ public class FlowRuleCodecTest { | ... | @@ -247,15 +247,15 @@ public class FlowRuleCodecTest { |
247 | instruction = getInstruction(Instruction.Type.L2MODIFICATION, | 247 | instruction = getInstruction(Instruction.Type.L2MODIFICATION, |
248 | L2ModificationInstruction.L2SubType.MPLS_PUSH.name()); | 248 | L2ModificationInstruction.L2SubType.MPLS_PUSH.name()); |
249 | assertThat(instruction.type(), is(Instruction.Type.L2MODIFICATION)); | 249 | assertThat(instruction.type(), is(Instruction.Type.L2MODIFICATION)); |
250 | - assertThat((short) ((L2ModificationInstruction.PushHeaderInstructions) instruction) | 250 | + assertThat(((L2ModificationInstruction.PushHeaderInstructions) instruction) |
251 | - .ethernetType(), | 251 | + .ethernetType().toShort(), |
252 | is(Ethernet.MPLS_UNICAST)); | 252 | is(Ethernet.MPLS_UNICAST)); |
253 | 253 | ||
254 | instruction = getInstruction(Instruction.Type.L2MODIFICATION, | 254 | instruction = getInstruction(Instruction.Type.L2MODIFICATION, |
255 | L2ModificationInstruction.L2SubType.MPLS_POP.name()); | 255 | L2ModificationInstruction.L2SubType.MPLS_POP.name()); |
256 | assertThat(instruction.type(), is(Instruction.Type.L2MODIFICATION)); | 256 | assertThat(instruction.type(), is(Instruction.Type.L2MODIFICATION)); |
257 | - assertThat((short) ((L2ModificationInstruction.PushHeaderInstructions) instruction) | 257 | + assertThat(((L2ModificationInstruction.PushHeaderInstructions) instruction) |
258 | - .ethernetType(), | 258 | + .ethernetType().toShort(), |
259 | is(Ethernet.MPLS_UNICAST)); | 259 | is(Ethernet.MPLS_UNICAST)); |
260 | 260 | ||
261 | instruction = getInstruction(Instruction.Type.L2MODIFICATION, | 261 | instruction = getInstruction(Instruction.Type.L2MODIFICATION, | ... | ... |
... | @@ -66,7 +66,7 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json | ... | @@ -66,7 +66,7 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json |
66 | return false; | 66 | return false; |
67 | } | 67 | } |
68 | 68 | ||
69 | - if (instructionToMatch.ethernetType() != ethJson.asInt()) { | 69 | + if (instructionToMatch.ethernetType().toShort() != ethJson.asInt()) { |
70 | description.appendText("ethernetType was " + ethJson); | 70 | description.appendText("ethernetType was " + ethJson); |
71 | return false; | 71 | return false; |
72 | } | 72 | } | ... | ... |
providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
... | @@ -316,12 +316,12 @@ public class FlowModBuilderVer13 extends FlowModBuilder { | ... | @@ -316,12 +316,12 @@ public class FlowModBuilderVer13 extends FlowModBuilder { |
316 | PushHeaderInstructions pushHeaderInstructions = | 316 | PushHeaderInstructions pushHeaderInstructions = |
317 | (PushHeaderInstructions) l2m; | 317 | (PushHeaderInstructions) l2m; |
318 | return factory().actions().pushMpls(EthType.of(pushHeaderInstructions | 318 | return factory().actions().pushMpls(EthType.of(pushHeaderInstructions |
319 | - .ethernetType())); | 319 | + .ethernetType().toShort())); |
320 | case MPLS_POP: | 320 | case MPLS_POP: |
321 | PushHeaderInstructions popHeaderInstructions = | 321 | PushHeaderInstructions popHeaderInstructions = |
322 | (PushHeaderInstructions) l2m; | 322 | (PushHeaderInstructions) l2m; |
323 | return factory().actions().popMpls(EthType.of(popHeaderInstructions | 323 | return factory().actions().popMpls(EthType.of(popHeaderInstructions |
324 | - .ethernetType())); | 324 | + .ethernetType().toShort())); |
325 | case MPLS_LABEL: | 325 | case MPLS_LABEL: |
326 | ModMplsLabelInstruction mplsLabel = | 326 | ModMplsLabelInstruction mplsLabel = |
327 | (ModMplsLabelInstruction) l2m; | 327 | (ModMplsLabelInstruction) l2m; |
... | @@ -335,7 +335,7 @@ public class FlowModBuilderVer13 extends FlowModBuilder { | ... | @@ -335,7 +335,7 @@ public class FlowModBuilderVer13 extends FlowModBuilder { |
335 | case VLAN_PUSH: | 335 | case VLAN_PUSH: |
336 | PushHeaderInstructions pushVlanInstruction = (PushHeaderInstructions) l2m; | 336 | PushHeaderInstructions pushVlanInstruction = (PushHeaderInstructions) l2m; |
337 | return factory().actions().pushVlan( | 337 | return factory().actions().pushVlan( |
338 | - EthType.of(pushVlanInstruction.ethernetType())); | 338 | + EthType.of(pushVlanInstruction.ethernetType().toShort())); |
339 | default: | 339 | default: |
340 | log.warn("Unimplemented action type {}.", l2m.subtype()); | 340 | log.warn("Unimplemented action type {}.", l2m.subtype()); |
341 | break; | 341 | break; | ... | ... |
... | @@ -269,17 +269,17 @@ public final class GroupModBuilder { | ... | @@ -269,17 +269,17 @@ public final class GroupModBuilder { |
269 | L2ModificationInstruction.PushHeaderInstructions pushVlanInstruction | 269 | L2ModificationInstruction.PushHeaderInstructions pushVlanInstruction |
270 | = (L2ModificationInstruction.PushHeaderInstructions) l2m; | 270 | = (L2ModificationInstruction.PushHeaderInstructions) l2m; |
271 | return factory.actions().pushVlan( | 271 | return factory.actions().pushVlan( |
272 | - EthType.of(pushVlanInstruction.ethernetType())); | 272 | + EthType.of(pushVlanInstruction.ethernetType().toShort())); |
273 | case MPLS_PUSH: | 273 | case MPLS_PUSH: |
274 | L2ModificationInstruction.PushHeaderInstructions pushHeaderInstructions = | 274 | L2ModificationInstruction.PushHeaderInstructions pushHeaderInstructions = |
275 | (L2ModificationInstruction.PushHeaderInstructions) l2m; | 275 | (L2ModificationInstruction.PushHeaderInstructions) l2m; |
276 | return factory.actions().pushMpls(EthType.of(pushHeaderInstructions | 276 | return factory.actions().pushMpls(EthType.of(pushHeaderInstructions |
277 | - .ethernetType())); | 277 | + .ethernetType().toShort())); |
278 | case MPLS_POP: | 278 | case MPLS_POP: |
279 | L2ModificationInstruction.PushHeaderInstructions popHeaderInstructions = | 279 | L2ModificationInstruction.PushHeaderInstructions popHeaderInstructions = |
280 | (L2ModificationInstruction.PushHeaderInstructions) l2m; | 280 | (L2ModificationInstruction.PushHeaderInstructions) l2m; |
281 | return factory.actions().popMpls(EthType.of(popHeaderInstructions | 281 | return factory.actions().popMpls(EthType.of(popHeaderInstructions |
282 | - .ethernetType())); | 282 | + .ethernetType().toShort())); |
283 | case MPLS_LABEL: | 283 | case MPLS_LABEL: |
284 | L2ModificationInstruction.ModMplsLabelInstruction mplsLabel = | 284 | L2ModificationInstruction.ModMplsLabelInstruction mplsLabel = |
285 | (L2ModificationInstruction.ModMplsLabelInstruction) l2m; | 285 | (L2ModificationInstruction.ModMplsLabelInstruction) l2m; | ... | ... |
... | @@ -15,52 +15,106 @@ | ... | @@ -15,52 +15,106 @@ |
15 | */ | 15 | */ |
16 | package org.onlab.packet; | 16 | package org.onlab.packet; |
17 | 17 | ||
18 | -import com.google.common.collect.Maps; | ||
19 | - | ||
20 | -import java.util.Map; | ||
21 | - | ||
22 | /** | 18 | /** |
23 | * Representation of an Ethertype. | 19 | * Representation of an Ethertype. |
24 | */ | 20 | */ |
25 | public class EthType { | 21 | public class EthType { |
26 | 22 | ||
27 | - public static final short ARP = EtherType.ARP.ethType.toShort(); | 23 | + /** |
28 | - public static final short RARP = EtherType.RARP.ethType.toShort(); | 24 | + * A list of known ethertypes. Adding a fully defined enum here will |
29 | - public static final short VLAN = EtherType.VLAN.ethType.toShort(); | 25 | + * associated the ethertype with a textual representation and a parsing |
30 | - public static final short IPV4 = EtherType.IPV4.ethType.toShort(); | 26 | + * class. |
31 | - public static final short IPV6 = EtherType.IPV6.ethType.toShort(); | 27 | + */ |
32 | - public static final short LLDP = EtherType.LLDP.ethType.toShort(); | 28 | + public enum EtherType { |
33 | - public static final short BDDP = EtherType.BDDP.ethType.toShort(); | 29 | + |
34 | - public static final short MPLS_MULTICAST = EtherType.MPLS_UNICAST.ethType.toShort(); | 30 | + ARP(0x806, "arp", org.onlab.packet.ARP.deserializer()), |
35 | - public static final short MPLS_UNICAST = EtherType.MPLS_UNICAST.ethType.toShort(); | 31 | + RARP(0x8035, "rarp", org.onlab.packet.ARP.deserializer()), |
32 | + IPV4(0x800, "ipv4", org.onlab.packet.IPv4.deserializer()), | ||
33 | + IPV6(0x86dd, "ipv6", org.onlab.packet.IPv6.deserializer()), | ||
34 | + LLDP(0x88cc, "lldp", org.onlab.packet.LLDP.deserializer()), | ||
35 | + VLAN(0x8100, "vlan", null), | ||
36 | + BDDP(0x8942, "bddp", org.onlab.packet.LLDP.deserializer()), | ||
37 | + MPLS_UNICAST(0x8847, "mpls_unicast", org.onlab.packet.MPLS.deserializer()), | ||
38 | + MPLS_MULTICAST(0x8848, "mpls_unicast", org.onlab.packet.MPLS.deserializer()); | ||
39 | + | ||
40 | + | ||
41 | + | ||
42 | + private final EthType etherType; | ||
43 | + private final String type; | ||
44 | + private final Deserializer<?> deserializer; | ||
45 | + | ||
46 | + /** | ||
47 | + * Constucts a new ethertype. | ||
48 | + * | ||
49 | + * @param ethType The actual ethertype | ||
50 | + * @param type it's textual representation | ||
51 | + * @param deserializer a parser for this ethertype | ||
52 | + */ | ||
53 | + EtherType(int ethType, String type, Deserializer<?> deserializer) { | ||
54 | + this.etherType = new EthType(ethType); | ||
55 | + this.type = type; | ||
56 | + this.deserializer = deserializer; | ||
57 | + } | ||
36 | 58 | ||
37 | - private short etherType; | 59 | + public EthType ethType() { |
60 | + return etherType; | ||
61 | + } | ||
38 | 62 | ||
39 | - /* | 63 | + @Override |
40 | - * Reverse-lookup map for getting a EtherType enum | 64 | + public String toString() { |
41 | - */ | 65 | + return type; |
42 | - private static final Map<Short, EtherType> LOOKUP = Maps.newHashMap(); | 66 | + } |
43 | 67 | ||
44 | - static { | 68 | + public Deserializer<?> deserializer() { |
45 | - for (EtherType eth : EtherType.values()) { | 69 | + return deserializer; |
46 | - LOOKUP.put(eth.ethType().toShort(), eth); | ||
47 | } | 70 | } |
71 | + | ||
48 | } | 72 | } |
49 | 73 | ||
74 | + | ||
75 | + private final short etherType; | ||
76 | + | ||
77 | + /** | ||
78 | + * Builds the EthType. | ||
79 | + * | ||
80 | + * @param etherType an integer representing an ethtype | ||
81 | + */ | ||
50 | public EthType(int etherType) { | 82 | public EthType(int etherType) { |
51 | this.etherType = (short) (etherType & 0xFFFF); | 83 | this.etherType = (short) (etherType & 0xFFFF); |
52 | } | 84 | } |
53 | 85 | ||
86 | + /** | ||
87 | + * Builds the EthType. | ||
88 | + * | ||
89 | + * @param etherType a short representing the ethtype | ||
90 | + */ | ||
54 | public EthType(short etherType) { | 91 | public EthType(short etherType) { |
55 | this.etherType = etherType; | 92 | this.etherType = etherType; |
56 | } | 93 | } |
57 | 94 | ||
95 | + /** | ||
96 | + * Returns the short value for this ethtype. | ||
97 | + * | ||
98 | + * @return a short value | ||
99 | + */ | ||
58 | public short toShort() { | 100 | public short toShort() { |
59 | return etherType; | 101 | return etherType; |
60 | } | 102 | } |
61 | 103 | ||
62 | - public static EtherType lookup(short etherType) { | 104 | + /** |
63 | - return LOOKUP.get(etherType); | 105 | + * Looks up the ethertype by it's numerical representation |
106 | + * and returns it's textual format. | ||
107 | + * | ||
108 | + * @param etherType the short value of the ethertype | ||
109 | + * @return a textual representation | ||
110 | + */ | ||
111 | + public EtherType lookup(short etherType) { | ||
112 | + for (EtherType ethType : EtherType.values()) { | ||
113 | + if (ethType.ethType().toShort() == etherType) { | ||
114 | + return ethType; | ||
115 | + } | ||
116 | + } | ||
117 | + return null; | ||
64 | } | 118 | } |
65 | 119 | ||
66 | @Override | 120 | @Override |
... | @@ -88,49 +142,8 @@ public class EthType { | ... | @@ -88,49 +142,8 @@ public class EthType { |
88 | 142 | ||
89 | public String toString() { | 143 | public String toString() { |
90 | EtherType ethType = lookup(this.etherType); | 144 | EtherType ethType = lookup(this.etherType); |
91 | - return (ethType == null ? "unknown" : ethType.toString()); | 145 | + return (ethType == null ? String.format("0x%04x", etherType) : |
146 | + ethType.toString()); | ||
92 | } | 147 | } |
93 | 148 | ||
94 | - public static enum EtherType { | ||
95 | - | ||
96 | - ARP(0x806, "arp", ARP.class, org.onlab.packet.ARP.deserializer()), | ||
97 | - RARP(0x8035, "rarp", null, org.onlab.packet.ARP.deserializer()), | ||
98 | - IPV4(0x800, "ipv4", IPv4.class, org.onlab.packet.IPv4.deserializer()), | ||
99 | - IPV6(0x86dd, "ipv6", IPv6.class, org.onlab.packet.IPv6.deserializer()), | ||
100 | - LLDP(0x88cc, "lldp", LLDP.class, org.onlab.packet.LLDP.deserializer()), | ||
101 | - VLAN(0x8100, "vlan", null, null), | ||
102 | - BDDP(0x8942, "bddp", LLDP.class, org.onlab.packet.LLDP.deserializer()), | ||
103 | - MPLS_UNICAST(0x8847, "mpls_unicast", null, org.onlab.packet.MPLS.deserializer()), | ||
104 | - MPLS_MULTICAST(0x8848, "mpls_unicast", null, org.onlab.packet.MPLS.deserializer()); | ||
105 | - | ||
106 | - | ||
107 | - private final Class clazz; | ||
108 | - private EthType ethType; | ||
109 | - private String type; | ||
110 | - private Deserializer<?> deserializer; | ||
111 | - | ||
112 | - EtherType(int ethType, String type, Class clazz, Deserializer deserializer) { | ||
113 | - this.ethType = new EthType(ethType); | ||
114 | - this.type = type; | ||
115 | - this.clazz = clazz; | ||
116 | - this.deserializer = deserializer; | ||
117 | - } | ||
118 | - | ||
119 | - public EthType ethType() { | ||
120 | - return ethType; | ||
121 | - } | ||
122 | - | ||
123 | - @Override | ||
124 | - public String toString() { | ||
125 | - return type; | ||
126 | - } | ||
127 | - | ||
128 | - public Class clazz() { | ||
129 | - return clazz; | ||
130 | - } | ||
131 | - | ||
132 | - public Deserializer<?> deserializer() { | ||
133 | - return deserializer; | ||
134 | - } | ||
135 | - } | ||
136 | } | 149 | } | ... | ... |
... | @@ -32,16 +32,17 @@ import static org.onlab.packet.PacketUtils.checkInput; | ... | @@ -32,16 +32,17 @@ import static org.onlab.packet.PacketUtils.checkInput; |
32 | */ | 32 | */ |
33 | public class Ethernet extends BasePacket { | 33 | public class Ethernet extends BasePacket { |
34 | private static final String HEXES = "0123456789ABCDEF"; | 34 | private static final String HEXES = "0123456789ABCDEF"; |
35 | - public static final short TYPE_ARP = EthType.ARP; | ||
36 | - public static final short TYPE_RARP = EthType.RARP; | ||
37 | - public static final short TYPE_IPV4 = EthType.IPV4; | ||
38 | - public static final short TYPE_IPV6 = EthType.IPV6; | ||
39 | - public static final short TYPE_LLDP = EthType.LLDP; | ||
40 | - public static final short TYPE_VLAN = EthType.VLAN; | ||
41 | - public static final short TYPE_BSN = EthType.BDDP; | ||
42 | 35 | ||
43 | - public static final short MPLS_UNICAST = EthType.MPLS_UNICAST; | 36 | + public static final short TYPE_ARP = EthType.EtherType.ARP.ethType().toShort(); |
44 | - public static final short MPLS_MULTICAST = EthType.MPLS_MULTICAST; | 37 | + public static final short TYPE_RARP = EthType.EtherType.RARP.ethType().toShort(); |
38 | + public static final short TYPE_IPV4 = EthType.EtherType.IPV4.ethType().toShort(); | ||
39 | + public static final short TYPE_IPV6 = EthType.EtherType.IPV6.ethType().toShort(); | ||
40 | + public static final short TYPE_LLDP = EthType.EtherType.LLDP.ethType().toShort(); | ||
41 | + public static final short TYPE_VLAN = EthType.EtherType.VLAN.ethType().toShort(); | ||
42 | + public static final short TYPE_BSN = EthType.EtherType.BDDP.ethType().toShort(); | ||
43 | + | ||
44 | + public static final short MPLS_UNICAST = EthType.EtherType.MPLS_UNICAST.ethType().toShort();; | ||
45 | + public static final short MPLS_MULTICAST = EthType.EtherType.MPLS_MULTICAST.ethType().toShort(); | ||
45 | 46 | ||
46 | 47 | ||
47 | public static final short VLAN_UNTAGGED = (short) 0xffff; | 48 | public static final short VLAN_UNTAGGED = (short) 0xffff; |
... | @@ -56,7 +57,7 @@ public class Ethernet extends BasePacket { | ... | @@ -56,7 +57,7 @@ public class Ethernet extends BasePacket { |
56 | 57 | ||
57 | static { | 58 | static { |
58 | for (EthType.EtherType ethType : EthType.EtherType.values()) { | 59 | for (EthType.EtherType ethType : EthType.EtherType.values()) { |
59 | - if (ethType.clazz() != null) { | 60 | + if (ethType.deserializer() != null) { |
60 | ETHERTYPE_DESERIALIZER_MAP.put(ethType.ethType().toShort(), ethType.deserializer()); | 61 | ETHERTYPE_DESERIALIZER_MAP.put(ethType.ethType().toShort(), ethType.deserializer()); |
61 | } | 62 | } |
62 | } | 63 | } | ... | ... |
-
Please register or login to post a comment