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.ConvertorExecutor;
15 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorCase;
16 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil;
17 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.data.MatchResponseConvertorData;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCase;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.dst._case.Ipv6Dst;
27 public class OfToSalIpv6DstCase extends ConvertorCase<Ipv6DstCase, MatchBuilder, MatchResponseConvertorData> {
28 public OfToSalIpv6DstCase() {
29 super(Ipv6DstCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3);
33 public Optional<MatchBuilder> process(@Nonnull Ipv6DstCase source, MatchResponseConvertorData data, ConvertorExecutor convertorExecutor) {
34 final MatchBuilder matchBuilder = data.getMatchBuilder();
35 final Ipv6MatchBuilder ipv6MatchBuilder = data.getIpv6MatchBuilder();
36 final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder = data.getIpv6MatchArbitraryBitMaskBuilder();
38 Ipv6Dst ipv6Dst = source.getIpv6Dst();
40 if (ipv6Dst != null) {
41 byte[] mask = ipv6Dst.getMask();
42 if (mask != null && IpConversionUtil.isIpv6ArbitraryBitMask(mask)) {
43 // case where ipv6src is of type ipv6MatchBuilder and ipv6dst is of type ipv6MatchArbitrary.
44 // Need to convert ipv6src to ipv6MatchArbitrary.
46 if (ipv6MatchBuilder.getIpv6Source() != null) {
47 Ipv6Prefix ipv6PrefixSourceAddress = ipv6MatchBuilder.getIpv6Source();
48 Ipv6Address ipv6SrcAddress = IpConversionUtil.extractIpv6Address(ipv6PrefixSourceAddress);
49 Ipv6ArbitraryMask srcIpv6Arbitrary = IpConversionUtil.compressedIpv6MaskFormat(
50 IpConversionUtil.extractIpv6AddressMask(ipv6PrefixSourceAddress));
51 setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
52 srcIpv6Arbitrary, IpConversionUtil.compressedIpv6AddressFormat(ipv6SrcAddress));
54 Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
55 IpConversionUtil.createIpv6ArbitraryBitMask(mask));
56 Ipv6Address stringIpv6DstAddress = IpConversionUtil.compressedIpv6AddressFormat(ipv6Dst.getIpv6Address());
57 setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
58 dstIpv6ArbitraryMask, stringIpv6DstAddress);
59 matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
60 } else if (ipv6MatchArbitraryBitMaskBuilder.getIpv6SourceAddressNoMask() != null) {
63 Case where source is of type ipv4MatchArbitraryBitMask already exists in Layer3Match,
64 source which of type ipv6Match needs to be converted to ipv6MatchArbitraryBitMask.
65 We convert 1::/32 to 1::/FFFF:FFFF::
67 <ipv6-destination>1::/32</ipv6-destination>
68 <ipv6-source-address-no-mask>1::1</ipv6-source-address-no-mask>
69 <ipv6-source-arbitrary-bitmask>FFFF::0001</ipv6-source-arbitrary-bitmask>
70 after conversion output example:-
71 <ipv6-destination-address-no-mask>1::</ipv6-destination-address-no-mask>
72 <ipv6-destination-arbitrary-bitmask>FFFF:FFFF::</ipv6-destination-arbitrary-bitmask>
73 <ipv6-source-address-no-mask>1::1</ipv6-source-address-no-mask>
74 <ipv6-source-arbitrary-bitmask>FFFF::0001</ipv6-source-arbitrary-bitmask>
76 Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
77 IpConversionUtil.createIpv6ArbitraryBitMask(mask));
78 Ipv6Address stringIpv6DstAddress = IpConversionUtil.compressedIpv6AddressFormat(ipv6Dst.getIpv6Address());
79 setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
80 dstIpv6ArbitraryMask, stringIpv6DstAddress);
81 matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
83 Ipv6Address stringIpv6DstAddress = IpConversionUtil.compressedIpv6AddressFormat(ipv6Dst.getIpv6Address());
84 setIpv6MatchBuilderFields(ipv6MatchBuilder, mask, stringIpv6DstAddress);
85 matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
89 return Optional.of(matchBuilder);
92 private static void setIpv6MatchBuilderFields(final Ipv6MatchBuilder builder, final byte[] mask, final Ipv6Address prefix) {
93 Ipv6Prefix ipv6Prefix;
95 ipv6Prefix = IpConversionUtil.createPrefix(prefix, mask);
97 ipv6Prefix = IpConversionUtil.createPrefix(prefix);
99 builder.setIpv6Destination(ipv6Prefix);
102 private static void setSrcIpv6MatchArbitraryBitMaskBuilderFields(final Ipv6MatchArbitraryBitMaskBuilder builder,
103 final Ipv6ArbitraryMask mask,
104 final Ipv6Address ipv6Address) {
106 builder.setIpv6SourceArbitraryBitmask(mask);
108 builder.setIpv6SourceAddressNoMask(ipv6Address);
111 private static void setDstIpv6MatchArbitraryBitMaskBuilderFields(final Ipv6MatchArbitraryBitMaskBuilder builder,
112 final Ipv6ArbitraryMask mask,
113 final Ipv6Address ipv6Address) {
115 builder.setIpv6DestinationArbitraryBitmask(mask);
117 builder.setIpv6DestinationAddressNoMask(ipv6Address);