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 <sai.marapareddy@gmail.com>
*/
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;
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
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(),
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;
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
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;
}
}
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());
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;
} else if (v1 == null && v2 == null) {
verdict = Boolean.TRUE;
}
-
return verdict;
}
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;
} else if (!IpAddressEquals(statsIpv6, storedIpv6)) {
verdict = false;
}
-
return verdict;
}
static boolean isArbitraryBitMask(byte[] byteMask) {
if (byteMask == null) {
return false;
- }
- else {
+ } else {
ArrayList<Integer> integerMaskArrayList = new ArrayList<Integer>();
String maskInBits;
// converting byte array to bits
}
static boolean checkArbitraryBitMask(ArrayList<Integer> 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<arrayList.size()-1;i++) {
if(arrayList.get(i) ==0 && arrayList.get(i+1) == 1) {
return true;
String maskValue;
if(mask.getValue() != null && mask != null){
maskValue = mask.getValue();
- }
- else maskValue = DEFAULT_ARBITRARY_BIT_MASK;
+ } else maskValue = DEFAULT_ARBITRARY_BIT_MASK;
InetAddress maskInIpFormat = null;
try {
maskInIpFormat = InetAddress.getByName(maskValue);
}
- static String extractIpv4Address(Ipv4Address ipAddress, DottedQuad netMask) {
+ static String normalizeIpv4Address(Ipv4Address ipAddress, DottedQuad netMask) {
String actualIpAddress="";
String[] netMaskParts = netMask.getValue().split("\\.");
String[] ipAddressParts = ipAddress.getValue().split("\\.");
- for(int i=0; i<ipAddressParts.length;i++) {
+ for (int i=0; i<ipAddressParts.length;i++) {
int integerFormatIpAddress=Integer.parseInt(ipAddressParts[i]);
int integerFormatNetMask=Integer.parseInt(netMaskParts[i]);
int ipAddressPart=(integerFormatIpAddress) & (integerFormatNetMask);
actualIpAddress += ipAddressPart;
- if(i != ipAddressParts.length -1 ) {
+ if (i != ipAddressParts.length -1 ) {
actualIpAddress = actualIpAddress+".";
}
}
Ipv4Address ipAddress = new Ipv4Address("1.1.1.1");
DottedQuad netMask = new DottedQuad("255.255.255.0");
String extractedIpAddress;
- extractedIpAddress = MatchComparatorHelper.extractIpv4Address(ipAddress,netMask);
+ extractedIpAddress = MatchComparatorHelper.normalizeIpv4Address(ipAddress,netMask);
assertEquals(extractedIpAddress,"1.1.1.0");
}
(byte)(value >>> 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<bytes.length;i++){
+ for (int i=0; i<bytes.length;i++) {
int mask = maskBytes[i];
assertEquals(bytes[i],mask);
}
import java.util.Arrays;
import java.util.Iterator;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IetfInetUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
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;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import com.google.common.base.Preconditions;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.Iterators;
import com.google.common.net.InetAddresses;
import com.google.common.primitives.UnsignedBytes;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
/**
}
public static DottedQuad createArbitraryBitMask(final byte [] bytemask) {
- DottedQuad dottedQuad = new DottedQuad(DEFAULT_ARBITRARY_BIT_MASK);
- try {
- dottedQuad = new DottedQuad(InetAddress.getByAddress(bytemask).getHostAddress());
- } catch (UnknownHostException e) {
- LOG.error("Failed to create the dottedQuad notation for the given mask ", e);
+ DottedQuad dottedQuad = null;
+ if (bytemask == null ) {
+ dottedQuad = new DottedQuad(DEFAULT_ARBITRARY_BIT_MASK);
+ } else {
+ try {
+ dottedQuad = new DottedQuad(InetAddress.getByAddress(bytemask).getHostAddress());
+ } catch (UnknownHostException e) {
+ LOG.error("Failed to create the dottedQuad notation for the given mask ", e);
+ }
}
return dottedQuad;
}
return IetfInetUtil.INSTANCE.ipv6AddressFrom(ipv6Prefix);
}
+ public static Ipv4Address extractIpv4Address(final Ipv4Prefix ipv4Prefix) {
+ Iterator<String> addressParts = PREFIX_SPLITTER.split(ipv4Prefix.getValue()).iterator();
+ return new Ipv4Address(addressParts.next());
+ }
+
+ public static DottedQuad extractIpv4AddressMask(final Ipv4Prefix ipv4Prefix) {
+ Iterator<String> 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();
}
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;
public static boolean isArbitraryBitMask(byte[] byteMask) {
if (byteMask == null) {
return false;
- }
- else {
+ } else {
ArrayList<Integer> integerMaskArrayList = new ArrayList<Integer>();
String maskInBits;
// converting byte array to bits
maskInBits = new BigInteger(1, byteMask).toString(2);
ArrayList<String> stringMaskArrayList = new ArrayList<String>(Arrays.asList(maskInBits.split("(?!^)")));
- for(String string:stringMaskArrayList){
+ for (String string:stringMaskArrayList) {
integerMaskArrayList.add(Integer.parseInt(string));
}
return checkArbitraryBitMask(integerMaskArrayList);
private static boolean checkArbitraryBitMask(ArrayList<Integer> 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_ADDRESS_LENGTH) {
return true;
- }
- //checks 1*0*1 case
- else {
- for(int i=0; i<arrayList.size()-1;i++) {
- if(arrayList.get(i) ==0 && arrayList.get(i+1) == 1) {
+ } else {
+ //checks 1*0*1 case
+ for (int i=0; i<arrayList.size()-1;i++) {
+ if (arrayList.get(i) ==0 && arrayList.get(i+1) == 1) {
return true;
}
}
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
import static org.opendaylight.openflowjava.util.ByteBufUtils.macAddressToString;
-import com.google.common.base.Optional;
+
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+
import javax.annotation.Nonnull;
+
import org.opendaylight.openflowjava.util.ByteBufUtils;
import org.opendaylight.openflowplugin.api.OFConstants;
import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
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.*;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatch;
+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.Ipv4Match;
+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.Ipv4MatchArbitraryBitMaskBuilder;
+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.Ipv6Match;
+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._3.match.TunnelIpv4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatch;
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.TcpMatch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.base.Optional;
+
/**
* Utility class for converting a MD-SAL Flow into the OF flow mod
*/
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:-
+ <ipv4-destination>36.36.36.0/24</ipv4-destination>
+ <ipv4-source-address-no-mask>36.36.36.0</ipv4-source-address-no-mask>
+ <ipv4-source-arbitrary-bitmask>255.0.255.0</ipv4-source-arbitrary-bitmask>
+ after conversion output example:-
+ <ipv4-destination-address-no-mask>36.36.36.0</ipv4-destination-address-no-mask>
+ <ipv4-destination-arbitrary-bitmask>255.255.255.0</ipv4-destination-arbitrary-bitmask>
+ <ipv4-source-address-no-mask>36.36.36.0</ipv4-source-address-no-mask>
+ <ipv4-source-arbitrary-bitmask>255.0.255.0</ipv4-source-arbitrary-bitmask>
+ */
+ 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());
}
}
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:-
+ <ipv4-source>36.36.36.0/24</ipv4-source>
+ <ipv4-destination-address-no-mask>36.36.36.0</ipv4-destination-address-no-mask>
+ <ipv4-destination-arbitrary-bitmask>255.0.255.0</ipv4-destination-arbitrary-bitmask>
+ after conversion output example:-
+ <ipv4-source-address-no-mask>36.36.36.0</ipv4-source-address-no-mask>
+ <ipv4-source-arbitrary-bitmask>255.255.255.0</ipv4-source-arbitrary-bitmask>
+ <ipv4-destination-address-no-mask>36.36.36.0</ipv4-destination-address-no-mask>
+ <ipv4-destination-arbitrary-bitmask>255.0.255.0</ipv4-destination-arbitrary-bitmask>
+ */
+ DottedQuad dstDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask);
+ String stringIpv4DstAddress = ipv4Address.getIpv4Address().getValue();
+ setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch,
+ dstDottedQuadMask, stringIpv4DstAddress);
matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
}
else {
}
}
- 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);
}
import org.junit.Test;\r
import org.opendaylight.openflowjava.util.ByteBufUtils;\r
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorUtil;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;\r
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;\r
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;\r
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;\r
(byte)(value >>> 24), (byte)(value >> 16 & 0xff), (byte)(value >> 8 & 0xff), (byte)(value & 0xff) };\r
byte[] maskBytes;\r
maskBytes = IpConversionUtil.convertArbitraryMaskToByteArray(new DottedQuad("255.255.255.255"));\r
- for(int i=0; i<bytes.length;i++){\r
+ for (int i=0; i<bytes.length;i++) {\r
int mask = maskBytes[i];\r
Assert.assertEquals(bytes[i],mask);\r
}\r
arbitraryBitMask = IpConversionUtil.isArbitraryBitMask(null);\r
Assert.assertEquals(arbitraryBitMask,false);\r
}\r
+\r
+ @Test\r
+ public void extractIpv4AddressTest() {\r
+ Ipv4Address ipv4Address;\r
+ ipv4Address = IpConversionUtil.extractIpv4Address(new Ipv4Prefix("1.0.1.0/16"));\r
+ Assert.assertEquals(ipv4Address.getValue(),"1.0.1.0");\r
+ }\r
+\r
+ @Test\r
+ public void extractIpv4AddressMaskTest() {\r
+ DottedQuad dottedQuad;\r
+ dottedQuad = IpConversionUtil.extractIpv4AddressMask(new Ipv4Prefix("1.1.1.1/24"));\r
+ Assert.assertEquals(dottedQuad.getValue(),"255.255.255.0");\r
+ }\r
}\r
import java.math.BigInteger;\r
import java.util.ArrayList;\r
import java.util.List;\r
+\r
import org.junit.Assert;\r
import org.junit.Before;\r
import org.junit.Test;\r
}\r
\r
/**\r
- * 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)}\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
*/\r
@Test(expected = NullPointerException.class)\r
public void testEmptyMatch() {\r
}\r
\r
/**\r
- * 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)}\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
*/\r
@Test\r
public void testEmptyMatchEntry() {\r
}\r
\r
/**\r
- * 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)}\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
*/\r
@Test\r
public void testWithMatchEntryNoMasks() {\r
}\r
\r
/**\r
- * 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)}\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
*/\r
@Test\r
public void testWithMatchEntryWithMasks() {\r
}\r
\r
/**\r
- * 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)}\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
*/\r
@Test\r
public void testWithMatchEntryWithArbitraryMasks() {\r
final Match match = builder.build();\r
\r
final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
- .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10);\r
+ .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13);\r
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build();\r
+\r
+ final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
+ Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1",\r
+ ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue());\r
+ Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1",\r
+ ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue());\r
+ }\r
+\r
+ /**\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+ */\r
+ @Test\r
+ public void testWithMatchEntryWithSrcCidrMaskAndDstArbitraryBitMask() {\r
+ final MatchBuilder builder = new MatchBuilder();\r
+ builder.setType(OxmMatchType.class);\r
+ final List<MatchEntry> entries = new ArrayList<>();\r
+ MatchEntryBuilder entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata.class);\r
+ entriesBuilder.setHasMask(true);\r
+\r
+ entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(Ipv4Src.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder();\r
+ final Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder();\r
+ ipv4SrcBuilder.setIpv4Address(new Ipv4Address("10.1.1.1"));\r
+ ipv4SrcBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 255, 0});\r
+ ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build());\r
+ entries.add(entriesBuilder.build());\r
+\r
+ entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(Ipv4Dst.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder();\r
+ final Ipv4DstBuilder ipv4AddressBuilder = new Ipv4DstBuilder();\r
+ ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.1.1"));\r
+ ipv4AddressBuilder.setMask(new byte[]{(byte) 255, 0, (byte) 240, 0});\r
+ ipv4DstCaseBuilder.setIpv4Dst(ipv4AddressBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build());\r
+ entries.add(entriesBuilder.build());\r
+\r
+ builder.setMatchEntry(entries);\r
+ final Match match = builder.build();\r
+\r
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+ .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13);\r
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build();\r
+\r
+ final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
+ Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1",\r
+ ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue());\r
+ Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1",\r
+ ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue());\r
+ }\r
+\r
+ /**\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+ */\r
+ @Test\r
+ public void testWithMatchEntryWithSrcArbitraryBitMaskAndDstCidrMask() {\r
+ final MatchBuilder builder = new MatchBuilder();\r
+ builder.setType(OxmMatchType.class);\r
+ final List<MatchEntry> entries = new ArrayList<>();\r
+ MatchEntryBuilder entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata.class);\r
+ entriesBuilder.setHasMask(true);\r
+\r
+ entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(Ipv4Src.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder();\r
+ final Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder();\r
+ ipv4SrcBuilder.setIpv4Address(new Ipv4Address("10.1.1.1"));\r
+ ipv4SrcBuilder.setMask(new byte[]{(byte) 255, (byte) 0, (byte) 255, 0});\r
+ ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build());\r
+ entries.add(entriesBuilder.build());\r
+\r
+ entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(Ipv4Dst.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder();\r
+ final Ipv4DstBuilder ipv4AddressBuilder = new Ipv4DstBuilder();\r
+ ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.1.1"));\r
+ ipv4AddressBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 240, 0});\r
+ ipv4DstCaseBuilder.setIpv4Dst(ipv4AddressBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build());\r
+ entries.add(entriesBuilder.build());\r
+\r
+ builder.setMatchEntry(entries);\r
+ final Match match = builder.build();\r
+\r
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+ .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13);\r
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build();\r
+\r
+ final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
+ Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1",\r
+ ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue());\r
+ Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1",\r
+ ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue());\r
+ }\r
+\r
+\r
+ /**\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+ */\r
+ @Test\r
+ public void testWithMatchEntryWithDstArbitraryBitMaskAndSrcCidrMask() {\r
+ final MatchBuilder builder = new MatchBuilder();\r
+ builder.setType(OxmMatchType.class);\r
+ final List<MatchEntry> entries = new ArrayList<>();\r
+ MatchEntryBuilder entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata.class);\r
+ entriesBuilder.setHasMask(true);\r
+\r
+ entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(Ipv4Dst.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder();\r
+ final Ipv4DstBuilder ipv4AddressBuilder = new Ipv4DstBuilder();\r
+ ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.1.1"));\r
+ ipv4AddressBuilder.setMask(new byte[]{(byte) 255, 0, (byte) 240, 0});\r
+ ipv4DstCaseBuilder.setIpv4Dst(ipv4AddressBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build());\r
+ entries.add(entriesBuilder.build());\r
+\r
+ entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(Ipv4Src.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder();\r
+ final Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder();\r
+ ipv4SrcBuilder.setIpv4Address(new Ipv4Address("10.1.1.1"));\r
+ ipv4SrcBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 255, 0});\r
+ ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build());\r
+ entries.add(entriesBuilder.build());\r
+\r
+ builder.setMatchEntry(entries);\r
+ final Match match = builder.build();\r
+\r
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+ .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13);\r
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build();\r
+\r
+ final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
+ Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1",\r
+ ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue());\r
+ Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1",\r
+ ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue());\r
+ }\r
+\r
+ /**\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+ */\r
+ @Test\r
+ public void testWithMatchEntryWithDstCidrMaskAndSrcArbitraryBitMask() {\r
+ final MatchBuilder builder = new MatchBuilder();\r
+ builder.setType(OxmMatchType.class);\r
+ final List<MatchEntry> entries = new ArrayList<>();\r
+ MatchEntryBuilder entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata.class);\r
+ entriesBuilder.setHasMask(true);\r
+\r
+ entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(Ipv4Dst.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder();\r
+ final Ipv4DstBuilder ipv4AddressBuilder = new Ipv4DstBuilder();\r
+ ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.1.1"));\r
+ ipv4AddressBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 240, 0});\r
+ ipv4DstCaseBuilder.setIpv4Dst(ipv4AddressBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build());\r
+ entries.add(entriesBuilder.build());\r
+\r
+ entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(Ipv4Src.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder();\r
+ final Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder();\r
+ ipv4SrcBuilder.setIpv4Address(new Ipv4Address("10.1.1.1"));\r
+ ipv4SrcBuilder.setMask(new byte[]{(byte) 255, (byte) 0, (byte) 255, 0});\r
+ ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build());\r
+ entries.add(entriesBuilder.build());\r
+\r
+ builder.setMatchEntry(entries);\r
+ final Match match = builder.build();\r
+\r
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+ .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13);\r
final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build();\r
\r
final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
- Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1", ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue());\r
- Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1", ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue());\r
+ Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1",\r
+ ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue());\r
+ Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1",\r
+ ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue());\r
}\r
\r
/**\r
- * 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)}\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
*/\r
@Test\r
public void testLayer4MatchUdp() {\r
}\r
\r
/**\r
- * 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)}\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
*/\r
@Test\r
public void testLayer4MatchSctp() {\r
}\r
\r
/**\r
- * 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)}\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
*/\r
@Test\r
public void testLayer3MatchIpv6() {\r
}\r
\r
/**\r
- * 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)}\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
*/\r
@Test\r
public void testLayer3MatchIpv6ExtHeader2() {\r
}\r
\r
/**\r
- * 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)}\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
*/\r
@Test\r
public void testLayer3MatchArp() {\r
}\r
\r
/**\r
- * 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)}\r
+ * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+ * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+ * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
*/\r
@Test\r
public void testLayer3MatchArpWithMasks() {\r