From 5792fa1ecccf63cef4587d818d99d35018e7e2cf Mon Sep 17 00:00:00 2001 From: Sai MarapaReddy Date: Fri, 18 Mar 2016 23:36:20 -0700 Subject: [PATCH] Bug-5562 - Ipv4 L3-ArbitraryMask patch Current code expects the Arbitrary Mask to be normalized from switch. Example:- 3.3.3.3/255.0.255.0 to 3.0.3.0/255.0.255.0 Not all switches normalizes arbitrary bit mask in the flows when they are injected. Example:- 3.3.3.3/255.0.255.0 to 3.3.3.3/255.0.255.0 This patch ensures that the operational data store is in congruent with the flows that are shown on the switch. Patch is built on checking the mask & comparing the normalized stores & stats flows which ensures Ipv4 L3-ArbitraryMask works independant of how the switches normalizes the ip addresses when flows are pushed. Conflicts: openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/IpConversionUtil.java openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java Change-Id: Icfc6d4805c58f6483fc3ca0458b827b14c0a0cb1 Signed-off-by: Sai MarapaReddy --- .../impl/helper/MatchComparatorHelper.java | 93 +++--- .../helper/MatchComparatorHelperTest.java | 4 +- .../core/sal/convertor/IpConversionUtil.java | 61 ++-- .../convertor/match/MatchConvertorImpl.java | 127 +++++++-- .../sal/convertor/IpConversionUtilTest.java | 18 +- .../match/MatchConvertorImplV13Test.java | 266 +++++++++++++++++- 6 files changed, 456 insertions(+), 113 deletions(-) diff --git a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/helper/MatchComparatorHelper.java b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/helper/MatchComparatorHelper.java index 1682da69a6..6762fea79f 100644 --- a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/helper/MatchComparatorHelper.java +++ b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/helper/MatchComparatorHelper.java @@ -7,17 +7,13 @@ */ package org.opendaylight.openflowplugin.applications.statistics.manager.impl.helper; -import com.google.common.net.InetAddresses; import java.math.BigInteger; import java.net.Inet4Address; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Arrays; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.primitives.UnsignedBytes; + import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; 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; @@ -27,8 +23,14 @@ 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.Layer3Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMask; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.net.InetAddresses; +import com.google.common.primitives.UnsignedBytes; /** * @author joe @@ -123,7 +125,7 @@ public class MatchComparatorHelper { verdict = MatchComparatorHelper.compareIpv4PrefixNullSafe(statsIpv4Match.getIpv4Source(), storedIpv4Match.getIpv4Source()); } - } else if(statsLayer3Match instanceof Ipv6Match && storedLayer3Match instanceof Ipv6Match) { + } else if (statsLayer3Match instanceof Ipv6Match && storedLayer3Match instanceof Ipv6Match) { final Ipv6Match statsIpv6Match = (Ipv6Match) statsLayer3Match; final Ipv6Match storedIpv6Match = (Ipv6Match) storedLayer3Match; verdict = MatchComparatorHelper.compareIpv6PrefixNullSafe(storedIpv6Match.getIpv6Destination(), @@ -132,41 +134,42 @@ public class MatchComparatorHelper { verdict = MatchComparatorHelper.compareIpv6PrefixNullSafe(statsIpv6Match.getIpv6Source(), storedIpv6Match.getIpv6Source()); } - } else if(statsLayer3Match instanceof Ipv4MatchArbitraryBitMask && storedLayer3Match instanceof Ipv4MatchArbitraryBitMask) { + } else if (statsLayer3Match instanceof Ipv4MatchArbitraryBitMask && storedLayer3Match instanceof Ipv4MatchArbitraryBitMask) { // At this moment storedIpv4MatchArbitraryBitMask & statsIpv4MatchArbitraryBitMask will always have non null arbitrary masks. // In case of no / null arbitrary mask, statsLayer3Match will be an instance of Ipv4Match. // Eg:- stats -> 1.0.1.0/255.0.255.0 stored -> 1.1.1.0/255.0.255.0 final Ipv4MatchArbitraryBitMask statsIpv4MatchArbitraryBitMask= (Ipv4MatchArbitraryBitMask) statsLayer3Match; final Ipv4MatchArbitraryBitMask storedIpv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) storedLayer3Match; - if((storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask() != null | + if ((storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask() != null | storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask() != null)) { - if(storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask() != null) { - String storedIpAddress = extractIpv4Address(storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask(), + if (storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask() != null) { + String storedDstIpAddress = normalizeIpv4Address(storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask(), storedIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask()); - if(MatchComparatorHelper.compareStringNullSafe(storedIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask().getValue(), + String statsDstIpAddress = normalizeIpv4Address(statsIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask(), + statsIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask()); + if (MatchComparatorHelper.compareStringNullSafe(storedIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask().getValue(), statsIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask().getValue())) { - verdict = MatchComparatorHelper.compareStringNullSafe(storedIpAddress, - statsIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue()); - } - else { + verdict = MatchComparatorHelper.compareStringNullSafe(storedDstIpAddress, + statsDstIpAddress); + } else { verdict = false; return verdict; } } - if(storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask() != null) { - String storedIpAddress = extractIpv4Address(storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask() + if (storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask() != null) { + String storedSrcIpAddress = normalizeIpv4Address(storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask() ,storedIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask()); - if(MatchComparatorHelper.compareStringNullSafe(storedIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask().getValue(), + String statsSrcIpAddress = normalizeIpv4Address(statsIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask() + ,statsIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask()); + if (MatchComparatorHelper.compareStringNullSafe(storedIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask().getValue(), statsIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask().getValue())) { - verdict = MatchComparatorHelper.compareStringNullSafe(storedIpAddress, - statsIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue()); - } - else { + verdict = MatchComparatorHelper.compareStringNullSafe(storedSrcIpAddress, + statsSrcIpAddress); + } else { verdict = false; } } - } - else { + } else { final Boolean nullCheckOut = checkNullValues(storedLayer3Match, statsLayer3Match); if (nullCheckOut != null) { verdict = nullCheckOut; @@ -174,8 +177,7 @@ public class MatchComparatorHelper { verdict = storedLayer3Match.equals(statsLayer3Match); } } - } - else if (statsLayer3Match instanceof Ipv4Match && storedLayer3Match instanceof Ipv4MatchArbitraryBitMask) { + } else if (statsLayer3Match instanceof Ipv4Match && storedLayer3Match instanceof Ipv4MatchArbitraryBitMask) { // Here stored netmask is an instance of Ipv4MatchArbitraryBitMask, when it is pushed in to switch // it automatically converts it in to cidr format in case of certain subnet masks ( consecutive ones or zeroes) // Eg:- stats src/dest -> 1.1.1.0/24 stored src/dest -> 1.1.1.0/255.255.255.0 @@ -186,12 +188,11 @@ public class MatchComparatorHelper { if (storedIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask() != null) { byte[] destByteMask = convertArbitraryMaskToByteArray(storedIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask()); ipv4PrefixDestination = createPrefix(storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask(), destByteMask); - } - else{ + } else { ipv4PrefixDestination = createPrefix(storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask()); } verdict = MatchComparatorHelper.compareIpv4PrefixNullSafe(ipv4PrefixDestination, statsIpv4Match.getIpv4Destination()); - if(verdict == false) { + if (verdict == false) { return verdict; } } @@ -200,8 +201,7 @@ public class MatchComparatorHelper { if (storedIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask() != null) { byte[] srcByteMask = convertArbitraryMaskToByteArray(storedIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask()); ipv4PrefixSource = createPrefix(storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask(), srcByteMask); - } - else { + } else { ipv4PrefixSource = createPrefix(storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask()); } verdict = MatchComparatorHelper.compareIpv4PrefixNullSafe(ipv4PrefixSource, statsIpv4Match.getIpv4Source()); @@ -252,10 +252,10 @@ public class MatchComparatorHelper { private static boolean IpAddressEquals(Ipv6Prefix statsIpv6, Ipv6Prefix storedIpv6) { final String[] statsIpMask = statsIpv6.getValue().split("/"); final String[] storedIpMask = storedIpv6.getValue().split("/"); - if(! (statsIpMask.length > 1 && storedIpMask.length > 1 && statsIpMask[1].equals(storedIpMask[1]))){ + if (! (statsIpMask.length > 1 && storedIpMask.length > 1 && statsIpMask[1].equals(storedIpMask[1]))){ return false; } - if(InetAddresses.forString(statsIpMask[0]).equals(InetAddresses.forString(storedIpMask[0]))){ + if (InetAddresses.forString(statsIpMask[0]).equals(InetAddresses.forString(storedIpMask[0]))){ return true; } return false; @@ -271,7 +271,6 @@ public class MatchComparatorHelper { } else if (v1 == null && v2 == null) { verdict = Boolean.TRUE; } - return verdict; } @@ -291,7 +290,7 @@ public class MatchComparatorHelper { final Boolean checkDestNullValuesOut = checkNullValues(stringA,stringB); if (checkDestNullValuesOut != null) { verdict = checkDestNullValuesOut; - }else if (!stringA.equals(stringB)) { + } else if (!stringA.equals(stringB)) { verdict = false; } return verdict; @@ -305,7 +304,6 @@ public class MatchComparatorHelper { } else if (!IpAddressEquals(statsIpv6, storedIpv6)) { verdict = false; } - return verdict; } @@ -352,8 +350,7 @@ public class MatchComparatorHelper { static boolean isArbitraryBitMask(byte[] byteMask) { if (byteMask == null) { return false; - } - else { + } else { ArrayList integerMaskArrayList = new ArrayList(); String maskInBits; // converting byte array to bits @@ -367,12 +364,11 @@ public class MatchComparatorHelper { } static boolean checkArbitraryBitMask(ArrayList arrayList) { - // checks 0*1* case - Leading zeros in arrayList are truncated - if(arrayList.size()>0 && arrayList.size()<32) { + if (arrayList.size()>0 && arrayList.size()< IPV4_MASK_LENGTH ) { + // checks 0*1* case - Leading zeros in arrayList are truncated return true; - } - //checks 1*0*1 case - else { + } else { + //checks 1*0*1 case for(int i=0; i>> 24), (byte)(value >> 16 & 0xff), (byte)(value >> 8 & 0xff), (byte)(value & 0xff) }; byte[] maskBytes; maskBytes = MatchComparatorHelper.convertArbitraryMaskToByteArray(new DottedQuad("255.255.255.255")); - for(int i=0; i addressParts = PREFIX_SPLITTER.split(ipv4Prefix.getValue()).iterator(); + return new Ipv4Address(addressParts.next()); + } + + public static DottedQuad extractIpv4AddressMask(final Ipv4Prefix ipv4Prefix) { + Iterator addressParts = PREFIX_SPLITTER.split(ipv4Prefix.getValue()).iterator(); + addressParts.next(); + Integer cidrMask =0; + if (addressParts.hasNext()) { + cidrMask = Integer.parseInt(addressParts.next()); + } + long maskBits = 0; + maskBits = 0xffffffff << IPV4_ADDRESS_LENGTH - cidrMask; + String mask = String.format("%d.%d.%d.%d", (maskBits & 0x0000000000ff000000L) >> 24, (maskBits & 0x0000000000ff0000) >> 16, (maskBits & 0x0000000000ff00) >> 8, maskBits & 0xff); + DottedQuad netMask = new DottedQuad(mask); + return netMask; + } + public static Integer extractIpv6Prefix(final Ipv6Prefix ipv6Prefix) { return IetfInetUtil.INSTANCE.splitIpv6Prefix(ipv6Prefix).getValue(); } @@ -598,10 +622,9 @@ public final class IpConversionUtil { public static final byte[] convertArbitraryMaskToByteArray(DottedQuad mask) { String maskValue; - if (mask != null && mask.getValue() != null){ + if (mask != null && mask.getValue() != null) { maskValue = mask.getValue(); - } - else { + } else { maskValue = DEFAULT_ARBITRARY_BIT_MASK; } InetAddress maskInIpFormat = null; @@ -617,14 +640,13 @@ public final class IpConversionUtil { public static boolean isArbitraryBitMask(byte[] byteMask) { if (byteMask == null) { return false; - } - else { + } else { ArrayList integerMaskArrayList = new ArrayList(); String maskInBits; // converting byte array to bits maskInBits = new BigInteger(1, byteMask).toString(2); ArrayList stringMaskArrayList = new ArrayList(Arrays.asList(maskInBits.split("(?!^)"))); - for(String string:stringMaskArrayList){ + for (String string:stringMaskArrayList) { integerMaskArrayList.add(Integer.parseInt(string)); } return checkArbitraryBitMask(integerMaskArrayList); @@ -633,13 +655,12 @@ public final class IpConversionUtil { private static boolean checkArbitraryBitMask(ArrayList arrayList) { // checks 0*1* case - Leading zeros in arrayList are truncated - if(arrayList.size()>0 && arrayList.size()<32) { + if (arrayList.size()>0 && arrayList.size()> { if (ipv4Address != null) { byte[] mask = ipv4Address.getMask(); if (mask != null && IpConversionUtil.isArbitraryBitMask(mask)) { - DottedQuad dottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); - String Ipv4Address = ipv4Address.getIpv4Address().getValue(); - setIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, dottedQuadMask, Ipv4Address); + // case where ipv4dst is of type ipv4MatchBuilder and ipv4src is of type ipv4MatchArbitrary. + // Needs to convert ipv4dst to ipv4MatchArbitrary. + if (ipv4MatchBuilder.getIpv4Destination() != null) { + Ipv4Prefix ipv4PrefixDestinationAddress = ipv4MatchBuilder.getIpv4Destination(); + Ipv4Address ipv4DstAddress = IpConversionUtil.extractIpv4Address(ipv4PrefixDestinationAddress); + DottedQuad dstDottedQuadMask = IpConversionUtil.extractIpv4AddressMask(ipv4PrefixDestinationAddress); + setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, + dstDottedQuadMask, ipv4DstAddress.getValue()); + } + DottedQuad srcDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); + String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue(); + setSrcIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, + srcDottedQuadMask, stringIpv4SrcAddress); matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build()); - } - else { - String ipv4PrefixStr = ipv4Address.getIpv4Address().getValue(); - setIpv4MatchBuilderFields(ipv4MatchBuilder, ofMatch, mask, ipv4PrefixStr); + } else if (ipv4MatchArbitraryBitMaskBuilder.getIpv4DestinationAddressNoMask() != null) { + /* + Case where destination is of type ipv4MatchArbitraryBitMask already exists in Layer3Match, + source which of type ipv4Match needs to be converted to ipv4MatchArbitraryBitMask. + We convert 36.36.36.0/24 to 36.36.0/255.255.255.0 + expected output example:- + 36.36.36.0/24 + 36.36.36.0 + 255.0.255.0 + after conversion output example:- + 36.36.36.0 + 255.255.255.0 + 36.36.36.0 + 255.0.255.0 + */ + DottedQuad srcDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); + String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue(); + setSrcIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, + srcDottedQuadMask, stringIpv4SrcAddress); + matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build()); + } else { + String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue(); + setIpv4MatchBuilderFields(ipv4MatchBuilder, ofMatch, mask, stringIpv4SrcAddress); matchBuilder.setLayer3Match(ipv4MatchBuilder.build()); } } @@ -1332,10 +1374,40 @@ public class MatchConvertorImpl implements MatchConvertor> { org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4Dst ipv4Address = ((Ipv4DstCase) ofMatch.getMatchEntryValue()).getIpv4Dst(); if (ipv4Address != null) { byte[] mask = ipv4Address.getMask(); - if(mask != null && IpConversionUtil.isArbitraryBitMask(mask)) { - DottedQuad dottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); - String Ipv4Address = ipv4Address.getIpv4Address().getValue(); - setIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, dottedQuadMask, Ipv4Address); + if (mask != null && IpConversionUtil.isArbitraryBitMask(mask)) { + // case where ipv4src is of type ipv4MatchBuilder and ipv4dst is of type ipv4MatchArbitrary. + // Needs to convert ipv4src to ipv4MatchArbitrary. + if (ipv4MatchBuilder.getIpv4Source() != null) { + Ipv4Prefix ipv4PrefixSourceAddress = ipv4MatchBuilder.getIpv4Source(); + Ipv4Address ipv4SourceAddress = IpConversionUtil.extractIpv4Address(ipv4PrefixSourceAddress); + DottedQuad srcDottedQuad = IpConversionUtil.extractIpv4AddressMask(ipv4PrefixSourceAddress); + setSrcIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder,ofMatch, + srcDottedQuad, ipv4SourceAddress.getValue()); + } + DottedQuad dstDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); + String stringIpv4DstAddress = ipv4Address.getIpv4Address().getValue(); + setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, + dstDottedQuadMask, stringIpv4DstAddress); + matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build()); + } else if (ipv4MatchArbitraryBitMaskBuilder.getIpv4SourceAddressNoMask() != null) { + /* + Case where source is of type ipv4MatchArbitraryBitMask already exists in Layer3Match, + destination which of type ipv4Match needs to be converted to ipv4MatchArbitraryBitMask. + We convert 36.36.36.0/24 to 36.36.0/255.255.255.0 + expected output example:- + 36.36.36.0/24 + 36.36.36.0 + 255.0.255.0 + after conversion output example:- + 36.36.36.0 + 255.255.255.0 + 36.36.36.0 + 255.0.255.0 + */ + DottedQuad dstDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask); + String stringIpv4DstAddress = ipv4Address.getIpv4Address().getValue(); + setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, + dstDottedQuadMask, stringIpv4DstAddress); matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build()); } else { @@ -1572,25 +1644,26 @@ public class MatchConvertorImpl implements MatchConvertor> { } } - private static void setIpv4MatchArbitraryBitMaskBuilderFields(final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder, final MatchEntry ofMatch, final DottedQuad mask, final String ipv4AddressStr) { + private static void setSrcIpv4MatchArbitraryBitMaskBuilderFields( + final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder, + final MatchEntry ofMatch, final DottedQuad mask, final String ipv4AddressStr) { Ipv4Address ipv4Address; - DottedQuad dottedQuad; if (mask != null) { - dottedQuad = mask; - if (ofMatch.getOxmMatchField().equals(Ipv4Src.class)) { - ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(dottedQuad); - } - if (ofMatch.getOxmMatchField().equals(Ipv4Dst.class)) { - ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(dottedQuad); - } + ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(mask); } ipv4Address = new Ipv4Address(ipv4AddressStr); - if (ofMatch.getOxmMatchField().equals(Ipv4Src.class)) { - ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask(ipv4Address); - } - if (ofMatch.getOxmMatchField().equals(Ipv4Dst.class)) { - ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask(ipv4Address); + ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask(ipv4Address); + } + + private static void setDstIpv4MatchArbitraryBitMaskBuilderFields( + final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder, + final MatchEntry ofMatch, final DottedQuad mask, final String ipv4AddressStr) { + Ipv4Address ipv4Address; + if (mask != null) { + ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(mask); } + ipv4Address = new Ipv4Address(ipv4AddressStr); + ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask(ipv4Address); } diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/IpConversionUtilTest.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/IpConversionUtilTest.java index c65fb40b36..f74fb152d1 100644 --- a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/IpConversionUtilTest.java +++ b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/IpConversionUtilTest.java @@ -13,6 +13,8 @@ import org.junit.Assert; import org.junit.Test; import org.opendaylight.openflowjava.util.ByteBufUtils; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorUtil; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; +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.Ipv6Address; 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.yang.types.rev130715.DottedQuad; @@ -115,7 +117,7 @@ public class IpConversionUtilTest { (byte)(value >>> 24), (byte)(value >> 16 & 0xff), (byte)(value >> 8 & 0xff), (byte)(value & 0xff) }; byte[] maskBytes; maskBytes = IpConversionUtil.convertArbitraryMaskToByteArray(new DottedQuad("255.255.255.255")); - for(int i=0; i entries = new ArrayList<>(); + MatchEntryBuilder entriesBuilder = new MatchEntryBuilder(); + entriesBuilder.setOxmClass(OpenflowBasicClass.class); + entriesBuilder.setOxmMatchField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata.class); + entriesBuilder.setHasMask(true); + + entriesBuilder = new MatchEntryBuilder(); + entriesBuilder.setOxmClass(OpenflowBasicClass.class); + entriesBuilder.setOxmMatchField(Ipv4Src.class); + entriesBuilder.setHasMask(true); + final Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder(); + final Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder(); + ipv4SrcBuilder.setIpv4Address(new Ipv4Address("10.1.1.1")); + ipv4SrcBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 255, 0}); + ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build()); + entriesBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build()); + entries.add(entriesBuilder.build()); + + entriesBuilder = new MatchEntryBuilder(); + entriesBuilder.setOxmClass(OpenflowBasicClass.class); + entriesBuilder.setOxmMatchField(Ipv4Dst.class); + entriesBuilder.setHasMask(true); + final Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder(); + final Ipv4DstBuilder ipv4AddressBuilder = new Ipv4DstBuilder(); + ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.1.1")); + ipv4AddressBuilder.setMask(new byte[]{(byte) 255, 0, (byte) 240, 0}); + ipv4DstCaseBuilder.setIpv4Dst(ipv4AddressBuilder.build()); + entriesBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build()); + entries.add(entriesBuilder.build()); + + builder.setMatchEntry(entries); + final Match match = builder.build(); + + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow + .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); + + final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match(); + Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1", + ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue()); + Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1", + ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue()); + } + + /** + * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( + * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, + * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + */ + @Test + public void testWithMatchEntryWithSrcArbitraryBitMaskAndDstCidrMask() { + final MatchBuilder builder = new MatchBuilder(); + builder.setType(OxmMatchType.class); + final List entries = new ArrayList<>(); + MatchEntryBuilder entriesBuilder = new MatchEntryBuilder(); + entriesBuilder.setOxmClass(OpenflowBasicClass.class); + entriesBuilder.setOxmMatchField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata.class); + entriesBuilder.setHasMask(true); + + entriesBuilder = new MatchEntryBuilder(); + entriesBuilder.setOxmClass(OpenflowBasicClass.class); + entriesBuilder.setOxmMatchField(Ipv4Src.class); + entriesBuilder.setHasMask(true); + final Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder(); + final Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder(); + ipv4SrcBuilder.setIpv4Address(new Ipv4Address("10.1.1.1")); + ipv4SrcBuilder.setMask(new byte[]{(byte) 255, (byte) 0, (byte) 255, 0}); + ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build()); + entriesBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build()); + entries.add(entriesBuilder.build()); + + entriesBuilder = new MatchEntryBuilder(); + entriesBuilder.setOxmClass(OpenflowBasicClass.class); + entriesBuilder.setOxmMatchField(Ipv4Dst.class); + entriesBuilder.setHasMask(true); + final Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder(); + final Ipv4DstBuilder ipv4AddressBuilder = new Ipv4DstBuilder(); + ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.1.1")); + ipv4AddressBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 240, 0}); + ipv4DstCaseBuilder.setIpv4Dst(ipv4AddressBuilder.build()); + entriesBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build()); + entries.add(entriesBuilder.build()); + + builder.setMatchEntry(entries); + final Match match = builder.build(); + + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow + .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); + + final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match(); + Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1", + ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue()); + Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1", + ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue()); + } + + + /** + * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( + * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, + * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + */ + @Test + public void testWithMatchEntryWithDstArbitraryBitMaskAndSrcCidrMask() { + final MatchBuilder builder = new MatchBuilder(); + builder.setType(OxmMatchType.class); + final List entries = new ArrayList<>(); + MatchEntryBuilder entriesBuilder = new MatchEntryBuilder(); + entriesBuilder.setOxmClass(OpenflowBasicClass.class); + entriesBuilder.setOxmMatchField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata.class); + entriesBuilder.setHasMask(true); + + entriesBuilder = new MatchEntryBuilder(); + entriesBuilder.setOxmClass(OpenflowBasicClass.class); + entriesBuilder.setOxmMatchField(Ipv4Dst.class); + entriesBuilder.setHasMask(true); + final Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder(); + final Ipv4DstBuilder ipv4AddressBuilder = new Ipv4DstBuilder(); + ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.1.1")); + ipv4AddressBuilder.setMask(new byte[]{(byte) 255, 0, (byte) 240, 0}); + ipv4DstCaseBuilder.setIpv4Dst(ipv4AddressBuilder.build()); + entriesBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build()); + entries.add(entriesBuilder.build()); + + entriesBuilder = new MatchEntryBuilder(); + entriesBuilder.setOxmClass(OpenflowBasicClass.class); + entriesBuilder.setOxmMatchField(Ipv4Src.class); + entriesBuilder.setHasMask(true); + final Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder(); + final Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder(); + ipv4SrcBuilder.setIpv4Address(new Ipv4Address("10.1.1.1")); + ipv4SrcBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 255, 0}); + ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build()); + entriesBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build()); + entries.add(entriesBuilder.build()); + + builder.setMatchEntry(entries); + final Match match = builder.build(); + + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow + .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); + + final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match(); + Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1", + ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue()); + Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1", + ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue()); + } + + /** + * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( + * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, + * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + */ + @Test + public void testWithMatchEntryWithDstCidrMaskAndSrcArbitraryBitMask() { + final MatchBuilder builder = new MatchBuilder(); + builder.setType(OxmMatchType.class); + final List entries = new ArrayList<>(); + MatchEntryBuilder entriesBuilder = new MatchEntryBuilder(); + entriesBuilder.setOxmClass(OpenflowBasicClass.class); + entriesBuilder.setOxmMatchField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata.class); + entriesBuilder.setHasMask(true); + + entriesBuilder = new MatchEntryBuilder(); + entriesBuilder.setOxmClass(OpenflowBasicClass.class); + entriesBuilder.setOxmMatchField(Ipv4Dst.class); + entriesBuilder.setHasMask(true); + final Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder(); + final Ipv4DstBuilder ipv4AddressBuilder = new Ipv4DstBuilder(); + ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.1.1")); + ipv4AddressBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 240, 0}); + ipv4DstCaseBuilder.setIpv4Dst(ipv4AddressBuilder.build()); + entriesBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build()); + entries.add(entriesBuilder.build()); + + entriesBuilder = new MatchEntryBuilder(); + entriesBuilder.setOxmClass(OpenflowBasicClass.class); + entriesBuilder.setOxmMatchField(Ipv4Src.class); + entriesBuilder.setHasMask(true); + final Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder(); + final Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder(); + ipv4SrcBuilder.setIpv4Address(new Ipv4Address("10.1.1.1")); + ipv4SrcBuilder.setMask(new byte[]{(byte) 255, (byte) 0, (byte) 255, 0}); + ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build()); + entriesBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build()); + entries.add(entriesBuilder.build()); + + builder.setMatchEntry(entries); + final Match match = builder.build(); + + final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow + .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13); final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build(); final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match(); - Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1", ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue()); - Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1", ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue()); + Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1", + ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue()); + Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1", + ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue()); } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( + * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, + * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} */ @Test public void testLayer4MatchUdp() { @@ -753,7 +981,9 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( + * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, + * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} */ @Test public void testLayer4MatchSctp() { @@ -796,7 +1026,9 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( + * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, + * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} */ @Test public void testLayer3MatchIpv6() { @@ -899,7 +1131,9 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( + * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, + * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} */ @Test public void testLayer3MatchIpv6ExtHeader2() { @@ -929,7 +1163,9 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( + * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, + * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} */ @Test public void testLayer3MatchArp() { @@ -1005,7 +1241,9 @@ public class MatchConvertorImplV13Test { } /** - * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} + * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch( + * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, + * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)} */ @Test public void testLayer3MatchArpWithMasks() { -- 2.36.6