2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases;
11 import java.util.Optional;
12 import javax.annotation.Nonnull;
13 import org.opendaylight.openflowplugin.api.OFConstants;
14 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase;
15 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil;
16 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCase;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.src._case.Ipv6Src;
26 public class OfToSalIpv6SrcCase extends ConvertorCase<Ipv6SrcCase, MatchBuilder, MatchResponseConvertorData> {
27 public OfToSalIpv6SrcCase() {
28 super(Ipv6SrcCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3);
32 public Optional<MatchBuilder> process(@Nonnull Ipv6SrcCase source, MatchResponseConvertorData data) {
33 final MatchBuilder matchBuilder = data.getMatchBuilder();
34 final Ipv6MatchBuilder ipv6MatchBuilder = data.getIpv6MatchBuilder();
35 final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder = data.getIpv6MatchArbitraryBitMaskBuilder();
37 Ipv6Src ipv6Src = source.getIpv6Src();
39 if (ipv6Src != null) {
40 byte[] mask = ipv6Src.getMask();
41 if (mask != null && IpConversionUtil.isIpv6ArbitraryBitMask(mask)) {
42 // case where ipv6dst is of type ipv6MatchBuilder and ipv6src is of type ipv6MatchArbitrary.
43 // Need to convert ipv6dst to ipv6MatchArbitrary.
45 if (ipv6MatchBuilder.getIpv6Destination() != null) {
46 Ipv6Prefix ipv6PrefixDestinationAddress = ipv6MatchBuilder.getIpv6Destination();
47 Ipv6Address ipv6DstAddress = IpConversionUtil.extractIpv6Address(ipv6PrefixDestinationAddress);
48 Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
49 IpConversionUtil.extractIpv6AddressMask(ipv6PrefixDestinationAddress));
50 setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
51 dstIpv6ArbitraryMask, IpConversionUtil.compressedIpv6Format(ipv6DstAddress.getValue()));
53 Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
54 IpConversionUtil.createIpv6ArbitraryBitMask(mask));
55 String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Src.getIpv6Address().getValue());
56 setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
57 srcIpv6ArbitraryMask, stringIpv6SrcAddress);
58 matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
59 } else if (ipv6MatchArbitraryBitMaskBuilder.getIpv6DestinationAddressNoMask() != null) {
62 Case where destination is of type ipv6MatchArbitraryBitMask already exists in Layer3Match,
63 source which of type ipv6Match needs to be converted to ipv4MatchArbitraryBitMask.
64 We convert 1::/32 to 1::/FFFF:FFFF::
66 <ipv6-source>1::/32</ipv4-source>
67 <ipv6-destination-address-no-mask>1::1</ipv6-destination-address-no-mask>
68 <ipv6-destination-arbitrary-bitmask>FFFF::0001</ipv6-destination-arbitrary-bitmask>
69 after conversion output example:-
70 <ipv6-source-address-no-mask>1::</ipv6-source-address-no-mask>
71 <ipv6-source-arbitrary-bitmask>FFFF:FFFF::</ipv6-source-arbitrary-bitmask>
72 <ipv6-destination-address-no-mask>1::1</ipv6-destination-address-no-mask>
73 <ipv6-destination-arbitrary-bitmask>FFFF::0001</ipv6-destination-arbitrary-bitmask>
75 Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
76 IpConversionUtil.createIpv6ArbitraryBitMask(mask));
77 String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Src.getIpv6Address().getValue());
78 setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
79 srcIpv6ArbitraryMask, stringIpv6SrcAddress);
80 matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
82 String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Src.getIpv6Address().getValue());
83 setIpv6MatchBuilderFields(ipv6MatchBuilder, mask, stringIpv6SrcAddress);
84 matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
88 return Optional.of(matchBuilder);
91 private static void setIpv6MatchBuilderFields(final Ipv6MatchBuilder ipv6MatchBuilder, final byte[] mask, final String ipv6PrefixStr) {
92 Ipv6Prefix ipv6Prefix;
95 ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr), mask);
97 ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr));
100 ipv6MatchBuilder.setIpv6Source(ipv6Prefix);
103 private static void setSrcIpv6MatchArbitraryBitMaskBuilderFields(
104 final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder,
105 final Ipv6ArbitraryMask mask, final String ipv6AddressStr) {
106 Ipv6Address ipv6Address;
108 ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(mask);
110 ipv6Address = new Ipv6Address(ipv6AddressStr);
111 ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(ipv6Address);
114 private static void setDstIpv6MatchArbitraryBitMaskBuilderFields(
115 final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder,
116 final Ipv6ArbitraryMask mask, final String ipv6AddressStr) {
117 Ipv6Address ipv6Address;
119 ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(mask);
121 ipv6Address = new Ipv6Address(ipv6AddressStr);
122 ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(ipv6Address);