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