X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=utils%2Fmdsal-openflow%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fovsdb%2Futils%2Fmdsal%2Fopenflow%2FMatchUtils.java;h=ba8011004713fb6aaac3706a18952e7fb2fbfe3f;hb=2e01f32c7d0f84663338ab2eaf81021dd0dcb2c2;hp=42e0adcd503944dffdd9f4d8a027b11a1652347f;hpb=22fbbf4d4f6c5b46c6f4729f546352ce90079aa3;p=ovsdb.git diff --git a/utils/mdsal-openflow/src/main/java/org/opendaylight/ovsdb/utils/mdsal/openflow/MatchUtils.java b/utils/mdsal-openflow/src/main/java/org/opendaylight/ovsdb/utils/mdsal/openflow/MatchUtils.java index 42e0adcd5..ba8011004 100644 --- a/utils/mdsal-openflow/src/main/java/org/opendaylight/ovsdb/utils/mdsal/openflow/MatchUtils.java +++ b/utils/mdsal-openflow/src/main/java/org/opendaylight/ovsdb/utils/mdsal/openflow/MatchUtils.java @@ -1,19 +1,22 @@ /* - * Copyright (C) 2013 Red Hat, Inc. + * Copyright (c) 2013, 2015 Red Hat, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html - * */ package org.opendaylight.ovsdb.utils.mdsal.openflow; import java.math.BigInteger; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; @@ -26,13 +29,18 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0; @@ -42,6 +50,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg4; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg5; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg6; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfEthDst; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlow; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlowBuilder; @@ -50,6 +59,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.ge import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionListBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNodesNodeTableFlow; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNodesNodeTableFlowBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxCtStateKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxCtZoneKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg0Key; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg1Key; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg2Key; @@ -59,12 +70,23 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.ni import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg6Key; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg7Key; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIdKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfTcpDstKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfTcpSrcKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpDstKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpSrcKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.ct.state.grouping.NxmNxCtStateBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.ct.zone.grouping.NxmNxCtZoneBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.reg.grouping.NxmNxRegBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.tun.id.grouping.NxmNxTunIdBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxmNxNspKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.nxm.nx.nsp.grouping.NxmNxNspBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxmNxNsiKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.nxm.nx.nsi.grouping.NxmNxNsiBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNspKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.nsp.grouping.NxmNxNspBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNsiKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.nsi.grouping.NxmNxNsiBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.eth.dst.grouping.NxmOfEthDstBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.tcp.src.grouping.NxmOfTcpSrcBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.tcp.dst.grouping.NxmOfTcpDstBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.udp.dst.grouping.NxmOfUdpDstBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.udp.src.grouping.NxmOfUdpSrcBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,13 +94,27 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; public class MatchUtils { - private static final Logger logger = LoggerFactory.getLogger(MatchUtils.class); + private static final Logger LOG = LoggerFactory.getLogger(MatchUtils.class); public static final short ICMP_SHORT = 1; public static final short TCP_SHORT = 6; public static final short UDP_SHORT = 17; + public static final short SCTP_SHORT = 132; public static final String TCP = "tcp"; public static final String UDP = "udp"; private static final int TCP_SYN = 0x0002; + public static final String ICMP = "icmp"; + public static final String ICMPV6 = "icmpv6"; + public static final short ALL_ICMP = -1; + public static final long ETHERTYPE_IPV4 = 0x0800; + public static final long ETHERTYPE_IPV6 = 0x86dd; + public static final int UNTRACKED_CT_STATE = 0x00; + public static final int UNTRACKED_CT_STATE_MASK = 0x20; + public static final int TRACKED_EST_CT_STATE = 0x22; + public static final int TRACKED_EST_CT_STATE_MASK = 0x22; + public static final int TRACKED_NEW_CT_STATE = 0x21; + public static final int TRACKED_NEW_CT_STATE_MASK = 0x21; + public static final int NEW_CT_STATE = 0x01; + public static final int NEW_CT_STATE_MASK = 0x01; /** * Create Ingress Port Match dpidLong, inPort @@ -91,7 +127,18 @@ public class MatchUtils { public static MatchBuilder createInPortMatch(MatchBuilder matchBuilder, Long dpidLong, Long inPort) { NodeConnectorId ncid = new NodeConnectorId("openflow:" + dpidLong + ":" + inPort); - logger.debug("createInPortMatch() Node Connector ID is - Type=openflow: DPID={} inPort={} ", dpidLong, inPort); + LOG.debug("createInPortMatch() Node Connector ID is - Type=openflow: DPID={} inPort={} ", dpidLong, inPort); + matchBuilder.setInPort(NodeConnectorId.getDefaultInstance(ncid.getValue())); + matchBuilder.setInPort(ncid); + + return matchBuilder; + } + + public static MatchBuilder createInPortReservedMatch(MatchBuilder matchBuilder, Long dpidLong, String inPort) { + + NodeConnectorId ncid = new NodeConnectorId("openflow:" + dpidLong + ":" + inPort); + LOG.debug("createInPortResrevedMatch() Node Connector ID is - Type=openflow: DPID={} inPort={} ", + dpidLong, inPort); matchBuilder.setInPort(NodeConnectorId.getDefaultInstance(ncid.getValue())); matchBuilder.setInPort(ncid); @@ -116,6 +163,27 @@ public class MatchUtils { return matchBuilder; } + public static MatchBuilder createEthSrcDstMatch(MatchBuilder matchBuilder, MacAddress srcMac, MacAddress dstMac) { + EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder(); + if (srcMac != null) { + EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder(); + ethSourceBuilder.setAddress(new MacAddress(srcMac)); + ethernetMatch.setEthernetSource(ethSourceBuilder.build()); + } + if (dstMac != null) { + EthernetDestinationBuilder ethDestinationBuild = new EthernetDestinationBuilder(); + ethDestinationBuild.setAddress(new MacAddress(dstMac)); + ethernetMatch.setEthernetDestination(ethDestinationBuild.build()); + } + if (matchBuilder.getEthernetMatch() != null && matchBuilder.getEthernetMatch().getEthernetType() != null) { + ethernetMatch.setEthernetType(matchBuilder.getEthernetMatch().getEthernetType()); + } + + matchBuilder.setEthernetMatch(ethernetMatch.build()); + + return matchBuilder; + } + /** * Create Ethernet Source Match * @@ -192,19 +260,13 @@ public class MatchUtils { /** * Match ICMP code and type * - * @param matchBuilder MatchBuilder Object without a match yet + * @param matchBuilder MatchBuilder Object * @param type short representing an ICMP type * @param code short representing an ICMP code * @return matchBuilder Map MatchBuilder Object with a match */ public static MatchBuilder createICMPv4Match(MatchBuilder matchBuilder, short type, short code) { - EthernetMatchBuilder eth = new EthernetMatchBuilder(); - EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder(); - ethTypeBuilder.setType(new EtherType(0x0800L)); - eth.setEthernetType(ethTypeBuilder.build()); - matchBuilder.setEthernetMatch(eth.build()); - // Build the IPv4 Match requied per OVS Syntax IpMatchBuilder ipmatch = new IpMatchBuilder(); ipmatch.setIpProtocol((short) 1); @@ -212,13 +274,43 @@ public class MatchUtils { // Build the ICMPv4 Match Icmpv4MatchBuilder icmpv4match = new Icmpv4MatchBuilder(); - icmpv4match.setIcmpv4Type(type); - icmpv4match.setIcmpv4Code(code); + if (type != ALL_ICMP) { + icmpv4match.setIcmpv4Type(type); + } + if (code != ALL_ICMP) { + icmpv4match.setIcmpv4Code(code); + } matchBuilder.setIcmpv4Match(icmpv4match.build()); return matchBuilder; } + /** + * Match ICMPv6 code and type + * + * @param matchBuilder MatchBuilder Object + * @param type short representing an ICMP type + * @param code short representing an ICMP code + * @return matchBuilder Map MatchBuilder Object with a match + */ + public static MatchBuilder createICMPv6Match(MatchBuilder matchBuilder, short type, short code) { + + // Build the IPv6 Match required per OVS Syntax + IpMatchBuilder ipmatch = new IpMatchBuilder(); + ipmatch.setIpProtocol((short) 58); + matchBuilder.setIpMatch(ipmatch.build()); + + // Build the ICMPv6 Match + Icmpv6MatchBuilder icmpv6match = new Icmpv6MatchBuilder(); + if (type != ALL_ICMP || code != ALL_ICMP) { + icmpv6match.setIcmpv6Type(type); + icmpv6match.setIcmpv6Code(code); + } + matchBuilder.setIcmpv6Match(icmpv6match.build()); + + return matchBuilder; + } + /** * @param matchBuilder MatchBuilder Object without a match yet * @param dstip String containing an IPv4 prefix @@ -241,6 +333,20 @@ public class MatchUtils { } + /** + * @param matchBuilder MatchBuilder Object without a match yet + * @param dstip String containing an IPv4 prefix + * @return matchBuilder Map Object with a match + */ + public static MatchBuilder createArpDstIpv4Match(MatchBuilder matchBuilder, Ipv4Prefix dstip) { + ArpMatchBuilder arpDstMatch = new ArpMatchBuilder(); + arpDstMatch.setArpTargetTransportAddress(dstip) + .setArpOp(FlowUtils.ARP_OP_REQUEST); + matchBuilder.setLayer3Match(arpDstMatch.build()); + + return matchBuilder; + } + /** * @param matchBuilder MatchBuilder Object without a match yet * @param srcip String containing an IPv4 prefix @@ -265,7 +371,7 @@ public class MatchUtils { /** * Create Source TCP Port Match * - * @param matchBuilder @param matchbuilder MatchBuilder Object without a match yet + * @param matchBuilder MatchBuilder Object without a match yet * @param tcpport Integer representing a source TCP port * @return matchBuilder Map MatchBuilder Object with a match */ @@ -322,7 +428,7 @@ public class MatchUtils { * @param tcpPort PortNumber representing a destination TCP port * @param tcpFlag int representing a tcp_flag * @return match containing TCP_Flag (), IP Protocol (TCP), TCP_Flag (SYN) - *
+ *
* Defined TCP Flag values in OVS v2.1+
* TCP_FIN 0x001 / TCP_SYN 0x002 / TCP_RST 0x004
* TCP_PSH 0x008 / TCP_ACK 0x010 / TCP_URG 0x020
@@ -374,8 +480,8 @@ public class MatchUtils {
/**
* Create TCP Port Match
*
- * @param matchBuilder @param matchbuilder MatchBuilder Object without a match yet
- * @param tcpport Integer representing a source TCP port
+ * @param matchBuilder MatchBuilder Object without a match yet
+ * @param ipProtocol Integer representing the IP protocol
* @return matchBuilder Map MatchBuilder Object with a match
*/
public static MatchBuilder createIpProtocolMatch(MatchBuilder matchBuilder, short ipProtocol) {
@@ -400,6 +506,35 @@ public class MatchUtils {
return matchBuilder;
}
+ /**
+ * Create TCP Port Match
+ *
+ * @param matchBuilder MatchBuilder Object without a match yet
+ * @param ipProtocol Integer representing the IP protocol
+ * @return matchBuilder Map MatchBuilder Object with a match
+ */
+ public static MatchBuilder createIpv6ProtocolMatch(MatchBuilder matchBuilder, short ipProtocol) {
+
+ EthernetMatchBuilder ethType = new EthernetMatchBuilder();
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x86DDL));
+ ethType.setEthernetType(ethTypeBuilder.build());
+ matchBuilder.setEthernetMatch(ethType.build());
+
+ IpMatchBuilder ipMmatch = new IpMatchBuilder();
+ if (ipProtocol == TCP_SHORT) {
+ ipMmatch.setIpProtocol(TCP_SHORT);
+ }
+ else if (ipProtocol == UDP_SHORT) {
+ ipMmatch.setIpProtocol(UDP_SHORT);
+ }
+ else if (ipProtocol == ICMP_SHORT) {
+ ipMmatch.setIpProtocol(ICMP_SHORT);
+ }
+ matchBuilder.setIpMatch(ipMmatch.build());
+ return matchBuilder;
+ }
+
/**
* Create tcp syn with proto match.
*
@@ -456,29 +591,70 @@ public class MatchUtils {
*/
public static MatchBuilder createDmacTcpPortWithFlagMatch(MatchBuilder matchBuilder,
String attachedMac, Integer tcpFlag, String tunnelID) {
+ return createDmacTcpPortIpSaWithFlagMatch(matchBuilder, attachedMac, tcpFlag, null, tunnelID);
+ }
+
+ /**
+ * Create dmac ipSa match.
+ *
+ * @param matchBuilder the match builder
+ * @param attachedMac the attached mac
+ * @param ipPrefix the src ipPrefix
+ * @param tunnelID the tunnel iD
+ * @return match containing TCP_Flag (), IP Protocol (TCP), TCP_Flag (SYN), Ip Source Address (IPsa)
+ */
+ public static MatchBuilder createDmacIpSaMatch(
+ MatchBuilder matchBuilder, String attachedMac, Ipv4Prefix ipPrefix, String tunnelID) {
+ return createDmacTcpPortIpSaWithFlagMatch(matchBuilder, attachedMac, null, ipPrefix, tunnelID);
+ }
+
+ /**
+ * Create dmac tcp port ipSa with flag match.
+ *
+ * @param matchBuilder the match builder
+ * @param attachedMac the attached mac
+ * @param tcpFlag the tcp flag
+ * @param ipPrefix the src ipPrefix
+ * @param tunnelID the tunnel iD
+ * @return match containing TCP_Flag (), IP Protocol (TCP), TCP_Flag (SYN), Ip Source Address (IPsa)
+ */
+ public static MatchBuilder createDmacTcpPortIpSaWithFlagMatch(
+ MatchBuilder matchBuilder, String attachedMac, Integer tcpFlag, Ipv4Prefix ipPrefix, String tunnelID) {
EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
ethTypeBuilder.setType(new EtherType(0x0800L));
ethernetMatch.setEthernetType(ethTypeBuilder.build());
- EthernetDestinationBuilder ethDestinationBuilder = new EthernetDestinationBuilder();
- ethDestinationBuilder.setAddress(new MacAddress(attachedMac));
- ethernetMatch.setEthernetDestination(ethDestinationBuilder.build());
- matchBuilder.setEthernetMatch(ethernetMatch.build());
+ if (attachedMac != null) {
+ EthernetDestinationBuilder ethDestinationBuilder = new EthernetDestinationBuilder();
+ ethDestinationBuilder.setAddress(new MacAddress(attachedMac));
+ ethernetMatch.setEthernetDestination(ethDestinationBuilder.build());
+ matchBuilder.setEthernetMatch(ethernetMatch.build());
+ }
- // TCP Protocol Match
- IpMatchBuilder ipMatch = new IpMatchBuilder(); // ipv4 version
- ipMatch.setIpProtocol(TCP_SHORT);
- matchBuilder.setIpMatch(ipMatch.build());
+ if (tcpFlag != null) {
+ // TCP Protocol Match
+ IpMatchBuilder ipMatch = new IpMatchBuilder(); // ipv4 version
+ ipMatch.setIpProtocol(TCP_SHORT);
+ matchBuilder.setIpMatch(ipMatch.build());
- TcpFlagMatchBuilder tcpFlagMatch = new TcpFlagMatchBuilder();
- tcpFlagMatch.setTcpFlag(tcpFlag);
- matchBuilder.setTcpFlagMatch(tcpFlagMatch.build());
+ TcpFlagMatchBuilder tcpFlagMatch = new TcpFlagMatchBuilder();
+ tcpFlagMatch.setTcpFlag(tcpFlag);
+ matchBuilder.setTcpFlagMatch(tcpFlagMatch.build());
+ }
- TunnelBuilder tunnelBuilder = new TunnelBuilder();
- tunnelBuilder.setTunnelId(new BigInteger(tunnelID));
- matchBuilder.setTunnel(tunnelBuilder.build());
+ if (tunnelID != null) {
+ TunnelBuilder tunnelBuilder = new TunnelBuilder();
+ tunnelBuilder.setTunnelId(new BigInteger(tunnelID));
+ matchBuilder.setTunnel(tunnelBuilder.build());
+ }
+
+ if (ipPrefix != null) {
+ Ipv4MatchBuilder ipv4match = new Ipv4MatchBuilder();
+ ipv4match.setIpv4Source(ipPrefix);
+ matchBuilder.setLayer3Match(ipv4match.build());
+ }
return matchBuilder;
}
@@ -838,6 +1014,448 @@ public class MatchUtils {
return matchBuilder;
}
+ /**
+ * Create a DHCP match with port provided.
+ *
+ * @param matchBuilder the match builder
+ * @param srcPort the source port
+ * @param dstPort the destination port
+ * @return the DHCP match
+ */
+ public static MatchBuilder createDhcpMatch(MatchBuilder matchBuilder,
+ int srcPort, int dstPort) {
+
+ EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x0800L));
+ ethernetMatch.setEthernetType(ethTypeBuilder.build());
+ matchBuilder.setEthernetMatch(ethernetMatch.build());
+
+ IpMatchBuilder ipmatch = new IpMatchBuilder();
+ ipmatch.setIpProtocol(UDP_SHORT);
+ matchBuilder.setIpMatch(ipmatch.build());
+
+ UdpMatchBuilder udpmatch = new UdpMatchBuilder();
+ udpmatch.setUdpSourcePort(new PortNumber(srcPort));
+ udpmatch.setUdpDestinationPort(new PortNumber(dstPort));
+ matchBuilder.setLayer4Match(udpmatch.build());
+
+ return matchBuilder;
+
+ }
+
+ /**
+ * Create a DHCP match with port provided.
+ *
+ * @param matchBuilder the match builder
+ * @param srcPort the source port
+ * @param dstPort the destination port
+ * @return the DHCP match
+ */
+ public static MatchBuilder createDhcpv6Match(MatchBuilder matchBuilder,
+ int srcPort, int dstPort) {
+
+ EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x86DDL));
+ ethernetMatch.setEthernetType(ethTypeBuilder.build());
+ matchBuilder.setEthernetMatch(ethernetMatch.build());
+
+ IpMatchBuilder ipmatch = new IpMatchBuilder();
+ ipmatch.setIpProtocol(UDP_SHORT);
+ matchBuilder.setIpMatch(ipmatch.build());
+
+ UdpMatchBuilder udpmatch = new UdpMatchBuilder();
+ udpmatch.setUdpSourcePort(new PortNumber(srcPort));
+ udpmatch.setUdpDestinationPort(new PortNumber(dstPort));
+ matchBuilder.setLayer4Match(udpmatch.build());
+
+ return matchBuilder;
+
+ }
+
+ /**
+ * Creates DHCP server packet match with DHCP mac address and port.
+ *
+ * @param matchBuilder the matchbuilder
+ * @param dhcpServerMac MAc address of the DHCP server of the subnet
+ * @param srcPort the source port
+ * @param dstPort the destination port
+ * @return the DHCP server match
+ */
+ public static MatchBuilder createDhcpServerMatch(MatchBuilder matchBuilder, String dhcpServerMac, int srcPort,
+ int dstPort) {
+
+ EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x0800L));
+ ethernetMatch.setEthernetType(ethTypeBuilder.build());
+ matchBuilder.setEthernetMatch(ethernetMatch.build());
+
+ EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder();
+ ethSourceBuilder.setAddress(new MacAddress(dhcpServerMac));
+ ethernetMatch.setEthernetSource(ethSourceBuilder.build());
+ matchBuilder.setEthernetMatch(ethernetMatch.build());
+
+ IpMatchBuilder ipmatch = new IpMatchBuilder();
+ ipmatch.setIpProtocol(UDP_SHORT);
+ matchBuilder.setIpMatch(ipmatch.build());
+
+ UdpMatchBuilder udpmatch = new UdpMatchBuilder();
+ udpmatch.setUdpSourcePort(new PortNumber(srcPort));
+ udpmatch.setUdpDestinationPort(new PortNumber(dstPort));
+ matchBuilder.setLayer4Match(udpmatch.build());
+
+ return matchBuilder;
+
+ }
+
+ /**
+ * Creates DHCPv6 server packet match with DHCP mac address and port.
+ *
+ * @param matchBuilder the matchbuilder
+ * @param dhcpServerMac MAc address of the DHCP server of the subnet
+ * @param srcPort the source port
+ * @param dstPort the destination port
+ * @return the DHCP server match
+ */
+ public static MatchBuilder createDhcpv6ServerMatch(MatchBuilder matchBuilder, String dhcpServerMac, int srcPort,
+ int dstPort) {
+
+ EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x86DDL));
+ ethernetMatch.setEthernetType(ethTypeBuilder.build());
+ matchBuilder.setEthernetMatch(ethernetMatch.build());
+
+ EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder();
+ ethSourceBuilder.setAddress(new MacAddress(dhcpServerMac));
+ ethernetMatch.setEthernetSource(ethSourceBuilder.build());
+ matchBuilder.setEthernetMatch(ethernetMatch.build());
+
+ IpMatchBuilder ipmatch = new IpMatchBuilder();
+ ipmatch.setIpProtocol(UDP_SHORT);
+ matchBuilder.setIpMatch(ipmatch.build());
+
+ UdpMatchBuilder udpmatch = new UdpMatchBuilder();
+ udpmatch.setUdpSourcePort(new PortNumber(srcPort));
+ udpmatch.setUdpDestinationPort(new PortNumber(dstPort));
+ matchBuilder.setLayer4Match(udpmatch.build());
+
+ return matchBuilder;
+
+ }
+
+ /**
+ * Creates a Match with src ip address mac address set.
+ * @param matchBuilder MatchBuilder Object
+ * @param srcip String containing an IPv4 prefix
+ * @param srcMac The source macAddress
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder createSrcL3Ipv4MatchWithMac(MatchBuilder matchBuilder, Ipv4Prefix srcip, MacAddress srcMac) {
+
+ Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
+ ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix(srcip));
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x0800L));
+ EthernetMatchBuilder eth = new EthernetMatchBuilder();
+ eth.setEthernetType(ethTypeBuilder.build());
+ eth.setEthernetSource(new EthernetSourceBuilder()
+ .setAddress(srcMac)
+ .build());
+
+ matchBuilder.setLayer3Match(ipv4MatchBuilder.build());
+ matchBuilder.setEthernetMatch(eth.build());
+ return matchBuilder;
+
+ }
+
+ /**
+ * Creates a Match with src ip address mac address set.
+ * @param matchBuilder MatchBuilder Object
+ * @param srcip String containing an IPv6 prefix
+ * @param srcMac The source macAddress
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder createSrcL3Ipv6MatchWithMac(MatchBuilder matchBuilder, Ipv6Prefix srcip, MacAddress srcMac) {
+
+ Ipv6MatchBuilder ipv6MatchBuilder = new Ipv6MatchBuilder();
+ ipv6MatchBuilder.setIpv6Source(new Ipv6Prefix(srcip));
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x86DDL));
+ EthernetMatchBuilder eth = new EthernetMatchBuilder();
+ eth.setEthernetType(ethTypeBuilder.build());
+ eth.setEthernetSource(new EthernetSourceBuilder()
+ .setAddress(srcMac)
+ .build());
+
+ matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
+ matchBuilder.setEthernetMatch(eth.build());
+ return matchBuilder;
+
+ }
+
+ /**
+ * Creates a ether net match with ether type set to 0x0800L.
+ * @param matchBuilder MatchBuilder Object
+ * @param srcMac The source macAddress
+ * @param dstMac The destination mac address
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder createV4EtherMatchWithType(MatchBuilder matchBuilder,String srcMac, String dstMac)
+ {
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x0800L));
+ EthernetMatchBuilder eth = new EthernetMatchBuilder();
+ eth.setEthernetType(ethTypeBuilder.build());
+ if (null != srcMac) {
+ eth.setEthernetSource(new EthernetSourceBuilder()
+ .setAddress(new MacAddress(srcMac)).build());
+ }
+ if (null != dstMac) {
+ eth.setEthernetDestination(new EthernetDestinationBuilder()
+ .setAddress(new MacAddress(dstMac)).build());
+ }
+ matchBuilder.setEthernetMatch(eth.build());
+ return matchBuilder;
+ }
+
+ /**
+ * Creates a ether net match with ether type set to 0x86DDL.
+ * @param matchBuilder MatchBuilder Object
+ * @param srcMac The source macAddress
+ * @param dstMac The destination mac address
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder createV6EtherMatchWithType(MatchBuilder matchBuilder,String srcMac, String dstMac)
+ {
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x86DDL));
+ EthernetMatchBuilder eth = new EthernetMatchBuilder();
+ eth.setEthernetType(ethTypeBuilder.build());
+ if (null != srcMac) {
+ eth.setEthernetSource(new EthernetSourceBuilder()
+ .setAddress(new MacAddress(srcMac)).build());
+ }
+ if (null != dstMac) {
+ eth.setEthernetDestination(new EthernetDestinationBuilder()
+ .setAddress(new MacAddress(dstMac)).build());
+ }
+ matchBuilder.setEthernetMatch(eth.build());
+ return matchBuilder;
+ }
+
+ /**
+ * Adds remote Ip prefix to existing match.
+ * @param matchBuilder The match builder
+ * @param sourceIpPrefix The source IP prefix
+ * @param destIpPrefix The destination IP prefix
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder addRemoteIpPrefix(MatchBuilder matchBuilder,
+ Ipv4Prefix sourceIpPrefix,Ipv4Prefix destIpPrefix) {
+ Ipv4MatchBuilder ipv4match = new Ipv4MatchBuilder();
+ if (null != sourceIpPrefix) {
+ ipv4match.setIpv4Source(sourceIpPrefix);
+ }
+ if (null != destIpPrefix) {
+ ipv4match.setIpv4Destination(destIpPrefix);
+ }
+ matchBuilder.setLayer3Match(ipv4match.build());
+
+ return matchBuilder;
+ }
+
+ /**
+ * Adds remote Ipv6 prefix to existing match.
+ * @param matchBuilder The match builder
+ * @param sourceIpPrefix The source IP prefix
+ * @param destIpPrefix The destination IP prefix
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder addRemoteIpv6Prefix(MatchBuilder matchBuilder,
+ Ipv6Prefix sourceIpPrefix,Ipv6Prefix destIpPrefix) {
+ Ipv6MatchBuilder ipv6match = new Ipv6MatchBuilder();
+ if (null != sourceIpPrefix) {
+ ipv6match.setIpv6Source(sourceIpPrefix);
+ }
+ if (null != destIpPrefix) {
+ ipv6match.setIpv6Destination(destIpPrefix);
+ }
+ matchBuilder.setLayer3Match(ipv6match.build());
+
+ return matchBuilder;
+ }
+
+ /**
+ * Add a DSCP match to an existing match
+ * @param matchBuilder Map matchBuilder MatchBuilder Object with a match
+ * @param dscpValue
+ * @return {@link MatchBuilder}
+ */
+ public static MatchBuilder addDscp(MatchBuilder matchBuilder, short dscpValue) {
+ createEtherTypeMatch(matchBuilder, new EtherType(ETHERTYPE_IPV4));
+ return matchBuilder.setIpMatch(
+ new IpMatchBuilder()
+ .setIpDscp(new Dscp(dscpValue))
+ .build());
+ }
+
+ /**
+ * Add a layer4 match to an existing match
+ *
+ * @param matchBuilder Map matchBuilder MatchBuilder Object with a match
+ * @param protocol The layer4 protocol
+ * @param srcPort The src port
+ * @param destPort The destination port
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder addLayer4Match(MatchBuilder matchBuilder,
+ int protocol, int srcPort, int destPort) {
+ IpMatchBuilder ipmatch = new IpMatchBuilder();
+ if (TCP_SHORT == protocol) {
+ ipmatch.setIpProtocol(TCP_SHORT);
+ TcpMatchBuilder tcpmatch = new TcpMatchBuilder();
+ if (0 != srcPort) {
+ tcpmatch.setTcpSourcePort(new PortNumber(srcPort));
+ }
+ if (0 != destPort) {
+ tcpmatch.setTcpDestinationPort(new PortNumber(destPort));
+ }
+ matchBuilder.setLayer4Match(tcpmatch.build());
+ } else if (UDP_SHORT == protocol) {
+ ipmatch.setIpProtocol(UDP_SHORT);
+ UdpMatchBuilder udpMatch = new UdpMatchBuilder();
+ if (0 != srcPort) {
+ udpMatch.setUdpSourcePort(new PortNumber(srcPort));
+ }
+ if (0 != destPort) {
+ udpMatch.setUdpDestinationPort(new PortNumber(destPort));
+ }
+ matchBuilder.setLayer4Match(udpMatch.build());
+ } else if (SCTP_SHORT == protocol) {
+ ipmatch.setIpProtocol(SCTP_SHORT);
+ SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
+ if (0 != srcPort) {
+ sctpMatchBuilder.setSctpSourcePort(new PortNumber(srcPort));
+ }
+ if (0 != destPort) {
+ sctpMatchBuilder.setSctpDestinationPort(new PortNumber(destPort));
+ }
+ matchBuilder.setLayer4Match(sctpMatchBuilder.build());
+ }
+ matchBuilder.setIpMatch(ipmatch.build());
+
+ return matchBuilder;
+ }
+
+ /**
+ * Add a layer4 match to an existing match with mask
+ *
+ * @param matchBuilder Map matchBuilder MatchBuilder Object with a match.
+ * @param protocol The layer4 protocol
+ * @param srcPort The src port
+ * @param destPort The destination port
+ * @param mask the mask for the port
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder addLayer4MatchWithMask(MatchBuilder matchBuilder,
+ int protocol, int srcPort, int destPort,int mask) {
+
+ IpMatchBuilder ipmatch = new IpMatchBuilder();
+
+ NxAugMatchNodesNodeTableFlow nxAugMatch = null;
+ GeneralAugMatchNodesNodeTableFlow genAugMatch = null;
+ if (protocol == TCP_SHORT) {
+ ipmatch.setIpProtocol(TCP_SHORT);
+ if (0 != srcPort) {
+ NxmOfTcpSrcBuilder tcpSrc = new NxmOfTcpSrcBuilder();
+ tcpSrc.setPort(new PortNumber(srcPort));
+ tcpSrc.setMask(mask);
+ nxAugMatch = new NxAugMatchNodesNodeTableFlowBuilder().setNxmOfTcpSrc(tcpSrc.build()).build();
+ genAugMatch = new GeneralAugMatchNodesNodeTableFlowBuilder()
+ .setExtensionList(ImmutableList.of(new ExtensionListBuilder().setExtensionKey(NxmOfTcpSrcKey.class)
+ .setExtension(new ExtensionBuilder()
+ .addAugmentation(NxAugMatchNodesNodeTableFlow.class, nxAugMatch)
+ .build()).build())).build();
+ } else if (0 != destPort) {
+ NxmOfTcpDstBuilder tcpDst = new NxmOfTcpDstBuilder();
+ tcpDst.setPort(new PortNumber(destPort));
+ tcpDst.setMask(mask);
+ nxAugMatch = new NxAugMatchNodesNodeTableFlowBuilder()
+ .setNxmOfTcpDst(tcpDst.build())
+ .build();
+ genAugMatch = new GeneralAugMatchNodesNodeTableFlowBuilder()
+ .setExtensionList(ImmutableList.of(new ExtensionListBuilder().setExtensionKey(NxmOfTcpDstKey.class)
+ .setExtension(new ExtensionBuilder()
+ .addAugmentation(NxAugMatchNodesNodeTableFlow.class, nxAugMatch)
+ .build()).build())).build();
+ }
+
+ } else if (UDP_SHORT == protocol) {
+ ipmatch.setIpProtocol(UDP_SHORT);
+ UdpMatchBuilder udpMatch = new UdpMatchBuilder();
+ if (0 != srcPort) {
+ NxmOfUdpSrcBuilder udpSrc = new NxmOfUdpSrcBuilder();
+ udpSrc.setPort(new PortNumber(srcPort));
+ udpSrc.setMask(mask);
+ nxAugMatch = new NxAugMatchNodesNodeTableFlowBuilder().setNxmOfUdpSrc(udpSrc.build()).build();
+ genAugMatch = new GeneralAugMatchNodesNodeTableFlowBuilder()
+ .setExtensionList(ImmutableList.of(new ExtensionListBuilder().setExtensionKey(NxmOfUdpSrcKey.class)
+ .setExtension(new ExtensionBuilder()
+ .addAugmentation(NxAugMatchNodesNodeTableFlow.class, nxAugMatch)
+ .build()).build())).build();
+ } else if (0 != destPort) {
+ NxmOfUdpDstBuilder udpDst = new NxmOfUdpDstBuilder();
+ udpDst.setPort(new PortNumber(destPort));
+ udpDst.setMask(mask);
+ nxAugMatch = new NxAugMatchNodesNodeTableFlowBuilder()
+ .setNxmOfUdpDst(udpDst.build())
+ .build();
+ genAugMatch = new GeneralAugMatchNodesNodeTableFlowBuilder()
+ .setExtensionList(ImmutableList.of(new ExtensionListBuilder().setExtensionKey(NxmOfUdpDstKey.class)
+ .setExtension(new ExtensionBuilder()
+ .addAugmentation(NxAugMatchNodesNodeTableFlow.class, nxAugMatch)
+ .build()).build())).build();
+ }
+ }
+ matchBuilder.setIpMatch(ipmatch.build());
+ matchBuilder.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, genAugMatch);
+ return matchBuilder;
+ }
+
+ public static MatchBuilder addCtState(MatchBuilder matchBuilder,int ct_state, int mask) {
+ NxmNxCtStateBuilder ctStateBuilder = new NxmNxCtStateBuilder();
+ ctStateBuilder.setCtState((long)ct_state);
+ ctStateBuilder.setMask((long)mask);
+ NxAugMatchNodesNodeTableFlow nxAugMatch = new NxAugMatchNodesNodeTableFlowBuilder()
+ .setNxmNxCtState(ctStateBuilder.build())
+ .build();
+ GeneralAugMatchNodesNodeTableFlow genAugMatch = new GeneralAugMatchNodesNodeTableFlowBuilder()
+ .setExtensionList(ImmutableList.of(new ExtensionListBuilder().setExtensionKey(NxmNxCtStateKey.class)
+ .setExtension(new ExtensionBuilder()
+ .addAugmentation(NxAugMatchNodesNodeTableFlow.class, nxAugMatch)
+ .build()).build())).build();
+ matchBuilder.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, genAugMatch);
+ return matchBuilder;
+ }
+
+ public static MatchBuilder addCtZone(MatchBuilder matchBuilder,int ct_zone) {
+ NxmNxCtZoneBuilder ctZoneBuilder = new NxmNxCtZoneBuilder();
+ ctZoneBuilder.setCtZone(ct_zone);
+ NxAugMatchNodesNodeTableFlow nxAugMatch = new NxAugMatchNodesNodeTableFlowBuilder()
+ .setNxmNxCtZone(ctZoneBuilder.build())
+ .build();
+ GeneralAugMatchNodesNodeTableFlow genAugMatch = new GeneralAugMatchNodesNodeTableFlowBuilder()
+ .setExtensionList(ImmutableList.of(new ExtensionListBuilder().setExtensionKey(NxmNxCtZoneKey.class)
+ .setExtension(new ExtensionBuilder()
+ .addAugmentation(NxAugMatchNodesNodeTableFlow.class, nxAugMatch)
+ .build()).build())).build();
+ matchBuilder.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, genAugMatch);
+ return matchBuilder;
+ }
+
public static class RegMatch {
final Class extends NxmNxReg> reg;
final Long value;
@@ -851,9 +1469,8 @@ public class MatchUtils {
}
}
- public static void addNxRegMatch(MatchBuilder match,
- RegMatch... matches) {
- ArrayList