Committed by
Ray Milkey
adding EthType to secure handling ether types
this will also pretty print ethertypes in flow output Change-Id: I9363070ad308f3c756735e29b3992c500e503636
Showing
19 changed files
with
210 additions
and
52 deletions
| ... | @@ -114,7 +114,7 @@ public class SdnIpReactiveRouting { | ... | @@ -114,7 +114,7 @@ public class SdnIpReactiveRouting { |
| 114 | ConnectPoint srcConnectPoint = pkt.receivedFrom(); | 114 | ConnectPoint srcConnectPoint = pkt.receivedFrom(); |
| 115 | 115 | ||
| 116 | switch (ethPkt.getEtherType()) { | 116 | switch (ethPkt.getEtherType()) { |
| 117 | - case Ethernet.TYPE_ARP: | 117 | + case 0x806: |
| 118 | ARP arpPacket = (ARP) ethPkt.getPayload(); | 118 | ARP arpPacket = (ARP) ethPkt.getPayload(); |
| 119 | Ip4Address targetIpAddress = Ip4Address | 119 | Ip4Address targetIpAddress = Ip4Address |
| 120 | .valueOf(arpPacket.getTargetProtocolAddress()); | 120 | .valueOf(arpPacket.getTargetProtocolAddress()); |
| ... | @@ -141,7 +141,7 @@ public class SdnIpReactiveRouting { | ... | @@ -141,7 +141,7 @@ public class SdnIpReactiveRouting { |
| 141 | ByteBuffer.wrap(eth.serialize()))); | 141 | ByteBuffer.wrap(eth.serialize()))); |
| 142 | } | 142 | } |
| 143 | break; | 143 | break; |
| 144 | - case Ethernet.TYPE_IPV4: | 144 | + case 0x800: |
| 145 | // Parse packet | 145 | // Parse packet |
| 146 | IPv4 ipv4Packet = (IPv4) ethPkt.getPayload(); | 146 | IPv4 ipv4Packet = (IPv4) ethPkt.getPayload(); |
| 147 | IpAddress dstIp = | 147 | IpAddress dstIp = | ... | ... |
| ... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.net.flow.criteria; | 16 | package org.onosproject.net.flow.criteria; |
| 17 | 17 | ||
| 18 | +import org.onlab.packet.EthType; | ||
| 18 | import org.onosproject.net.IndexedLambda; | 19 | import org.onosproject.net.IndexedLambda; |
| 19 | import org.onosproject.net.Lambda; | 20 | import org.onosproject.net.Lambda; |
| 20 | import org.onosproject.net.OchSignal; | 21 | import org.onosproject.net.OchSignal; |
| ... | @@ -101,6 +102,16 @@ public final class Criteria { | ... | @@ -101,6 +102,16 @@ public final class Criteria { |
| 101 | } | 102 | } |
| 102 | 103 | ||
| 103 | /** | 104 | /** |
| 105 | + * Creates a match on ETH_TYPE field using the specified value. | ||
| 106 | + * | ||
| 107 | + * @param ethType eth type value | ||
| 108 | + * @return match criterion | ||
| 109 | + */ | ||
| 110 | + public static Criterion matchEthType(EthType ethType) { | ||
| 111 | + return new EthTypeCriterion(ethType); | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + /** | ||
| 104 | * Creates a match on VLAN ID field using the specified value. | 115 | * Creates a match on VLAN ID field using the specified value. |
| 105 | * | 116 | * |
| 106 | * @param vlanId vlan id value | 117 | * @param vlanId vlan id value | ... | ... |
| ... | @@ -15,6 +15,8 @@ | ... | @@ -15,6 +15,8 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.net.flow.criteria; | 16 | package org.onosproject.net.flow.criteria; |
| 17 | 17 | ||
| 18 | +import org.onlab.packet.EthType; | ||
| 19 | + | ||
| 18 | import java.util.Objects; | 20 | import java.util.Objects; |
| 19 | 21 | ||
| 20 | import static com.google.common.base.MoreObjects.toStringHelper; | 22 | import static com.google.common.base.MoreObjects.toStringHelper; |
| ... | @@ -24,7 +26,7 @@ import static com.google.common.base.MoreObjects.toStringHelper; | ... | @@ -24,7 +26,7 @@ import static com.google.common.base.MoreObjects.toStringHelper; |
| 24 | */ | 26 | */ |
| 25 | public final class EthTypeCriterion implements Criterion { | 27 | public final class EthTypeCriterion implements Criterion { |
| 26 | private static final int MASK = 0xffff; | 28 | private static final int MASK = 0xffff; |
| 27 | - private final int ethType; // Ethernet type value: 16 bits | 29 | + private final EthType ethType; // Ethernet type value: 16 bits |
| 28 | 30 | ||
| 29 | /** | 31 | /** |
| 30 | * Constructor. | 32 | * Constructor. |
| ... | @@ -33,7 +35,16 @@ public final class EthTypeCriterion implements Criterion { | ... | @@ -33,7 +35,16 @@ public final class EthTypeCriterion implements Criterion { |
| 33 | * integer) | 35 | * integer) |
| 34 | */ | 36 | */ |
| 35 | EthTypeCriterion(int ethType) { | 37 | EthTypeCriterion(int ethType) { |
| 36 | - this.ethType = ethType & MASK; | 38 | + this.ethType = new EthType(ethType & MASK); |
| 39 | + } | ||
| 40 | + | ||
| 41 | + /** | ||
| 42 | + * Constructor. | ||
| 43 | + * | ||
| 44 | + * @param ethType the Ethernet frame type to match | ||
| 45 | + */ | ||
| 46 | + EthTypeCriterion(EthType ethType) { | ||
| 47 | + this.ethType = ethType; | ||
| 37 | } | 48 | } |
| 38 | 49 | ||
| 39 | @Override | 50 | @Override |
| ... | @@ -46,14 +57,14 @@ public final class EthTypeCriterion implements Criterion { | ... | @@ -46,14 +57,14 @@ public final class EthTypeCriterion implements Criterion { |
| 46 | * | 57 | * |
| 47 | * @return the Ethernet frame type to match (16 bits unsigned integer) | 58 | * @return the Ethernet frame type to match (16 bits unsigned integer) |
| 48 | */ | 59 | */ |
| 49 | - public int ethType() { | 60 | + public EthType ethType() { |
| 50 | return ethType; | 61 | return ethType; |
| 51 | } | 62 | } |
| 52 | 63 | ||
| 53 | @Override | 64 | @Override |
| 54 | public String toString() { | 65 | public String toString() { |
| 55 | return toStringHelper(type().toString()) | 66 | return toStringHelper(type().toString()) |
| 56 | - .add("ethType", Long.toHexString(ethType)) | 67 | + .add("ethType", ethType.toString()) |
| 57 | .toString(); | 68 | .toString(); |
| 58 | } | 69 | } |
| 59 | 70 | ... | ... |
| ... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
| 16 | package org.onosproject.net.flow.criteria; | 16 | package org.onosproject.net.flow.criteria; |
| 17 | 17 | ||
| 18 | import org.junit.Test; | 18 | import org.junit.Test; |
| 19 | +import org.onlab.packet.EthType; | ||
| 19 | import org.onosproject.net.ChannelSpacing; | 20 | import org.onosproject.net.ChannelSpacing; |
| 20 | import org.onosproject.net.GridType; | 21 | import org.onosproject.net.GridType; |
| 21 | import org.onosproject.net.Lambda; | 22 | import org.onosproject.net.Lambda; |
| ... | @@ -418,8 +419,8 @@ public class CriteriaTest { | ... | @@ -418,8 +419,8 @@ public class CriteriaTest { |
| 418 | */ | 419 | */ |
| 419 | @Test | 420 | @Test |
| 420 | public void testMatchEthTypeMethod() { | 421 | public void testMatchEthTypeMethod() { |
| 421 | - int ethType = 12; | 422 | + EthType ethType = new EthType(12); |
| 422 | - Criterion matchEthType = Criteria.matchEthType(ethType); | 423 | + Criterion matchEthType = Criteria.matchEthType(new EthType(12)); |
| 423 | EthTypeCriterion ethTypeCriterion = | 424 | EthTypeCriterion ethTypeCriterion = |
| 424 | checkAndConvert(matchEthType, | 425 | checkAndConvert(matchEthType, |
| 425 | Criterion.Type.ETH_TYPE, | 426 | Criterion.Type.ETH_TYPE, | ... | ... |
| ... | @@ -165,7 +165,7 @@ public final class EncodeCriterionCodec { | ... | @@ -165,7 +165,7 @@ public final class EncodeCriterionCodec { |
| 165 | public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) { | 165 | public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) { |
| 166 | final EthTypeCriterion ethTypeCriterion = | 166 | final EthTypeCriterion ethTypeCriterion = |
| 167 | (EthTypeCriterion) criterion; | 167 | (EthTypeCriterion) criterion; |
| 168 | - return root.put(CriterionCodec.ETH_TYPE, ethTypeCriterion.ethType()); | 168 | + return root.put(CriterionCodec.ETH_TYPE, ethTypeCriterion.ethType().toShort()); |
| 169 | } | 169 | } |
| 170 | } | 170 | } |
| 171 | 171 | ... | ... |
| ... | @@ -134,7 +134,7 @@ public final class CriterionJsonMatcher extends | ... | @@ -134,7 +134,7 @@ public final class CriterionJsonMatcher extends |
| 134 | * @return true if the JSON matches the criterion, false otherwise. | 134 | * @return true if the JSON matches the criterion, false otherwise. |
| 135 | */ | 135 | */ |
| 136 | private boolean matchCriterion(EthTypeCriterion criterion) { | 136 | private boolean matchCriterion(EthTypeCriterion criterion) { |
| 137 | - final int ethType = criterion.ethType(); | 137 | + final int ethType = criterion.ethType().toShort(); |
| 138 | final int jsonEthType = jsonCriterion.get("ethType").intValue(); | 138 | final int jsonEthType = jsonCriterion.get("ethType").intValue(); |
| 139 | if (ethType != jsonEthType) { | 139 | if (ethType != jsonEthType) { |
| 140 | description.appendText("ethType was " | 140 | description.appendText("ethType was " | ... | ... |
| ... | @@ -22,6 +22,7 @@ import java.util.TreeMap; | ... | @@ -22,6 +22,7 @@ import java.util.TreeMap; |
| 22 | 22 | ||
| 23 | import org.junit.Before; | 23 | import org.junit.Before; |
| 24 | import org.junit.Test; | 24 | import org.junit.Test; |
| 25 | +import org.onlab.packet.EthType; | ||
| 25 | import org.onlab.packet.Ethernet; | 26 | import org.onlab.packet.Ethernet; |
| 26 | import org.onlab.packet.IpAddress; | 27 | import org.onlab.packet.IpAddress; |
| 27 | import org.onlab.packet.IpPrefix; | 28 | import org.onlab.packet.IpPrefix; |
| ... | @@ -148,7 +149,7 @@ public class FlowRuleCodecTest { | ... | @@ -148,7 +149,7 @@ public class FlowRuleCodecTest { |
| 148 | assertThat(rule.selector().criteria().size(), is(1)); | 149 | assertThat(rule.selector().criteria().size(), is(1)); |
| 149 | Criterion criterion1 = rule.selector().criteria().iterator().next(); | 150 | Criterion criterion1 = rule.selector().criteria().iterator().next(); |
| 150 | assertThat(criterion1.type(), is(Criterion.Type.ETH_TYPE)); | 151 | assertThat(criterion1.type(), is(Criterion.Type.ETH_TYPE)); |
| 151 | - assertThat(((EthTypeCriterion) criterion1).ethType(), is(2054)); | 152 | + assertThat(((EthTypeCriterion) criterion1).ethType(), is(new EthType(2054))); |
| 152 | 153 | ||
| 153 | assertThat(rule.treatment().allInstructions().size(), is(1)); | 154 | assertThat(rule.treatment().allInstructions().size(), is(1)); |
| 154 | Instruction instruction1 = rule.treatment().allInstructions().get(0); | 155 | Instruction instruction1 = rule.treatment().allInstructions().get(0); |
| ... | @@ -356,7 +357,7 @@ public class FlowRuleCodecTest { | ... | @@ -356,7 +357,7 @@ public class FlowRuleCodecTest { |
| 356 | Criterion criterion; | 357 | Criterion criterion; |
| 357 | 358 | ||
| 358 | criterion = getCriterion(Criterion.Type.ETH_TYPE); | 359 | criterion = getCriterion(Criterion.Type.ETH_TYPE); |
| 359 | - assertThat(((EthTypeCriterion) criterion).ethType(), is(2054)); | 360 | + assertThat(((EthTypeCriterion) criterion).ethType(), is(new EthType(2054))); |
| 360 | 361 | ||
| 361 | criterion = getCriterion(Criterion.Type.ETH_DST); | 362 | criterion = getCriterion(Criterion.Type.ETH_DST); |
| 362 | assertThat(((EthCriterion) criterion).mac(), | 363 | assertThat(((EthCriterion) criterion).mac(), | ... | ... |
| ... | @@ -243,7 +243,7 @@ public class MplsPathIntentCompiler implements IntentCompiler<MplsPathIntent> { | ... | @@ -243,7 +243,7 @@ public class MplsPathIntentCompiler implements IntentCompiler<MplsPathIntent> { |
| 243 | Criterion c = intent.selector().getCriterion(Criterion.Type.ETH_TYPE); | 243 | Criterion c = intent.selector().getCriterion(Criterion.Type.ETH_TYPE); |
| 244 | if (c != null && c instanceof EthTypeCriterion) { | 244 | if (c != null && c instanceof EthTypeCriterion) { |
| 245 | EthTypeCriterion ethertype = (EthTypeCriterion) c; | 245 | EthTypeCriterion ethertype = (EthTypeCriterion) c; |
| 246 | - treat.popMpls((short) ethertype.ethType()); | 246 | + treat.popMpls(ethertype.ethType().toShort()); |
| 247 | } else { | 247 | } else { |
| 248 | treat.popMpls(Ethernet.TYPE_IPV4); | 248 | treat.popMpls(Ethernet.TYPE_IPV4); |
| 249 | } | 249 | } | ... | ... |
| ... | @@ -20,6 +20,7 @@ import com.google.common.collect.ImmutableMap; | ... | @@ -20,6 +20,7 @@ import com.google.common.collect.ImmutableMap; |
| 20 | import com.google.common.collect.ImmutableSet; | 20 | import com.google.common.collect.ImmutableSet; |
| 21 | 21 | ||
| 22 | import org.onlab.packet.ChassisId; | 22 | import org.onlab.packet.ChassisId; |
| 23 | +import org.onlab.packet.EthType; | ||
| 23 | import org.onlab.packet.Ip4Address; | 24 | import org.onlab.packet.Ip4Address; |
| 24 | import org.onlab.packet.Ip4Prefix; | 25 | import org.onlab.packet.Ip4Prefix; |
| 25 | import org.onlab.packet.Ip6Address; | 26 | import org.onlab.packet.Ip6Address; |
| ... | @@ -293,6 +294,7 @@ public final class KryoNamespaces { | ... | @@ -293,6 +294,7 @@ public final class KryoNamespaces { |
| 293 | PortCriterion.class, | 294 | PortCriterion.class, |
| 294 | MetadataCriterion.class, | 295 | MetadataCriterion.class, |
| 295 | EthCriterion.class, | 296 | EthCriterion.class, |
| 297 | + EthType.class, | ||
| 296 | EthTypeCriterion.class, | 298 | EthTypeCriterion.class, |
| 297 | VlanIdCriterion.class, | 299 | VlanIdCriterion.class, |
| 298 | VlanPcpCriterion.class, | 300 | VlanPcpCriterion.class, | ... | ... |
| ... | @@ -295,7 +295,7 @@ public class CentecV350Pipeline extends AbstractHandlerBehaviour implements Pipe | ... | @@ -295,7 +295,7 @@ public class CentecV350Pipeline extends AbstractHandlerBehaviour implements Pipe |
| 295 | TrafficSelector selector = fwd.selector(); | 295 | TrafficSelector selector = fwd.selector(); |
| 296 | EthTypeCriterion ethType = | 296 | EthTypeCriterion ethType = |
| 297 | (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE); | 297 | (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE); |
| 298 | - if (ethType == null || ethType.ethType() != Ethernet.TYPE_IPV4) { | 298 | + if (ethType == null || ethType.ethType().toShort() != Ethernet.TYPE_IPV4) { |
| 299 | fail(fwd, ObjectiveError.UNSUPPORTED); | 299 | fail(fwd, ObjectiveError.UNSUPPORTED); |
| 300 | return Collections.emptySet(); | 300 | return Collections.emptySet(); |
| 301 | } | 301 | } | ... | ... |
| ... | @@ -510,7 +510,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline | ... | @@ -510,7 +510,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline |
| 510 | fail(fwd, ObjectiveError.UNKNOWN); | 510 | fail(fwd, ObjectiveError.UNKNOWN); |
| 511 | return Collections.emptySet(); | 511 | return Collections.emptySet(); |
| 512 | } | 512 | } |
| 513 | - if (ethType.ethType() == Ethernet.TYPE_ARP) { | 513 | + if (ethType.ethType().toShort() == Ethernet.TYPE_ARP) { |
| 514 | log.warn("Installing ARP rule to table 60"); | 514 | log.warn("Installing ARP rule to table 60"); |
| 515 | 515 | ||
| 516 | // currently need to punt from ACL table should use: | 516 | // currently need to punt from ACL table should use: |
| ... | @@ -551,7 +551,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline | ... | @@ -551,7 +551,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline |
| 551 | EthTypeCriterion ethType = | 551 | EthTypeCriterion ethType = |
| 552 | (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE); | 552 | (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE); |
| 553 | // XXX currently supporting only the L3 unicast table | 553 | // XXX currently supporting only the L3 unicast table |
| 554 | - if (ethType == null || ethType.ethType() != Ethernet.TYPE_IPV4) { | 554 | + if (ethType == null || ethType.ethType().toShort() != Ethernet.TYPE_IPV4) { |
| 555 | fail(fwd, ObjectiveError.UNSUPPORTED); | 555 | fail(fwd, ObjectiveError.UNSUPPORTED); |
| 556 | return Collections.emptySet(); | 556 | return Collections.emptySet(); |
| 557 | } | 557 | } | ... | ... |
| ... | @@ -257,17 +257,17 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli | ... | @@ -257,17 +257,17 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli |
| 257 | fail(fwd, ObjectiveError.UNKNOWN); | 257 | fail(fwd, ObjectiveError.UNKNOWN); |
| 258 | return Collections.emptySet(); | 258 | return Collections.emptySet(); |
| 259 | } | 259 | } |
| 260 | - if (ethType.ethType() == Ethernet.TYPE_ARP) { | 260 | + if (ethType.ethType().toShort() == Ethernet.TYPE_ARP) { |
| 261 | log.warn("Driver automatically handles ARP packets by punting to controller " | 261 | log.warn("Driver automatically handles ARP packets by punting to controller " |
| 262 | + " from ETHER table"); | 262 | + " from ETHER table"); |
| 263 | pass(fwd); | 263 | pass(fwd); |
| 264 | return Collections.emptySet(); | 264 | return Collections.emptySet(); |
| 265 | - } else if (ethType.ethType() == Ethernet.TYPE_LLDP || | 265 | + } else if (ethType.ethType().toShort() == Ethernet.TYPE_LLDP || |
| 266 | - ethType.ethType() == Ethernet.TYPE_BSN) { | 266 | + ethType.ethType().toShort() == Ethernet.TYPE_BSN) { |
| 267 | log.warn("Driver currently does not currently handle LLDP packets"); | 267 | log.warn("Driver currently does not currently handle LLDP packets"); |
| 268 | fail(fwd, ObjectiveError.UNSUPPORTED); | 268 | fail(fwd, ObjectiveError.UNSUPPORTED); |
| 269 | return Collections.emptySet(); | 269 | return Collections.emptySet(); |
| 270 | - } else if (ethType.ethType() == Ethernet.TYPE_IPV4) { | 270 | + } else if (ethType.ethType().toShort() == Ethernet.TYPE_IPV4) { |
| 271 | IPCriterion ipSrc = (IPCriterion) selector | 271 | IPCriterion ipSrc = (IPCriterion) selector |
| 272 | .getCriterion(Criterion.Type.IPV4_SRC); | 272 | .getCriterion(Criterion.Type.IPV4_SRC); |
| 273 | IPCriterion ipDst = (IPCriterion) selector | 273 | IPCriterion ipDst = (IPCriterion) selector |
| ... | @@ -303,7 +303,7 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli | ... | @@ -303,7 +303,7 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli |
| 303 | TrafficSelector selector = fwd.selector(); | 303 | TrafficSelector selector = fwd.selector(); |
| 304 | EthTypeCriterion ethType = | 304 | EthTypeCriterion ethType = |
| 305 | (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE); | 305 | (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE); |
| 306 | - if (ethType == null || ethType.ethType() != Ethernet.TYPE_IPV4) { | 306 | + if (ethType == null || ethType.ethType().toShort() != Ethernet.TYPE_IPV4) { |
| 307 | fail(fwd, ObjectiveError.UNSUPPORTED); | 307 | fail(fwd, ObjectiveError.UNSUPPORTED); |
| 308 | return Collections.emptySet(); | 308 | return Collections.emptySet(); |
| 309 | } | 309 | } | ... | ... |
| ... | @@ -243,7 +243,7 @@ public class PicaPipeline extends AbstractHandlerBehaviour implements Pipeliner | ... | @@ -243,7 +243,7 @@ public class PicaPipeline extends AbstractHandlerBehaviour implements Pipeliner |
| 243 | return Collections.emptySet(); | 243 | return Collections.emptySet(); |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | - if (ethType.ethType() == Ethernet.TYPE_ARP) { | 246 | + if (ethType.ethType().toShort() == Ethernet.TYPE_ARP) { |
| 247 | if (filters.isEmpty()) { | 247 | if (filters.isEmpty()) { |
| 248 | pendingVersatiles.add(fwd); | 248 | pendingVersatiles.add(fwd); |
| 249 | return Collections.emptySet(); | 249 | return Collections.emptySet(); |
| ... | @@ -253,12 +253,12 @@ public class PicaPipeline extends AbstractHandlerBehaviour implements Pipeliner | ... | @@ -253,12 +253,12 @@ public class PicaPipeline extends AbstractHandlerBehaviour implements Pipeliner |
| 253 | flowrules.addAll(processVersatilesWithFilters(filter, fwd)); | 253 | flowrules.addAll(processVersatilesWithFilters(filter, fwd)); |
| 254 | } | 254 | } |
| 255 | return flowrules; | 255 | return flowrules; |
| 256 | - } else if (ethType.ethType() == Ethernet.TYPE_LLDP || | 256 | + } else if (ethType.ethType().toShort() == Ethernet.TYPE_LLDP || |
| 257 | - ethType.ethType() == Ethernet.TYPE_BSN) { | 257 | + ethType.ethType().toShort() == Ethernet.TYPE_BSN) { |
| 258 | log.warn("Driver currently does not currently handle LLDP packets"); | 258 | log.warn("Driver currently does not currently handle LLDP packets"); |
| 259 | fail(fwd, ObjectiveError.UNSUPPORTED); | 259 | fail(fwd, ObjectiveError.UNSUPPORTED); |
| 260 | return Collections.emptySet(); | 260 | return Collections.emptySet(); |
| 261 | - } else if (ethType.ethType() == Ethernet.TYPE_IPV4) { | 261 | + } else if (ethType.ethType().toShort() == Ethernet.TYPE_IPV4) { |
| 262 | IPCriterion ipSrc = (IPCriterion) selector | 262 | IPCriterion ipSrc = (IPCriterion) selector |
| 263 | .getCriterion(Criterion.Type.IPV4_SRC); | 263 | .getCriterion(Criterion.Type.IPV4_SRC); |
| 264 | IPCriterion ipDst = (IPCriterion) selector | 264 | IPCriterion ipDst = (IPCriterion) selector |
| ... | @@ -339,7 +339,7 @@ public class PicaPipeline extends AbstractHandlerBehaviour implements Pipeliner | ... | @@ -339,7 +339,7 @@ public class PicaPipeline extends AbstractHandlerBehaviour implements Pipeliner |
| 339 | TrafficSelector selector = fwd.selector(); | 339 | TrafficSelector selector = fwd.selector(); |
| 340 | EthTypeCriterion ethType = | 340 | EthTypeCriterion ethType = |
| 341 | (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE); | 341 | (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE); |
| 342 | - if (ethType == null || ethType.ethType() != Ethernet.TYPE_IPV4) { | 342 | + if (ethType == null || ethType.ethType().toShort() != Ethernet.TYPE_IPV4) { |
| 343 | fail(fwd, ObjectiveError.UNSUPPORTED); | 343 | fail(fwd, ObjectiveError.UNSUPPORTED); |
| 344 | return Collections.emptySet(); | 344 | return Collections.emptySet(); |
| 345 | } | 345 | } | ... | ... |
| ... | @@ -367,7 +367,7 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe | ... | @@ -367,7 +367,7 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe |
| 367 | return Collections.emptySet(); | 367 | return Collections.emptySet(); |
| 368 | } | 368 | } |
| 369 | 369 | ||
| 370 | - if (ethType.ethType() == Ethernet.TYPE_ARP) { | 370 | + if (ethType.ethType().toShort() == Ethernet.TYPE_ARP) { |
| 371 | // need to install ARP request & reply flow rules for each interface filter | 371 | // need to install ARP request & reply flow rules for each interface filter |
| 372 | 372 | ||
| 373 | // rule for ARP replies | 373 | // rule for ARP replies |
| ... | @@ -425,7 +425,7 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe | ... | @@ -425,7 +425,7 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe |
| 425 | EthTypeCriterion ethType = | 425 | EthTypeCriterion ethType = |
| 426 | (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE); | 426 | (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE); |
| 427 | // XXX currently supporting only the L3 unicast table | 427 | // XXX currently supporting only the L3 unicast table |
| 428 | - if (ethType == null || ethType.ethType() != Ethernet.TYPE_IPV4) { | 428 | + if (ethType == null || ethType.ethType().toShort() != Ethernet.TYPE_IPV4) { |
| 429 | fail(fwd, ObjectiveError.UNSUPPORTED); | 429 | fail(fwd, ObjectiveError.UNSUPPORTED); |
| 430 | return Collections.emptySet(); | 430 | return Collections.emptySet(); |
| 431 | } | 431 | } |
| ... | @@ -474,7 +474,7 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe | ... | @@ -474,7 +474,7 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe |
| 474 | * the dummy group is fetched from the distributed store and the enclosed | 474 | * the dummy group is fetched from the distributed store and the enclosed |
| 475 | * treatment is applied as a flow rule action. | 475 | * treatment is applied as a flow rule action. |
| 476 | * | 476 | * |
| 477 | - * @param nextObjective the next objective of type simple | 477 | + * @param nextObj the next objective of type simple |
| 478 | */ | 478 | */ |
| 479 | private void processSimpleNextObjective(NextObjective nextObj) { | 479 | private void processSimpleNextObjective(NextObjective nextObj) { |
| 480 | // Simple next objective has a single treatment (not a collection) | 480 | // Simple next objective has a single treatment (not a collection) | ... | ... |
| ... | @@ -440,8 +440,8 @@ public class SpringOpenTTP extends AbstractHandlerBehaviour | ... | @@ -440,8 +440,8 @@ public class SpringOpenTTP extends AbstractHandlerBehaviour |
| 440 | EthTypeCriterion ethType = (EthTypeCriterion) selector | 440 | EthTypeCriterion ethType = (EthTypeCriterion) selector |
| 441 | .getCriterion(Criterion.Type.ETH_TYPE); | 441 | .getCriterion(Criterion.Type.ETH_TYPE); |
| 442 | if ((ethType == null) || | 442 | if ((ethType == null) || |
| 443 | - ((((short) ethType.ethType()) != Ethernet.TYPE_IPV4) && | 443 | + (ethType.ethType().toShort() != Ethernet.TYPE_IPV4) && |
| 444 | - (((short) ethType.ethType()) != Ethernet.MPLS_UNICAST))) { | 444 | + (ethType.ethType().toShort() != Ethernet.MPLS_UNICAST)) { |
| 445 | log.warn("processSpecific: Unsupported " | 445 | log.warn("processSpecific: Unsupported " |
| 446 | + "forwarding objective criteraia"); | 446 | + "forwarding objective criteraia"); |
| 447 | fail(fwd, ObjectiveError.UNSUPPORTED); | 447 | fail(fwd, ObjectiveError.UNSUPPORTED); |
| ... | @@ -451,7 +451,7 @@ public class SpringOpenTTP extends AbstractHandlerBehaviour | ... | @@ -451,7 +451,7 @@ public class SpringOpenTTP extends AbstractHandlerBehaviour |
| 451 | TrafficSelector.Builder filteredSelectorBuilder = | 451 | TrafficSelector.Builder filteredSelectorBuilder = |
| 452 | DefaultTrafficSelector.builder(); | 452 | DefaultTrafficSelector.builder(); |
| 453 | int forTableId = -1; | 453 | int forTableId = -1; |
| 454 | - if (((short) ethType.ethType()) == Ethernet.TYPE_IPV4) { | 454 | + if (ethType.ethType().toShort() == Ethernet.TYPE_IPV4) { |
| 455 | filteredSelectorBuilder = filteredSelectorBuilder | 455 | filteredSelectorBuilder = filteredSelectorBuilder |
| 456 | .matchEthType(Ethernet.TYPE_IPV4) | 456 | .matchEthType(Ethernet.TYPE_IPV4) |
| 457 | .matchIPDst(((IPCriterion) selector | 457 | .matchIPDst(((IPCriterion) selector | ... | ... |
| ... | @@ -81,8 +81,8 @@ public class SpringOpenTTPDell extends SpringOpenTTP { | ... | @@ -81,8 +81,8 @@ public class SpringOpenTTPDell extends SpringOpenTTP { |
| 81 | EthTypeCriterion ethType = (EthTypeCriterion) selector | 81 | EthTypeCriterion ethType = (EthTypeCriterion) selector |
| 82 | .getCriterion(Criterion.Type.ETH_TYPE); | 82 | .getCriterion(Criterion.Type.ETH_TYPE); |
| 83 | if ((ethType == null) || | 83 | if ((ethType == null) || |
| 84 | - ((((short) ethType.ethType()) != Ethernet.TYPE_IPV4) && | 84 | + (ethType.ethType().toShort() != Ethernet.TYPE_IPV4) && |
| 85 | - (((short) ethType.ethType()) != Ethernet.MPLS_UNICAST))) { | 85 | + (ethType.ethType().toShort() != Ethernet.MPLS_UNICAST)) { |
| 86 | log.debug("processSpecific: Unsupported " | 86 | log.debug("processSpecific: Unsupported " |
| 87 | + "forwarding objective criteraia"); | 87 | + "forwarding objective criteraia"); |
| 88 | fail(fwd, ObjectiveError.UNSUPPORTED); | 88 | fail(fwd, ObjectiveError.UNSUPPORTED); |
| ... | @@ -92,7 +92,7 @@ public class SpringOpenTTPDell extends SpringOpenTTP { | ... | @@ -92,7 +92,7 @@ public class SpringOpenTTPDell extends SpringOpenTTP { |
| 92 | TrafficSelector.Builder filteredSelectorBuilder = | 92 | TrafficSelector.Builder filteredSelectorBuilder = |
| 93 | DefaultTrafficSelector.builder(); | 93 | DefaultTrafficSelector.builder(); |
| 94 | int forTableId = -1; | 94 | int forTableId = -1; |
| 95 | - if (((short) ethType.ethType()) == Ethernet.TYPE_IPV4) { | 95 | + if (ethType.ethType().toShort() == Ethernet.TYPE_IPV4) { |
| 96 | if (deviceTMac == null) { | 96 | if (deviceTMac == null) { |
| 97 | log.debug("processSpecific: ETH_DST filtering " | 97 | log.debug("processSpecific: ETH_DST filtering " |
| 98 | + "objective is not set which is required " | 98 | + "objective is not set which is required " | ... | ... |
| ... | @@ -198,7 +198,7 @@ public abstract class FlowModBuilder { | ... | @@ -198,7 +198,7 @@ public abstract class FlowModBuilder { |
| 198 | break; | 198 | break; |
| 199 | case ETH_TYPE: | 199 | case ETH_TYPE: |
| 200 | EthTypeCriterion ethType = (EthTypeCriterion) c; | 200 | EthTypeCriterion ethType = (EthTypeCriterion) c; |
| 201 | - mBuilder.setExact(MatchField.ETH_TYPE, EthType.of(ethType.ethType())); | 201 | + mBuilder.setExact(MatchField.ETH_TYPE, EthType.of(ethType.ethType().toShort())); |
| 202 | break; | 202 | break; |
| 203 | case VLAN_VID: | 203 | case VLAN_VID: |
| 204 | VlanIdCriterion vid = (VlanIdCriterion) c; | 204 | VlanIdCriterion vid = (VlanIdCriterion) c; | ... | ... |
| 1 | +/* | ||
| 2 | + * Copyright 2015 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onlab.packet; | ||
| 17 | + | ||
| 18 | +import com.google.common.collect.Maps; | ||
| 19 | + | ||
| 20 | +import java.util.Map; | ||
| 21 | + | ||
| 22 | +/** | ||
| 23 | + * Representation of an Ethertype. | ||
| 24 | + */ | ||
| 25 | +public class EthType { | ||
| 26 | + | ||
| 27 | + public static final short ARP = EtherType.ARP.ethType.toShort(); | ||
| 28 | + public static final short RARP = EtherType.RARP.ethType.toShort(); | ||
| 29 | + public static final short VLAN = EtherType.VLAN.ethType.toShort(); | ||
| 30 | + public static final short IPV4 = EtherType.IPV4.ethType.toShort(); | ||
| 31 | + public static final short IPV6 = EtherType.IPV6.ethType.toShort(); | ||
| 32 | + public static final short LLDP = EtherType.LLDP.ethType.toShort(); | ||
| 33 | + public static final short BDDP = EtherType.BDDP.ethType.toShort(); | ||
| 34 | + public static final short MPLS_MULTICAST = EtherType.MPLS_UNICAST.ethType.toShort(); | ||
| 35 | + public static final short MPLS_UNICAST = EtherType.MPLS_UNICAST.ethType.toShort(); | ||
| 36 | + | ||
| 37 | + private short etherType; | ||
| 38 | + | ||
| 39 | + /* | ||
| 40 | + * Reverse-lookup map for getting a EtherType enum | ||
| 41 | + */ | ||
| 42 | + private static final Map<Short, EtherType> LOOKUP = Maps.newHashMap(); | ||
| 43 | + | ||
| 44 | + static { | ||
| 45 | + for (EtherType eth : EtherType.values()) { | ||
| 46 | + LOOKUP.put(eth.ethType().toShort(), eth); | ||
| 47 | + } | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + public EthType(int etherType) { | ||
| 51 | + this.etherType = (short) (etherType & 0xFFFF); | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + public EthType(short etherType) { | ||
| 55 | + this.etherType = etherType; | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + public short toShort() { | ||
| 59 | + return etherType; | ||
| 60 | + } | ||
| 61 | + | ||
| 62 | + public static EtherType lookup(short etherType) { | ||
| 63 | + return LOOKUP.get(etherType); | ||
| 64 | + } | ||
| 65 | + | ||
| 66 | + @Override | ||
| 67 | + public boolean equals(Object o) { | ||
| 68 | + if (this == o) { | ||
| 69 | + return true; | ||
| 70 | + } | ||
| 71 | + if (o == null || getClass() != o.getClass()) { | ||
| 72 | + return false; | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + EthType ethType = (EthType) o; | ||
| 76 | + | ||
| 77 | + if (etherType != ethType.etherType) { | ||
| 78 | + return false; | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + return true; | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + @Override | ||
| 85 | + public int hashCode() { | ||
| 86 | + return (int) etherType; | ||
| 87 | + } | ||
| 88 | + | ||
| 89 | + public String toString() { | ||
| 90 | + EtherType ethType = lookup(this.etherType); | ||
| 91 | + return (ethType == null ? "unknown" : ethType.toString()); | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + public static enum EtherType { | ||
| 95 | + | ||
| 96 | + ARP(0x806, "arp", ARP.class), | ||
| 97 | + RARP(0x8035, "rarp", null), | ||
| 98 | + IPV4(0x800, "ipv4", IPv4.class), | ||
| 99 | + IPV6(0x86dd, "ipv6", IPv6.class), | ||
| 100 | + LLDP(0x88cc, "lldp", LLDP.class), | ||
| 101 | + VLAN(0x8100, "vlan", null), | ||
| 102 | + BDDP(0x8942, "bddp", LLDP.class), | ||
| 103 | + MPLS_UNICAST(0x8847, "mpls_unicast", null), | ||
| 104 | + MPLS_MULTICAST(0x8848, "mpls_unicast", null); | ||
| 105 | + | ||
| 106 | + | ||
| 107 | + private final Class clazz; | ||
| 108 | + private EthType ethType; | ||
| 109 | + private String type; | ||
| 110 | + | ||
| 111 | + EtherType(int ethType, String type, Class clazz) { | ||
| 112 | + this.ethType = new EthType(ethType); | ||
| 113 | + this.type = type; | ||
| 114 | + this.clazz = clazz; | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + public EthType ethType() { | ||
| 118 | + return ethType; | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + @Override | ||
| 122 | + public String toString() { | ||
| 123 | + return type; | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + public Class clazz() { | ||
| 127 | + return clazz; | ||
| 128 | + } | ||
| 129 | + | ||
| 130 | + | ||
| 131 | + } | ||
| 132 | +} |
| ... | @@ -31,28 +31,28 @@ import java.util.Map; | ... | @@ -31,28 +31,28 @@ import java.util.Map; |
| 31 | */ | 31 | */ |
| 32 | public class Ethernet extends BasePacket { | 32 | public class Ethernet extends BasePacket { |
| 33 | private static final String HEXES = "0123456789ABCDEF"; | 33 | private static final String HEXES = "0123456789ABCDEF"; |
| 34 | - public static final short TYPE_ARP = (short) 0x0806; | 34 | + public static final short TYPE_ARP = EthType.ARP; |
| 35 | - public static final short TYPE_RARP = (short) 0x8035; | 35 | + public static final short TYPE_RARP = EthType.RARP; |
| 36 | - public static final short TYPE_IPV4 = (short) 0x0800; | 36 | + public static final short TYPE_IPV4 = EthType.IPV4; |
| 37 | - public static final short TYPE_IPV6 = (short) 0x86dd; | 37 | + public static final short TYPE_IPV6 = EthType.IPV6; |
| 38 | - public static final short TYPE_LLDP = (short) 0x88cc; | 38 | + public static final short TYPE_LLDP = EthType.LLDP; |
| 39 | - public static final short TYPE_VLAN = (short) 0x8100; | 39 | + public static final short TYPE_VLAN = EthType.VLAN; |
| 40 | - public static final short TYPE_BSN = (short) 0x8942; | 40 | + public static final short TYPE_BSN = EthType.BDDP; |
| 41 | - public static final short VLAN_UNTAGGED = (short) 0xffff; | 41 | + |
| 42 | - public static final short MPLS_UNICAST = (short) 0x8847; | 42 | + public static final short MPLS_UNICAST = EthType.MPLS_UNICAST; |
| 43 | - public static final short MPLS_MULTICAST = (short) 0x8848; | 43 | + public static final short MPLS_MULTICAST = EthType.MPLS_MULTICAST; |
| 44 | 44 | ||
| 45 | + public static final short VLAN_UNTAGGED = (short) 0xffff; | ||
| 45 | public static final short DATALAYER_ADDRESS_LENGTH = 6; // bytes | 46 | public static final short DATALAYER_ADDRESS_LENGTH = 6; // bytes |
| 46 | public static final Map<Short, Class<? extends IPacket>> ETHER_TYPE_CLASS_MAP = | 47 | public static final Map<Short, Class<? extends IPacket>> ETHER_TYPE_CLASS_MAP = |
| 47 | new HashMap<>(); | 48 | new HashMap<>(); |
| 48 | 49 | ||
| 49 | static { | 50 | static { |
| 50 | - Ethernet.ETHER_TYPE_CLASS_MAP.put(Ethernet.TYPE_ARP, ARP.class); | 51 | + for (EthType.EtherType ethType : EthType.EtherType.values()) { |
| 51 | - Ethernet.ETHER_TYPE_CLASS_MAP.put(Ethernet.TYPE_RARP, ARP.class); | 52 | + if (ethType.clazz() != null) { |
| 52 | - Ethernet.ETHER_TYPE_CLASS_MAP.put(Ethernet.TYPE_IPV4, IPv4.class); | 53 | + ETHER_TYPE_CLASS_MAP.put(ethType.ethType().toShort(), ethType.clazz()); |
| 53 | - Ethernet.ETHER_TYPE_CLASS_MAP.put(Ethernet.TYPE_IPV6, IPv6.class); | 54 | + } |
| 54 | - Ethernet.ETHER_TYPE_CLASS_MAP.put(Ethernet.TYPE_LLDP, LLDP.class); | 55 | + } |
| 55 | - Ethernet.ETHER_TYPE_CLASS_MAP.put(Ethernet.TYPE_BSN, LLDP.class); | ||
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | protected MacAddress destinationMACAddress; | 58 | protected MacAddress destinationMACAddress; | ... | ... |
-
Please register or login to post a comment