Merge "BUG-4062: Flows,Groups,Meters not getting deleted during switch flap"
[openflowplugin.git] / extension / openflowplugin-extension-nicira / src / main / java / org / opendaylight / openflowplugin / extension / vendor / nicira / convertor / match / MatchUtil.java
1 /**
2  * Copyright (c) 2014 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
13 import com.google.common.primitives.Longs;
14 import com.google.common.primitives.UnsignedBytes;
15 import java.util.Iterator;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
17 import java.util.HashSet;
18 import java.util.Set;
19 import org.opendaylight.openflowplugin.extension.api.GroupingResolver;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmClassBase;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.MatchEntryValue;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNodesNodeTableFlow;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcAddFlow;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcRemoveFlow;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcUpdateFlowOriginal;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcUpdateFlowUpdated;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpShaGrouping;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpThaGrouping;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc1Grouping;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc2Grouping;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc3Grouping;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc4Grouping;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNsiGrouping;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNspGrouping;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxRegGrouping;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIdGrouping;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4DstGrouping;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4SrcGrouping;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpOpGrouping;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpSpaGrouping;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpTpaGrouping;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthDstGrouping;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthSrcGrouping;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthTypeGrouping;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfTcpDstGrouping;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfTcpSrcGrouping;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpDstGrouping;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpSrcGrouping;
55 import org.opendaylight.yangtools.yang.binding.Augmentation;
56
57 /**
58  * @author msunal
59  *
60  */
61 public class MatchUtil {
62     private static final Splitter SPLITTER = Splitter.on('.');
63     private static final Joiner JOINER = Joiner.on('.');
64
65     private final static Set<Class<? extends Augmentation<Extension>>> augmentationsOfExtension = new HashSet<>();
66     public final static GroupingResolver<NxmNxRegGrouping, Extension> regResolver = new GroupingResolver<>(
67             NxmNxRegGrouping.class);
68     public final static GroupingResolver<NxmNxTunIdGrouping, Extension> tunIdResolver = new GroupingResolver<>(
69             NxmNxTunIdGrouping.class);
70     public final static GroupingResolver<NxmNxArpShaGrouping, Extension> arpShaResolver = new GroupingResolver<>(
71             NxmNxArpShaGrouping.class);
72     public final static GroupingResolver<NxmNxArpThaGrouping, Extension> arpThaResolver = new GroupingResolver<>(
73             NxmNxArpThaGrouping.class);
74     public final static GroupingResolver<NxmOfArpOpGrouping, Extension> arpOpResolver = new GroupingResolver<>(
75             NxmOfArpOpGrouping.class);
76     public final static GroupingResolver<NxmOfArpSpaGrouping, Extension> arpSpaResolver = new GroupingResolver<>(
77             NxmOfArpSpaGrouping.class);
78     public final static GroupingResolver<NxmOfArpTpaGrouping, Extension> arpTpaResolver = new GroupingResolver<>(
79             NxmOfArpTpaGrouping.class);
80     public final static GroupingResolver<NxmNxTunIpv4DstGrouping, Extension> tunIpv4DstResolver = new GroupingResolver<>(
81             NxmNxTunIpv4DstGrouping.class);
82     public final static GroupingResolver<NxmNxTunIpv4SrcGrouping, Extension> tunIpv4SrcResolver = new GroupingResolver<>(
83             NxmNxTunIpv4SrcGrouping.class);
84     public final static GroupingResolver<NxmOfEthDstGrouping, Extension> ethDstResolver = new GroupingResolver<>(
85             NxmOfEthDstGrouping.class);
86     public final static GroupingResolver<NxmOfEthSrcGrouping, Extension> ethSrcResolver = new GroupingResolver<>(
87             NxmOfEthSrcGrouping.class);
88     public final static GroupingResolver<NxmOfEthTypeGrouping, Extension> ethTypeResolver = new GroupingResolver<>(
89             NxmOfEthTypeGrouping.class);
90     public final static GroupingResolver<NxmNxNsiGrouping, Extension> nsiResolver = new GroupingResolver<>(
91             NxmNxNsiGrouping.class);
92     public final static GroupingResolver<NxmNxNspGrouping, Extension> nspResolver = new GroupingResolver<>(
93             NxmNxNspGrouping.class);
94     public final static GroupingResolver<NxmNxNshc1Grouping, Extension> nsc1Resolver = new GroupingResolver<>(
95             NxmNxNshc1Grouping.class);
96     public final static GroupingResolver<NxmNxNshc2Grouping, Extension> nsc2Resolver = new GroupingResolver<>(
97             NxmNxNshc2Grouping.class);
98     public final static GroupingResolver<NxmNxNshc3Grouping, Extension> nsc3Resolver = new GroupingResolver<>(
99             NxmNxNshc3Grouping.class);
100     public final static GroupingResolver<NxmNxNshc4Grouping, Extension> nsc4Resolver = new GroupingResolver<>(
101             NxmNxNshc4Grouping.class);
102     public final static GroupingResolver<NxmOfTcpSrcGrouping, Extension> tcpSrcResolver = new GroupingResolver<>(
103             NxmOfTcpSrcGrouping.class);
104     public final static GroupingResolver<NxmOfTcpDstGrouping, Extension> tcpDstResolver = new GroupingResolver<>(
105             NxmOfTcpDstGrouping.class);
106     public final static GroupingResolver<NxmOfUdpSrcGrouping, Extension> udpSrcResolver = new GroupingResolver<>(
107             NxmOfUdpSrcGrouping.class);
108     public final static GroupingResolver<NxmOfUdpDstGrouping, Extension> udpDstResolver = new GroupingResolver<>(
109             NxmOfUdpDstGrouping.class);
110
111
112     static {
113         augmentationsOfExtension.add(NxAugMatchRpcAddFlow.class);
114         augmentationsOfExtension.add(NxAugMatchRpcRemoveFlow.class);
115         augmentationsOfExtension.add(NxAugMatchRpcUpdateFlowOriginal.class);
116         augmentationsOfExtension.add(NxAugMatchRpcUpdateFlowUpdated.class);
117         augmentationsOfExtension.add(NxAugMatchNodesNodeTableFlow.class);
118         augmentationsOfExtension.add(NxAugMatchNotifSwitchFlowRemoved.class);
119         augmentationsOfExtension.add(NxAugMatchNotifPacketIn.class);
120         augmentationsOfExtension.add(NxAugMatchNotifUpdateFlowStats.class);
121         regResolver.setAugmentations(augmentationsOfExtension);
122         tunIdResolver.setAugmentations(augmentationsOfExtension);
123         arpShaResolver.setAugmentations(augmentationsOfExtension);
124         arpThaResolver.setAugmentations(augmentationsOfExtension);
125         arpOpResolver.setAugmentations(augmentationsOfExtension);
126         arpSpaResolver.setAugmentations(augmentationsOfExtension);
127         arpTpaResolver.setAugmentations(augmentationsOfExtension);
128         tunIpv4DstResolver.setAugmentations(augmentationsOfExtension);
129         tunIpv4SrcResolver.setAugmentations(augmentationsOfExtension);
130         ethDstResolver.setAugmentations(augmentationsOfExtension);
131         ethSrcResolver.setAugmentations(augmentationsOfExtension);
132         ethTypeResolver.setAugmentations(augmentationsOfExtension);
133         nspResolver.setAugmentations(augmentationsOfExtension);
134         nsiResolver.setAugmentations(augmentationsOfExtension);
135         nsc1Resolver.setAugmentations(augmentationsOfExtension);
136         nsc2Resolver.setAugmentations(augmentationsOfExtension);
137         nsc3Resolver.setAugmentations(augmentationsOfExtension);
138         nsc4Resolver.setAugmentations(augmentationsOfExtension);
139         tcpSrcResolver.setAugmentations(augmentationsOfExtension);
140         tcpDstResolver.setAugmentations(augmentationsOfExtension);
141         udpSrcResolver.setAugmentations(augmentationsOfExtension);
142         udpDstResolver.setAugmentations(augmentationsOfExtension);
143
144     }
145
146     public static MatchEntryBuilder createDefaultMatchEntryBuilder(Class<? extends MatchField> matchField,
147                                                                    Class<? extends OxmClassBase> oxmClass,
148                                                                    MatchEntryValue matchEntryValue){
149         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
150         matchEntryBuilder.setHasMask(false);
151         matchEntryBuilder.setOxmMatchField(matchField);
152         matchEntryBuilder.setOxmClass(oxmClass);
153         matchEntryBuilder.setMatchEntryValue(matchEntryValue);
154         return matchEntryBuilder;
155     }
156
157     public static Long ipv4ToLong(Ipv4Address ipv4) {
158         Iterator<String> iterator = SPLITTER.split(ipv4.getValue()).iterator();
159         byte[] bytes = new byte[8];
160         for(int i =0;i < bytes.length;i++) {
161             if(i<4) {
162                 bytes[i] = 0;
163             } else {
164                 bytes[i] = UnsignedBytes.parseUnsignedByte((iterator.next()));
165             }
166         }
167         Long result = Longs.fromByteArray(bytes);
168         return result;
169     }
170
171     public static Ipv4Address longToIpv4Address(Long l) {
172         byte[] bytes = Longs.toByteArray(l);
173         String[] strArray = new String[4];
174         for(int i = 4;i < bytes.length;i++) {
175             strArray[i-4]=UnsignedBytes.toString(bytes[i]);
176         }
177         String str = JOINER.join(strArray);
178         Ipv4Address result = new Ipv4Address(str);
179         return result;
180     }
181 }