alshabib
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 {
ConnectPoint srcConnectPoint = pkt.receivedFrom();
switch (ethPkt.getEtherType()) {
case Ethernet.TYPE_ARP:
case 0x806:
ARP arpPacket = (ARP) ethPkt.getPayload();
Ip4Address targetIpAddress = Ip4Address
.valueOf(arpPacket.getTargetProtocolAddress());
......@@ -141,7 +141,7 @@ public class SdnIpReactiveRouting {
ByteBuffer.wrap(eth.serialize())));
}
break;
case Ethernet.TYPE_IPV4:
case 0x800:
// Parse packet
IPv4 ipv4Packet = (IPv4) ethPkt.getPayload();
IpAddress dstIp =
......
......@@ -15,6 +15,7 @@
*/
package org.onosproject.net.flow.criteria;
import org.onlab.packet.EthType;
import org.onosproject.net.IndexedLambda;
import org.onosproject.net.Lambda;
import org.onosproject.net.OchSignal;
......@@ -101,6 +102,16 @@ public final class Criteria {
}
/**
* Creates a match on ETH_TYPE field using the specified value.
*
* @param ethType eth type value
* @return match criterion
*/
public static Criterion matchEthType(EthType ethType) {
return new EthTypeCriterion(ethType);
}
/**
* Creates a match on VLAN ID field using the specified value.
*
* @param vlanId vlan id value
......
......@@ -15,6 +15,8 @@
*/
package org.onosproject.net.flow.criteria;
import org.onlab.packet.EthType;
import java.util.Objects;
import static com.google.common.base.MoreObjects.toStringHelper;
......@@ -24,7 +26,7 @@ import static com.google.common.base.MoreObjects.toStringHelper;
*/
public final class EthTypeCriterion implements Criterion {
private static final int MASK = 0xffff;
private final int ethType; // Ethernet type value: 16 bits
private final EthType ethType; // Ethernet type value: 16 bits
/**
* Constructor.
......@@ -33,7 +35,16 @@ public final class EthTypeCriterion implements Criterion {
* integer)
*/
EthTypeCriterion(int ethType) {
this.ethType = ethType & MASK;
this.ethType = new EthType(ethType & MASK);
}
/**
* Constructor.
*
* @param ethType the Ethernet frame type to match
*/
EthTypeCriterion(EthType ethType) {
this.ethType = ethType;
}
@Override
......@@ -46,14 +57,14 @@ public final class EthTypeCriterion implements Criterion {
*
* @return the Ethernet frame type to match (16 bits unsigned integer)
*/
public int ethType() {
public EthType ethType() {
return ethType;
}
@Override
public String toString() {
return toStringHelper(type().toString())
.add("ethType", Long.toHexString(ethType))
.add("ethType", ethType.toString())
.toString();
}
......
......@@ -16,6 +16,7 @@
package org.onosproject.net.flow.criteria;
import org.junit.Test;
import org.onlab.packet.EthType;
import org.onosproject.net.ChannelSpacing;
import org.onosproject.net.GridType;
import org.onosproject.net.Lambda;
......@@ -418,8 +419,8 @@ public class CriteriaTest {
*/
@Test
public void testMatchEthTypeMethod() {
int ethType = 12;
Criterion matchEthType = Criteria.matchEthType(ethType);
EthType ethType = new EthType(12);
Criterion matchEthType = Criteria.matchEthType(new EthType(12));
EthTypeCriterion ethTypeCriterion =
checkAndConvert(matchEthType,
Criterion.Type.ETH_TYPE,
......
......@@ -165,7 +165,7 @@ public final class EncodeCriterionCodec {
public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
final EthTypeCriterion ethTypeCriterion =
(EthTypeCriterion) criterion;
return root.put(CriterionCodec.ETH_TYPE, ethTypeCriterion.ethType());
return root.put(CriterionCodec.ETH_TYPE, ethTypeCriterion.ethType().toShort());
}
}
......
......@@ -134,7 +134,7 @@ public final class CriterionJsonMatcher extends
* @return true if the JSON matches the criterion, false otherwise.
*/
private boolean matchCriterion(EthTypeCriterion criterion) {
final int ethType = criterion.ethType();
final int ethType = criterion.ethType().toShort();
final int jsonEthType = jsonCriterion.get("ethType").intValue();
if (ethType != jsonEthType) {
description.appendText("ethType was "
......
......@@ -22,6 +22,7 @@ import java.util.TreeMap;
import org.junit.Before;
import org.junit.Test;
import org.onlab.packet.EthType;
import org.onlab.packet.Ethernet;
import org.onlab.packet.IpAddress;
import org.onlab.packet.IpPrefix;
......@@ -148,7 +149,7 @@ public class FlowRuleCodecTest {
assertThat(rule.selector().criteria().size(), is(1));
Criterion criterion1 = rule.selector().criteria().iterator().next();
assertThat(criterion1.type(), is(Criterion.Type.ETH_TYPE));
assertThat(((EthTypeCriterion) criterion1).ethType(), is(2054));
assertThat(((EthTypeCriterion) criterion1).ethType(), is(new EthType(2054)));
assertThat(rule.treatment().allInstructions().size(), is(1));
Instruction instruction1 = rule.treatment().allInstructions().get(0);
......@@ -356,7 +357,7 @@ public class FlowRuleCodecTest {
Criterion criterion;
criterion = getCriterion(Criterion.Type.ETH_TYPE);
assertThat(((EthTypeCriterion) criterion).ethType(), is(2054));
assertThat(((EthTypeCriterion) criterion).ethType(), is(new EthType(2054)));
criterion = getCriterion(Criterion.Type.ETH_DST);
assertThat(((EthCriterion) criterion).mac(),
......
......@@ -243,7 +243,7 @@ public class MplsPathIntentCompiler implements IntentCompiler<MplsPathIntent> {
Criterion c = intent.selector().getCriterion(Criterion.Type.ETH_TYPE);
if (c != null && c instanceof EthTypeCriterion) {
EthTypeCriterion ethertype = (EthTypeCriterion) c;
treat.popMpls((short) ethertype.ethType());
treat.popMpls(ethertype.ethType().toShort());
} else {
treat.popMpls(Ethernet.TYPE_IPV4);
}
......
......@@ -20,6 +20,7 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import org.onlab.packet.ChassisId;
import org.onlab.packet.EthType;
import org.onlab.packet.Ip4Address;
import org.onlab.packet.Ip4Prefix;
import org.onlab.packet.Ip6Address;
......@@ -293,6 +294,7 @@ public final class KryoNamespaces {
PortCriterion.class,
MetadataCriterion.class,
EthCriterion.class,
EthType.class,
EthTypeCriterion.class,
VlanIdCriterion.class,
VlanPcpCriterion.class,
......
......@@ -295,7 +295,7 @@ public class CentecV350Pipeline extends AbstractHandlerBehaviour implements Pipe
TrafficSelector selector = fwd.selector();
EthTypeCriterion ethType =
(EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE);
if (ethType == null || ethType.ethType() != Ethernet.TYPE_IPV4) {
if (ethType == null || ethType.ethType().toShort() != Ethernet.TYPE_IPV4) {
fail(fwd, ObjectiveError.UNSUPPORTED);
return Collections.emptySet();
}
......
......@@ -510,7 +510,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline
fail(fwd, ObjectiveError.UNKNOWN);
return Collections.emptySet();
}
if (ethType.ethType() == Ethernet.TYPE_ARP) {
if (ethType.ethType().toShort() == Ethernet.TYPE_ARP) {
log.warn("Installing ARP rule to table 60");
// currently need to punt from ACL table should use:
......@@ -551,7 +551,7 @@ public class OFDPA1Pipeline extends AbstractHandlerBehaviour implements Pipeline
EthTypeCriterion ethType =
(EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE);
// XXX currently supporting only the L3 unicast table
if (ethType == null || ethType.ethType() != Ethernet.TYPE_IPV4) {
if (ethType == null || ethType.ethType().toShort() != Ethernet.TYPE_IPV4) {
fail(fwd, ObjectiveError.UNSUPPORTED);
return Collections.emptySet();
}
......
......@@ -257,17 +257,17 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli
fail(fwd, ObjectiveError.UNKNOWN);
return Collections.emptySet();
}
if (ethType.ethType() == Ethernet.TYPE_ARP) {
if (ethType.ethType().toShort() == Ethernet.TYPE_ARP) {
log.warn("Driver automatically handles ARP packets by punting to controller "
+ " from ETHER table");
pass(fwd);
return Collections.emptySet();
} else if (ethType.ethType() == Ethernet.TYPE_LLDP ||
ethType.ethType() == Ethernet.TYPE_BSN) {
} else if (ethType.ethType().toShort() == Ethernet.TYPE_LLDP ||
ethType.ethType().toShort() == Ethernet.TYPE_BSN) {
log.warn("Driver currently does not currently handle LLDP packets");
fail(fwd, ObjectiveError.UNSUPPORTED);
return Collections.emptySet();
} else if (ethType.ethType() == Ethernet.TYPE_IPV4) {
} else if (ethType.ethType().toShort() == Ethernet.TYPE_IPV4) {
IPCriterion ipSrc = (IPCriterion) selector
.getCriterion(Criterion.Type.IPV4_SRC);
IPCriterion ipDst = (IPCriterion) selector
......@@ -303,7 +303,7 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli
TrafficSelector selector = fwd.selector();
EthTypeCriterion ethType =
(EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE);
if (ethType == null || ethType.ethType() != Ethernet.TYPE_IPV4) {
if (ethType == null || ethType.ethType().toShort() != Ethernet.TYPE_IPV4) {
fail(fwd, ObjectiveError.UNSUPPORTED);
return Collections.emptySet();
}
......
......@@ -243,7 +243,7 @@ public class PicaPipeline extends AbstractHandlerBehaviour implements Pipeliner
return Collections.emptySet();
}
if (ethType.ethType() == Ethernet.TYPE_ARP) {
if (ethType.ethType().toShort() == Ethernet.TYPE_ARP) {
if (filters.isEmpty()) {
pendingVersatiles.add(fwd);
return Collections.emptySet();
......@@ -253,12 +253,12 @@ public class PicaPipeline extends AbstractHandlerBehaviour implements Pipeliner
flowrules.addAll(processVersatilesWithFilters(filter, fwd));
}
return flowrules;
} else if (ethType.ethType() == Ethernet.TYPE_LLDP ||
ethType.ethType() == Ethernet.TYPE_BSN) {
} else if (ethType.ethType().toShort() == Ethernet.TYPE_LLDP ||
ethType.ethType().toShort() == Ethernet.TYPE_BSN) {
log.warn("Driver currently does not currently handle LLDP packets");
fail(fwd, ObjectiveError.UNSUPPORTED);
return Collections.emptySet();
} else if (ethType.ethType() == Ethernet.TYPE_IPV4) {
} else if (ethType.ethType().toShort() == Ethernet.TYPE_IPV4) {
IPCriterion ipSrc = (IPCriterion) selector
.getCriterion(Criterion.Type.IPV4_SRC);
IPCriterion ipDst = (IPCriterion) selector
......@@ -339,7 +339,7 @@ public class PicaPipeline extends AbstractHandlerBehaviour implements Pipeliner
TrafficSelector selector = fwd.selector();
EthTypeCriterion ethType =
(EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE);
if (ethType == null || ethType.ethType() != Ethernet.TYPE_IPV4) {
if (ethType == null || ethType.ethType().toShort() != Ethernet.TYPE_IPV4) {
fail(fwd, ObjectiveError.UNSUPPORTED);
return Collections.emptySet();
}
......
......@@ -367,7 +367,7 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe
return Collections.emptySet();
}
if (ethType.ethType() == Ethernet.TYPE_ARP) {
if (ethType.ethType().toShort() == Ethernet.TYPE_ARP) {
// need to install ARP request & reply flow rules for each interface filter
// rule for ARP replies
......@@ -425,7 +425,7 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe
EthTypeCriterion ethType =
(EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE);
// XXX currently supporting only the L3 unicast table
if (ethType == null || ethType.ethType() != Ethernet.TYPE_IPV4) {
if (ethType == null || ethType.ethType().toShort() != Ethernet.TYPE_IPV4) {
fail(fwd, ObjectiveError.UNSUPPORTED);
return Collections.emptySet();
}
......@@ -474,7 +474,7 @@ public class SoftRouterPipeline extends AbstractHandlerBehaviour implements Pipe
* the dummy group is fetched from the distributed store and the enclosed
* treatment is applied as a flow rule action.
*
* @param nextObjective the next objective of type simple
* @param nextObj the next objective of type simple
*/
private void processSimpleNextObjective(NextObjective nextObj) {
// Simple next objective has a single treatment (not a collection)
......
......@@ -440,8 +440,8 @@ public class SpringOpenTTP extends AbstractHandlerBehaviour
EthTypeCriterion ethType = (EthTypeCriterion) selector
.getCriterion(Criterion.Type.ETH_TYPE);
if ((ethType == null) ||
((((short) ethType.ethType()) != Ethernet.TYPE_IPV4) &&
(((short) ethType.ethType()) != Ethernet.MPLS_UNICAST))) {
(ethType.ethType().toShort() != Ethernet.TYPE_IPV4) &&
(ethType.ethType().toShort() != Ethernet.MPLS_UNICAST)) {
log.warn("processSpecific: Unsupported "
+ "forwarding objective criteraia");
fail(fwd, ObjectiveError.UNSUPPORTED);
......@@ -451,7 +451,7 @@ public class SpringOpenTTP extends AbstractHandlerBehaviour
TrafficSelector.Builder filteredSelectorBuilder =
DefaultTrafficSelector.builder();
int forTableId = -1;
if (((short) ethType.ethType()) == Ethernet.TYPE_IPV4) {
if (ethType.ethType().toShort() == Ethernet.TYPE_IPV4) {
filteredSelectorBuilder = filteredSelectorBuilder
.matchEthType(Ethernet.TYPE_IPV4)
.matchIPDst(((IPCriterion) selector
......
......@@ -81,8 +81,8 @@ public class SpringOpenTTPDell extends SpringOpenTTP {
EthTypeCriterion ethType = (EthTypeCriterion) selector
.getCriterion(Criterion.Type.ETH_TYPE);
if ((ethType == null) ||
((((short) ethType.ethType()) != Ethernet.TYPE_IPV4) &&
(((short) ethType.ethType()) != Ethernet.MPLS_UNICAST))) {
(ethType.ethType().toShort() != Ethernet.TYPE_IPV4) &&
(ethType.ethType().toShort() != Ethernet.MPLS_UNICAST)) {
log.debug("processSpecific: Unsupported "
+ "forwarding objective criteraia");
fail(fwd, ObjectiveError.UNSUPPORTED);
......@@ -92,7 +92,7 @@ public class SpringOpenTTPDell extends SpringOpenTTP {
TrafficSelector.Builder filteredSelectorBuilder =
DefaultTrafficSelector.builder();
int forTableId = -1;
if (((short) ethType.ethType()) == Ethernet.TYPE_IPV4) {
if (ethType.ethType().toShort() == Ethernet.TYPE_IPV4) {
if (deviceTMac == null) {
log.debug("processSpecific: ETH_DST filtering "
+ "objective is not set which is required "
......
......@@ -198,7 +198,7 @@ public abstract class FlowModBuilder {
break;
case ETH_TYPE:
EthTypeCriterion ethType = (EthTypeCriterion) c;
mBuilder.setExact(MatchField.ETH_TYPE, EthType.of(ethType.ethType()));
mBuilder.setExact(MatchField.ETH_TYPE, EthType.of(ethType.ethType().toShort()));
break;
case VLAN_VID:
VlanIdCriterion vid = (VlanIdCriterion) c;
......
/*
* Copyright 2015 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onlab.packet;
import com.google.common.collect.Maps;
import java.util.Map;
/**
* Representation of an Ethertype.
*/
public class EthType {
public static final short ARP = EtherType.ARP.ethType.toShort();
public static final short RARP = EtherType.RARP.ethType.toShort();
public static final short VLAN = EtherType.VLAN.ethType.toShort();
public static final short IPV4 = EtherType.IPV4.ethType.toShort();
public static final short IPV6 = EtherType.IPV6.ethType.toShort();
public static final short LLDP = EtherType.LLDP.ethType.toShort();
public static final short BDDP = EtherType.BDDP.ethType.toShort();
public static final short MPLS_MULTICAST = EtherType.MPLS_UNICAST.ethType.toShort();
public static final short MPLS_UNICAST = EtherType.MPLS_UNICAST.ethType.toShort();
private short etherType;
/*
* Reverse-lookup map for getting a EtherType enum
*/
private static final Map<Short, EtherType> LOOKUP = Maps.newHashMap();
static {
for (EtherType eth : EtherType.values()) {
LOOKUP.put(eth.ethType().toShort(), eth);
}
}
public EthType(int etherType) {
this.etherType = (short) (etherType & 0xFFFF);
}
public EthType(short etherType) {
this.etherType = etherType;
}
public short toShort() {
return etherType;
}
public static EtherType lookup(short etherType) {
return LOOKUP.get(etherType);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
EthType ethType = (EthType) o;
if (etherType != ethType.etherType) {
return false;
}
return true;
}
@Override
public int hashCode() {
return (int) etherType;
}
public String toString() {
EtherType ethType = lookup(this.etherType);
return (ethType == null ? "unknown" : ethType.toString());
}
public static enum EtherType {
ARP(0x806, "arp", ARP.class),
RARP(0x8035, "rarp", null),
IPV4(0x800, "ipv4", IPv4.class),
IPV6(0x86dd, "ipv6", IPv6.class),
LLDP(0x88cc, "lldp", LLDP.class),
VLAN(0x8100, "vlan", null),
BDDP(0x8942, "bddp", LLDP.class),
MPLS_UNICAST(0x8847, "mpls_unicast", null),
MPLS_MULTICAST(0x8848, "mpls_unicast", null);
private final Class clazz;
private EthType ethType;
private String type;
EtherType(int ethType, String type, Class clazz) {
this.ethType = new EthType(ethType);
this.type = type;
this.clazz = clazz;
}
public EthType ethType() {
return ethType;
}
@Override
public String toString() {
return type;
}
public Class clazz() {
return clazz;
}
}
}
......@@ -31,28 +31,28 @@ import java.util.Map;
*/
public class Ethernet extends BasePacket {
private static final String HEXES = "0123456789ABCDEF";
public static final short TYPE_ARP = (short) 0x0806;
public static final short TYPE_RARP = (short) 0x8035;
public static final short TYPE_IPV4 = (short) 0x0800;
public static final short TYPE_IPV6 = (short) 0x86dd;
public static final short TYPE_LLDP = (short) 0x88cc;
public static final short TYPE_VLAN = (short) 0x8100;
public static final short TYPE_BSN = (short) 0x8942;
public static final short VLAN_UNTAGGED = (short) 0xffff;
public static final short MPLS_UNICAST = (short) 0x8847;
public static final short MPLS_MULTICAST = (short) 0x8848;
public static final short TYPE_ARP = EthType.ARP;
public static final short TYPE_RARP = EthType.RARP;
public static final short TYPE_IPV4 = EthType.IPV4;
public static final short TYPE_IPV6 = EthType.IPV6;
public static final short TYPE_LLDP = EthType.LLDP;
public static final short TYPE_VLAN = EthType.VLAN;
public static final short TYPE_BSN = EthType.BDDP;
public static final short MPLS_UNICAST = EthType.MPLS_UNICAST;
public static final short MPLS_MULTICAST = EthType.MPLS_MULTICAST;
public static final short VLAN_UNTAGGED = (short) 0xffff;
public static final short DATALAYER_ADDRESS_LENGTH = 6; // bytes
public static final Map<Short, Class<? extends IPacket>> ETHER_TYPE_CLASS_MAP =
new HashMap<>();
static {
Ethernet.ETHER_TYPE_CLASS_MAP.put(Ethernet.TYPE_ARP, ARP.class);
Ethernet.ETHER_TYPE_CLASS_MAP.put(Ethernet.TYPE_RARP, ARP.class);
Ethernet.ETHER_TYPE_CLASS_MAP.put(Ethernet.TYPE_IPV4, IPv4.class);
Ethernet.ETHER_TYPE_CLASS_MAP.put(Ethernet.TYPE_IPV6, IPv6.class);
Ethernet.ETHER_TYPE_CLASS_MAP.put(Ethernet.TYPE_LLDP, LLDP.class);
Ethernet.ETHER_TYPE_CLASS_MAP.put(Ethernet.TYPE_BSN, LLDP.class);
for (EthType.EtherType ethType : EthType.EtherType.values()) {
if (ethType.clazz() != null) {
ETHER_TYPE_CLASS_MAP.put(ethType.ethType().toShort(), ethType.clazz());
}
}
}
protected MacAddress destinationMACAddress;
......