OPNFLWPLUG-1021 : ct_tp_src and ct_tp_dst support in nicira extension
[openflowplugin.git] / extension / openflowplugin-extension-nicira / src / main / java / org / opendaylight / openflowplugin / extension / vendor / nicira / convertor / match / MatchUtil.java
1 /**
2  * Copyright (c) 2014, 2017 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 package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match;
9
10 import com.google.common.base.Joiner;
11 import com.google.common.base.Splitter;
12 import com.google.common.primitives.Longs;
13 import com.google.common.primitives.UnsignedBytes;
14 import java.util.HashSet;
15 import java.util.Iterator;
16 import java.util.Set;
17 import org.opendaylight.openflowplugin.extension.api.GroupingResolver;
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.opendaylight.openflow.oxm.rev150225.MatchField;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmClassBase;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.MatchEntryValue;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNodesNodeTableFlow;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchPacketInMessage;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcAddFlow;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcRemoveFlow;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcUpdateFlowOriginal;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcUpdateFlowUpdated;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpShaGrouping;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpThaGrouping;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxCtMarkGrouping;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxCtStateGrouping;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxCtTpDstGrouping;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxCtTpSrcGrouping;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxCtZoneGrouping;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxEncapEthDstGrouping;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxEncapEthSrcGrouping;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxEncapEthTypeGrouping;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshMdtypeGrouping;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshNpGrouping;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc1Grouping;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc2Grouping;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc3Grouping;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc4Grouping;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNsiGrouping;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNspGrouping;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxRegGrouping;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunGpeNpGrouping;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIdGrouping;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4DstGrouping;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4SrcGrouping;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpOpGrouping;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpSpaGrouping;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpTpaGrouping;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthDstGrouping;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthSrcGrouping;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthTypeGrouping;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfInPortGrouping;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfTcpDstGrouping;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfTcpSrcGrouping;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpDstGrouping;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpSrcGrouping;
66 import org.opendaylight.yangtools.yang.binding.Augmentation;
67
68 /**
69  * Match utilities.
70  *
71  * @author msunal
72  */
73 public final class MatchUtil {
74     private static final Splitter SPLITTER = Splitter.on('.');
75     private static final Joiner JOINER = Joiner.on('.');
76
77     private static final Set<Class<? extends Augmentation<Extension>>> AUGMENTATIONS_OF_EXTENSION = new HashSet<>();
78     public static final GroupingResolver<NxmNxRegGrouping, Extension> REG_RESOLVER = new GroupingResolver<>(
79             NxmNxRegGrouping.class);
80     public static final GroupingResolver<NxmNxTunIdGrouping, Extension> TUN_ID_RESOLVER = new GroupingResolver<>(
81             NxmNxTunIdGrouping.class);
82     public static final GroupingResolver<NxmNxArpShaGrouping, Extension> ARP_SHA_RESOLVER = new GroupingResolver<>(
83             NxmNxArpShaGrouping.class);
84     public static final GroupingResolver<NxmNxArpThaGrouping, Extension> ARP_THA_RESOLVER = new GroupingResolver<>(
85             NxmNxArpThaGrouping.class);
86     public static final GroupingResolver<NxmOfArpOpGrouping, Extension> ARP_OP_RESOLVER = new GroupingResolver<>(
87             NxmOfArpOpGrouping.class);
88     public static final GroupingResolver<NxmOfArpSpaGrouping, Extension> ARP_SPA_RESOLVER = new GroupingResolver<>(
89             NxmOfArpSpaGrouping.class);
90     public static final GroupingResolver<NxmOfArpTpaGrouping, Extension> ARP_TPA_RESOLVER = new GroupingResolver<>(
91             NxmOfArpTpaGrouping.class);
92     public static final GroupingResolver<NxmNxTunIpv4DstGrouping, Extension> TUN_IPV4_DST_RESOLVER =
93             new GroupingResolver<>(NxmNxTunIpv4DstGrouping.class);
94     public static final GroupingResolver<NxmNxTunIpv4SrcGrouping, Extension> TUN_IPV4_SRC_RESOLVER =
95             new GroupingResolver<>(NxmNxTunIpv4SrcGrouping.class);
96     public static final GroupingResolver<NxmOfEthDstGrouping, Extension> ETH_DST_RESOLVER = new GroupingResolver<>(
97             NxmOfEthDstGrouping.class);
98     public static final GroupingResolver<NxmOfEthSrcGrouping, Extension> ETH_SRC_RESOLVER = new GroupingResolver<>(
99             NxmOfEthSrcGrouping.class);
100     public static final GroupingResolver<NxmOfEthTypeGrouping, Extension> ETH_TYPE_RESOLVER = new GroupingResolver<>(
101             NxmOfEthTypeGrouping.class);
102     public static final GroupingResolver<NxmNxNsiGrouping, Extension> NSI_RESOLVER = new GroupingResolver<>(
103             NxmNxNsiGrouping.class);
104     public static final GroupingResolver<NxmNxNspGrouping, Extension> NSP_RESOLVER = new GroupingResolver<>(
105             NxmNxNspGrouping.class);
106     public static final GroupingResolver<NxmNxNshc1Grouping, Extension> NSC1_RESOLVER = new GroupingResolver<>(
107             NxmNxNshc1Grouping.class);
108     public static final GroupingResolver<NxmNxNshc2Grouping, Extension> NSC2_RESOLVER = new GroupingResolver<>(
109             NxmNxNshc2Grouping.class);
110     public static final GroupingResolver<NxmNxNshc3Grouping, Extension> NSC3_RESOLVER = new GroupingResolver<>(
111             NxmNxNshc3Grouping.class);
112     public static final GroupingResolver<NxmNxNshc4Grouping, Extension> NSC4_RESOLVER = new GroupingResolver<>(
113             NxmNxNshc4Grouping.class);
114     public static final GroupingResolver<NxmNxEncapEthTypeGrouping, Extension> ENCAP_ETH_TYPE_RESOLVER =
115             new GroupingResolver<>(NxmNxEncapEthTypeGrouping.class);
116     public static final GroupingResolver<NxmNxEncapEthSrcGrouping, Extension> ENCAP_ETH_SRC_RESOLVER =
117             new GroupingResolver<>(NxmNxEncapEthSrcGrouping.class);
118     public static final GroupingResolver<NxmNxEncapEthDstGrouping, Extension> ENCAP_ETH_DST_RESOLVER =
119             new GroupingResolver<>(NxmNxEncapEthDstGrouping.class);
120     public static final GroupingResolver<NxmNxNshMdtypeGrouping, Extension> NSH_MDTYPE_RESOLVER =
121             new GroupingResolver<>(NxmNxNshMdtypeGrouping.class);
122     public static final GroupingResolver<NxmNxNshNpGrouping, Extension> NSH_NP_RESOLVER = new GroupingResolver<>(
123             NxmNxNshNpGrouping.class);
124     public static final GroupingResolver<NxmNxTunGpeNpGrouping, Extension> TUN_GPE_NP_RESOLVER = new GroupingResolver<>(
125             NxmNxTunGpeNpGrouping.class);
126     public static final GroupingResolver<NxmOfTcpSrcGrouping, Extension> TCP_SRC_RESOLVER = new GroupingResolver<>(
127             NxmOfTcpSrcGrouping.class);
128     public static final GroupingResolver<NxmOfTcpDstGrouping, Extension> TCP_DST_RESOLVER = new GroupingResolver<>(
129             NxmOfTcpDstGrouping.class);
130     public static final GroupingResolver<NxmOfUdpSrcGrouping, Extension> UDP_SRC_RESOLVER = new GroupingResolver<>(
131             NxmOfUdpSrcGrouping.class);
132     public static final GroupingResolver<NxmOfUdpDstGrouping, Extension> UDP_DST_RESOLVER = new GroupingResolver<>(
133             NxmOfUdpDstGrouping.class);
134     public static final GroupingResolver<NxmNxCtMarkGrouping, Extension> CT_MARK_RESOLVER = new GroupingResolver<>(
135             NxmNxCtMarkGrouping.class);
136     public static final GroupingResolver<NxmNxCtStateGrouping, Extension> CT_STATE_RESOLVER = new GroupingResolver<>(
137             NxmNxCtStateGrouping.class);
138     public static final GroupingResolver<NxmNxCtZoneGrouping, Extension> CT_ZONE_RESOLVER = new GroupingResolver<>(
139             NxmNxCtZoneGrouping.class);
140     public static final GroupingResolver<NxmNxCtTpSrcGrouping, Extension> CT_TP_SRC_RESOLVER = new GroupingResolver<>(
141             NxmNxCtTpSrcGrouping.class);
142     public static final GroupingResolver<NxmNxCtTpDstGrouping, Extension> CT_TP_DST_RESOLVER = new GroupingResolver<>(
143             NxmNxCtTpDstGrouping.class);
144     public static final GroupingResolver<NxmOfInPortGrouping, Extension> NXM_OF_INPORT_RESOLVER =
145             new GroupingResolver<>(NxmOfInPortGrouping.class);
146
147     static {
148         AUGMENTATIONS_OF_EXTENSION.add(NxAugMatchRpcAddFlow.class);
149         AUGMENTATIONS_OF_EXTENSION.add(NxAugMatchRpcRemoveFlow.class);
150         AUGMENTATIONS_OF_EXTENSION.add(NxAugMatchRpcUpdateFlowOriginal.class);
151         AUGMENTATIONS_OF_EXTENSION.add(NxAugMatchRpcUpdateFlowUpdated.class);
152         AUGMENTATIONS_OF_EXTENSION.add(NxAugMatchNodesNodeTableFlow.class);
153         AUGMENTATIONS_OF_EXTENSION.add(NxAugMatchNotifSwitchFlowRemoved.class);
154         AUGMENTATIONS_OF_EXTENSION.add(NxAugMatchNotifPacketIn.class);
155         //augmentationsOfExtension.add(NxAugMatchNotifUpdateFlowStats.class);
156         AUGMENTATIONS_OF_EXTENSION.add(NxAugMatchPacketInMessage.class);
157         REG_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
158         TUN_ID_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
159         ARP_SHA_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
160         ARP_THA_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
161         ARP_OP_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
162         ARP_SPA_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
163         ARP_TPA_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
164         TUN_IPV4_DST_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
165         TUN_IPV4_SRC_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
166         ETH_DST_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
167         ETH_SRC_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
168         ETH_TYPE_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
169         NSP_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
170         NSI_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
171         NSC1_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
172         NSC2_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
173         NSC3_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
174         NSC4_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
175         ENCAP_ETH_TYPE_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
176         ENCAP_ETH_SRC_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
177         ENCAP_ETH_DST_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
178         NSH_MDTYPE_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
179         NSH_NP_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
180         TUN_GPE_NP_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
181         TCP_SRC_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
182         TCP_DST_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
183         UDP_SRC_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
184         UDP_DST_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
185         CT_STATE_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
186         CT_ZONE_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
187         NXM_OF_INPORT_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
188         CT_MARK_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
189         CT_TP_SRC_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
190         CT_TP_DST_RESOLVER.setAugmentations(AUGMENTATIONS_OF_EXTENSION);
191     }
192
193     private MatchUtil() {
194     }
195
196     public static MatchEntryBuilder createDefaultMatchEntryBuilder(Class<? extends MatchField> matchField,
197                                                                    Class<? extends OxmClassBase> oxmClass,
198                                                                    MatchEntryValue matchEntryValue) {
199         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
200         matchEntryBuilder.setHasMask(false);
201         matchEntryBuilder.setOxmMatchField(matchField);
202         matchEntryBuilder.setOxmClass(oxmClass);
203         matchEntryBuilder.setMatchEntryValue(matchEntryValue);
204         return matchEntryBuilder;
205     }
206
207     public static Long ipv4ToLong(Ipv4Address ipv4) {
208         Iterator<String> iterator = SPLITTER.split(ipv4.getValue()).iterator();
209         byte[] bytes = new byte[8];
210         for (int i = 0; i < bytes.length; i++) {
211             if (i < 4) {
212                 bytes[i] = 0;
213             } else {
214                 bytes[i] = UnsignedBytes.parseUnsignedByte(iterator.next());
215             }
216         }
217         Long result = Longs.fromByteArray(bytes);
218         return result;
219     }
220
221     public static Ipv4Address longToIpv4Address(Long value) {
222         byte[] bytes = Longs.toByteArray(value);
223         String[] strArray = new String[4];
224         for (int i = 4; i < bytes.length; i++) {
225             strArray[i - 4] = UnsignedBytes.toString(bytes[i]);
226         }
227         String str = JOINER.join(strArray);
228         Ipv4Address result = new Ipv4Address(str);
229         return result;
230     }
231 }