--- /dev/null
+module opendaylight-ipv6-arbitrary-bitmask-fields {
+ namespace "urn:opendaylight:opendaylight-ipv6-arbitrary-bitmask-fields";
+ prefix "ipv6-arbitrary-bitmask";
+
+ import ietf-inet-types {prefix inet; revision-date "2013-07-15";}
+
+
+ revision 2016-02-24 {
+ description "Initial revision";
+ }
+
+ typedef ipv6-arbitrary-mask {
+ type string {
+ pattern
+ '(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|'
+ + '([0-9a-fA-F]{1,4}:){1,7}:|'
+ + '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|'
+ + '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|'
+ + '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|'
+ + '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|'
+ + '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|'
+ + '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|'
+ + ':((:[0-9a-fA-F]{1,4}){1,7}|:))';
+ }
+ }
+
+ grouping "ipv6-match-arbitrary-bitmask-fields" {
+
+ leaf ipv6-source-address-no-mask {
+ description "IPv6 source address with no mask.";
+ type inet:ipv6-address;
+ }
+
+ leaf ipv6-source-arbitrary-bitmask {
+ description "Arbitrary bit mask of IPv6 source address.";
+ type ipv6-arbitrary-mask;
+ }
+
+ leaf ipv6-destination-address-no-mask {
+ description "IPv6 destination address with no mask.";
+ type inet:ipv6-address;
+ }
+
+ leaf ipv6-destination-arbitrary-bitmask {
+ description "Arbitrary bit mask of IPv6 destination address.";
+ type ipv6-arbitrary-mask;
+ }
+ }
+
+}
\ No newline at end of file
import opendaylight-l2-types {prefix l2t;revision-date "2013-08-27";}
import opendaylight-inventory {prefix inv;revision-date "2013-08-19";}
import opendaylight-arbitrary-bitmask-fields {prefix mask; revision-date "2016-01-30";}
+ import opendaylight-ipv6-arbitrary-bitmask-fields {prefix ipv6-arbitrary-mask; revision-date "2016-02-24";}
revision "2013-10-26" {
description "Initial revision of match types";
case "ipv6-match" {
uses "ipv6-match-fields";
}
+ case "ipv6-match-arbitrary-bit-mask"{
+ uses ipv6-arbitrary-mask:ipv6-match-arbitrary-bitmask-fields;
+ }
case "arp-match" {
uses "arp-match-fields";
}
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
+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.collect.Lists;
+import com.google.common.net.InetAddresses;
+import com.google.common.primitives.UnsignedBytes;
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 java.util.BitSet;
import java.util.Iterator;
import java.util.List;
-import com.google.common.collect.Lists;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;
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;
-
/**
* Created by Martin Bobak <mbobak@cisco.com> on 5.3.2015.
private static final int IPV4_ADDRESS_LENGTH = 32;
private static final int IPV6_ADDRESS_LENGTH = 128;
private static final String DEFAULT_ARBITRARY_BIT_MASK = "255.255.255.255";
+ private static final String DEFAULT_IPV6_ARBITRARY_BITMASK = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff";
/*
* Prefix bytearray lookup table. We concatenate the prefixes
return IetfInetUtil.INSTANCE.ipv4PrefixFor(ipv4Address, countBits(bytemask));
}
- public static DottedQuad createArbitraryBitMask(final byte [] bytemask) {
+ public static DottedQuad createArbitraryBitMask(final byte [] bitmask) {
DottedQuad dottedQuad = null;
- if (bytemask == null ) {
+ if (bitmask == null ) {
dottedQuad = new DottedQuad(DEFAULT_ARBITRARY_BIT_MASK);
} else {
try {
- dottedQuad = new DottedQuad(InetAddress.getByAddress(bytemask).getHostAddress());
+ dottedQuad = new DottedQuad(InetAddress.getByAddress(bitmask).getHostAddress());
} catch (UnknownHostException e) {
LOG.error("Failed to create the dottedQuad notation for the given mask ", e);
}
return dottedQuad;
}
+ public static Ipv6ArbitraryMask createIpv6ArbitraryBitMask(final byte [] bitmask) {
+ Ipv6ArbitraryMask ipv6ArbitraryMask = null;
+ if (bitmask == null ) {
+ ipv6ArbitraryMask = new Ipv6ArbitraryMask(DEFAULT_IPV6_ARBITRARY_BITMASK);
+ } else {
+ try {
+ ipv6ArbitraryMask = new Ipv6ArbitraryMask(InetAddress.getByAddress(bitmask).getHostAddress());
+ } catch (UnknownHostException e) {
+ LOG.error("Failed to create the Ipv6ArbitraryMask notation for the given mask ", e);
+ }
+ }
+ return ipv6ArbitraryMask;
+ }
+
public static Ipv6Prefix createPrefix(final Ipv6Address ipv6Address){
return IetfInetUtil.INSTANCE.ipv6PrefixFor(ipv6Address);
}
List<String> partsV6Prefix = Lists.newArrayList(splittedV6Prefix.iterator());
boolean valid = true;
-
+
try {
mask = Integer.parseInt(partsV6Prefix.get(1));
if (mask > 128) {
return netMask;
}
+ public static Ipv6ArbitraryMask extractIpv6AddressMask(final Ipv6Prefix ipv6Prefix) {
+ Iterator<String> addressParts = PREFIX_SPLITTER.split(ipv6Prefix.getValue()).iterator();
+ addressParts.next();
+ int maskLength = 0;
+ if (addressParts.hasNext()) {
+ maskLength = Integer.parseInt(addressParts.next());
+ }
+ BitSet ipmask = new BitSet(128);
+ ipmask.set(0,maskLength,true);
+ ipmask.set(maskLength+1,128,false);
+ byte[] finalmask = new byte[16];
+ System.arraycopy(ipmask.toByteArray(),0,finalmask,0,ipmask.toByteArray().length);
+ InetAddress inetAddress = null;
+ try {
+ inetAddress = InetAddress.getByAddress(finalmask);
+ } catch (UnknownHostException e) {
+ LOG.error("Failed to convert the Ipv6 subnetmask from integer to mask value ", e);
+ }
+ return new Ipv6ArbitraryMask(inetAddress.getHostAddress());
+ }
+
public static Integer extractIpv6Prefix(final Ipv6Prefix ipv6Prefix) {
return IetfInetUtil.INSTANCE.splitIpv6Prefix(ipv6Prefix).getValue();
}
try {
maskInIpFormat = InetAddress.getByName(maskValue);
} catch (UnknownHostException e) {
- LOG.error ("Failed to resolve the ip address of the mask",e);
+ LOG.error ("Failed to resolve the ip address of the mask ",e);
}
byte[] bytes = maskInIpFormat.getAddress();
return bytes;
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) {
integerMaskArrayList.add(Integer.parseInt(string));
}
return false;
}
+
+ public static final byte[] convertIpv6ArbitraryMaskToByteArray(final Ipv6ArbitraryMask mask) {
+ String maskValue;
+ if (mask.getValue() != null) {
+ maskValue = mask.getValue();
+ } else {
+ maskValue = DEFAULT_IPV6_ARBITRARY_BITMASK;
+ }
+ InetAddress maskInIpFormat = null;
+ try {
+ maskInIpFormat = InetAddress.getByName(maskValue);
+ } catch (UnknownHostException e) {
+ LOG.error ("Failed to convert mask string to ipv6 format mask ",e);
+ }
+ return maskInIpFormat.getAddress();
+ }
+
+ public static boolean isIpv6ArbitraryBitMask(final byte[] byteMask) {
+ if (byteMask == null) {
+ return false;
+ } 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) {
+ integerMaskArrayList.add(Integer.parseInt(string));
+ }
+ return checkIpv6ArbitraryBitMask(integerMaskArrayList);
+ }
+ }
+
+ private static boolean checkIpv6ArbitraryBitMask(final ArrayList<Integer> arrayList) {
+ // checks 0*1* case - Leading zeros in arrayList are truncated
+ if (arrayList.size() > 0 && arrayList.size() < IPV6_ADDRESS_LENGTH) {
+ return true;
+ } 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;
+ }
+ }
+ }
+ return false;
+ }
+
+ public static String compressedIpv6Format(final String ipv6Address) {
+ String compressedIpv6Address;
+ compressedIpv6Address = ipv6Address.replaceAll("((?::0+\\b){2,}):?(?!\\S*\\b\\1:0\\b)(\\S*)", "::$2");
+ return compressedIpv6Address;
+ }
+
+ public static Ipv6ArbitraryMask compressedIpv6MaskFormat(final Ipv6ArbitraryMask ipv6Mask) {
+ String stringIpv6Mask = ipv6Mask.getValue();
+ return new Ipv6ArbitraryMask(compressedIpv6Format(stringIpv6Mask));
+ }
}
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.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.Ipv6MatchArbitraryBitMask;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;
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.protocol.match.fields.Pbb;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldAction;
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
*/
private static void layer3Match(final List<MatchEntry> matchEntryList, final Layer3Match layer3Match) {
if (layer3Match != null) {
+ if(layer3Match instanceof Ipv6MatchArbitraryBitMask){
+ Ipv6MatchArbitraryBitMask Ipv6ArbitraryMaskMatchFields = (Ipv6MatchArbitraryBitMask) layer3Match;
+ if (Ipv6ArbitraryMaskMatchFields.getIpv6SourceAddressNoMask() != null) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setOxmMatchField(Ipv6Src.class);
+
+ Ipv6SrcCaseBuilder ipv6SrcCaseBuilder = new Ipv6SrcCaseBuilder();
+ Ipv6SrcBuilder ipv6SrcBuilder = new Ipv6SrcBuilder();
+ ipv6SrcBuilder.setIpv6Address(Ipv6ArbitraryMaskMatchFields.getIpv6SourceAddressNoMask());
+ Ipv6ArbitraryMask sourceArbitrarySubNetMask = Ipv6ArbitraryMaskMatchFields.getIpv6SourceArbitraryBitmask();
+ boolean hasMask = false;
+ if (sourceArbitrarySubNetMask != null) {
+ byte[] maskByteArray = IpConversionUtil.convertIpv6ArbitraryMaskToByteArray(sourceArbitrarySubNetMask);
+ if (maskByteArray != null) {
+ ipv6SrcBuilder.setMask(maskByteArray);
+ hasMask = true;
+ }
+ }
+ matchEntryBuilder.setHasMask(hasMask);
+ ipv6SrcCaseBuilder.setIpv6Src(ipv6SrcBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(ipv6SrcCaseBuilder.build());
+ matchEntryList.add(matchEntryBuilder.build());
+ }
+ if (Ipv6ArbitraryMaskMatchFields.getIpv6DestinationAddressNoMask() != null) {
+ MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
+ matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
+ matchEntryBuilder.setOxmMatchField(Ipv6Dst.class);
+
+ Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder();
+ Ipv6DstBuilder ipv6DstBuilder = new Ipv6DstBuilder();
+
+ ipv6DstBuilder.setIpv6Address(Ipv6ArbitraryMaskMatchFields.getIpv6DestinationAddressNoMask());
+ Ipv6ArbitraryMask destinationArbitrarySubNetMask = Ipv6ArbitraryMaskMatchFields.getIpv6DestinationArbitraryBitmask();
+
+ boolean hasMask = false;
+ if (destinationArbitrarySubNetMask != null) {
+ byte[] maskByteArray = IpConversionUtil.convertIpv6ArbitraryMaskToByteArray(destinationArbitrarySubNetMask);
+ if (maskByteArray != null) {
+ ipv6DstBuilder.setMask(maskByteArray);
+ hasMask = true;
+ }
+ }
+ matchEntryBuilder.setHasMask(hasMask);
+ ipv6DstCaseBuilder.setIpv6Dst(ipv6DstBuilder.build());
+ matchEntryBuilder.setMatchEntryValue(ipv6DstCaseBuilder.build());
+ matchEntryList.add(matchEntryBuilder.build());
+ }
+ }
if(layer3Match instanceof Ipv4MatchArbitraryBitMask) {
Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMaskFields = (Ipv4MatchArbitraryBitMask) layer3Match;
if (ipv4MatchArbitraryBitMaskFields.getIpv4SourceAddressNoMask() != null) {
Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder();
Ipv6MatchBuilder ipv6MatchBuilder = new Ipv6MatchBuilder();
+ Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder = new Ipv6MatchArbitraryBitMaskBuilder();
ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder = new TunnelIpv4MatchBuilder();
}
}
} else if (ofMatch.getOxmMatchField().equals(Ipv6Src.class)) {
- org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.src._case.Ipv6Src ipv6Src = ((Ipv6SrcCase) ofMatch.getMatchEntryValue()).getIpv6Src();
-
- if (ipv6Src != null) {
- String ipv6PrefixStr = ipv6Src.getIpv6Address().getValue();
- byte[] mask = ipv6Src.getMask();
- setIpv6MatchBuilderFields(ipv6MatchBuilder, ofMatch, ipv6PrefixStr, mask);
- matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
+ org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.src._case.Ipv6Src ipv6Address = ((Ipv6SrcCase) ofMatch.getMatchEntryValue()).getIpv6Src();
+ if (ipv6Address != null) {
+ byte[] mask = ipv6Address.getMask();
+ if (mask != null && IpConversionUtil.isIpv6ArbitraryBitMask(mask)) {
+ // case where ipv6dst is of type ipv6MatchBuilder and ipv6src is of type ipv6MatchArbitrary.
+ // Need to convert ipv6dst to ipv6MatchArbitrary.
+
+ if (ipv6MatchBuilder.getIpv6Destination() != null) {
+ Ipv6Prefix ipv6PrefixDestinationAddress = ipv6MatchBuilder.getIpv6Destination();
+ Ipv6Address ipv6DstAddress = IpConversionUtil.extractIpv6Address(ipv6PrefixDestinationAddress);
+ Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
+ IpConversionUtil.extractIpv6AddressMask(ipv6PrefixDestinationAddress));
+ setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch,
+ dstIpv6ArbitraryMask, IpConversionUtil.compressedIpv6Format(ipv6DstAddress.getValue()));
+ }
+ Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
+ IpConversionUtil.createIpv6ArbitraryBitMask(mask));
+ String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue());
+ setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch,
+ srcIpv6ArbitraryMask, stringIpv6SrcAddress);
+ matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
+ } else if (ipv6MatchArbitraryBitMaskBuilder.getIpv6DestinationAddressNoMask() != null) {
+ /*
+ TODO Change comments
+ Case where destination is of type ipv6MatchArbitraryBitMask already exists in Layer3Match,
+ source which of type ipv6Match needs to be converted to ipv4MatchArbitraryBitMask.
+ We convert 1::/32 to 1::/FFFF:FFFF::
+ example:-
+ <ipv6-source>1::/32</ipv4-source>
+ <ipv6-destination-address-no-mask>1::1</ipv6-destination-address-no-mask>
+ <ipv6-destination-arbitrary-bitmask>FFFF::0001</ipv6-destination-arbitrary-bitmask>
+ after conversion output example:-
+ <ipv6-source-address-no-mask>1::</ipv6-source-address-no-mask>
+ <ipv6-source-arbitrary-bitmask>FFFF:FFFF::</ipv6-source-arbitrary-bitmask>
+ <ipv6-destination-address-no-mask>1::1</ipv6-destination-address-no-mask>
+ <ipv6-destination-arbitrary-bitmask>FFFF::0001</ipv6-destination-arbitrary-bitmask>
+ */
+ Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
+ IpConversionUtil.createIpv6ArbitraryBitMask(mask));
+ String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue());
+ setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch,
+ srcIpv6ArbitraryMask, stringIpv6SrcAddress);
+ matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
+ } else {
+ String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue());
+ setIpv6MatchBuilderFields(ipv6MatchBuilder, ofMatch, mask, stringIpv6SrcAddress);
+ matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
+ }
}
} else if (ofMatch.getOxmMatchField().equals(Ipv6Dst.class)) {
- org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.dst._case.Ipv6Dst ipv6Dst = ((Ipv6DstCase) ofMatch.getMatchEntryValue()).getIpv6Dst();
-
- if (ipv6Dst != null) {
- String ipv6PrefixStr = ipv6Dst.getIpv6Address().getValue();
- byte[] mask = ipv6Dst.getMask();
- setIpv6MatchBuilderFields(ipv6MatchBuilder, ofMatch, ipv6PrefixStr, mask);
- matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
+ org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.dst._case.Ipv6Dst ipv6Address = ((Ipv6DstCase) ofMatch.getMatchEntryValue()).getIpv6Dst();
+ if (ipv6Address != null) {
+ byte[] mask = ipv6Address.getMask();
+ if (mask != null && IpConversionUtil.isIpv6ArbitraryBitMask(mask)) {
+ // case where ipv6src is of type ipv6MatchBuilder and ipv6dst is of type ipv6MatchArbitrary.
+ // Need to convert ipv6src to ipv6MatchArbitrary.
+
+ if (ipv6MatchBuilder.getIpv6Source() != null) {
+ Ipv6Prefix ipv6PrefixSourceAddress = ipv6MatchBuilder.getIpv6Source();
+ Ipv6Address ipv6SrcAddress = IpConversionUtil.extractIpv6Address(ipv6PrefixSourceAddress);
+ Ipv6ArbitraryMask srcIpv6Arbitrary = IpConversionUtil.compressedIpv6MaskFormat(
+ IpConversionUtil.extractIpv6AddressMask(ipv6PrefixSourceAddress));
+ setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch,
+ srcIpv6Arbitrary, IpConversionUtil.compressedIpv6Format(ipv6SrcAddress.getValue()));
+ }
+ Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
+ IpConversionUtil.createIpv6ArbitraryBitMask(mask));
+ String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue());
+ setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch,
+ dstIpv6ArbitraryMask, stringIpv6DstAddress);
+ matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
+ } else if (ipv6MatchArbitraryBitMaskBuilder.getIpv6SourceAddressNoMask() != null) {
+ /*
+ TODO Change comments
+ Case where source is of type ipv4MatchArbitraryBitMask already exists in Layer3Match,
+ source which of type ipv6Match needs to be converted to ipv6MatchArbitraryBitMask.
+ We convert 1::/32 to 1::/FFFF:FFFF::
+ example:-
+ <ipv6-destination>1::/32</ipv6-destination>
+ <ipv6-source-address-no-mask>1::1</ipv6-source-address-no-mask>
+ <ipv6-source-arbitrary-bitmask>FFFF::0001</ipv6-source-arbitrary-bitmask>
+ after conversion output example:-
+ <ipv6-destination-address-no-mask>1::</ipv6-destination-address-no-mask>
+ <ipv6-destination-arbitrary-bitmask>FFFF:FFFF::</ipv6-destination-arbitrary-bitmask>
+ <ipv6-source-address-no-mask>1::1</ipv6-source-address-no-mask>
+ <ipv6-source-arbitrary-bitmask>FFFF::0001</ipv6-source-arbitrary-bitmask>
+ */
+ Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
+ IpConversionUtil.createIpv6ArbitraryBitMask(mask));
+ String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue());
+ setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch,
+ dstIpv6ArbitraryMask, stringIpv6DstAddress);
+ matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
+ } else {
+ String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue());
+ setIpv6MatchBuilderFields(ipv6MatchBuilder, ofMatch, mask, stringIpv6DstAddress);
+ matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
+ }
}
} else if (ofMatch.getOxmMatchField().equals(Ipv6Flabel.class)) {
org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.flabel._case.Ipv6Flabel ipv6Flabel = ((Ipv6FlabelCase) ofMatch.getMatchEntryValue()).getIpv6Flabel();
return matchBuilder;
}
- private static void setIpv6MatchBuilderFields(final Ipv6MatchBuilder ipv6MatchBuilder, final MatchEntry ofMatch, final String ipv6PrefixStr, final byte[] mask) {
+ private static void setIpv6MatchBuilderFields(final Ipv6MatchBuilder ipv6MatchBuilder, final MatchEntry ofMatch, final byte[] mask, final String ipv6PrefixStr) {
Ipv6Prefix ipv6Prefix;
if (mask != null) {
ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask(ipv4Address);
}
+ private static void setSrcIpv6MatchArbitraryBitMaskBuilderFields(
+ final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder,
+ final MatchEntry ofMatch, final Ipv6ArbitraryMask mask, final String ipv6AddressStr) {
+ Ipv6Address ipv6Address;
+ if (mask != null) {
+ ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(mask);
+ }
+ ipv6Address = new Ipv6Address(ipv6AddressStr);
+ ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(ipv6Address);
+ }
+
+ private static void setDstIpv6MatchArbitraryBitMaskBuilderFields(
+ final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder,
+ final MatchEntry ofMatch, final Ipv6ArbitraryMask mask, final String ipv6AddressStr) {
+ Ipv6Address ipv6Address;
+ if (mask != null) {
+ ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(mask);
+ }
+ ipv6Address = new Ipv6Address(ipv6AddressStr);
+ ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(ipv6Address);
+ }
private static MatchEntry toOfMplsPbb(final Pbb pbb) {
MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;\r
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;\r
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;\r
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;\r
import org.slf4j.Logger;\r
import org.slf4j.LoggerFactory;\r
dottedQuad = IpConversionUtil.extractIpv4AddressMask(new Ipv4Prefix("1.1.1.1/24"));\r
Assert.assertEquals(dottedQuad.getValue(),"255.255.255.0");\r
}\r
+\r
+ @Test\r
+ public void convertipv6ArbitraryMaskToByteArrayTest() {\r
+ byte[] bytes = {-5,-96,-1,-74,-1,-16,-1,-16, -1,-16,-1,-16,-1,-16,-91,85};\r
+ byte[] maskBytes = IpConversionUtil.convertIpv6ArbitraryMaskToByteArray(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));\r
+ for(int i=0; i<bytes.length;i++){\r
+ int mask = maskBytes[i];\r
+ Assert.assertEquals(bytes[i],mask);\r
+ }\r
+ }\r
+\r
+ @Test\r
+ public void createArbitraryBitMaskTest() {\r
+ byte[] bytes = {-1,-1,-1,0};\r
+ DottedQuad dottedQuad;\r
+ dottedQuad = IpConversionUtil.createArbitraryBitMask(bytes);\r
+ Assert.assertEquals(dottedQuad.getValue(),"255.255.255.0");\r
+ DottedQuad dottedQuadNull;\r
+ dottedQuadNull = IpConversionUtil.createArbitraryBitMask(null);\r
+ Assert.assertEquals(dottedQuadNull.getValue(),"255.255.255.255");\r
+ }\r
+\r
+ @Test\r
+ public void createIpv6ArbitraryBitMaskTest() {\r
+ byte[] bytes = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};\r
+ Ipv6ArbitraryMask ipv6ArbitraryMask;\r
+ ipv6ArbitraryMask = IpConversionUtil.createIpv6ArbitraryBitMask(bytes);\r
+ Assert.assertEquals(ipv6ArbitraryMask.getValue(),"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");\r
+ Ipv6ArbitraryMask ipv6ArbitraryMaskNull;\r
+ ipv6ArbitraryMaskNull = IpConversionUtil.createIpv6ArbitraryBitMask(null);\r
+ Assert.assertEquals(ipv6ArbitraryMaskNull.getValue(),"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");\r
+ }\r
+\r
+ @Test\r
+ public void extractIpv6AddressMaskTest() {\r
+ Ipv6ArbitraryMask ipv6IpAddressMask;\r
+ Ipv6Prefix ipv6Prefix = new Ipv6Prefix("1:2:3:4:5:6:7:8/16");\r
+ ipv6IpAddressMask = IpConversionUtil.extractIpv6AddressMask(ipv6Prefix);\r
+ Assert.assertEquals(ipv6IpAddressMask.getValue(),"ffff:0:0:0:0:0:0:0");\r
+ }\r
+\r
+ @Test\r
+ public void isIpv6ArbitraryBitMaskTest() {\r
+ byte[] bytes = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};\r
+ boolean falseCase = false;\r
+ boolean trueCase = true;\r
+ Assert.assertEquals(falseCase,IpConversionUtil.isIpv6ArbitraryBitMask(bytes));\r
+ byte[] bytesArbitraryMask = {-1,-1,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};\r
+ Assert.assertEquals(trueCase,IpConversionUtil.isIpv6ArbitraryBitMask(bytesArbitraryMask));\r
+ Assert.assertEquals(falseCase,IpConversionUtil.isIpv6ArbitraryBitMask(null));\r
+ byte[] bytesMask = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0};\r
+ Assert.assertEquals(falseCase,IpConversionUtil.isIpv6ArbitraryBitMask(bytesMask));\r
+ byte[] bytesArbMask = {0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};\r
+ Assert.assertEquals(trueCase,IpConversionUtil.isIpv6ArbitraryBitMask(bytesArbMask));\r
+ }\r
+\r
+ @Test\r
+ public void extractIpv6AddressTest() {\r
+ Ipv6Address ipv6Address;\r
+ ipv6Address = IpConversionUtil.extractIpv6Address(new Ipv6Prefix("1:2:3:4:5:6:7:8/16"));\r
+ Assert.assertEquals(ipv6Address.getValue(),"1:2:3:4:5:6:7:8");\r
+ }\r
+\r
+ @Test\r
+ public void extractIpv6PrefixTest() {\r
+ int ipv6Address;\r
+ ipv6Address = IpConversionUtil.extractIpv6Prefix(new Ipv6Prefix("1:2:3:4:5:6:7:8/16"));\r
+ Assert.assertEquals(ipv6Address,16);\r
+ }\r
+\r
+ @Test\r
+ public void compressedIpv6MaskFormatTest() {\r
+ Ipv6ArbitraryMask compressedIpv6IpAddressMask;\r
+ Ipv6ArbitraryMask ipv6IpAddressMask = new Ipv6ArbitraryMask("FFFF:0000:0000:0:0:0:1001:1000");\r
+ compressedIpv6IpAddressMask = IpConversionUtil.compressedIpv6MaskFormat(ipv6IpAddressMask);\r
+ Assert.assertEquals(compressedIpv6IpAddressMask.getValue(),"FFFF::1001:1000");\r
+ }\r
}\r
\r
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;\r
\r
+import java.math.BigInteger;\r
+import java.util.List;\r
import org.junit.Assert;\r
import org.junit.Before;\r
import org.junit.Test;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpOp;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSha;\r
Assert.assertArrayEquals("Wrong tunnel id mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 14},\r
((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getMask());\r
}\r
+\r
+ /**\r
+ * Test {@link MatchConvertorImpl#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match, java.math.BigInteger)}\r
+ */\r
+ @Test\r
+ public void testIpv6MatchArbitraryBitMask(){\r
+ MatchBuilder builder = new MatchBuilder();\r
+ Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder= new Ipv6MatchArbitraryBitMaskBuilder();\r
+ ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));\r
+ ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));\r
+ ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));\r
+ ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));\r
+ builder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());\r
+ Match match = builder.build();\r
+\r
+ List<MatchEntry> entries = convertor.convert(match, new BigInteger("42"));\r
+ Assert.assertEquals("Wrong entries size", 2, entries.size());\r
+\r
+ MatchEntry entry = entries.get(0);\r
+ checkEntryHeader(entry,Ipv6Src.class,true);\r
+ Assert.assertEquals("wrong Ipv6Adress source", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());\r
+ entry = entries.get(1);\r
+ checkEntryHeader(entry,Ipv6Dst.class,true);\r
+ Assert.assertEquals("wrong Ipv6Adress destination", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());\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
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMask;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMask;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatch;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatch;\r
final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build();\r
\r
final Ipv6Match ipv6Match = (Ipv6Match) builtMatch.getLayer3Match();\r
- Assert.assertEquals("Wrong ipv6 src address", "2001:cdba:0000:0000:0000:0000:3257:9657/128",\r
+ Assert.assertEquals("Wrong ipv6 src address", "2001:cdba::3257:9657/128",\r
ipv6Match.getIpv6Source().getValue());\r
- Assert.assertEquals("Wrong ipv6 dst address", "2001:cdba:0000:0000:0000:0000:3257:9658/128",\r
+ Assert.assertEquals("Wrong ipv6 dst address", "2001:cdba::3257:9658/128",\r
ipv6Match.getIpv6Destination().getValue());\r
Assert.assertEquals("Wrong ipv6 nd target", "2001:cdba:0000:0000:0000:0000:3257:9659",\r
ipv6Match.getIpv6NdTarget().getValue());\r
Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:04", arpMatch.getArpTargetHardwareAddress().getAddress().getValue());\r
Assert.assertEquals("Wrong arp tha mask", "01:01:01:02:02:02", arpMatch.getArpTargetHardwareAddress().getMask().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 testWithMatchEntryWithIpv6ArbitraryMasks() {\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(Ipv6Src.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv6SrcCaseBuilder ipv6SrcCaseBuilder = new Ipv6SrcCaseBuilder();\r
+ final Ipv6SrcBuilder ipv6SrcBuilder = new Ipv6SrcBuilder();\r
+ ipv6SrcBuilder.setIpv6Address(new Ipv6Address("1001:1001:1001:1001:1001:1001:1001:1001"));\r
+ ipv6SrcBuilder.setMask(new byte[]{(byte) 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,(byte) 255});\r
+ ipv6SrcCaseBuilder.setIpv6Src(ipv6SrcBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv6SrcCaseBuilder.build());\r
+ entries.add(entriesBuilder.build());\r
+\r
+ entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(Ipv6Dst.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder();\r
+ final Ipv6DstBuilder ipv6AddressBuilder = new Ipv6DstBuilder();\r
+ ipv6AddressBuilder.setIpv6Address(new Ipv6Address("2002:2002:2002:2002:2002:2002:2002:2002"));\r
+ ipv6AddressBuilder.setMask(new byte[]{(byte) 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,(byte) 255});\r
+ ipv6DstCaseBuilder.setIpv6Dst(ipv6AddressBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv6DstCaseBuilder.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 Ipv6MatchArbitraryBitMask ipv6MatchArbitraryBitMask = (Ipv6MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
+ Assert.assertEquals("Wrong ipv6 src address", "1001:1001:1001:1001:1001:1001:1001:1001",\r
+ ipv6MatchArbitraryBitMask.getIpv6SourceAddressNoMask().getValue());\r
+ Assert.assertEquals("Wrong ipv6 dst address", "2002:2002:2002:2002:2002:2002:2002:2002",\r
+ ipv6MatchArbitraryBitMask.getIpv6DestinationAddressNoMask().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 testWithMatchEntryWithIpv6SrcCidrlMaskAndDstArbitraryBitMask() {\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(Ipv6Src.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv6SrcCaseBuilder ipv6SrcCaseBuilder = new Ipv6SrcCaseBuilder();\r
+ final Ipv6SrcBuilder ipv6SrcBuilder = new Ipv6SrcBuilder();\r
+ ipv6SrcBuilder.setIpv6Address(new Ipv6Address("1001:1001:1001:1001:1001:1001:1001:1001"));\r
+ ipv6SrcBuilder.setMask(new byte[]{(byte) 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0});\r
+ ipv6SrcCaseBuilder.setIpv6Src(ipv6SrcBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv6SrcCaseBuilder.build());\r
+ entries.add(entriesBuilder.build());\r
+\r
+ entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(Ipv6Dst.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder();\r
+ final Ipv6DstBuilder ipv6AddressBuilder = new Ipv6DstBuilder();\r
+ ipv6AddressBuilder.setIpv6Address(new Ipv6Address("2002:2002:2002:2002:2002:2002:2002:2002"));\r
+ ipv6AddressBuilder.setMask(new byte[]{(byte) 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,(byte) 255});\r
+ ipv6DstCaseBuilder.setIpv6Dst(ipv6AddressBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv6DstCaseBuilder.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 Ipv6MatchArbitraryBitMask ipv6MatchArbitraryBitMask = (Ipv6MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
+ Assert.assertEquals("Wrong ipv6 src address", "1001:1001:1001:1001:1001:1001:1001:1001",\r
+ ipv6MatchArbitraryBitMask.getIpv6SourceAddressNoMask().getValue());\r
+ Assert.assertEquals("Wrong ipv6 dst address", "2002:2002:2002:2002:2002:2002:2002:2002",\r
+ ipv6MatchArbitraryBitMask.getIpv6DestinationAddressNoMask().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 testWithMatchEntryWithIpv6SrcArbitraryBitMaskAndDstCidrMask() {\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(Ipv6Src.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv6SrcCaseBuilder ipv6SrcCaseBuilder = new Ipv6SrcCaseBuilder();\r
+ final Ipv6SrcBuilder ipv6SrcBuilder = new Ipv6SrcBuilder();\r
+ ipv6SrcBuilder.setIpv6Address(new Ipv6Address("1001:1001:1001:1001:1001:1001:1001:1001"));\r
+ ipv6SrcBuilder.setMask(new byte[]{(byte) 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,(byte) 255});\r
+ ipv6SrcCaseBuilder.setIpv6Src(ipv6SrcBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv6SrcCaseBuilder.build());\r
+ entries.add(entriesBuilder.build());\r
+\r
+ entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(Ipv6Dst.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder();\r
+ final Ipv6DstBuilder ipv6AddressBuilder = new Ipv6DstBuilder();\r
+ ipv6AddressBuilder.setIpv6Address(new Ipv6Address("2002:2002:2002:2002:2002:2002:2002:2002"));\r
+ ipv6AddressBuilder.setMask(new byte[]{(byte) 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0});\r
+ ipv6DstCaseBuilder.setIpv6Dst(ipv6AddressBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv6DstCaseBuilder.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 Ipv6MatchArbitraryBitMask ipv6MatchArbitraryBitMask = (Ipv6MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
+ Assert.assertEquals("Wrong ipv6 src address", "1001:1001:1001:1001:1001:1001:1001:1001",\r
+ ipv6MatchArbitraryBitMask.getIpv6SourceAddressNoMask().getValue());\r
+ Assert.assertEquals("Wrong ipv6 dst address", "2002:2002:2002:2002:2002:2002:2002:2002",\r
+ ipv6MatchArbitraryBitMask.getIpv6DestinationAddressNoMask().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
+\r
+ @Test\r
+ public void testWithMatchEntryWithIpv6DstArbitraryBitMaskAndSrcCidrMask() {\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(Ipv6Dst.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder();\r
+ final Ipv6DstBuilder ipv6AddressBuilder = new Ipv6DstBuilder();\r
+ ipv6AddressBuilder.setIpv6Address(new Ipv6Address("1001:1001:1001:1001:1001:1001:1001:1001"));\r
+ ipv6AddressBuilder.setMask(new byte[]{(byte) 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,(byte) 255});\r
+ ipv6DstCaseBuilder.setIpv6Dst(ipv6AddressBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv6DstCaseBuilder.build());\r
+ entries.add(entriesBuilder.build());\r
+\r
+ entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(Ipv6Src.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv6SrcCaseBuilder ipv6SrcCaseBuilder = new Ipv6SrcCaseBuilder();\r
+ final Ipv6SrcBuilder ipv6SrcBuilder = new Ipv6SrcBuilder();\r
+ ipv6SrcBuilder.setIpv6Address(new Ipv6Address("2002:2002:2002:2002:2002:2002:2002:2002"));\r
+ ipv6SrcBuilder.setMask(new byte[]{(byte) 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0});\r
+ ipv6SrcCaseBuilder.setIpv6Src(ipv6SrcBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv6SrcCaseBuilder.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 Ipv6MatchArbitraryBitMask ipv6MatchArbitraryBitMask = (Ipv6MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
+ Assert.assertEquals("Wrong ipv6 src address", "2002:2002:2002:2002:2002:2002:2002:2002",\r
+ ipv6MatchArbitraryBitMask.getIpv6SourceAddressNoMask().getValue());\r
+ Assert.assertEquals("Wrong ipv6 dst address", "1001:1001:1001:1001:1001:1001:1001:1001",\r
+ ipv6MatchArbitraryBitMask.getIpv6DestinationAddressNoMask().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
+\r
+ @Test\r
+ public void testWithMatchEntryWithIpv6DstCidrMaskAndSrcArbitraryBitMask() {\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(Ipv6Dst.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder();\r
+ final Ipv6DstBuilder ipv6AddressBuilder = new Ipv6DstBuilder();\r
+ ipv6AddressBuilder.setIpv6Address(new Ipv6Address("1001:1001:1001:1001:1001:1001:1001:1001"));\r
+ ipv6AddressBuilder.setMask(new byte[]{(byte) 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0});\r
+ ipv6DstCaseBuilder.setIpv6Dst(ipv6AddressBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv6DstCaseBuilder.build());\r
+ entries.add(entriesBuilder.build());\r
+\r
+ entriesBuilder = new MatchEntryBuilder();\r
+ entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+ entriesBuilder.setOxmMatchField(Ipv6Src.class);\r
+ entriesBuilder.setHasMask(true);\r
+ final Ipv6SrcCaseBuilder ipv6SrcCaseBuilder = new Ipv6SrcCaseBuilder();\r
+ final Ipv6SrcBuilder ipv6SrcBuilder = new Ipv6SrcBuilder();\r
+ ipv6SrcBuilder.setIpv6Address(new Ipv6Address("2002:2002:2002:2002:2002:2002:2002:2002"));\r
+ ipv6SrcBuilder.setMask(new byte[]{(byte) 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,(byte) 255});\r
+ ipv6SrcCaseBuilder.setIpv6Src(ipv6SrcBuilder.build());\r
+ entriesBuilder.setMatchEntryValue(ipv6SrcCaseBuilder.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 Ipv6MatchArbitraryBitMask ipv6MatchArbitraryBitMask = (Ipv6MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
+ Assert.assertEquals("Wrong ipv6 src address", "2002:2002:2002:2002:2002:2002:2002:2002",\r
+ ipv6MatchArbitraryBitMask.getIpv6SourceAddressNoMask().getValue());\r
+ Assert.assertEquals("Wrong ipv6 dst address", "1001:1001:1001:1001:1001:1001:1001:1001",\r
+ ipv6MatchArbitraryBitMask.getIpv6DestinationAddressNoMask().getValue());\r
+ }\r
+\r
+\r
}\r