2 * Copyright (c) 2014, 2017 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match;
10 import com.google.common.base.Joiner;
11 import com.google.common.base.Splitter;
12 import com.google.common.collect.ImmutableSet;
13 import com.google.common.primitives.Longs;
14 import com.google.common.primitives.UnsignedBytes;
15 import java.util.Iterator;
16 import org.opendaylight.openflowplugin.extension.api.AugmentationGroupingResolver;
17 import org.opendaylight.openflowplugin.extension.api.AugmentationGroupingResolver.Factory;
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.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCase;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCaseBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.experimenter.id._case.ExperimenterBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ExperimenterClass;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmClassBase;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.MatchEntryValue;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxExpMatch;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxExpMatchBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.oxm.container.match.entry.value.experimenter.id._case.NxExpMatchEntryValue;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNodesNodeTableFlow;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchPacketInMessage;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcAddFlow;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcRemoveFlow;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcUpdateFlowOriginal;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcUpdateFlowUpdated;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpShaGrouping;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpThaGrouping;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxCtMarkGrouping;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxCtStateGrouping;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxCtTpDstGrouping;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxCtTpSrcGrouping;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxCtZoneGrouping;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshFlagsGrouping;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshMdtypeGrouping;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshNpGrouping;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshTtlGrouping;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc1Grouping;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc2Grouping;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc3Grouping;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNshc4Grouping;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNsiGrouping;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxNspGrouping;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxPktMarkGrouping;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxRegGrouping;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIdGrouping;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4DstGrouping;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4SrcGrouping;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpOpGrouping;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpSpaGrouping;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpTpaGrouping;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthDstGrouping;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthSrcGrouping;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthTypeGrouping;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfInPortGrouping;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfTcpDstGrouping;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfTcpSrcGrouping;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpDstGrouping;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfUdpSrcGrouping;
73 import org.opendaylight.yangtools.yang.binding.Augmentation;
80 public final class MatchUtil {
81 private static final Splitter SPLITTER = Splitter.on('.');
82 private static final Joiner JOINER = Joiner.on('.');
84 public static final AugmentationGroupingResolver<NxmNxRegGrouping, Extension> REG_RESOLVER;
85 public static final AugmentationGroupingResolver<NxmNxTunIdGrouping, Extension> TUN_ID_RESOLVER;
86 public static final AugmentationGroupingResolver<NxmNxArpShaGrouping, Extension> ARP_SHA_RESOLVER;
87 public static final AugmentationGroupingResolver<NxmNxArpThaGrouping, Extension> ARP_THA_RESOLVER;
88 public static final AugmentationGroupingResolver<NxmOfArpOpGrouping, Extension> ARP_OP_RESOLVER;
89 public static final AugmentationGroupingResolver<NxmOfArpSpaGrouping, Extension> ARP_SPA_RESOLVER;
90 public static final AugmentationGroupingResolver<NxmOfArpTpaGrouping, Extension> ARP_TPA_RESOLVER;
91 public static final AugmentationGroupingResolver<NxmNxTunIpv4DstGrouping, Extension> TUN_IPV4_DST_RESOLVER;
92 public static final AugmentationGroupingResolver<NxmNxTunIpv4SrcGrouping, Extension> TUN_IPV4_SRC_RESOLVER;
93 public static final AugmentationGroupingResolver<NxmOfEthDstGrouping, Extension> ETH_DST_RESOLVER;
94 public static final AugmentationGroupingResolver<NxmOfEthSrcGrouping, Extension> ETH_SRC_RESOLVER;
95 public static final AugmentationGroupingResolver<NxmOfEthTypeGrouping, Extension> ETH_TYPE_RESOLVER;
96 public static final AugmentationGroupingResolver<NxmNxNsiGrouping, Extension> NSI_RESOLVER;
97 public static final AugmentationGroupingResolver<NxmNxNspGrouping, Extension> NSP_RESOLVER;
98 public static final AugmentationGroupingResolver<NxmNxNshc1Grouping, Extension> NSC1_RESOLVER;
99 public static final AugmentationGroupingResolver<NxmNxNshc2Grouping, Extension> NSC2_RESOLVER;
100 public static final AugmentationGroupingResolver<NxmNxNshc3Grouping, Extension> NSC3_RESOLVER;
101 public static final AugmentationGroupingResolver<NxmNxNshc4Grouping, Extension> NSC4_RESOLVER;
102 public static final AugmentationGroupingResolver<NxmNxNshFlagsGrouping, Extension> NSH_FLAGS_RESOLVER;
103 public static final AugmentationGroupingResolver<NxmNxNshMdtypeGrouping, Extension> NSH_MDTYPE_RESOLVER;
104 public static final AugmentationGroupingResolver<NxmNxNshNpGrouping, Extension> NSH_NP_RESOLVER;
105 public static final AugmentationGroupingResolver<NxmNxNshTtlGrouping, Extension> NSH_TTL_RESOLVER;
106 public static final AugmentationGroupingResolver<NxmOfTcpSrcGrouping, Extension> TCP_SRC_RESOLVER;
107 public static final AugmentationGroupingResolver<NxmOfTcpDstGrouping, Extension> TCP_DST_RESOLVER;
108 public static final AugmentationGroupingResolver<NxmOfUdpSrcGrouping, Extension> UDP_SRC_RESOLVER;
109 public static final AugmentationGroupingResolver<NxmOfUdpDstGrouping, Extension> UDP_DST_RESOLVER;
110 public static final AugmentationGroupingResolver<NxmNxCtMarkGrouping, Extension> CT_MARK_RESOLVER;
111 public static final AugmentationGroupingResolver<NxmNxCtStateGrouping, Extension> CT_STATE_RESOLVER;
112 public static final AugmentationGroupingResolver<NxmNxCtZoneGrouping, Extension> CT_ZONE_RESOLVER;
113 public static final AugmentationGroupingResolver<NxmNxCtTpSrcGrouping, Extension> CT_TP_SRC_RESOLVER;
114 public static final AugmentationGroupingResolver<NxmNxCtTpDstGrouping, Extension> CT_TP_DST_RESOLVER;
115 public static final AugmentationGroupingResolver<NxmNxPktMarkGrouping, Extension> PKT_MARK_RESOLVER;
116 public static final AugmentationGroupingResolver<NxmOfInPortGrouping, Extension> NXM_OF_INPORT_RESOLVER;
119 final Factory<Extension> factory = AugmentationGroupingResolver.factory(Extension.class, ImmutableSet.of(
120 NxAugMatchRpcAddFlow.class,
121 NxAugMatchRpcRemoveFlow.class,
122 NxAugMatchRpcUpdateFlowOriginal.class,
123 NxAugMatchRpcUpdateFlowUpdated.class,
124 NxAugMatchNodesNodeTableFlow.class,
125 NxAugMatchNotifSwitchFlowRemoved.class,
126 NxAugMatchNotifPacketIn.class,
127 // NxAugMatchNotifUpdateFlowStats.class,
128 NxAugMatchPacketInMessage.class));
130 REG_RESOLVER = factory.createResolver(NxmNxRegGrouping.class);
131 TUN_ID_RESOLVER = factory.createResolver(NxmNxTunIdGrouping.class);
132 ARP_SHA_RESOLVER = factory.createResolver(NxmNxArpShaGrouping.class);
133 ARP_THA_RESOLVER = factory.createResolver(NxmNxArpThaGrouping.class);
134 ARP_OP_RESOLVER = factory.createResolver(NxmOfArpOpGrouping.class);
135 ARP_SPA_RESOLVER = factory.createResolver(NxmOfArpSpaGrouping.class);
136 ARP_TPA_RESOLVER = factory.createResolver(NxmOfArpTpaGrouping.class);
137 TUN_IPV4_DST_RESOLVER = factory.createResolver(NxmNxTunIpv4DstGrouping.class);
138 TUN_IPV4_SRC_RESOLVER = factory.createResolver(NxmNxTunIpv4SrcGrouping.class);
139 ETH_DST_RESOLVER = factory.createResolver(NxmOfEthDstGrouping.class);
140 ETH_SRC_RESOLVER = factory.createResolver(NxmOfEthSrcGrouping.class);
141 ETH_TYPE_RESOLVER = factory.createResolver(NxmOfEthTypeGrouping.class);
142 NSP_RESOLVER = factory.createResolver(NxmNxNspGrouping.class);
143 NSI_RESOLVER = factory.createResolver(NxmNxNsiGrouping.class);
144 NSC1_RESOLVER = factory.createResolver(NxmNxNshc1Grouping.class);
145 NSC2_RESOLVER = factory.createResolver(NxmNxNshc2Grouping.class);
146 NSC3_RESOLVER = factory.createResolver(NxmNxNshc3Grouping.class);
147 NSC4_RESOLVER = factory.createResolver(NxmNxNshc4Grouping.class);
148 NSH_FLAGS_RESOLVER = factory.createResolver(NxmNxNshFlagsGrouping.class);
149 NSH_MDTYPE_RESOLVER = factory.createResolver(NxmNxNshMdtypeGrouping.class);
150 NSH_NP_RESOLVER = factory.createResolver(NxmNxNshNpGrouping.class);
151 NSH_TTL_RESOLVER = factory.createResolver(NxmNxNshTtlGrouping.class);
152 TCP_SRC_RESOLVER = factory.createResolver(NxmOfTcpSrcGrouping.class);
153 TCP_DST_RESOLVER = factory.createResolver(NxmOfTcpDstGrouping.class);
154 UDP_SRC_RESOLVER = factory.createResolver(NxmOfUdpSrcGrouping.class);
155 UDP_DST_RESOLVER = factory.createResolver(NxmOfUdpDstGrouping.class);
156 CT_STATE_RESOLVER = factory.createResolver(NxmNxCtStateGrouping.class);
157 CT_ZONE_RESOLVER = factory.createResolver(NxmNxCtZoneGrouping.class);
158 NXM_OF_INPORT_RESOLVER = factory.createResolver(NxmOfInPortGrouping.class);
159 CT_MARK_RESOLVER = factory.createResolver(NxmNxCtMarkGrouping.class);
160 CT_TP_SRC_RESOLVER = factory.createResolver(NxmNxCtTpSrcGrouping.class);
161 CT_TP_DST_RESOLVER = factory.createResolver(NxmNxCtTpDstGrouping.class);
162 PKT_MARK_RESOLVER = factory.createResolver(NxmNxPktMarkGrouping.class);
165 private MatchUtil() {
168 public static MatchEntryBuilder createDefaultMatchEntryBuilder(final Class<? extends MatchField> matchField,
169 final Class<? extends OxmClassBase> oxmClass,
170 final MatchEntryValue matchEntryValue) {
171 MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
172 matchEntryBuilder.setHasMask(false);
173 matchEntryBuilder.setOxmMatchField(matchField);
174 matchEntryBuilder.setOxmClass(oxmClass);
175 matchEntryBuilder.setMatchEntryValue(matchEntryValue);
176 return matchEntryBuilder;
179 public static <V extends Augmentation<ExperimenterIdCase>> MatchEntryBuilder createExperimenterMatchEntryBuilder(
180 final Class<? extends MatchField> matchField,
181 final long experimenterId,
182 final NxExpMatchEntryValue value) {
183 ExperimenterBuilder experimenterBuilder = new ExperimenterBuilder();
184 experimenterBuilder.setExperimenter(new ExperimenterId(experimenterId));
185 ExperimenterIdCaseBuilder expCaseBuilder = new ExperimenterIdCaseBuilder();
186 expCaseBuilder.setExperimenter(experimenterBuilder.build());
187 OfjAugNxExpMatch ofjAugNxExpMatch = new OfjAugNxExpMatchBuilder().setNxExpMatchEntryValue(value).build();
188 expCaseBuilder.addAugmentation(OfjAugNxExpMatch.class, ofjAugNxExpMatch);
189 return createDefaultMatchEntryBuilder(matchField, ExperimenterClass.class, expCaseBuilder.build());
192 public static Long ipv4ToLong(final Ipv4Address ipv4) {
193 Iterator<String> iterator = SPLITTER.split(ipv4.getValue()).iterator();
194 byte[] bytes = new byte[8];
195 for (int i = 0; i < bytes.length; i++) {
199 bytes[i] = UnsignedBytes.parseUnsignedByte(iterator.next());
202 Long result = Longs.fromByteArray(bytes);
206 public static Ipv4Address longToIpv4Address(final Long value) {
207 byte[] bytes = Longs.toByteArray(value);
208 String[] strArray = new String[4];
209 for (int i = 4; i < bytes.length; i++) {
210 strArray[i - 4] = UnsignedBytes.toString(bytes[i]);
212 String str = JOINER.join(strArray);
213 Ipv4Address result = new Ipv4Address(str);