Merge "ITM module sync-up"
[genius.git] / mdsalutil / mdsalutil-api / src / main / java / org / opendaylight / genius / mdsalutil / MatchFieldType.java
1 /*
2  * Copyright (c) 2016 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.genius.mdsalutil;
9
10 import java.math.BigInteger;
11 import java.util.Map;
12
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
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.Icmpv4MatchBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagMatchBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpOp;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpSpa;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpTpa;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpSha;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpTha;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthDst;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthSrc;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthType;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv4Type;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv6Type;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.InPort;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.IpProto;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv4Dst;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv4Src;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MatchField;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Metadata;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MplsLabel;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.PbbIsid;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpDst;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpFlag;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpSrc;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.UdpDst;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.UdpSrc;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanVid;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelId;
65
66 public enum MatchFieldType {
67     eth_src {
68         @Override
69         protected Class<? extends MatchField> getMatchType() {
70             return EthSrc.class;
71         }
72
73         @Override
74         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
75             EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
76                     .get(EthernetMatchBuilder.class);
77
78             if (ethernetMatchBuilder == null) {
79                 ethernetMatchBuilder = new EthernetMatchBuilder();
80                 mapMatchBuilder.put(EthernetMatchBuilder.class, ethernetMatchBuilder);
81             }
82
83             ethernetMatchBuilder.setEthernetSource(new EthernetSourceBuilder().setAddress(
84                     new MacAddress(matchInfo.getStringMatchValues()[0])).build());
85         }
86
87         @Override
88         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
89             EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
90                     .remove(EthernetMatchBuilder.class);
91
92             if (ethernetMatchBuilder != null) {
93                 matchBuilderInOut.setEthernetMatch(ethernetMatchBuilder.build());
94             }
95         }
96     },
97
98     eth_dst {
99         @Override
100         protected Class<? extends MatchField> getMatchType() {
101             return EthDst.class;
102         }
103
104         @Override
105         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
106             EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
107                     .get(EthernetMatchBuilder.class);
108
109             if (ethernetMatchBuilder == null) {
110                 ethernetMatchBuilder = new EthernetMatchBuilder();
111                 mapMatchBuilder.put(EthernetMatchBuilder.class, ethernetMatchBuilder);
112             }
113
114             ethernetMatchBuilder.setEthernetDestination(new EthernetDestinationBuilder().setAddress(
115                     new MacAddress(matchInfo.getStringMatchValues()[0])).build());
116         }
117
118         @Override
119         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
120             EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
121                     .remove(EthernetMatchBuilder.class);
122
123             if (ethernetMatchBuilder != null) {
124                 matchBuilderInOut.setEthernetMatch(ethernetMatchBuilder.build());
125             }
126         }
127     },
128
129     eth_type {
130         @Override
131         protected Class<? extends MatchField> getMatchType() {
132             return EthType.class;
133         }
134
135         @Override
136         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
137             EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
138                     .get(EthernetMatchBuilder.class);
139
140             if (ethernetMatchBuilder == null) {
141                 ethernetMatchBuilder = new EthernetMatchBuilder();
142                 mapMatchBuilder.put(EthernetMatchBuilder.class, ethernetMatchBuilder);
143             }
144
145             ethernetMatchBuilder.setEthernetType(new EthernetTypeBuilder().setType(
146                     new EtherType(matchInfo.getMatchValues()[0])).build());
147         }
148
149         @Override
150         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
151             EthernetMatchBuilder ethernetMatchBuilder = (EthernetMatchBuilder) mapMatchBuilder
152                     .remove(EthernetMatchBuilder.class);
153
154             if (ethernetMatchBuilder != null) {
155                 matchBuilderInOut.setEthernetMatch(ethernetMatchBuilder.build());
156             }
157         }
158     },
159
160     in_port {
161         @Override
162         protected Class<? extends MatchField> getMatchType() {
163             return InPort.class;
164         }
165
166         @Override
167         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
168         }
169
170         @Override
171         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
172
173             StringBuffer nodeConnectorId = new StringBuffer().append("openflow:").append(matchInfo.getBigMatchValues()[0])
174             .append(':').append(matchInfo.getBigMatchValues()[1]);
175             matchBuilderInOut.setInPort(new NodeConnectorId(nodeConnectorId.toString()));
176         }
177     },
178
179     ip_proto {
180         @Override
181         protected Class<? extends MatchField> getMatchType() {
182             return IpProto.class;
183         }
184
185         @Override
186         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
187             IpMatchBuilder ipMatchBuilder = (IpMatchBuilder) mapMatchBuilder.get(IpMatchBuilder.class);
188
189             if (ipMatchBuilder == null) {
190                 ipMatchBuilder = new IpMatchBuilder();
191                 mapMatchBuilder.put(IpMatchBuilder.class, ipMatchBuilder);
192             }
193
194             ipMatchBuilder.setIpProtocol(Short.valueOf((short) matchInfo.getMatchValues()[0])).build();
195         }
196
197         @Override
198         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
199             IpMatchBuilder ipMatchBuilder = (IpMatchBuilder) mapMatchBuilder.remove(IpMatchBuilder.class);
200
201             if (ipMatchBuilder != null) {
202                 matchBuilderInOut.setIpMatch(ipMatchBuilder.build());
203             }
204         }
205     },
206
207     ipv4_dst {
208         @Override
209         protected Class<? extends MatchField> getMatchType() {
210             return Ipv4Dst.class;
211         }
212
213         @Override
214         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
215             Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.get(Ipv4MatchBuilder.class);
216
217             if (ipv4MatchBuilder == null) {
218                 ipv4MatchBuilder = new Ipv4MatchBuilder();
219                 mapMatchBuilder.put(Ipv4MatchBuilder.class, ipv4MatchBuilder);
220             }
221
222             long[] prefix = matchInfo.getMatchValues();
223             ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1]))).build();
224         }
225
226         @Override
227         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
228             Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.remove(Ipv4MatchBuilder.class);
229
230             if (ipv4MatchBuilder != null) {
231                 matchBuilderInOut.setLayer3Match(ipv4MatchBuilder.build());
232             }
233         }
234     },
235
236     ipv4_src {
237         @Override
238         protected Class<? extends MatchField> getMatchType() {
239             return Ipv4Src.class;
240         }
241
242         @Override
243         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
244             Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.get(Ipv4MatchBuilder.class);
245
246             if (ipv4MatchBuilder == null) {
247                 ipv4MatchBuilder = new Ipv4MatchBuilder();
248                 mapMatchBuilder.put(Ipv4MatchBuilder.class, ipv4MatchBuilder);
249             }
250
251             long[] prefix = matchInfo.getMatchValues();
252             ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1]))).build();
253         }
254
255         @Override
256         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
257             Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.remove(Ipv4MatchBuilder.class);
258
259             if (ipv4MatchBuilder != null) {
260                 matchBuilderInOut.setLayer3Match(ipv4MatchBuilder.build());
261             }
262         }
263     },
264
265     ipv4_destination {
266         @Override
267         protected Class<? extends MatchField> getMatchType() {
268             return Ipv4Dst.class;
269         }
270
271         @Override
272         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
273             Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.get(Ipv4MatchBuilder.class);
274
275             if (ipv4MatchBuilder == null) {
276                 ipv4MatchBuilder = new Ipv4MatchBuilder();
277                 mapMatchBuilder.put(Ipv4MatchBuilder.class, ipv4MatchBuilder);
278             }
279
280             String[] prefix = matchInfo.getStringMatchValues();
281             ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix(prefix[0] + "/" + prefix[1])).build();
282         }
283
284         @Override
285         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
286             Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.remove(Ipv4MatchBuilder.class);
287
288             if (ipv4MatchBuilder != null) {
289                 matchBuilderInOut.setLayer3Match(ipv4MatchBuilder.build());
290             }
291         }
292     },
293
294     ipv4_source {
295         @Override
296         protected Class<? extends MatchField> getMatchType() {
297             return Ipv4Src.class;
298         }
299
300         @Override
301         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
302             Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.get(Ipv4MatchBuilder.class);
303
304             if (ipv4MatchBuilder == null) {
305                 ipv4MatchBuilder = new Ipv4MatchBuilder();
306                 mapMatchBuilder.put(Ipv4MatchBuilder.class, ipv4MatchBuilder);
307             }
308
309             String[] prefix = matchInfo.getStringMatchValues();
310             ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix(prefix[0] + "/" + prefix[1])).build();
311         }
312
313         @Override
314         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
315             Ipv4MatchBuilder ipv4MatchBuilder = (Ipv4MatchBuilder) mapMatchBuilder.remove(Ipv4MatchBuilder.class);
316
317             if (ipv4MatchBuilder != null) {
318                 matchBuilderInOut.setLayer3Match(ipv4MatchBuilder.build());
319             }
320         }
321     },
322
323     arp_op {
324         @Override
325         protected Class<? extends MatchField> getMatchType() {
326             return ArpOp.class;
327         }
328
329         @Override
330         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
331             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
332
333             if (arpMatchBuilder == null) {
334                 arpMatchBuilder = new ArpMatchBuilder();
335                 mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
336             }
337
338             arpMatchBuilder.setArpOp(Integer.valueOf((int) matchInfo.getMatchValues()[0]));
339         }
340
341         @Override
342         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
343             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
344
345             if (arpMatchBuilder != null) {
346                 matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
347             }
348         }
349     },
350
351     arp_tpa {
352         @Override
353         protected Class<? extends MatchField> getMatchType() {
354             return ArpTpa.class;
355         }
356
357         @Override
358         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
359             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
360
361             if (arpMatchBuilder == null) {
362                 arpMatchBuilder = new ArpMatchBuilder();
363                 mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
364             }
365
366             long[] prefix = matchInfo.getMatchValues();
367             arpMatchBuilder.setArpTargetTransportAddress(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1])));
368         }
369
370         @Override
371         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
372             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
373
374             if (arpMatchBuilder != null) {
375                 matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
376             }
377         }
378     },
379
380     arp_spa {
381         @Override
382         protected Class<? extends MatchField> getMatchType() {
383             return ArpSpa.class;
384         }
385
386         @Override
387         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
388             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
389
390             if (arpMatchBuilder == null) {
391                 arpMatchBuilder = new ArpMatchBuilder();
392                 mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
393             }
394
395             long[] prefix = matchInfo.getMatchValues();
396             arpMatchBuilder.setArpSourceTransportAddress(new Ipv4Prefix(MDSALUtil.longToIp(prefix[0], prefix[1])));
397         }
398
399         @Override
400         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
401             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
402
403             if (arpMatchBuilder != null) {
404                 matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
405             }
406         }
407     },
408
409     arp_tha {
410         @Override
411         protected Class<? extends MatchField> getMatchType() {
412             return ArpTha.class;
413         }
414
415         @Override
416         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
417             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
418
419             if (arpMatchBuilder == null) {
420                 arpMatchBuilder = new ArpMatchBuilder();
421                 mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
422             }
423
424             ArpTargetHardwareAddressBuilder arpSrc = new ArpTargetHardwareAddressBuilder();
425             arpSrc.setAddress(new MacAddress(matchInfo.getStringMatchValues()[0]));
426             arpMatchBuilder.setArpTargetHardwareAddress(arpSrc.build());
427         }
428
429         @Override
430         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
431             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
432
433             if (arpMatchBuilder != null) {
434                 matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
435             }
436         }
437     },
438
439     arp_sha {
440         @Override
441         protected Class<? extends MatchField> getMatchType() {
442             return ArpSha.class;
443         }
444
445         @Override
446         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
447             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.get(ArpMatchBuilder.class);
448
449             if (arpMatchBuilder == null) {
450                 arpMatchBuilder = new ArpMatchBuilder();
451                 mapMatchBuilder.put(ArpMatchBuilder.class, arpMatchBuilder);
452             }
453
454             ArpSourceHardwareAddressBuilder arpSrc = new ArpSourceHardwareAddressBuilder();
455             arpSrc.setAddress(new MacAddress(matchInfo.getStringMatchValues()[0]));
456             arpMatchBuilder.setArpSourceHardwareAddress(arpSrc.build());
457         }
458
459         @Override
460         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
461             ArpMatchBuilder arpMatchBuilder = (ArpMatchBuilder) mapMatchBuilder.remove(ArpMatchBuilder.class);
462
463             if (arpMatchBuilder != null) {
464                 matchBuilderInOut.setLayer3Match(arpMatchBuilder.build());
465             }
466         }
467     },
468
469     metadata {
470         @Override
471         protected Class<? extends MatchField> getMatchType() {
472             return Metadata.class;
473         }
474
475         @Override
476         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
477             MetadataBuilder metadataBuilder = (MetadataBuilder) mapMatchBuilder.get(MetadataBuilder.class);
478
479             if (metadataBuilder == null) {
480                 metadataBuilder = new MetadataBuilder();
481                 mapMatchBuilder.put(MetadataBuilder.class, metadataBuilder);
482             }
483
484             BigInteger[] metadataValues = matchInfo.getBigMatchValues();
485             metadataBuilder.setMetadata(metadataValues[0]).setMetadataMask(metadataValues[1]).build();
486         }
487
488         @Override
489         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
490             MetadataBuilder metadataBuilder = (MetadataBuilder) mapMatchBuilder.remove(MetadataBuilder.class);
491
492             if (metadataBuilder != null) {
493                 matchBuilderInOut.setMetadata(metadataBuilder.build());
494             }
495         }
496     },
497
498     mpls_label {
499         @Override
500         protected Class<? extends MatchField> getMatchType() {
501             return MplsLabel.class;
502         }
503
504         @Override
505         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
506             ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
507                     .get(ProtocolMatchFieldsBuilder.class);
508
509             if (protocolMatchFieldsBuilder == null) {
510                 protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
511                 mapMatchBuilder.put(ProtocolMatchFieldsBuilder.class, protocolMatchFieldsBuilder);
512             }
513
514             protocolMatchFieldsBuilder.setMplsLabel(Long.valueOf(matchInfo.getStringMatchValues()[0])).build();
515         }
516
517         @Override
518         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
519             ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
520                     .remove(ProtocolMatchFieldsBuilder.class);
521
522             if (protocolMatchFieldsBuilder != null) {
523                 matchBuilderInOut.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
524             }
525         }
526     },
527
528     pbb_isid {
529         @Override
530         protected Class<? extends MatchField> getMatchType() {
531             return PbbIsid.class;
532         }
533
534         @Override
535         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
536             ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
537                     .get(ProtocolMatchFieldsBuilder.class);
538
539             if (protocolMatchFieldsBuilder == null) {
540                 protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
541                 mapMatchBuilder.put(ProtocolMatchFieldsBuilder.class, protocolMatchFieldsBuilder);
542             }
543
544             protocolMatchFieldsBuilder.setPbb(new PbbBuilder().setPbbIsid(Long.valueOf(matchInfo.getMatchValues()[0]))
545                     .build());
546         }
547
548         @Override
549         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
550             ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = (ProtocolMatchFieldsBuilder) mapMatchBuilder
551                     .remove(ProtocolMatchFieldsBuilder.class);
552
553             if (protocolMatchFieldsBuilder != null) {
554                 matchBuilderInOut.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
555             }
556         }
557     },
558
559     tcp_dst {
560         @Override
561         protected Class<? extends MatchField> getMatchType() {
562             return TcpDst.class;
563         }
564
565         @Override
566         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
567             TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.get(TcpMatchBuilder.class);
568
569             if (tcpMatchBuilder == null) {
570                 tcpMatchBuilder = new TcpMatchBuilder();
571                 mapMatchBuilder.put(TcpMatchBuilder.class, tcpMatchBuilder);
572             }
573
574             tcpMatchBuilder.setTcpDestinationPort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
575         }
576
577         @Override
578         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
579             TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.remove(TcpMatchBuilder.class);
580
581             if (tcpMatchBuilder != null) {
582                 matchBuilderInOut.setLayer4Match(tcpMatchBuilder.build());
583             }
584         }
585     },
586
587     tcp_src {
588         @Override
589         protected Class<? extends MatchField> getMatchType() {
590             return TcpSrc.class;
591         }
592
593         @Override
594         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
595             TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.get(TcpMatchBuilder.class);
596
597             if (tcpMatchBuilder == null) {
598                 tcpMatchBuilder = new TcpMatchBuilder();
599                 mapMatchBuilder.put(TcpMatchBuilder.class, tcpMatchBuilder);
600             }
601
602             tcpMatchBuilder.setTcpSourcePort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
603         }
604
605         @Override
606         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
607             TcpMatchBuilder tcpMatchBuilder = (TcpMatchBuilder) mapMatchBuilder.remove(TcpMatchBuilder.class);
608
609             if (tcpMatchBuilder != null) {
610                 matchBuilderInOut.setLayer4Match(tcpMatchBuilder.build());
611             }
612         }
613     },
614
615     tcp_flags {
616         @Override
617         protected Class<? extends MatchField> getMatchType() {
618             return TcpFlag.class;
619         }
620
621         @Override
622         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
623             TcpFlagMatchBuilder tcpFlagMatchBuilder = (TcpFlagMatchBuilder) mapMatchBuilder
624                     .get(TcpFlagMatchBuilder.class);
625             if (matchInfo == null || matchInfo.getMatchValues() == null || matchInfo.getMatchValues().length == 0) {
626                 return;
627             }
628
629             if (tcpFlagMatchBuilder == null) {
630                 tcpFlagMatchBuilder = new TcpFlagMatchBuilder();
631                 mapMatchBuilder.put(TcpFlagMatchBuilder.class, tcpFlagMatchBuilder);
632             }
633             tcpFlagMatchBuilder.setTcpFlag((int) matchInfo.getMatchValues()[0]);
634         }
635
636         @Override
637         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>,
638                 Object> mapMatchBuilder) {
639             TcpFlagMatchBuilder tcpFlagMatchBuilder = (TcpFlagMatchBuilder) mapMatchBuilder
640                     .remove(TcpFlagMatchBuilder.class);
641
642             if (tcpFlagMatchBuilder != null) {
643                 matchBuilderInOut.setTcpFlagMatch(tcpFlagMatchBuilder.build());
644             }
645         }
646     },
647     udp_dst {
648         @Override
649         protected Class<? extends MatchField> getMatchType() {
650             return UdpDst.class;
651         }
652
653         @Override
654         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
655             UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.get(UdpMatchBuilder.class);
656
657             if (udpMatchBuilder == null) {
658                 udpMatchBuilder = new UdpMatchBuilder();
659                 mapMatchBuilder.put(UdpMatchBuilder.class, udpMatchBuilder);
660             }
661
662             udpMatchBuilder.setUdpDestinationPort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
663         }
664
665         @Override
666         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
667             UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.remove(UdpMatchBuilder.class);
668
669             if (udpMatchBuilder != null) {
670                 matchBuilderInOut.setLayer4Match(udpMatchBuilder.build());
671             }
672         }
673     },
674
675     udp_src {
676         @Override
677         protected Class<? extends MatchField> getMatchType() {
678             return UdpSrc.class;
679         }
680
681         @Override
682         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
683             UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.get(UdpMatchBuilder.class);
684
685             if (udpMatchBuilder == null) {
686                 udpMatchBuilder = new UdpMatchBuilder();
687                 mapMatchBuilder.put(UdpMatchBuilder.class, udpMatchBuilder);
688             }
689
690             udpMatchBuilder.setUdpSourcePort(new PortNumber(Integer.valueOf((int) matchInfo.getMatchValues()[0])));
691         }
692
693         @Override
694         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
695             UdpMatchBuilder udpMatchBuilder = (UdpMatchBuilder) mapMatchBuilder.remove(UdpMatchBuilder.class);
696
697             if (udpMatchBuilder != null) {
698                 matchBuilderInOut.setLayer4Match(udpMatchBuilder.build());
699             }
700         }
701     },
702     tunnel_id {
703         @Override
704         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
705             TunnelBuilder tunnelBuilder = (TunnelBuilder) mapMatchBuilder.get(TunnelBuilder.class);
706
707             if (tunnelBuilder == null) {
708                 tunnelBuilder = new TunnelBuilder();
709                 mapMatchBuilder.put(TunnelBuilder.class, tunnelBuilder);
710             }
711
712             BigInteger[] tunnelIdValues = matchInfo.getBigMatchValues();
713             tunnelBuilder.setTunnelId(tunnelIdValues[0]);
714             if(tunnelIdValues.length > 1){
715                 tunnelBuilder.setTunnelMask(tunnelIdValues[1]);
716             }
717             tunnelBuilder.build();
718         }
719
720         @Override
721         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
722             TunnelBuilder tunnelBuilder = (TunnelBuilder) mapMatchBuilder.remove(TunnelBuilder.class);
723
724             if (tunnelBuilder != null) {
725                 matchBuilderInOut.setTunnel(tunnelBuilder.build());
726             }
727         }
728
729         @Override
730         protected Class<? extends MatchField> getMatchType() {
731             return TunnelId.class;
732         }
733
734     },
735
736     vlan_vid {
737         @Override
738         protected Class<? extends MatchField> getMatchType() {
739             return VlanVid.class;
740         }
741
742         @Override
743         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
744             VlanMatchBuilder vlanMatchBuilder = (VlanMatchBuilder) mapMatchBuilder.get(VlanMatchBuilder.class);
745
746             if (vlanMatchBuilder == null) {
747                 vlanMatchBuilder = new VlanMatchBuilder();
748                 mapMatchBuilder.put(VlanMatchBuilder.class, vlanMatchBuilder);
749             }
750
751             vlanMatchBuilder.setVlanId(new VlanIdBuilder()
752             .setVlanId(new VlanId(Integer.valueOf((int) matchInfo.getMatchValues()[0])))
753             .setVlanIdPresent(((int) matchInfo.getMatchValues()[0] == 0) ? Boolean.FALSE : Boolean.TRUE)
754             .build());
755         }
756
757         @Override
758         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
759             VlanMatchBuilder vlanMatchBuilder = (VlanMatchBuilder) mapMatchBuilder.remove(VlanMatchBuilder.class);
760
761             if (vlanMatchBuilder != null) {
762                 matchBuilderInOut.setVlanMatch(vlanMatchBuilder.build());
763             }
764         }
765     },
766
767     icmp_v4 {
768         @Override
769         protected Class<? extends MatchField> getMatchType() {
770             return Icmpv4Type.class;
771         }
772
773         @Override
774         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
775             Icmpv4MatchBuilder icmpv4MatchBuilder = (Icmpv4MatchBuilder) mapMatchBuilder.get(Icmpv4MatchBuilder.class);
776
777             if (icmpv4MatchBuilder == null) {
778                 icmpv4MatchBuilder = new Icmpv4MatchBuilder();
779                 mapMatchBuilder.put(Icmpv4MatchBuilder.class, icmpv4MatchBuilder);
780             }
781
782             icmpv4MatchBuilder.setIcmpv4Type((short) matchInfo.getMatchValues()[0]);
783             icmpv4MatchBuilder.setIcmpv4Code((short) matchInfo.getMatchValues()[1]);
784         }
785
786         @Override
787         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
788             Icmpv4MatchBuilder icmpv4MatchBuilder = (Icmpv4MatchBuilder) mapMatchBuilder.remove(Icmpv4MatchBuilder.class);
789
790             if (icmpv4MatchBuilder != null) {
791                 matchBuilderInOut.setIcmpv4Match(icmpv4MatchBuilder.build());
792             }
793         }
794     },
795
796     icmp_v6 {
797         @Override
798         protected Class<? extends MatchField> getMatchType() {
799             return Icmpv6Type.class;
800         }
801
802         @Override
803         public void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
804             Icmpv6MatchBuilder icmpv6MatchBuilder = (Icmpv6MatchBuilder) mapMatchBuilder.get(Icmpv6MatchBuilder.class);
805
806             if (icmpv6MatchBuilder == null) {
807                 icmpv6MatchBuilder = new Icmpv6MatchBuilder();
808                 mapMatchBuilder.put(Icmpv6MatchBuilder.class, icmpv6MatchBuilder);
809             }
810
811             icmpv6MatchBuilder.setIcmpv6Type((short) matchInfo.getMatchValues()[0]);
812             icmpv6MatchBuilder.setIcmpv6Code((short) matchInfo.getMatchValues()[1]);
813         }
814
815         @Override
816         public void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder) {
817             Icmpv6MatchBuilder icmpv6MatchBuilder = (Icmpv6MatchBuilder) mapMatchBuilder.remove(VlanMatchBuilder.class);
818
819             if (icmpv6MatchBuilder != null) {
820                 matchBuilderInOut.setIcmpv6Match(icmpv6MatchBuilder.build());
821             }
822         }
823     };
824
825
826     public abstract void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder);
827
828     public abstract void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo,
829             Map<Class<?>, Object> mapMatchBuilder);
830
831     protected abstract Class<? extends MatchField> getMatchType();
832
833     protected boolean hasMatchFieldMask() {
834         // Override this to return true
835                 return false;
836     }
837 }