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