alshabib

initial impl of criteria

package org.onlab.onos.net.flow.criteria;
import org.onlab.onos.net.PortNumber;
import org.onlab.onos.net.flow.criteria.Criterion.Type;
import org.onlab.packet.IPAddress;
import org.onlab.packet.MACAddress;
import org.onlab.packet.VLANID;
/**
* Factory class to create various traffic selection criteria.
*/
public final class Criteria {
//TODO: incomplete type implementation. Need to implement complete list from Criterion
// Ban construction
private Criteria() {
}
/**
* Creates a match on IN_PORT field using the specified value.
*
* @param port inport value
* @return match criterion
*/
public static Criterion matchInPort(PortNumber port) {
return new PortCriterion(port);
}
/**
* Creates a match on ETH_SRC field using the specified value. This value
* may be a wildcard mask.
*
* @param macValue MAC address value or wildcard mask
* @return match criterion
*/
public static Criterion matchEthSrc(MACValue macValue) {
return null;
public static Criterion matchEthSrc(MACAddress mac) {
return new EthCriterion(mac, Type.ETH_SRC);
}
/**
......@@ -27,11 +45,214 @@ public final class Criteria {
* @param macValue MAC address value or wildcard mask
* @return match criterion
*/
public static Criterion matchEthDst(MACValue macValue) {
return null;
public static Criterion matchEthDst(MACAddress mac) {
return new EthCriterion(mac, Type.ETH_DST);
}
/**
* Creates a match on ETH_TYPE field using the specified value.
*
* @param ethType eth type value
* @return match criterion
*/
public static Criterion matchEthType(Short ethType) {
return new EthTypeCriterion(ethType);
}
/**
* Creates a match on VLAN ID field using the specified value.
*
* @param vlanId vlan id value
* @return match criterion
*/
public static Criterion matchVlanId(VLANID vlanId) {
return new VlanIdCriterion(vlanId);
}
/**
* Creates a match on VLAN PCP field using the specified value.
*
* @param vlanPcp vlan pcp value
* @return match criterion
*/
public static Criterion matchVlanId(Byte vlanPcp) {
return new VlanPcpCriterion(vlanPcp);
}
/**
* Creates a match on IP proto field using the specified value.
*
* @param proto ip protocol value
* @return match criterion
*/
public static Criterion matchIPProtocol(Byte proto) {
return new IPProtocolCriterion(proto);
}
/**
* Creates a match on IP src field using the specified value.
*
* @param ip ip src value
* @return match criterion
*/
public static Criterion matchIPSrc(IPAddress ip) {
return new IPCriterion(ip, Type.IPV4_SRC);
}
/**
* Creates a match on IP dst field using the specified value.
*
* @param ip ip src value
* @return match criterion
*/
public static Criterion matchIPDst(IPAddress ip) {
return new IPCriterion(ip, Type.IPV4_DST);
}
/*
* Implementations of criteria.
*/
public static final class PortCriterion implements Criterion {
private final PortNumber port;
public PortCriterion(PortNumber port) {
this.port = port;
}
@Override
public Type type() {
return Type.IN_PORT;
}
public PortNumber port() {
return this.port;
}
}
public static final class EthCriterion implements Criterion {
private final MACAddress mac;
private final Type type;
public EthCriterion(MACAddress mac, Type type) {
this.mac = mac;
this.type = type;
}
@Override
public Type type() {
return this.type;
}
public MACAddress mac() {
return this.mac;
}
}
public static final class EthTypeCriterion implements Criterion {
private final Short ethType;
public EthTypeCriterion(Short ethType) {
this.ethType = ethType;
}
@Override
public Type type() {
return Type.ETH_TYPE;
}
public Short ethType() {
return ethType;
}
}
public static final class IPCriterion implements Criterion {
private final IPAddress ip;
private final Type type;
public IPCriterion(IPAddress ip, Type type) {
this.ip = ip;
this.type = type;
}
@Override
public Type type() {
return this.type;
}
public IPAddress ip() {
return this.ip;
}
}
public static final class IPProtocolCriterion implements Criterion {
private final Byte proto;
public IPProtocolCriterion(Byte protocol) {
this.proto = protocol;
}
@Override
public Type type() {
return Type.IP_PROTO;
}
public Byte protocol() {
return proto;
}
}
public static final class VlanPcpCriterion implements Criterion {
private final Byte vlanPcp;
public VlanPcpCriterion(Byte vlanPcp) {
this.vlanPcp = vlanPcp;
}
@Override
public Type type() {
return Type.VLAN_PCP;
}
public Byte protocol() {
return vlanPcp;
}
}
public static final class VlanIdCriterion implements Criterion {
private final VLANID vlanId;
public VlanIdCriterion(VLANID vlanId) {
this.vlanId = vlanId;
}
@Override
public Type type() {
return Type.VLAN_VID;
}
public VLANID vlanId() {
return vlanId;
}
}
// Dummy to illustrate the concept for now; delete ASAP
private static class MACValue { }
}
......
package org.onlab.onos.net.flow.criteria;
/**
* Representation of a single header field selection.
*/
......@@ -92,6 +93,12 @@ public interface Criterion {
IPV6_EXTHDR
}
/**
* Returns the type of criterion.
* @return type of criterion
*/
public Type type();
// TODO: Create factory class 'Criteria' that will have various factory
// to create specific criterions.
......
......@@ -10,6 +10,7 @@ import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.ModIPInstr
import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.ModIPProtoInstruction;
import org.onlab.packet.IPAddress;
import org.onlab.packet.MACAddress;
import org.onlab.packet.VLANID;
/**
* Factory class for creating various traffic treatment instructions.
*/
......@@ -74,7 +75,7 @@ public final class Instructions {
* @param vlanId the vlan id to modify to.
* @return a L2 modification
*/
public static L2ModificationInstruction modVlanId(Short vlanId) {
public static L2ModificationInstruction modVlanId(VLANID vlanId) {
checkNotNull(vlanId, "VLAN id cannot be null");
return new L2ModificationInstruction.ModVlanIdInstruction(vlanId);
}
......
package org.onlab.onos.net.flow.instructions;
import org.onlab.packet.MACAddress;
import org.onlab.packet.VLANID;
/**
* Abstraction of a single traffic treatment step.
......@@ -100,9 +101,9 @@ public abstract class L2ModificationInstruction implements Instruction {
*/
public static final class ModVlanIdInstruction extends L2ModificationInstruction {
public final Short vlanId;
public final VLANID vlanId;
public ModVlanIdInstruction(Short vlanId) {
public ModVlanIdInstruction(VLANID vlanId) {
this.vlanId = vlanId;
}
......@@ -111,7 +112,7 @@ public abstract class L2ModificationInstruction implements Instruction {
return L2SubType.VLAN_ID;
}
public Short vlanId() {
public VLANID vlanId() {
return this.vlanId;
}
......