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