| package net.floodlightcontroller.util; |
| |
| import net.floodlightcontroller.util.MACAddress; |
| import net.floodlightcontroller.util.IPv4Net; |
| |
| import org.codehaus.jackson.annotate.JsonProperty; |
| |
| /** |
| * The class representing the Flow Entry Matching filter. |
| * |
| * The Flow Entry matching filter that is used to specify |
| * the network data that would be forwarded on the data path from |
| * the source to the destination. Examples: source or destination MAC address, |
| * IP prefix that includes the destination's IP address, etc. |
| */ |
| public class FlowEntryMatch { |
| /** |
| * A class for storing a value to match. |
| */ |
| class Field<T> { |
| /** |
| * Default constructor. |
| */ |
| public Field() { |
| this.enabled = false; |
| } |
| |
| /** |
| * Constructor for a given value to match. |
| * |
| * @param value the value to match. |
| */ |
| public Field(T value) { |
| this.value = value; |
| this.enabled = true; |
| } |
| |
| /** |
| * Get the value. |
| * |
| * @return the value. |
| */ |
| public T value() { return this.value; } |
| |
| /** |
| * Enable the matching for a given value. |
| * |
| * @param value the value to set. |
| */ |
| public void enableMatch(T value) { |
| this.value = value; |
| this.enabled = true; |
| } |
| |
| /** |
| * Disable the matching. |
| */ |
| public void disableMatch() { |
| this.enabled = false; |
| } |
| |
| /** |
| * Test whether matching is enabled. |
| * |
| * @return true if matching is enabled, otherwise false. |
| */ |
| public boolean enabled() { return this.enabled; } |
| |
| private T value; // The value to match |
| private boolean enabled; // Set to true, if matching is enabled |
| } |
| |
| private Field<Port> inPort; // Matching input switch port |
| private Field<MACAddress> srcMac; // Matching source MAC address |
| private Field<MACAddress> dstMac; // Matching destination MAC address |
| private Field<Short> vlanId; // Matching VLAN ID |
| private Field<Byte> vlanPriority; // Matching VLAN priority |
| private Field<Short> ethernetFrameType; // Matching Ethernet frame type |
| private Field<Byte> ipToS; // Matching IP ToS (DSCP field, 6 bits) |
| private Field<Byte> ipProto; // Matching IP protocol |
| private Field<IPv4Net> srcIPv4Net; // Matching source IPv4 prefix |
| private Field<IPv4Net> dstIPv4Net; // Matching destination IPv4 prefix |
| private Field<Short> srcTcpUdpPort; // Matching source TCP/UDP port |
| private Field<Short> dstTcpUdpPort; // Matching destination TCP/UDP port |
| |
| /** |
| * Default constructor. |
| */ |
| public FlowEntryMatch() { |
| } |
| |
| /** |
| * Copy constructor. |
| * |
| * @param other the object to copy from. |
| */ |
| public FlowEntryMatch(FlowEntryMatch other) { |
| if ((other.inPort != null) && other.inPort.enabled()) |
| this.enableInPort(other.inPort.value()); |
| if ((other.srcMac != null) && other.srcMac.enabled()) |
| this.enableSrcMac(other.srcMac.value()); |
| if ((other.dstMac != null) && other.dstMac.enabled()) |
| this.enableDstMac(other.dstMac.value()); |
| if ((other.vlanId != null) && other.vlanId.enabled()) |
| this.enableVlanId(other.vlanId.value()); |
| if ((other.vlanPriority != null) && other.vlanPriority.enabled()) |
| this.enableVlanPriority(other.vlanPriority.value()); |
| if ((other.ethernetFrameType != null) && other.ethernetFrameType.enabled()) |
| this.enableEthernetFrameType(other.ethernetFrameType.value()); |
| if ((other.ipToS != null) && other.ipToS.enabled()) |
| this.enableIpToS(other.ipToS.value()); |
| if ((other.ipProto != null) && other.ipProto.enabled()) |
| this.enableIpProto(other.ipProto.value()); |
| if ((other.srcIPv4Net != null) && other.srcIPv4Net.enabled()) |
| this.enableSrcIPv4Net(other.srcIPv4Net.value()); |
| if ((other.dstIPv4Net != null) && other.dstIPv4Net.enabled()) |
| this.enableDstIPv4Net(other.dstIPv4Net.value()); |
| if ((other.srcTcpUdpPort != null) && other.srcTcpUdpPort.enabled()) |
| this.enableSrcTcpUdpPort(other.srcTcpUdpPort.value()); |
| if ((other.dstTcpUdpPort != null) && other.dstTcpUdpPort.enabled()) |
| this.enableDstTcpUdpPort(other.dstTcpUdpPort.value()); |
| } |
| |
| /** |
| * Get the matching input switch port. |
| * |
| * @return the matching input switch port. |
| */ |
| @JsonProperty("inPort") |
| public Port inPort() { |
| if (inPort != null) |
| return inPort.value(); |
| return null; |
| } |
| |
| /** |
| * Enable the matching on input switch port. |
| * |
| * @param inPort the input switch port value to enable for matching. |
| */ |
| @JsonProperty("inPort") |
| public void enableInPort(Port inPort) { |
| this.inPort = new Field<Port>(inPort); |
| } |
| |
| /** |
| * Disable the matching on input switch port. |
| */ |
| public void disableInPort() { |
| this.inPort = null; |
| } |
| |
| /** |
| * Test if matching on input switch port is enabled. |
| * |
| * @return true if matching on input switch port is enabled. |
| */ |
| @JsonProperty("matchInPort") |
| public boolean matchInPort() { |
| if (inPort != null) |
| return inPort.enabled(); |
| return false; |
| } |
| |
| /** |
| * Get the matching source MAC address. |
| * |
| * @return the matching source MAC address. |
| */ |
| @JsonProperty("srcMac") |
| public MACAddress srcMac() { |
| if (srcMac != null) |
| return srcMac.value(); |
| return null; |
| } |
| |
| /** |
| * Enable the matching on source MAC address. |
| * |
| * @param srcMac the source MAC address value to enable for matching. |
| */ |
| @JsonProperty("srcMac") |
| public void enableSrcMac(MACAddress srcMac) { |
| this.srcMac = new Field<MACAddress>(srcMac); |
| } |
| |
| /** |
| * Disable the matching on source MAC address. |
| */ |
| public void disableSrcMac() { |
| this.srcMac = null; |
| } |
| |
| /** |
| * Test if matching on source MAC address is enabled. |
| * |
| * @return true if matching on source MAC address is enabled. |
| */ |
| @JsonProperty("matchSrcMac") |
| public boolean matchSrcMac() { |
| if (srcMac != null) |
| return srcMac.enabled(); |
| return false; |
| } |
| |
| /** |
| * Get the matching destination MAC address. |
| * |
| * @return the matching destination MAC address. |
| */ |
| @JsonProperty("dstMac") |
| public MACAddress dstMac() { |
| if (dstMac != null) |
| return dstMac.value(); |
| return null; |
| } |
| |
| /** |
| * Enable the matching on destination MAC address. |
| * |
| * @param dstMac the destination MAC address value to enable for matching. |
| */ |
| @JsonProperty("dstMac") |
| public void enableDstMac(MACAddress dstMac) { |
| this.dstMac = new Field<MACAddress>(dstMac); |
| } |
| |
| /** |
| * Disable the matching on destination MAC address. |
| */ |
| public void disableDstMac() { |
| this.dstMac = null; |
| } |
| |
| /** |
| * Test if matching on destination MAC address is enabled. |
| * |
| * @return true if matching on destination MAC address is enabled. |
| */ |
| @JsonProperty("matchDstMac") |
| public boolean matchDstMac() { |
| if (dstMac != null) |
| return dstMac.enabled(); |
| return false; |
| } |
| |
| /** |
| * Get the matching VLAN ID. |
| * |
| * @return the matching VLAN ID. |
| */ |
| @JsonProperty("vlanId") |
| public Short vlanId() { |
| if (vlanId != null) |
| return vlanId.value(); |
| return null; |
| } |
| |
| /** |
| * Enable the matching on VLAN ID. |
| * |
| * @param vlanId the VLAN ID value to enable for matching. |
| */ |
| @JsonProperty("vlanId") |
| public void enableVlanId(Short vlanId) { |
| this.vlanId = new Field<Short>(vlanId); |
| } |
| |
| /** |
| * Disable the matching on VLAN ID. |
| */ |
| public void disableVlanId() { |
| this.vlanId = null; |
| } |
| |
| /** |
| * Test if matching on VLAN ID is enabled. |
| * |
| * @return true if matching on VLAN ID is enabled. |
| */ |
| @JsonProperty("matchVlanId") |
| public boolean matchVlanId() { |
| if (vlanId != null) |
| return vlanId.enabled(); |
| return false; |
| } |
| |
| /** |
| * Get the matching VLAN priority. |
| * |
| * @return the matching VLAN priority. |
| */ |
| @JsonProperty("vlanPriority") |
| public Byte vlanPriority() { |
| if (vlanPriority != null) |
| return vlanPriority.value(); |
| return null; |
| } |
| |
| /** |
| * Enable the matching on VLAN priority. |
| * |
| * @param vlanPriority the VLAN priority value to enable for matching. |
| */ |
| @JsonProperty("vlanPriority") |
| public void enableVlanPriority(Byte vlanPriority) { |
| this.vlanPriority = new Field<Byte>(vlanPriority); |
| } |
| |
| /** |
| * Disable the matching on VLAN priority. |
| */ |
| public void disableVlanPriority() { |
| this.vlanPriority = null; |
| } |
| |
| /** |
| * Test if matching on VLAN priority is enabled. |
| * |
| * @return true if matching on VLAN priority is enabled. |
| */ |
| @JsonProperty("matchVlanPriority") |
| public boolean matchVlanPriority() { |
| if (vlanPriority != null) |
| return vlanPriority.enabled(); |
| return false; |
| } |
| |
| /** |
| * Get the matching Ethernet frame type. |
| * |
| * @return the matching Ethernet frame type. |
| */ |
| @JsonProperty("ethernetFrameType") |
| public Short ethernetFrameType() { |
| if (ethernetFrameType != null) |
| return ethernetFrameType.value(); |
| return null; |
| } |
| |
| /** |
| * Enable the matching on Ethernet frame type. |
| * |
| * @param ethernetFrameType the Ethernet frame type value to enable for |
| * matching. |
| */ |
| @JsonProperty("ethernetFrameType") |
| public void enableEthernetFrameType(Short ethernetFrameType) { |
| this.ethernetFrameType = new Field<Short>(ethernetFrameType); |
| } |
| |
| /** |
| * Disable the matching on Ethernet frame type. |
| */ |
| public void disableEthernetFrameType() { |
| this.ethernetFrameType = null; |
| } |
| |
| /** |
| * Test if matching on Ethernet frame type is enabled. |
| * |
| * @return true if matching on Ethernet frame type is enabled. |
| */ |
| @JsonProperty("matchEthernetFrameType") |
| public boolean matchEthernetFrameType() { |
| if (ethernetFrameType != null) |
| return ethernetFrameType.enabled(); |
| return false; |
| } |
| |
| /** |
| * Get the matching IP ToS (DSCP field, 6 bits) |
| * |
| * @return the matching IP ToS. |
| */ |
| @JsonProperty("ipToS") |
| public Byte ipToS() { |
| if (ipToS != null) |
| return ipToS.value(); |
| return null; |
| } |
| |
| /** |
| * Enable the matching on IP ToS (DSCP field, 6 bits). |
| * |
| * @param ipToS the IP ToS value to enable for matching. |
| */ |
| @JsonProperty("ipToS") |
| public void enableIpToS(Byte ipToS) { |
| this.ipToS = new Field<Byte>(ipToS); |
| } |
| |
| /** |
| * Disable the matching on IP ToS (DSCP field, 6 bits). |
| */ |
| public void disableIpToS() { |
| this.ipToS = null; |
| } |
| |
| /** |
| * Test if matching on IP ToS (DSCP field, 6 bits) is enabled. |
| * |
| * @return true if matching on IP ToS is enabled. |
| */ |
| @JsonProperty("matchIpToS") |
| public boolean matchIpToS() { |
| if (ipToS != null) |
| return ipToS.enabled(); |
| return false; |
| } |
| |
| /** |
| * Get the matching IP protocol. |
| * |
| * @return the matching IP protocol. |
| */ |
| @JsonProperty("ipProto") |
| public Byte ipProto() { |
| if (ipProto != null) |
| return ipProto.value(); |
| return null; |
| } |
| |
| /** |
| * Enable the matching on IP protocol. |
| * |
| * @param ipProto the IP protocol value to enable for matching. |
| */ |
| @JsonProperty("ipProto") |
| public void enableIpProto(Byte ipProto) { |
| this.ipProto = new Field<Byte>(ipProto); |
| } |
| |
| /** |
| * Disable the matching on IP protocol. |
| */ |
| public void disableIpProto() { |
| this.ipProto = null; |
| } |
| |
| /** |
| * Test if matching on IP protocol is enabled. |
| * |
| * @return true if matching on IP protocol is enabled. |
| */ |
| @JsonProperty("matchIpProto") |
| public boolean matchIpProto() { |
| if (ipProto != null) |
| return ipProto.enabled(); |
| return false; |
| } |
| |
| /** |
| * Get the matching source IPv4 prefix. |
| * |
| * @return the matching source IPv4 prefix. |
| */ |
| @JsonProperty("srcIPv4Net") |
| public IPv4Net srcIPv4Net() { |
| if (srcIPv4Net != null) |
| return srcIPv4Net.value(); |
| return null; |
| } |
| |
| /** |
| * Enable the matching on source IPv4 prefix. |
| * |
| * @param srcIPv4Net the source IPv4 prefix value to enable for matching. |
| */ |
| @JsonProperty("srcIPv4Net") |
| public void enableSrcIPv4Net(IPv4Net srcIPv4Net) { |
| this.srcIPv4Net = new Field<IPv4Net>(srcIPv4Net); |
| } |
| |
| /** |
| * Disable the matching on source IPv4 prefix. |
| */ |
| public void disableSrcIPv4Net() { |
| this.srcIPv4Net = null; |
| } |
| |
| /** |
| * Test if matching on source IPv4 prefix is enabled. |
| * |
| * @return true if matching on source IPv4 prefix is enabled. |
| */ |
| @JsonProperty("matchSrcIPv4Net") |
| public boolean matchSrcIPv4Net() { |
| if (srcIPv4Net != null) |
| return srcIPv4Net.enabled(); |
| return false; |
| } |
| |
| /** |
| * Get the matching destination IPv4 prefix. |
| * |
| * @return the matching destination IPv4 prefix. |
| */ |
| @JsonProperty("dstIPv4Net") |
| public IPv4Net dstIPv4Net() { |
| if (dstIPv4Net != null) |
| return dstIPv4Net.value(); |
| return null; |
| } |
| |
| /** |
| * Enable the matching on destination IPv4 prefix. |
| * |
| * @param dstIPv4Net the destination IPv4 prefix value to enable for |
| * matching. |
| */ |
| @JsonProperty("dstIPv4Net") |
| public void enableDstIPv4Net(IPv4Net dstIPv4Net) { |
| this.dstIPv4Net = new Field<IPv4Net>(dstIPv4Net); |
| } |
| |
| /** |
| * Disable the matching on destination IPv4 prefix. |
| */ |
| public void disableDstIPv4Net() { |
| this.dstIPv4Net = null; |
| } |
| |
| /** |
| * Test if matching on destination IPv4 prefix is enabled. |
| * |
| * @return true if matching on destination IPv4 prefix is enabled. |
| */ |
| @JsonProperty("matchDstIPv4Net") |
| public boolean matchDstIPv4Net() { |
| if (dstIPv4Net != null) |
| return dstIPv4Net.enabled(); |
| return false; |
| } |
| |
| /** |
| * Get the matching source TCP/UDP port. |
| * |
| * @return the matching source TCP/UDP port. |
| */ |
| @JsonProperty("srcTcpUdpPort") |
| public Short srcTcpUdpPort() { |
| if (srcTcpUdpPort != null) |
| return srcTcpUdpPort.value(); |
| return null; |
| } |
| |
| /** |
| * Enable the matching on source TCP/UDP port. |
| * |
| * @param srcTcpUdpPort the source TCP/UDP port to enable for matching. |
| */ |
| @JsonProperty("srcTcpUdpPort") |
| public void enableSrcTcpUdpPort(Short srcTcpUdpPort) { |
| this.srcTcpUdpPort = new Field<Short>(srcTcpUdpPort); |
| } |
| |
| /** |
| * Disable the matching on source TCP/UDP port. |
| */ |
| public void disableSrcTcpUdpPort() { |
| this.srcTcpUdpPort = null; |
| } |
| |
| /** |
| * Test if matching on source TCP/UDP port is enabled. |
| * |
| * @return true if matching on source TCP/UDP port is enabled. |
| */ |
| @JsonProperty("matchSrcTcpUdpPort") |
| public boolean matchSrcTcpUdpPort() { |
| if (srcTcpUdpPort != null) |
| return srcTcpUdpPort.enabled(); |
| return false; |
| } |
| |
| /** |
| * Get the matching destination TCP/UDP port. |
| * |
| * @return the matching destination TCP/UDP port. |
| */ |
| @JsonProperty("dstTcpUdpPort") |
| public Short dstTcpUdpPort() { |
| if (dstTcpUdpPort != null) |
| return dstTcpUdpPort.value(); |
| return null; |
| } |
| |
| /** |
| * Enable the matching on destination TCP/UDP port. |
| * |
| * @param dstTcpUdpPort the destination TCP/UDP port to enable for |
| * matching. |
| */ |
| @JsonProperty("dstTcpUdpPort") |
| public void enableDstTcpUdpPort(Short dstTcpUdpPort) { |
| this.dstTcpUdpPort = new Field<Short>(dstTcpUdpPort); |
| } |
| |
| /** |
| * Disable the matching on destination TCP/UDP port. |
| */ |
| public void disableDstTcpUdpPort() { |
| this.dstTcpUdpPort = null; |
| } |
| |
| /** |
| * Test if matching on destination TCP/UDP port is enabled. |
| * |
| * @return true if matching on destination TCP/UDP port is enabled. |
| */ |
| @JsonProperty("matchDstTcpUdpPort") |
| public boolean matchDstTcpUdpPort() { |
| if (dstTcpUdpPort != null) |
| return dstTcpUdpPort.enabled(); |
| return false; |
| } |
| |
| /** |
| * Convert the matching filter to a string. |
| * |
| * The string has the following form: |
| * [srcMac=XXX dstMac=XXX srcIPv4Net=XXX dstIPv4Net=XXX] |
| * |
| * @return the matching filter as a string. |
| */ |
| @Override |
| public String toString() { |
| String ret = "["; |
| boolean addSpace = false; |
| |
| // |
| // Conditionally add only those matching fields that are enabled |
| // |
| if (matchInPort()) { |
| if (addSpace) |
| ret += " "; |
| addSpace = true; |
| ret += "inPort=" + this.inPort().toString(); |
| } |
| if (matchSrcMac()) { |
| if (addSpace) |
| ret += " "; |
| addSpace = true; |
| ret += "srcMac=" + this.srcMac().toString(); |
| } |
| if (matchDstMac()) { |
| if (addSpace) |
| ret += " "; |
| addSpace = true; |
| ret += "dstMac=" + this.dstMac().toString(); |
| } |
| if (matchVlanId()) { |
| if (addSpace) |
| ret += " "; |
| addSpace = true; |
| ret += "vlanId=" + this.vlanId().toString(); |
| } |
| if (matchVlanPriority()) { |
| if (addSpace) |
| ret += " "; |
| addSpace = true; |
| ret += "vlanPriority=" + this.vlanPriority().toString(); |
| } |
| if (matchEthernetFrameType()) { |
| if (addSpace) |
| ret += " "; |
| addSpace = true; |
| ret += "ethernetFrameType=" + this.ethernetFrameType().toString(); |
| } |
| if (matchIpToS()) { |
| if (addSpace) |
| ret += " "; |
| addSpace = true; |
| ret += "ipToS=" + this.ipToS().toString(); |
| } |
| if (matchIpProto()) { |
| if (addSpace) |
| ret += " "; |
| addSpace = true; |
| ret += "ipProto=" + this.ipProto().toString(); |
| } |
| if (matchSrcIPv4Net()) { |
| if (addSpace) |
| ret += " "; |
| addSpace = true; |
| ret += "srcIPv4Net=" + this.srcIPv4Net().toString(); |
| } |
| if (matchDstIPv4Net()) { |
| if (addSpace) |
| ret += " "; |
| addSpace = true; |
| ret += "dstIPv4Net=" + this.dstIPv4Net().toString(); |
| } |
| if (matchSrcTcpUdpPort()) { |
| if (addSpace) |
| ret += " "; |
| addSpace = true; |
| ret += "srcTcpUdpPort=" + this.srcTcpUdpPort().toString(); |
| } |
| if (matchDstTcpUdpPort()) { |
| if (addSpace) |
| ret += " "; |
| addSpace = true; |
| ret += "dstTcpUdpPort=" + this.dstTcpUdpPort().toString(); |
| } |
| |
| ret += "]"; |
| |
| return ret; |
| } |
| } |