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=dd7222080a038e32243008a9970afb0902104088;hpb=f183e9857b3a53645b2c463204a4f6945bb10cdb;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 dd7222080..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 @@ -10,9 +10,13 @@ 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; @@ -25,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; @@ -32,6 +37,8 @@ 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; @@ -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.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; @@ -77,10 +98,15 @@ public class MatchUtils { 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 @@ -100,6 +126,17 @@ public class MatchUtils { 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); + + return matchBuilder; + } + /** * Create EtherType Match * @@ -118,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 * @@ -208,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 @@ -244,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; @@ -409,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. * @@ -889,7 +1007,7 @@ public class MatchUtils { } /** - * Create a DHCP match with pot provided. + * Create a DHCP match with port provided. * * @param matchBuilder the match builder * @param srcPort the source port @@ -918,6 +1036,36 @@ public class MatchUtils { } + /** + * 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. * @@ -954,6 +1102,42 @@ public class MatchUtils { } + /** + * 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 @@ -979,6 +1163,31 @@ public class MatchUtils { } + /** + * 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 @@ -986,7 +1195,7 @@ public class MatchUtils { * @param dstMac The destination mac address * @return matchBuilder Map Object with a match */ - public static MatchBuilder createEtherMatchWithType(MatchBuilder matchBuilder,String srcMac, String dstMac) + public static MatchBuilder createV4EtherMatchWithType(MatchBuilder matchBuilder,String srcMac, String dstMac) { EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder(); ethTypeBuilder.setType(new EtherType(0x0800L)); @@ -1003,6 +1212,32 @@ public class MatchUtils { 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 @@ -1023,10 +1258,46 @@ public class MatchUtils { 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 without a 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 @@ -1055,12 +1326,127 @@ public class MatchUtils { 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; @@ -1075,8 +1461,7 @@ public class MatchUtils { } } - public static void addNxRegMatch(MatchBuilder match, - RegMatch... matches) { + public static MatchBuilder addNxRegMatch(MatchBuilder matchBuilder, RegMatch... matches) { List extensions = new ArrayList<>(); for (RegMatch rm : matches) { Class key; @@ -1099,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(); - match.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, m); + GeneralAugMatchNodesNodeTableFlow m = new GeneralAugMatchNodesNodeTableFlowBuilder() + .setExtensionList(extensions) + .build(); + matchBuilder.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, m); + return matchBuilder; } - public static void addNxTunIdMatch(MatchBuilder match, - int tunId) { - NxAugMatchNodesNodeTableFlow am = - new NxAugMatchNodesNodeTableFlowBuilder() - .setNxmNxTunId(new NxmNxTunIdBuilder() - .setValue(BigInteger.valueOf(tunId)) - .build()) - .build(); + 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(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.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNodesNodeTableFlow am = - new org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.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.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNodesNodeTableFlow am = - new org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.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.openflowplugin.extension.nicira.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(); @@ -1169,16 +1555,16 @@ public class MatchUtils { } extensions.add(new ExtensionListBuilder() - .setExtensionKey(extensionKey) - .setExtension(new ExtensionBuilder() - .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.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, @@ -1213,6 +1599,67 @@ public class MatchUtils { 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 *