ELAN FT Support for BE
[vpnservice.git] / mdsalutil / mdsalutil-api / src / main / java / org / opendaylight / vpnservice / mdsalutil / MatchFieldType.java
1 /*
2  * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. 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.vpnservice.mdsalutil;
9
10 import java.math.BigInteger;
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.Map;
14
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg1;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlow;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlowBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.ExtensionBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionListBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNodesNodeTableFlow;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNodesNodeTableFlowBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg1Key;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.reg.grouping.NxmNxRegBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpOp;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpSpa;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpTpa;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthDst;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthSrc;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthType;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.InPort;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.IpProto;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv4Dst;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv4Src;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MatchField;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Metadata;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MplsLabel;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.PbbIsid;
60 //import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.SalOpenflowBasicClass;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpDst;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpSrc;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.UdpDst;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.UdpSrc;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanVid;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.set.field.match.SetFieldMatch;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.set.field.match.SetFieldMatchBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelId;
70
71 public enum MatchFieldType {
72     eth_src {
73         @Override
74         protected Class<? extends MatchField> getMatchType() {
75             return EthSrc.class;
76         }
77
78         @Override
79         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
80             EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
81                     .get(EthernetMatchBuilder.class);
82
83             if (ethernetMatchBuilder == null) {
84                 ethernetMatchBuilder = new EthernetMatchBuilder();
85                 mapMatchBuilder.put(EthernetMatchBuilder.class, ethernetMatchBuilder);
86             }
87
88             ethernetMatchBuilder.setEthernetSource(new EthernetSourceBuilder().setAddress(
89                     new MacAddress(matchInfo.getStringMatchValues()[0])).build());
90         }
91
92         @Override
93         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
94             EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
95                     .remove(EthernetMatchBuilder.class);
96
97             if (ethernetMatchBuilder != null) {
98                 matchBuilderInOut.setEthernetMatch(ethernetMatchBuilder.build());
99             }
100         }
101     },
102
103     eth_dst {
104         @Override
105         protected Class<? extends MatchField> getMatchType() {
106             return EthDst.class;
107         }
108
109         @Override
110         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
111             EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
112                     .get(EthernetMatchBuilder.class);
113
114             if (ethernetMatchBuilder == null) {
115                 ethernetMatchBuilder = new EthernetMatchBuilder();
116                 mapMatchBuilder.put(EthernetMatchBuilder.class, ethernetMatchBuilder);
117             }
118
119             ethernetMatchBuilder.setEthernetDestination(new EthernetDestinationBuilder().setAddress(
120                     new MacAddress(matchInfo.getStringMatchValues()[0])).build());
121         }
122
123         @Override
124         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
125             EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
126                     .remove(EthernetMatchBuilder.class);
127
128             if (ethernetMatchBuilder != null) {
129                 matchBuilderInOut.setEthernetMatch(ethernetMatchBuilder.build());
130             }
131         }
132     },
133
134     eth_type {
135         @Override
136         protected Class<? extends MatchField> getMatchType() {
137             return EthType.class;
138         }
139
140         @Override
141         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
142             EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
143                     .get(EthernetMatchBuilder.class);
144
145             if (ethernetMatchBuilder == null) {
146                 ethernetMatchBuilder = new EthernetMatchBuilder();
147                 mapMatchBuilder.put(EthernetMatchBuilder.class, ethernetMatchBuilder);
148             }
149
150             ethernetMatchBuilder.setEthernetType(new EthernetTypeBuilder().setType(
151                     new EtherType(matchInfo.getMatchValues()[0])).build());
152         }
153
154         @Override
155         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
156             EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
157                     .remove(EthernetMatchBuilder.class);
158
159             if (ethernetMatchBuilder != null) {
160                 matchBuilderInOut.setEthernetMatch(ethernetMatchBuilder.build());
161             }
162         }
163     },
164
165     in_port {
166         @Override
167         protected Class<? extends MatchField> getMatchType() {
168             return InPort.class;
169         }
170
171         @Override
172         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
173         }
174
175         @Override
176         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
177
178             StringBuffer nodeConnectorId = new StringBuffer().append("openflow:").append(matchInfo.getBigMatchValues()[0])
179             .append(':').append(matchInfo.getBigMatchValues()[1]);
180             matchBuilderInOut.setInPort(new NodeConnectorId(nodeConnectorId.toString()));
181         }
182     },
183
184     ip_proto {
185         @Override
186         protected Class<? extends MatchField> getMatchType() {
187             return IpProto.class;
188         }
189
190         @Override
191         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
192             IpMatchBuilder ipMatchBuilder = (IpMatchBuilder) mapMatchBuilder.get(IpMatchBuilder.class);
193
194             if (ipMatchBuilder == null) {
195                 ipMatchBuilder = new IpMatchBuilder();
196                 mapMatchBuilder.put(IpMatchBuilder.class, ipMatchBuilder);
197             }
198
199             ipMatchBuilder.setIpProtocol(Short.valueOf((short) matchInfo.getMatchValues()[0])).build();
200         }
201
202         @Override
203         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
204             IpMatchBuilder ipMatchBuilder = (IpMatchBuilder) mapMatchBuilder.remove(IpMatchBuilder.class);
205
206             if (ipMatchBuilder != null) {
207                 matchBuilderInOut.setIpMatch(ipMatchBuilder.build());
208             }
209         }
210     },
211
212     ipv4_dst {
213         @Override
214         protected Class<? extends MatchField> getMatchType() {
215             return Ipv4Dst.class;
216         }
217
218         @Override
219         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
220             Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.get(Ipv4MatchBuilder.class);
221
222             if (ipv4MatchBuilder == null) {
223                 ipv4MatchBuilder = new Ipv4MatchBuilder();
224                 mapMatchBuilder.put(Ipv4MatchBuilder.class, ipv4MatchBuilder);
225             }
226
227             long[] prefix = matchInfo.getMatchValues();
228             ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1]))).build();
229         }
230
231         @Override
232         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
233             Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.remove(Ipv4MatchBuilder.class);
234
235             if (ipv4MatchBuilder != null) {
236                 matchBuilderInOut.setLayer3Match(ipv4MatchBuilder.build());
237             }
238         }
239     },
240
241     ipv4_src {
242         @Override
243         protected Class<? extends MatchField> getMatchType() {
244             return Ipv4Src.class;
245         }
246
247         @Override
248         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
249             Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.get(Ipv4MatchBuilder.class);
250
251             if (ipv4MatchBuilder == null) {
252                 ipv4MatchBuilder = new Ipv4MatchBuilder();
253                 mapMatchBuilder.put(Ipv4MatchBuilder.class, ipv4MatchBuilder);
254             }
255
256             long[] prefix = matchInfo.getMatchValues();
257             ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1]))).build();
258         }
259
260         @Override
261         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
262             Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.remove(Ipv4MatchBuilder.class);
263
264             if (ipv4MatchBuilder != null) {
265                 matchBuilderInOut.setLayer3Match(ipv4MatchBuilder.build());
266             }
267         }
268     },
269
270     arp_op {
271         @Override
272         protected Class<? extends MatchField> getMatchType() {
273             return ArpOp.class;
274         }
275
276         @Override
277         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
278             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
279
280             if (arpMatchBuilder == null) {
281                 arpMatchBuilder = new ArpMatchBuilder();
282                 mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
283             }
284
285             arpMatchBuilder.setArpOp(Integer.valueOf((int) matchInfo.getMatchValues()[0]));
286         }
287
288         @Override
289         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
290             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
291
292             if (arpMatchBuilder != null) {
293                 matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
294             }
295         }
296     },
297
298     arp_tpa {
299         @Override
300         protected Class<? extends MatchField> getMatchType() {
301             return ArpTpa.class;
302         }
303
304         @Override
305         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
306             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
307
308             if (arpMatchBuilder == null) {
309                 arpMatchBuilder = new ArpMatchBuilder();
310                 mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
311             }
312
313             long[] prefix = matchInfo.getMatchValues();
314             arpMatchBuilder.setArpTargetTransportAddress(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1])));
315         }
316
317         @Override
318         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
319             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
320
321             if (arpMatchBuilder != null) {
322                 matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
323             }
324         }
325     },
326
327     arp_spa {
328         @Override
329         protected Class<? extends MatchField> getMatchType() {
330             return ArpSpa.class;
331         }
332
333         @Override
334         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
335             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
336
337             if (arpMatchBuilder == null) {
338                 arpMatchBuilder = new ArpMatchBuilder();
339                 mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
340             }
341
342             long[] prefix = matchInfo.getMatchValues();
343             arpMatchBuilder.setArpSourceTransportAddress(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1])));
344         }
345
346         @Override
347         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
348             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
349
350             if (arpMatchBuilder != null) {
351                 matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
352             }
353         }
354     },
355
356     metadata {
357         @Override
358         protected Class<? extends MatchField> getMatchType() {
359             return Metadata.class;
360         }
361
362         @Override
363         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
364             MetadataBuilder metadataBuilder = (MetadataBuilder) mapMatchBuilder.get(MetadataBuilder.class);
365
366             if (metadataBuilder == null) {
367                 metadataBuilder = new MetadataBuilder();
368                 mapMatchBuilder.put(MetadataBuilder.class, metadataBuilder);
369             }
370
371             BigInteger[] metadataValues = matchInfo.getBigMatchValues();
372             metadataBuilder.setMetadata(metadataValues[0]).setMetadataMask(metadataValues[1]).build();
373         }
374
375         @Override
376         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
377             MetadataBuilder metadataBuilder = (MetadataBuilder) mapMatchBuilder.remove(MetadataBuilder.class);
378
379             if (metadataBuilder != null) {
380                 matchBuilderInOut.setMetadata(metadataBuilder.build());
381             }
382         }
383     },
384
385     mpls_label {
386         @Override
387         protected Class<? extends MatchField> getMatchType() {
388             return MplsLabel.class;
389         }
390
391         @Override
392         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
393             ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
394                     .get(ProtocolMatchFieldsBuilder.class);
395
396             if (protocolMatchFieldsBuilder == null) {
397                 protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
398                 mapMatchBuilder.put(ProtocolMatchFieldsBuilder.class, protocolMatchFieldsBuilder);
399             }
400
401             protocolMatchFieldsBuilder.setMplsLabel(Long.valueOf(matchInfo.getStringMatchValues()[0])).build();
402         }
403
404         @Override
405         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
406             ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
407                     .remove(ProtocolMatchFieldsBuilder.class);
408
409             if (protocolMatchFieldsBuilder != null) {
410                 matchBuilderInOut.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
411             }
412         }
413     },
414
415     pbb_isid {
416         @Override
417         protected Class<? extends MatchField> getMatchType() {
418             return PbbIsid.class;
419         }
420
421         @Override
422         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
423             ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
424                     .get(ProtocolMatchFieldsBuilder.class);
425
426             if (protocolMatchFieldsBuilder == null) {
427                 protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
428                 mapMatchBuilder.put(ProtocolMatchFieldsBuilder.class, protocolMatchFieldsBuilder);
429             }
430
431             protocolMatchFieldsBuilder.setPbb(new PbbBuilder().setPbbIsid(Long.valueOf(matchInfo.getMatchValues()[0]))
432                     .build());
433         }
434
435         @Override
436         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
437             ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
438                     .remove(ProtocolMatchFieldsBuilder.class);
439
440             if (protocolMatchFieldsBuilder != null) {
441                 matchBuilderInOut.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
442             }
443         }
444     },
445
446     tcp_dst {
447         @Override
448         protected Class<? extends MatchField> getMatchType() {
449             return TcpDst.class;
450         }
451
452         @Override
453         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
454             TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.get(TcpMatchBuilder.class);
455
456             if (tcpMatchBuilder == null) {
457                 tcpMatchBuilder = new TcpMatchBuilder();
458                 mapMatchBuilder.put(TcpMatchBuilder.class, tcpMatchBuilder);
459             }
460
461             tcpMatchBuilder.setTcpDestinationPort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
462         }
463
464         @Override
465         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
466             TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.remove(TcpMatchBuilder.class);
467
468             if (tcpMatchBuilder != null) {
469                 matchBuilderInOut.setLayer4Match(tcpMatchBuilder.build());
470             }
471         }
472     },
473
474     tcp_src {
475         @Override
476         protected Class<? extends MatchField> getMatchType() {
477             return TcpSrc.class;
478         }
479
480         @Override
481         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
482             TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.get(TcpMatchBuilder.class);
483
484             if (tcpMatchBuilder == null) {
485                 tcpMatchBuilder = new TcpMatchBuilder();
486                 mapMatchBuilder.put(TcpMatchBuilder.class, tcpMatchBuilder);
487             }
488
489             tcpMatchBuilder.setTcpSourcePort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
490         }
491
492         @Override
493         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
494             TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.remove(TcpMatchBuilder.class);
495
496             if (tcpMatchBuilder != null) {
497                 matchBuilderInOut.setLayer4Match(tcpMatchBuilder.build());
498             }
499         }
500     },
501
502     udp_dst {
503         @Override
504         protected Class<? extends MatchField> getMatchType() {
505             return UdpDst.class;
506         }
507
508         @Override
509         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
510             UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.get(UdpMatchBuilder.class);
511
512             if (udpMatchBuilder == null) {
513                 udpMatchBuilder = new UdpMatchBuilder();
514                 mapMatchBuilder.put(UdpMatchBuilder.class, udpMatchBuilder);
515             }
516
517             udpMatchBuilder.setUdpDestinationPort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
518         }
519
520         @Override
521         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
522             UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.remove(UdpMatchBuilder.class);
523
524             if (udpMatchBuilder != null) {
525                 matchBuilderInOut.setLayer4Match(udpMatchBuilder.build());
526             }
527         }
528     },
529
530     udp_src {
531         @Override
532         protected Class<? extends MatchField> getMatchType() {
533             return UdpSrc.class;
534         }
535
536         @Override
537         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
538             UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.get(UdpMatchBuilder.class);
539
540             if (udpMatchBuilder == null) {
541                 udpMatchBuilder = new UdpMatchBuilder();
542                 mapMatchBuilder.put(UdpMatchBuilder.class, udpMatchBuilder);
543             }
544
545             udpMatchBuilder.setUdpSourcePort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
546         }
547
548         @Override
549         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
550             UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.remove(UdpMatchBuilder.class);
551
552             if (udpMatchBuilder != null) {
553                 matchBuilderInOut.setLayer4Match(udpMatchBuilder.build());
554             }
555         }
556     },
557     tunnel_id {
558         @Override
559         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
560             TunnelBuilder tunnelBuilder = (TunnelBuilder) mapMatchBuilder.get(TunnelBuilder.class);
561
562             if (tunnelBuilder == null) {
563                 tunnelBuilder = new TunnelBuilder();
564                 mapMatchBuilder.put(TunnelBuilder.class, tunnelBuilder);
565             }
566
567             BigInteger[] tunnelIdValues = matchInfo.getBigMatchValues();
568             tunnelBuilder.setTunnelId(tunnelIdValues[0]);
569             if(tunnelIdValues.length > 1){
570                 tunnelBuilder.setTunnelMask(tunnelIdValues[1]);
571             }
572             tunnelBuilder.build();
573         }
574
575         @Override
576         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
577             TunnelBuilder tunnelBuilder = (TunnelBuilder) mapMatchBuilder.remove(TunnelBuilder.class);
578
579             if (tunnelBuilder != null) {
580                 matchBuilderInOut.setTunnel(tunnelBuilder.build());
581             }
582         }
583
584         @Override
585         protected Class<? extends MatchField> getMatchType() {
586             return TunnelId.class;
587         }
588
589     },
590
591     reg1 {
592         @Override
593         protected Class<? extends MatchField> getMatchType() {
594             return MatchField.class;
595         }
596
597         @Override
598         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
599             NxmNxRegBuilder regdataBuilder = (NxmNxRegBuilder) mapMatchBuilder.get(NxmNxRegBuilder.class);
600              if (regdataBuilder == null) {
601                 regdataBuilder = new NxmNxRegBuilder();
602                 mapMatchBuilder.put(NxmNxRegBuilder.class, regdataBuilder);
603             }
604             long[] metadataValues = matchInfo.getMatchValues();
605             regdataBuilder.setValue(metadataValues[0]).build();
606             ArrayList<ExtensionList> extensions = new ArrayList<>();
607             NxAugMatchNodesNodeTableFlow am =  new NxAugMatchNodesNodeTableFlowBuilder().setNxmNxReg(new NxmNxRegBuilder().setReg(NxmNxReg1.class).setValue(metadataValues[0]).build()).build();
608             extensions.add(new ExtensionListBuilder().setExtensionKey(NxmNxReg1Key.class).setExtension(new ExtensionBuilder().addAugmentation(NxAugMatchNodesNodeTableFlow.class, am).build()).build());
609             GeneralAugMatchNodesNodeTableFlow m = new GeneralAugMatchNodesNodeTableFlowBuilder().setExtensionList(extensions).build();
610         }
611
612         @Override
613         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
614             List<ExtensionList> extensions = new ArrayList<>();
615             long[] matchvalues = matchInfo.getMatchValues();
616             NxAugMatchNodesNodeTableFlow am = new NxAugMatchNodesNodeTableFlowBuilder().setNxmNxReg(new NxmNxRegBuilder().setReg(NxmNxReg1.class).setValue(matchvalues[0]).build()).build();
617             extensions.add(new ExtensionListBuilder().setExtensionKey(NxmNxReg1Key.class).setExtension(new ExtensionBuilder().addAugmentation(NxAugMatchNodesNodeTableFlow.class, am).build()).build());
618             GeneralAugMatchNodesNodeTableFlow m = new GeneralAugMatchNodesNodeTableFlowBuilder().setExtensionList(extensions).build();
619             matchBuilderInOut.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, m);
620
621         }
622     },
623
624     vlan_vid {
625         @Override
626         protected Class<? extends MatchField> getMatchType() {
627             return VlanVid.class;
628         }
629
630         @Override
631         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
632             VlanMatchBuilder vlanMatchBuilder = (VlanMatchBuilder) mapMatchBuilder.get(VlanMatchBuilder.class);
633
634             if (vlanMatchBuilder == null) {
635                 vlanMatchBuilder = new VlanMatchBuilder();
636                 mapMatchBuilder.put(VlanMatchBuilder.class, vlanMatchBuilder);
637             }
638
639             vlanMatchBuilder.setVlanId(new VlanIdBuilder()
640             .setVlanId(new VlanId(Integer.valueOf((int) matchInfo.getMatchValues()[0])))
641             .setVlanIdPresent(((int) matchInfo.getMatchValues()[0] == 0) ? Boolean.FALSE : Boolean.TRUE)
642             .build());
643         }
644
645         @Override
646         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
647             VlanMatchBuilder vlanMatchBuilder = (VlanMatchBuilder) mapMatchBuilder.remove(VlanMatchBuilder.class);
648
649             if (vlanMatchBuilder != null) {
650                 matchBuilderInOut.setVlanMatch(vlanMatchBuilder.build());
651             }
652         }
653     };
654
655
656     public abstract void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder);
657
658     public abstract void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo,
659             Map<Class<?>, Object> mapMatchBuilder);
660
661     protected abstract Class<? extends MatchField> getMatchType();
662
663     protected boolean hasMatchFieldMask() {
664         // Override this to return true
665                 return false;
666     }
667 }