Fix checkstyle violations in openflowplugin - part 4
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / match / cases / OfToSalIpv6SrcCase.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.cases;
10
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.Ipv6SrcCase;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.src._case.Ipv6Src;
26
27 public class OfToSalIpv6SrcCase extends ConvertorCase<Ipv6SrcCase, MatchBuilder, MatchResponseConvertorData> {
28     public OfToSalIpv6SrcCase() {
29         super(Ipv6SrcCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3);
30     }
31
32     @Override
33     public Optional<MatchBuilder> process(@Nonnull Ipv6SrcCase source, MatchResponseConvertorData data,
34             ConvertorExecutor convertorExecutor) {
35         final MatchBuilder matchBuilder = data.getMatchBuilder();
36         final Ipv6MatchBuilder ipv6MatchBuilder = data.getIpv6MatchBuilder();
37         final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder =
38                 data.getIpv6MatchArbitraryBitMaskBuilder();
39
40         Ipv6Src ipv6Src = source.getIpv6Src();
41
42         if (ipv6Src != null) {
43             byte[] mask = ipv6Src.getMask();
44             if (mask != null && IpConversionUtil.isIpv6ArbitraryBitMask(mask)) {
45                 // case where ipv6dst is of type ipv6MatchBuilder and ipv6src is of type ipv6MatchArbitrary.
46                 // Need to convert ipv6dst to ipv6MatchArbitrary.
47
48                 if (ipv6MatchBuilder.getIpv6Destination() != null) {
49                     Ipv6Prefix ipv6PrefixDestinationAddress = ipv6MatchBuilder.getIpv6Destination();
50                     Ipv6Address ipv6DstAddress = IpConversionUtil.extractIpv6Address(ipv6PrefixDestinationAddress);
51                     Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
52                             IpConversionUtil.extractIpv6AddressMask(ipv6PrefixDestinationAddress));
53                     setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
54                             dstIpv6ArbitraryMask, IpConversionUtil.compressedIpv6AddressFormat(ipv6DstAddress));
55                 }
56                 Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
57                         IpConversionUtil.createIpv6ArbitraryBitMask(mask));
58                 Ipv6Address stringIpv6SrcAddress =
59                         IpConversionUtil.compressedIpv6AddressFormat(ipv6Src.getIpv6Address());
60                 setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
61                         srcIpv6ArbitraryMask, stringIpv6SrcAddress);
62                 matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
63             } else if (ipv6MatchArbitraryBitMaskBuilder.getIpv6DestinationAddressNoMask() != null) {
64                          /*
65                          TODO Change comments
66                         Case where destination is of type ipv6MatchArbitraryBitMask already exists in Layer3Match,
67                         source which of type ipv6Match needs to be converted to ipv4MatchArbitraryBitMask.
68                         We convert 1::/32 to 1::/FFFF:FFFF::
69                         example:-
70                         <ipv6-source>1::/32</ipv4-source>
71                         <ipv6-destination-address-no-mask>1::1</ipv6-destination-address-no-mask>
72                         <ipv6-destination-arbitrary-bitmask>FFFF::0001</ipv6-destination-arbitrary-bitmask>
73                         after conversion output example:-
74                         <ipv6-source-address-no-mask>1::</ipv6-source-address-no-mask>
75                         <ipv6-source-arbitrary-bitmask>FFFF:FFFF::</ipv6-source-arbitrary-bitmask>
76                         <ipv6-destination-address-no-mask>1::1</ipv6-destination-address-no-mask>
77                         <ipv6-destination-arbitrary-bitmask>FFFF::0001</ipv6-destination-arbitrary-bitmask>
78                         */
79                 Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
80                         IpConversionUtil.createIpv6ArbitraryBitMask(mask));
81                 Ipv6Address stringIpv6SrcAddress =
82                         IpConversionUtil.compressedIpv6AddressFormat(ipv6Src.getIpv6Address());
83                 setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder,
84                         srcIpv6ArbitraryMask, stringIpv6SrcAddress);
85                 matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
86             } else {
87                 Ipv6Address stringIpv6SrcAddress =
88                         IpConversionUtil.compressedIpv6AddressFormat(ipv6Src.getIpv6Address());
89                 setIpv6MatchBuilderFields(ipv6MatchBuilder, mask, stringIpv6SrcAddress);
90                 matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
91             }
92         }
93
94         return Optional.of(matchBuilder);
95     }
96
97     private static void setIpv6MatchBuilderFields(final Ipv6MatchBuilder builder, final byte[] mask,
98             final Ipv6Address prefix) {
99         Ipv6Prefix ipv6Prefix;
100         if (mask != null) {
101             ipv6Prefix = IpConversionUtil.createPrefix(prefix, mask);
102         } else {
103             ipv6Prefix = IpConversionUtil.createPrefix(prefix);
104         }
105         builder.setIpv6Source(ipv6Prefix);
106     }
107
108     private static void setSrcIpv6MatchArbitraryBitMaskBuilderFields(final Ipv6MatchArbitraryBitMaskBuilder builder,
109                                                                      final Ipv6ArbitraryMask mask,
110                                                                      final Ipv6Address ipv6Address) {
111         if (mask != null) {
112             builder.setIpv6SourceArbitraryBitmask(mask);
113         }
114         builder.setIpv6SourceAddressNoMask(ipv6Address);
115     }
116
117     private static void setDstIpv6MatchArbitraryBitMaskBuilderFields(final Ipv6MatchArbitraryBitMaskBuilder builder,
118                                                                      final Ipv6ArbitraryMask mask,
119                                                                      final Ipv6Address ipv6Address) {
120         if (mask != null) {
121             builder.setIpv6DestinationArbitraryBitmask(mask);
122         }
123         builder.setIpv6DestinationAddressNoMask(ipv6Address);
124     }
125 }