OPNFLWPLUG-930 Inconsistent flow IDs between flows
[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.NxmNxCtZoneGrouping;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxEncapEthDstGrouping;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxEncapEthSrcGrouping;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxEncapEthTypeGrouping;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshMdtypeGrouping;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshNpGrouping;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc1Grouping;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc2Grouping;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc3Grouping;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc4Grouping;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNsiGrouping;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNspGrouping;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxRegGrouping;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunGpeNpGrouping;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIdGrouping;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4DstGrouping;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4SrcGrouping;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpOpGrouping;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpSpaGrouping;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpTpaGrouping;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthDstGrouping;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthSrcGrouping;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthTypeGrouping;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfInPortGrouping;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfTcpDstGrouping;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfTcpSrcGrouping;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpDstGrouping;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpSrcGrouping;
64 import org.opendaylight.yangtools.yang.binding.Augmentation;
65
66 /**
67  * @author msunal
68  *
69  */
70 public class MatchUtil {
71     private static final Splitter SPLITTER = Splitter.on('.');
72     private static final Joiner JOINER = Joiner.on('.');
73
74     private final static Set<Class<? extends Augmentation<Extension>>> augmentationsOfExtension = new HashSet<>();
75     public final static GroupingResolver<NxmNxRegGrouping, Extension> regResolver = new GroupingResolver<>(
76             NxmNxRegGrouping.class);
77     public final static GroupingResolver<NxmNxTunIdGrouping, Extension> tunIdResolver = new GroupingResolver<>(
78             NxmNxTunIdGrouping.class);
79     public final static GroupingResolver<NxmNxArpShaGrouping, Extension> arpShaResolver = new GroupingResolver<>(
80             NxmNxArpShaGrouping.class);
81     public final static GroupingResolver<NxmNxArpThaGrouping, Extension> arpThaResolver = new GroupingResolver<>(
82             NxmNxArpThaGrouping.class);
83     public final static GroupingResolver<NxmOfArpOpGrouping, Extension> arpOpResolver = new GroupingResolver<>(
84             NxmOfArpOpGrouping.class);
85     public final static GroupingResolver<NxmOfArpSpaGrouping, Extension> arpSpaResolver = new GroupingResolver<>(
86             NxmOfArpSpaGrouping.class);
87     public final static GroupingResolver<NxmOfArpTpaGrouping, Extension> arpTpaResolver = new GroupingResolver<>(
88             NxmOfArpTpaGrouping.class);
89     public final static GroupingResolver<NxmNxTunIpv4DstGrouping, Extension> tunIpv4DstResolver = new GroupingResolver<>(
90             NxmNxTunIpv4DstGrouping.class);
91     public final static GroupingResolver<NxmNxTunIpv4SrcGrouping, Extension> tunIpv4SrcResolver = new GroupingResolver<>(
92             NxmNxTunIpv4SrcGrouping.class);
93     public final static GroupingResolver<NxmOfEthDstGrouping, Extension> ethDstResolver = new GroupingResolver<>(
94             NxmOfEthDstGrouping.class);
95     public final static GroupingResolver<NxmOfEthSrcGrouping, Extension> ethSrcResolver = new GroupingResolver<>(
96             NxmOfEthSrcGrouping.class);
97     public final static GroupingResolver<NxmOfEthTypeGrouping, Extension> ethTypeResolver = new GroupingResolver<>(
98             NxmOfEthTypeGrouping.class);
99     public final static GroupingResolver<NxmNxNsiGrouping, Extension> nsiResolver = new GroupingResolver<>(
100             NxmNxNsiGrouping.class);
101     public final static GroupingResolver<NxmNxNspGrouping, Extension> nspResolver = new GroupingResolver<>(
102             NxmNxNspGrouping.class);
103     public final static GroupingResolver<NxmNxNshc1Grouping, Extension> nsc1Resolver = new GroupingResolver<>(
104             NxmNxNshc1Grouping.class);
105     public final static GroupingResolver<NxmNxNshc2Grouping, Extension> nsc2Resolver = new GroupingResolver<>(
106             NxmNxNshc2Grouping.class);
107     public final static GroupingResolver<NxmNxNshc3Grouping, Extension> nsc3Resolver = new GroupingResolver<>(
108             NxmNxNshc3Grouping.class);
109     public final static GroupingResolver<NxmNxNshc4Grouping, Extension> nsc4Resolver = new GroupingResolver<>(
110             NxmNxNshc4Grouping.class);
111     public final static GroupingResolver<NxmNxEncapEthTypeGrouping, Extension> encapEthTypeResolver = new GroupingResolver<>(
112             NxmNxEncapEthTypeGrouping.class);
113     public final static GroupingResolver<NxmNxEncapEthSrcGrouping, Extension> encapEthSrcResolver = new GroupingResolver<>(
114             NxmNxEncapEthSrcGrouping.class);
115     public final static GroupingResolver<NxmNxEncapEthDstGrouping, Extension> encapEthDstResolver = new GroupingResolver<>(
116             NxmNxEncapEthDstGrouping.class);
117     public final static GroupingResolver<NxmNxNshMdtypeGrouping, Extension> nshMdtypeResolver = new GroupingResolver<>(
118             NxmNxNshMdtypeGrouping.class);
119     public final static GroupingResolver<NxmNxNshNpGrouping, Extension> nshNpResolver = new GroupingResolver<>(
120             NxmNxNshNpGrouping.class);
121     public final static GroupingResolver<NxmNxTunGpeNpGrouping, Extension> tunGpeNpResolver = new GroupingResolver<>(
122             NxmNxTunGpeNpGrouping.class);
123     public final static GroupingResolver<NxmOfTcpSrcGrouping, Extension> tcpSrcResolver = new GroupingResolver<>(
124             NxmOfTcpSrcGrouping.class);
125     public final static GroupingResolver<NxmOfTcpDstGrouping, Extension> tcpDstResolver = new GroupingResolver<>(
126             NxmOfTcpDstGrouping.class);
127     public final static GroupingResolver<NxmOfUdpSrcGrouping, Extension> udpSrcResolver = new GroupingResolver<>(
128             NxmOfUdpSrcGrouping.class);
129     public final static GroupingResolver<NxmOfUdpDstGrouping, Extension> udpDstResolver = new GroupingResolver<>(
130             NxmOfUdpDstGrouping.class);
131     public final static GroupingResolver<NxmNxCtMarkGrouping, Extension> ctMarkResolver = new GroupingResolver<>(
132             NxmNxCtMarkGrouping.class);
133     public final static GroupingResolver<NxmNxCtStateGrouping, Extension> ctStateResolver = new GroupingResolver<>(
134             NxmNxCtStateGrouping.class);
135     public final static GroupingResolver<NxmNxCtZoneGrouping, Extension> ctZoneResolver = new GroupingResolver<>(
136             NxmNxCtZoneGrouping.class);
137     public final static GroupingResolver<NxmOfInPortGrouping, Extension> nxmOfInportResolver = new GroupingResolver<>(
138             NxmOfInPortGrouping.class);
139
140     static {
141         augmentationsOfExtension.add(NxAugMatchRpcAddFlow.class);
142         augmentationsOfExtension.add(NxAugMatchRpcRemoveFlow.class);
143         augmentationsOfExtension.add(NxAugMatchRpcUpdateFlowOriginal.class);
144         augmentationsOfExtension.add(NxAugMatchRpcUpdateFlowUpdated.class);
145         augmentationsOfExtension.add(NxAugMatchNodesNodeTableFlow.class);
146         augmentationsOfExtension.add(NxAugMatchNotifSwitchFlowRemoved.class);
147         augmentationsOfExtension.add(NxAugMatchNotifPacketIn.class);
148         //augmentationsOfExtension.add(NxAugMatchNotifUpdateFlowStats.class);
149         augmentationsOfExtension.add(NxAugMatchPacketInMessage.class);
150         regResolver.setAugmentations(augmentationsOfExtension);
151         tunIdResolver.setAugmentations(augmentationsOfExtension);
152         arpShaResolver.setAugmentations(augmentationsOfExtension);
153         arpThaResolver.setAugmentations(augmentationsOfExtension);
154         arpOpResolver.setAugmentations(augmentationsOfExtension);
155         arpSpaResolver.setAugmentations(augmentationsOfExtension);
156         arpTpaResolver.setAugmentations(augmentationsOfExtension);
157         tunIpv4DstResolver.setAugmentations(augmentationsOfExtension);
158         tunIpv4SrcResolver.setAugmentations(augmentationsOfExtension);
159         ethDstResolver.setAugmentations(augmentationsOfExtension);
160         ethSrcResolver.setAugmentations(augmentationsOfExtension);
161         ethTypeResolver.setAugmentations(augmentationsOfExtension);
162         nspResolver.setAugmentations(augmentationsOfExtension);
163         nsiResolver.setAugmentations(augmentationsOfExtension);
164         nsc1Resolver.setAugmentations(augmentationsOfExtension);
165         nsc2Resolver.setAugmentations(augmentationsOfExtension);
166         nsc3Resolver.setAugmentations(augmentationsOfExtension);
167         nsc4Resolver.setAugmentations(augmentationsOfExtension);
168         encapEthTypeResolver.setAugmentations(augmentationsOfExtension);
169         encapEthSrcResolver.setAugmentations(augmentationsOfExtension);
170         encapEthDstResolver.setAugmentations(augmentationsOfExtension);
171         nshMdtypeResolver.setAugmentations(augmentationsOfExtension);
172         nshNpResolver.setAugmentations(augmentationsOfExtension);
173         tunGpeNpResolver.setAugmentations(augmentationsOfExtension);
174         tcpSrcResolver.setAugmentations(augmentationsOfExtension);
175         tcpDstResolver.setAugmentations(augmentationsOfExtension);
176         udpSrcResolver.setAugmentations(augmentationsOfExtension);
177         udpDstResolver.setAugmentations(augmentationsOfExtension);
178         ctStateResolver.setAugmentations(augmentationsOfExtension);
179         ctZoneResolver.setAugmentations(augmentationsOfExtension);
180         nxmOfInportResolver.setAugmentations(augmentationsOfExtension);
181         ctMarkResolver.setAugmentations(augmentationsOfExtension);
182     }
183
184     public static MatchEntryBuilder createDefaultMatchEntryBuilder(Class<? extends MatchField> matchField,
185                                                                    Class<? extends OxmClassBase> oxmClass,
186                                                                    MatchEntryValue matchEntryValue){
187         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
188         matchEntryBuilder.setHasMask(false);
189         matchEntryBuilder.setOxmMatchField(matchField);
190         matchEntryBuilder.setOxmClass(oxmClass);
191         matchEntryBuilder.setMatchEntryValue(matchEntryValue);
192         return matchEntryBuilder;
193     }
194
195     public static Long ipv4ToLong(Ipv4Address ipv4) {
196         Iterator<String> iterator = SPLITTER.split(ipv4.getValue()).iterator();
197         byte[] bytes = new byte[8];
198         for(int i =0;i < bytes.length;i++) {
199             if(i<4) {
200                 bytes[i] = 0;
201             } else {
202                 bytes[i] = UnsignedBytes.parseUnsignedByte((iterator.next()));
203             }
204         }
205         Long result = Longs.fromByteArray(bytes);
206         return result;
207     }
208
209     public static Ipv4Address longToIpv4Address(Long l) {
210         byte[] bytes = Longs.toByteArray(l);
211         String[] strArray = new String[4];
212         for(int i = 4;i < bytes.length;i++) {
213             strArray[i-4]=UnsignedBytes.toString(bytes[i]);
214         }
215         String str = JOINER.join(strArray);
216         Ipv4Address result = new Ipv4Address(str);
217         return result;
218     }
219 }