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=97d381f9abbf219e29e7f318f5b91fabed5ae408;hb=e0bf1166f4ad2515859ab43080a28115975a2cf5;hp=c35651c1f56ed838e623a0538962f5f6d3dae54a;hpb=3d32406fbd02fb43f0a077365f60b578abdc75f7;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 c35651c1f..97d381f9a 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,6 +29,7 @@ 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; @@ -33,7 +37,10 @@ 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.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; @@ -43,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; @@ -51,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; @@ -60,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; @@ -73,13 +94,19 @@ 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; /** * Create Ingress Port Match dpidLong, inPort @@ -92,7 +119,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); @@ -117,6 +155,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 * @@ -193,19 +252,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); @@ -213,13 +266,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 @@ -249,7 +332,8 @@ public class MatchUtils { */ public static MatchBuilder createArpDstIpv4Match(MatchBuilder matchBuilder, Ipv4Prefix dstip) { ArpMatchBuilder arpDstMatch = new ArpMatchBuilder(); - arpDstMatch.setArpTargetTransportAddress(dstip); + arpDstMatch.setArpTargetTransportAddress(dstip) + .setArpOp(FlowUtils.ARP_OP_REQUEST); matchBuilder.setLayer3Match(arpDstMatch.build()); return matchBuilder; @@ -279,7 +363,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 */ @@ -336,7 +420,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 @@ -388,8 +472,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) { @@ -414,6 +498,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. * @@ -470,29 +583,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; } @@ -852,6 +1006,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 reg; final Long value; @@ -865,9 +1461,8 @@ public class MatchUtils { } } - public static void addNxRegMatch(MatchBuilder match, - RegMatch... matches) { - ArrayList extensions = new ArrayList<>(); + public static MatchBuilder addNxRegMatch(MatchBuilder matchBuilder, RegMatch... matches) { + List extensions = new ArrayList<>(); for (RegMatch rm : matches) { Class key; if (NxmNxReg0.class.equals(rm.reg)) { @@ -889,67 +1484,68 @@ public class MatchUtils { } NxAugMatchNodesNodeTableFlow am = new NxAugMatchNodesNodeTableFlowBuilder() - .setNxmNxReg(new NxmNxRegBuilder() - .setReg(rm.reg) - .setValue(rm.value) - .build()) - .build(); + .setNxmNxReg(new NxmNxRegBuilder() + .setReg(rm.reg) + .setValue(rm.value) + .build()) + .build(); extensions.add(new ExtensionListBuilder() - .setExtensionKey(key) - .setExtension(new ExtensionBuilder() - .addAugmentation(NxAugMatchNodesNodeTableFlow.class, am) - .build()) - .build()); + .setExtensionKey(key) + .setExtension(new ExtensionBuilder() + .addAugmentation(NxAugMatchNodesNodeTableFlow.class, am) + .build()) + .build()); } + GeneralAugMatchNodesNodeTableFlow m = new GeneralAugMatchNodesNodeTableFlowBuilder() + .setExtensionList(extensions) + .build(); + matchBuilder.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, m); + return matchBuilder; + } + + public static MatchBuilder addNxTunIdMatch(MatchBuilder matchBuilder, int tunId) { + NxAugMatchNodesNodeTableFlow am = new NxAugMatchNodesNodeTableFlowBuilder() + .setNxmNxTunId(new NxmNxTunIdBuilder() + .setValue(BigInteger.valueOf(tunId)) + .build()) + .build(); GeneralAugMatchNodesNodeTableFlow m = new GeneralAugMatchNodesNodeTableFlowBuilder() - .setExtensionList(extensions) - .build(); - match.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, m); - } - - public static void addNxTunIdMatch(MatchBuilder match, - int tunId) { - NxAugMatchNodesNodeTableFlow am = - new NxAugMatchNodesNodeTableFlowBuilder() - .setNxmNxTunId(new NxmNxTunIdBuilder() - .setValue(BigInteger.valueOf(tunId)) - .build()) - .build(); - GeneralAugMatchNodesNodeTableFlow m = - new GeneralAugMatchNodesNodeTableFlowBuilder() - .setExtensionList(ImmutableList.of(new ExtensionListBuilder() - .setExtensionKey(NxmNxTunIdKey.class) - .setExtension(new ExtensionBuilder() - .addAugmentation(NxAugMatchNodesNodeTableFlow.class, am) - .build()) - .build())) - .build(); - match.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, m); + .setExtensionList(ImmutableList.of(new ExtensionListBuilder() + .setExtensionKey(NxmNxTunIdKey.class) + .setExtension(new ExtensionBuilder() + .addAugmentation(NxAugMatchNodesNodeTableFlow.class, am) + .build()) + .build())) + .build(); + matchBuilder.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, m); + return matchBuilder; } - public static void addNxNsp(MatchBuilder match, long nsp) { - org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchNodesNodeTableFlow am = - new org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchNodesNodeTableFlowBuilder() + public static MatchBuilder addNxNspMatch(MatchBuilder matchBuilder, long nsp) { + NxAugMatchNodesNodeTableFlow am = new NxAugMatchNodesNodeTableFlowBuilder() .setNxmNxNsp(new NxmNxNspBuilder() - .setValue(nsp) - .build()) + .setValue(nsp) + .build()) .build(); - addExtension(match, NxmNxNspKey.class, am); + addExtension(matchBuilder, NxmNxNspKey.class, am); + return matchBuilder; } - public static void addNxNsi(MatchBuilder match, short nsi) { - org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchNodesNodeTableFlow am = - new org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchNodesNodeTableFlowBuilder() + public static MatchBuilder addNxNsiMatch(MatchBuilder matchBuilder, short nsi) { + NxAugMatchNodesNodeTableFlow am = new NxAugMatchNodesNodeTableFlowBuilder() .setNxmNxNsi(new NxmNxNsiBuilder() - .setNsi(nsi) - .build()) + .setNsi(nsi) + .build()) .build(); - addExtension(match, NxmNxNsiKey.class, am); + addExtension(matchBuilder, NxmNxNsiKey.class, am); + return matchBuilder; } - private static void addExtension (MatchBuilder match, Class extensionKey, org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchNodesNodeTableFlow am) { - GeneralAugMatchNodesNodeTableFlow existingAugmentations = match.getAugmentation(GeneralAugMatchNodesNodeTableFlow.class); + private static void addExtension(MatchBuilder matchBuilder, Class extensionKey, + NxAugMatchNodesNodeTableFlow am) { + GeneralAugMatchNodesNodeTableFlow existingAugmentations = + matchBuilder.getAugmentation(GeneralAugMatchNodesNodeTableFlow.class); List extensions = null; if (existingAugmentations != null ) { extensions = existingAugmentations.getExtensionList(); @@ -959,34 +1555,124 @@ public class MatchUtils { } extensions.add(new ExtensionListBuilder() - .setExtensionKey(extensionKey) - .setExtension(new ExtensionBuilder() - .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.match.rev140714.NxAugMatchNodesNodeTableFlow.class, am) - .build()) - .build()); + .setExtensionKey(extensionKey) + .setExtension(new ExtensionBuilder() + .addAugmentation(NxAugMatchNodesNodeTableFlow.class, am) + .build()) + .build()); GeneralAugMatchNodesNodeTableFlow m = new GeneralAugMatchNodesNodeTableFlowBuilder() - .setExtensionList(extensions) - .build(); - match.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, m); + .setExtensionList(extensions) + .build(); + matchBuilder.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, m); } public static EthernetMatch ethernetMatch(MacAddress srcMac, MacAddress dstMac, Long etherType) { EthernetMatchBuilder emb = new EthernetMatchBuilder(); - if (srcMac != null) + if (srcMac != null) { emb.setEthernetSource(new EthernetSourceBuilder() .setAddress(srcMac) .build()); - if (dstMac != null) + } + if (dstMac != null) { emb.setEthernetDestination(new EthernetDestinationBuilder() .setAddress(dstMac) .build()); - if (etherType != null) + } + if (etherType != null) { emb.setEthernetType(new EthernetTypeBuilder() .setType(new EtherType(etherType)) .build()); + } return emb.build(); } + + /** + * Create ipv4 prefix from ipv4 address, by appending /32 mask + * + * @param ipv4AddressString the ip address, in string format + * @return Ipv4Prefix with ipv4Address and /32 mask + */ + public static Ipv4Prefix iPv4PrefixFromIPv4Address(String ipv4AddressString) { + return new Ipv4Prefix(ipv4AddressString + "/32"); + } + + /** + * Create ipv6 prefix from ipv6 address, by appending /128 mask + * + * @param ipv6AddressString the ip address, in string format + * @return Ipv6Prefix with ipv6Address and /128 mask + */ + public static Ipv6Prefix iPv6PrefixFromIPv6Address(String ipv6AddressString) { + return new Ipv6Prefix(ipv6AddressString + "/128"); + } + + /** + * Converts port range into a set of masked port ranges. + * + * @param portMin the strating port of the range. + * @param portMax the ending port of the range. + * @return the map contianing the port no and their mask. + * + */ + public static Map getLayer4MaskForRange(int portMin, int portMax) { + int [] offset = {32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1}; + int[] mask = {0x8000,0xC000,0xE000,0xF000,0xF800,0xFC00,0xFE00,0xFF00, + 0xFF80,0xFFC0,0xFFE0,0xFFF0,0xFFF8,0xFFFC,0xFFFE,0xFFFF}; + int noOfPorts = portMax - portMin + 1; + String binaryNoOfPorts = Integer.toBinaryString(noOfPorts); + int medianOffset = 16 - binaryNoOfPorts.length(); + int medianLength = offset[medianOffset]; + int median = 0; + for (int tempMedian = 0;tempMedian < portMax;) { + tempMedian = medianLength + tempMedian; + if (portMin < tempMedian) { + median = tempMedian; + break; + } + } + Map portMap = new HashMap(); + int tempMedian = 0; + int currentMedain = median; + for (int tempMedianOffset = medianOffset;16 > tempMedianOffset;tempMedianOffset++) { + tempMedian = currentMedain - offset[tempMedianOffset]; + if (portMin <= tempMedian) { + for (;portMin <= tempMedian;) { + portMap.put(tempMedian, mask[tempMedianOffset]); + currentMedain = tempMedian; + tempMedian = tempMedian - offset[tempMedianOffset]; + } + } + } + currentMedain = median; + for (int tempMedianOffset = medianOffset;16 > tempMedianOffset;tempMedianOffset++) { + tempMedian = currentMedain + offset[tempMedianOffset]; + if (portMax >= tempMedian - 1) { + for (;portMax >= tempMedian - 1;) { + portMap.put(currentMedain, mask[tempMedianOffset]); + currentMedain = tempMedian; + tempMedian = tempMedian + offset[tempMedianOffset]; + } + } + } + return portMap; + } + + /** + * Return Long that represents OF port for strings where OF is explicitly provided + * + * @param ofPortIdentifier the string with encoded OF port (example format "OFPort|999") + * @return the OFport or null + */ + public static Long parseExplicitOFPort(String ofPortIdentifier) { + if (ofPortIdentifier != null) { + String[] pair = ofPortIdentifier.split("\\|"); + if ((pair.length > 1) && (pair[0].equalsIgnoreCase("OFPort"))) { + return new Long(pair[1]); + } + } + return null; + } }