restructure and base modules for different features
[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                         // NodeConnectorId format -> openflow:<dpnId>:<portId>
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 SetFieldMatch buildSetFieldMatch(XtensionType xtype) {
606                 if (xtype == null || xtype.getMatchMaskType() == 
607                                 SalOfaMatchMaskType.OFPMMNOMASK) {
608                         return new 
609                                         SetFieldMatchBuilder().setHasMask(false).setMatchType(getMatchType())
610                                         .setSalOxmClass(SalOpenflowBasicClass.class).build();
611                 }
612
613                 return new SetFieldMatchBuilder()
614                 .setHasMask(true)
615                 .setMatchType(getMatchType())
616                 .setSalOxmClass(SalOpenflowBasicClass.class)
617                 .addAugmentation(
618                                 ExperimenterSetFieldMatch.class,
619                                 new 
620                                 ExperimenterSetFieldMatchBuilder().setMatchMaskType(xtype.getMatchMaskType())
621                                 .setTlvMatchMask(xtype.getByteBuf()).build()).build();
622
623
624         }
625 */
626
627         // New one for ODL without the Extension --CHECK
628         /*
629         public SetFieldMatch buildSetFieldMatch() {
630                 
631                 return new SetFieldMatchBuilder().setHasMask(false).setMatchType(getMatchType())
632                                         .setSalOxmClass(SalOpenflowBasicClass.class).build();
633                                         
634                 return null;
635                 }
636 */
637                 
638         
639         public abstract void createInnerMatchBuilder(MatchInfo matchInfo, Map<Class<?>, Object> mapMatchBuilder);
640
641         public abstract void setMatch(MatchBuilder matchBuilderInOut, MatchInfo matchInfo,
642                         Map<Class<?>, Object> mapMatchBuilder);
643
644         protected abstract Class<? extends MatchField> getMatchType();
645
646         protected boolean hasMatchFieldMask() {
647                 // Override this to return true
648                                 return false;
649         }
650 }