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