Merge "Removed duplicate declaration in pom.xml."
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / match / cases / OfToSalIpv4SrcCase.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.Ipv4Address;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCase;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.src._case.Ipv4Src;
26
27 public class OfToSalIpv4SrcCase extends ConvertorCase<Ipv4SrcCase, MatchBuilder, MatchResponseConvertorData> {
28     public OfToSalIpv4SrcCase() {
29         super(Ipv4SrcCase.class, true, OFConstants.OFP_VERSION_1_0, OFConstants.OFP_VERSION_1_3);
30     }
31
32     private static void setIpv4MatchBuilderFields(final Ipv4MatchBuilder ipv4MatchBuilder, final byte[] mask, final String ipv4PrefixStr) {
33         final Ipv4Prefix ipv4Prefix;
34         if (mask != null) {
35             ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr), mask);
36         } else {
37             //Openflow Spec : 1.3.2
38             //An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask.
39             // So when user specify 32 as a mast, switch omit that mast and we get null as a mask in flow
40             // statistics response.
41             ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr));
42         }
43
44         ipv4MatchBuilder.setIpv4Source(ipv4Prefix);
45     }
46
47     private static void setSrcIpv4MatchArbitraryBitMaskBuilderFields(
48             final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder,
49             final DottedQuad mask, final String ipv4AddressStr) {
50         if (mask != null) {
51             ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(mask);
52         }
53
54         ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask(new Ipv4Address(ipv4AddressStr));
55     }
56
57     private static void setDstIpv4MatchArbitraryBitMaskBuilderFields(
58             final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder,
59             final DottedQuad mask, final String ipv4AddressStr) {
60         if (mask != null) {
61             ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(mask);
62         }
63
64         ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address(ipv4AddressStr));
65     }
66
67     @Override
68     public Optional<MatchBuilder> process(@Nonnull Ipv4SrcCase source, MatchResponseConvertorData data, ConvertorExecutor convertorExecutor) {
69         final MatchBuilder matchBuilder = data.getMatchBuilder();
70         final Ipv4MatchBuilder ipv4MatchBuilder = data.getIpv4MatchBuilder();
71         final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder = data.getIpv4MatchArbitraryBitMaskBuilder();
72
73         Ipv4Src ipv4Address = source.getIpv4Src();
74
75         if (ipv4Address != null) {
76             byte[] mask = ipv4Address.getMask();
77
78             if (mask != null && IpConversionUtil.isArbitraryBitMask(mask)) {
79                 // case where ipv4dst is of type ipv4MatchBuilder and ipv4src is of type ipv4MatchArbitrary.
80                 // Needs to convert ipv4dst to ipv4MatchArbitrary.
81                 if (ipv4MatchBuilder.getIpv4Destination() != null) {
82                     Ipv4Prefix ipv4PrefixDestinationAddress = ipv4MatchBuilder.getIpv4Destination();
83                     Ipv4Address ipv4DstAddress = IpConversionUtil.extractIpv4Address(ipv4PrefixDestinationAddress);
84                     DottedQuad dstDottedQuadMask = IpConversionUtil.extractIpv4AddressMask(ipv4PrefixDestinationAddress);
85
86                     setDstIpv4MatchArbitraryBitMaskBuilderFields(
87                             ipv4MatchArbitraryBitMaskBuilder,
88                             dstDottedQuadMask, ipv4DstAddress.getValue());
89                 }
90
91                 DottedQuad srcDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask);
92                 String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue();
93                 setSrcIpv4MatchArbitraryBitMaskBuilderFields(
94                         ipv4MatchArbitraryBitMaskBuilder,
95                         srcDottedQuadMask, stringIpv4SrcAddress);
96                 matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
97             } else if (ipv4MatchArbitraryBitMaskBuilder.getIpv4DestinationAddressNoMask() != null) {
98                  /*
99                 Case where destination is of type ipv4MatchArbitraryBitMask already exists in Layer3Match,
100                 source which of type ipv4Match needs to be converted to ipv4MatchArbitraryBitMask.
101                 We convert 36.36.36.0/24 to 36.36.0/255.255.255.0
102                 expected output example:-
103                 <ipv4-destination>36.36.36.0/24</ipv4-destination>
104                 <ipv4-source-address-no-mask>36.36.36.0</ipv4-source-address-no-mask>
105                 <ipv4-source-arbitrary-bitmask>255.0.255.0</ipv4-source-arbitrary-bitmask>
106                 after conversion output example:-
107                 <ipv4-destination-address-no-mask>36.36.36.0</ipv4-destination-address-no-mask>
108                 <ipv4-destination-arbitrary-bitmask>255.255.255.0</ipv4-destination-arbitrary-bitmask>
109                 <ipv4-source-address-no-mask>36.36.36.0</ipv4-source-address-no-mask>
110                 <ipv4-source-arbitrary-bitmask>255.0.255.0</ipv4-source-arbitrary-bitmask>
111                 */
112                 DottedQuad srcDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask);
113                 String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue();
114                 setSrcIpv4MatchArbitraryBitMaskBuilderFields(
115                         ipv4MatchArbitraryBitMaskBuilder,
116                         srcDottedQuadMask, stringIpv4SrcAddress);
117                 matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
118             } else {
119                 String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue();
120                 setIpv4MatchBuilderFields(ipv4MatchBuilder, mask, stringIpv4SrcAddress);
121                 matchBuilder.setLayer3Match(ipv4MatchBuilder.build());
122             }
123         }
124
125         return Optional.of(matchBuilder);
126     }
127 }