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=7078486a92553a1d5a018a1fdc33c61cfc00c3c9;hb=05213e174213ea961e0ca2e5a330078c587a9d65;hp=5eda399db8f795a4ad5d85e874134dac42569389;hpb=29402767d9136ed34e712d53ad21586e4ae3f4a7;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 5eda399db..7078486a9 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,17 +1,18 @@ /* - * 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.Ipv4Prefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber; @@ -44,6 +45,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; @@ -52,6 +54,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; @@ -61,12 +65,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; @@ -74,13 +89,15 @@ 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 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 short ALL_ICMP = -1; /** * Create Ingress Port Match dpidLong, inPort @@ -93,7 +110,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); @@ -194,19 +222,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); @@ -214,8 +236,12 @@ 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; @@ -250,7 +276,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; @@ -895,14 +922,15 @@ public class MatchUtils { } /** - * Create a DHCP match with pot provided + * Create a DHCP match with pot 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) { + public static MatchBuilder createDhcpMatch(MatchBuilder matchBuilder, + int srcPort, int dstPort) { EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder(); EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder(); @@ -932,7 +960,7 @@ public class MatchUtils { * @param dstPort the destination port * @return the DHCP server match */ - public static MatchBuilder createDHCPServerMatch(MatchBuilder matchBuilder, String dhcpServerMac, int srcPort, + public static MatchBuilder createDhcpServerMatch(MatchBuilder matchBuilder, String dhcpServerMac, int srcPort, int dstPort) { EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder(); @@ -960,12 +988,13 @@ public class MatchUtils { } /** + * 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) { + public static MatchBuilder createSrcL3Ipv4MatchWithMac(MatchBuilder matchBuilder, Ipv4Prefix srcip, MacAddress srcMac) { Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder(); ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix(srcip)); @@ -983,6 +1012,194 @@ public class MatchUtils { } + /** + * 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 createEtherMatchWithType(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; + } + /** + * 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; + } + /** + * 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()); + } + 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; @@ -996,9 +1213,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)) { @@ -1020,67 +1236,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(); @@ -1090,16 +1307,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, @@ -1134,6 +1351,57 @@ public class MatchUtils { return new Ipv4Prefix(ipv4AddressString + "/32"); } + /** + * 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 *