d8cbaca00ea66d4ecb1432065692adee744a5b2d
[genius.git] / mdsalutil / mdsalutil-api / src / main / java / org / opendaylight / genius / mdsalutil / ActionType.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 com.google.common.net.InetAddresses;
11 import java.math.BigInteger;
12 import org.opendaylight.genius.mdsalutil.actions.ActionDrop;
13 import org.opendaylight.genius.mdsalutil.actions.ActionGroup;
14 import org.opendaylight.genius.mdsalutil.actions.ActionLearn;
15 import org.opendaylight.genius.mdsalutil.actions.ActionMoveSourceDestinationEth;
16 import org.opendaylight.genius.mdsalutil.actions.ActionMoveSourceDestinationIp;
17 import org.opendaylight.genius.mdsalutil.actions.ActionNxConntrack;
18 import org.opendaylight.genius.mdsalutil.actions.ActionNxResubmit;
19 import org.opendaylight.genius.mdsalutil.actions.ActionOutput;
20 import org.opendaylight.genius.mdsalutil.actions.ActionPopMpls;
21 import org.opendaylight.genius.mdsalutil.actions.ActionPopPbb;
22 import org.opendaylight.genius.mdsalutil.actions.ActionPopVlan;
23 import org.opendaylight.genius.mdsalutil.actions.ActionPuntToController;
24 import org.opendaylight.genius.mdsalutil.actions.ActionPushMpls;
25 import org.opendaylight.genius.mdsalutil.actions.ActionPushPbb;
26 import org.opendaylight.genius.mdsalutil.actions.ActionPushVlan;
27 import org.opendaylight.genius.mdsalutil.actions.ActionRegLoad;
28 import org.opendaylight.genius.mdsalutil.actions.ActionRegMove;
29 import org.opendaylight.genius.mdsalutil.actions.ActionSetDestinationIp;
30 import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldDscp;
31 import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldEthernetDestination;
32 import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldEthernetSource;
33 import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldMplsLabel;
34 import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldPbbIsid;
35 import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldTunnelId;
36 import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldVlanVid;
37 import org.opendaylight.genius.mdsalutil.actions.ActionSetIcmpType;
38 import org.opendaylight.genius.mdsalutil.actions.ActionSetSourceIp;
39 import org.opendaylight.genius.mdsalutil.actions.ActionSetTcpDestinationPort;
40 import org.opendaylight.genius.mdsalutil.actions.ActionSetTcpSourcePort;
41 import org.opendaylight.genius.mdsalutil.actions.ActionSetTunnelDestinationIp;
42 import org.opendaylight.genius.mdsalutil.actions.ActionSetTunnelSourceIp;
43 import org.opendaylight.genius.mdsalutil.actions.ActionSetUdpDestinationPort;
44 import org.opendaylight.genius.mdsalutil.actions.ActionSetUdpProtocol;
45 import org.opendaylight.genius.mdsalutil.actions.ActionSetUdpSourcePort;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg6;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.DstChoice;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxArpShaCaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxArpThaCaseBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxOfInPortCaseBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpOpCaseBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpSpaCaseBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpTpaCaseBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.group.buckets.bucket.action.action.NxActionRegLoadNodesNodeGroupBucketsBucketActionsCaseBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.group.buckets.bucket.action.action.NxActionRegMoveNodesNodeGroupBucketsBucketActionsCaseBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionRegMoveNodesNodeTableFlowApplyActionsCaseBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoad;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.NxRegMove;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.NxRegMoveBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.nx.reg.move.SrcBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.SrcChoice;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxArpShaCaseBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfArpSpaCaseBuilder;
74
75
76 public enum ActionType {
77     @Deprecated
78     group {
79         @Override
80         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
81             if (actionInfo instanceof ActionGroup) {
82                 return ((ActionGroup) actionInfo).buildAction(newActionKey);
83             } else {
84                 // TODO Migrate all users to ActionGroup
85                 return new ActionGroup(actionInfo.getActionValues()).buildAction(newActionKey);
86             }
87         }
88     },
89
90     @Deprecated
91     output {
92         @Override
93         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
94             if (actionInfo instanceof ActionOutput) {
95                 return ((ActionOutput) actionInfo).buildAction(newActionKey);
96             } else {
97                 // TODO Migrate all users to ActionOutput
98                 return new ActionOutput(actionInfo.getActionValues()).buildAction(newActionKey);
99             }
100         }
101     },
102
103     @Deprecated
104     pop_mpls {
105         @Override
106         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
107             if (actionInfo instanceof ActionPopMpls) {
108                 return ((ActionPopMpls) actionInfo).buildAction(newActionKey);
109             } else {
110                 // TODO Migrate all users to ActionPopMpls
111                 return new ActionPopMpls().buildAction(newActionKey);
112             }
113         }
114     },
115
116     @Deprecated
117     pop_pbb {
118         @Override
119         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
120             if (actionInfo instanceof ActionPopPbb) {
121                 return ((ActionPopPbb) actionInfo).buildAction(newActionKey);
122             } else {
123                 // TODO Migrate all users to ActionPopPbb
124                 return new ActionPopPbb().buildAction(newActionKey);
125             }
126         }
127     },
128
129     @Deprecated
130     pop_vlan {
131         @Override
132         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
133             if (actionInfo instanceof ActionPopVlan) {
134                 return ((ActionPopVlan) actionInfo).buildAction(newActionKey);
135             } else {
136                 // TODO Migrate all users to ActionPopVlan
137                 return new ActionPopVlan().buildAction(newActionKey);
138             }
139         }
140     },
141
142     @Deprecated
143     push_mpls {
144         @Override
145         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
146             if (actionInfo instanceof ActionPushMpls) {
147                 return ((ActionPushMpls) actionInfo).buildAction(newActionKey);
148             } else {
149                 // TODO Migrate all users to ActionPushMpls
150                 return new ActionPushMpls().buildAction(newActionKey);
151             }
152         }
153     },
154
155     @Deprecated
156     push_pbb {
157         @Override
158         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
159             if (actionInfo instanceof ActionPushPbb) {
160                 return ((ActionPushPbb) actionInfo).buildAction(newActionKey);
161             } else {
162                 // TODO Migrate all users to ActionPushPbb
163                 return new ActionPushPbb().buildAction(newActionKey);
164             }
165         }
166     },
167
168     @Deprecated
169     push_vlan {
170         @Override
171         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
172             if (actionInfo instanceof ActionPushVlan) {
173                 return ((ActionPushVlan) actionInfo).buildAction(newActionKey);
174             } else {
175                 // TODO Migrate all users to ActionPushVlan
176                 return new ActionPushVlan().buildAction(newActionKey);
177             }
178         }
179     },
180
181     @Deprecated
182     set_field_mpls_label {
183         @Override
184         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
185             if (actionInfo instanceof ActionSetFieldMplsLabel) {
186                 return ((ActionSetFieldMplsLabel) actionInfo).buildAction(newActionKey);
187             } else {
188                 // TODO Migrate all users to ActionSetFieldMplsLabel
189                 return new ActionSetFieldMplsLabel(actionInfo).buildAction(newActionKey);
190             }
191         }
192     },
193
194     @Deprecated
195     set_field_pbb_isid {
196         @Override
197         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
198             if (actionInfo instanceof ActionSetFieldPbbIsid) {
199                 return ((ActionSetFieldPbbIsid) actionInfo).buildAction(newActionKey);
200             } else {
201                 // TODO Migrate all users to ActionSetFieldPbbIsid
202                 return new ActionSetFieldPbbIsid(actionInfo).buildAction(newActionKey);
203             }
204         }
205     },
206
207     @Deprecated
208     set_field_vlan_vid {
209         @Override
210         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
211             if (actionInfo instanceof ActionSetFieldVlanVid) {
212                 return ((ActionSetFieldVlanVid) actionInfo).buildAction(newActionKey);
213             } else {
214                 // TODO Migrate all users to ActionSetFieldVlanVid
215                 return new ActionSetFieldVlanVid(actionInfo).buildAction(newActionKey);
216             }
217         }
218     },
219
220     @Deprecated
221     set_field_tunnel_id {
222         @Override
223         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
224             if (actionInfo instanceof ActionSetFieldTunnelId) {
225                 return ((ActionSetFieldTunnelId) actionInfo).buildAction(newActionKey);
226             } else {
227                 // TODO Migrate all users to ActionSetFieldTunnelId
228                 return new ActionSetFieldTunnelId(actionInfo).buildAction(newActionKey);
229             }
230         }
231     },
232
233     @Deprecated
234     set_tunnel_src_ip {
235         @Override
236         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
237             if (actionInfo instanceof ActionSetTunnelSourceIp) {
238                 return ((ActionSetTunnelSourceIp) actionInfo).buildAction(newActionKey);
239             } else {
240                 // TODO Migrate all users to ActionSetTunnelSourceIp
241                 return new ActionSetTunnelSourceIp(actionInfo).buildAction(newActionKey);
242             }
243         }
244     },
245
246     @Deprecated
247     set_tunnel_dest_ip {
248         @Override
249         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
250             if (actionInfo instanceof ActionSetTunnelDestinationIp) {
251                 return ((ActionSetTunnelDestinationIp) actionInfo).buildAction(newActionKey);
252             } else {
253                 // TODO Migrate all users to ActionSetTunnelDestinationIp
254                 return new ActionSetTunnelDestinationIp(actionInfo).buildAction(newActionKey);
255             }
256         }
257     },
258
259     @Deprecated
260     set_field_eth_dest {
261         @Override
262         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
263             if (actionInfo instanceof ActionSetFieldEthernetDestination) {
264                 return ((ActionSetFieldEthernetDestination) actionInfo).buildAction(newActionKey);
265             } else {
266                 // TODO Migrate all users to ActionSetFieldEthernetDestination
267                 return new ActionSetFieldEthernetDestination(actionInfo).buildAction(newActionKey);
268             }
269         }
270     },
271
272     @Deprecated
273     set_udp_protocol {
274         @Override
275         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
276             if (actionInfo instanceof ActionSetUdpProtocol) {
277                 return ((ActionSetUdpProtocol) actionInfo).buildAction(newActionKey);
278             } else {
279                 return new ActionSetUdpProtocol().buildAction(newActionKey);
280             }
281         }
282     },
283
284     @Deprecated
285     punt_to_controller {
286         @Override
287         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
288             if (actionInfo instanceof ActionPuntToController) {
289                 return ((ActionPuntToController) actionInfo).buildAction(newActionKey);
290             } else {
291                 return new ActionPuntToController().buildAction(newActionKey);
292             }
293         }
294     },
295
296     @Deprecated
297     learn {
298         @Override
299         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
300             if (actionInfo instanceof ActionLearn) {
301                 return ((ActionLearn) actionInfo).buildAction(newActionKey);
302             } else {
303                 // TODO Migrate all users to ActionLearn
304                 return new ActionLearn(actionInfo).buildAction(newActionKey);
305             }
306         }
307     },
308
309     @Deprecated
310     set_udp_destination_port {
311         @Override
312         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
313             if (actionInfo instanceof ActionSetUdpDestinationPort) {
314                 return ((ActionSetUdpDestinationPort) actionInfo).buildAction(newActionKey);
315             } else {
316                 return new ActionSetUdpDestinationPort(actionInfo).buildAction(newActionKey);
317             }
318         }
319     },
320
321     @Deprecated
322     set_udp_source_port {
323         @Override
324         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
325             if (actionInfo instanceof ActionSetUdpSourcePort) {
326                 return ((ActionSetUdpSourcePort) actionInfo).buildAction(newActionKey);
327             } else {
328                 return new ActionSetUdpSourcePort(actionInfo).buildAction(newActionKey);
329             }
330         }
331     },
332
333     @Deprecated
334     set_tcp_destination_port {
335         @Override
336         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
337             if (actionInfo instanceof ActionSetTcpDestinationPort) {
338                 return ((ActionSetTcpDestinationPort) actionInfo).buildAction(newActionKey);
339             } else {
340                 return new ActionSetTcpDestinationPort(actionInfo).buildAction(newActionKey);
341             }
342         }
343     },
344
345     @Deprecated
346     set_tcp_source_port {
347         @Override
348         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
349             if (actionInfo instanceof ActionSetTcpSourcePort) {
350                 return ((ActionSetTcpSourcePort) actionInfo).buildAction(newActionKey);
351             } else {
352                 return new ActionSetTcpSourcePort(actionInfo).buildAction(newActionKey);
353             }
354         }
355     },
356
357     @Deprecated
358     set_source_ip {
359         @Override
360         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
361             if (actionInfo instanceof ActionSetSourceIp) {
362                 return ((ActionSetSourceIp) actionInfo).buildAction(newActionKey);
363             } else {
364                 return new ActionSetSourceIp(actionInfo).buildAction(newActionKey);
365             }
366         }
367     },
368
369     @Deprecated
370     set_destination_ip {
371         @Override
372         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
373             if (actionInfo instanceof ActionSetDestinationIp) {
374                 return ((ActionSetDestinationIp) actionInfo).buildAction(newActionKey);
375             } else {
376                 return new ActionSetDestinationIp(actionInfo).buildAction(newActionKey);
377             }
378         }
379     },
380
381     @Deprecated
382     set_field_dscp {
383         @Override
384         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
385             return ((ActionSetFieldDscp) actionInfo).buildAction(newActionKey);
386         }
387     },
388
389     @Deprecated
390     set_field_eth_src {
391         @Override
392         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
393             if (actionInfo instanceof ActionSetFieldEthernetSource) {
394                 return ((ActionSetFieldEthernetSource) actionInfo).buildAction(newActionKey);
395             } else {
396                 // TODO Migrate all users to ActionSetFieldEthernetSource
397                 return new ActionSetFieldEthernetSource(actionInfo).buildAction(newActionKey);
398             }
399         }
400     },
401
402     @Deprecated
403     drop_action {
404         @Override
405         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
406             if (actionInfo instanceof ActionDrop) {
407                 return ((ActionDrop) actionInfo).buildAction(newActionKey);
408             } else {
409                 // TODO Migrate all users to ActionDrop
410                 return new ActionDrop().buildAction(newActionKey);
411             }
412         }
413     },
414
415     @Deprecated
416     nx_resubmit {
417         @Override
418         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
419             if (actionInfo instanceof ActionNxResubmit) {
420                 return ((ActionNxResubmit) actionInfo).buildAction(newActionKey);
421             } else {
422                 // TODO Migrate all users to ActionNxResubmit
423                 return new ActionNxResubmit(actionInfo).buildAction(newActionKey);
424             }
425         }
426     },
427
428     @Deprecated
429     nx_load_reg_6 {
430         @Override
431         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
432             // TODO Migrate all users to ActionRegLoad
433             return new ActionRegLoad(NxmNxReg6.class, actionInfo.getActionValues()).buildAction(newActionKey);
434         }
435     },
436
437     @Deprecated
438     nx_load_reg {
439         @Override
440         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
441             if (actionInfo instanceof ActionRegLoad) {
442                 return ((ActionRegLoad) actionInfo).buildAction(newActionKey);
443             }
444             throw new IllegalStateException(
445                     "nx_load_reg with an ActionInfo that's not ActionRegLoad but " + actionInfo.getClass());
446         }
447     },
448
449     @Deprecated
450     nx_reg_move_mpls_label {
451         @Override
452         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
453             if (actionInfo instanceof ActionRegMove) {
454                 return ((ActionRegMove) actionInfo).buildAction(newActionKey);
455             }
456             throw new IllegalStateException(
457                     "nx_reg_move_mpls_label with an ActionInfo that's not ActionRegMove but " + actionInfo.getClass());
458         }
459     },
460
461     @Deprecated
462     goto_table {
463         @Override
464         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
465             return null;
466         }
467     },
468
469     @Deprecated
470     nx_conntrack {
471         @Override
472         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
473             if (actionInfo instanceof ActionNxConntrack) {
474                 return ((ActionNxConntrack) actionInfo).buildAction(newActionKey);
475             } else {
476                 return new ActionNxConntrack(actionInfo.getActionValues()).buildAction(newActionKey);
477             }
478         }
479
480     },
481
482     @Deprecated
483     move_src_dst_ip {
484         @Override
485         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
486             if (actionInfo instanceof ActionMoveSourceDestinationIp) {
487                 return ((ActionMoveSourceDestinationIp) actionInfo).buildAction(newActionKey);
488             } else {
489                 return new ActionMoveSourceDestinationIp(actionInfo).buildAction(newActionKey);
490             }
491         }
492     },
493
494     @Deprecated
495     move_src_dst_eth {
496         @Override
497         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
498             if (actionInfo instanceof ActionMoveSourceDestinationEth) {
499                 return ((ActionMoveSourceDestinationEth) actionInfo).buildAction(newActionKey);
500             } else {
501                 return new ActionMoveSourceDestinationEth(actionInfo).buildAction(newActionKey);
502             }
503         }
504     },
505
506     @Deprecated
507     set_icmp_type {
508         @Override
509         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
510             if (actionInfo instanceof ActionSetIcmpType) {
511                 return ((ActionSetIcmpType) actionInfo).buildAction(newActionKey);
512             } else {
513                 return new ActionSetIcmpType(actionInfo).buildAction(newActionKey);
514             }
515         }
516     },
517
518     nx_load_in_port {
519         @Override
520         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
521             BigInteger[] actionValues = actionInfo.getBigActionValues();
522             NxRegLoad rb = new NxRegLoadBuilder()
523                     .setDst(new DstBuilder()
524                             .setDstChoice(new DstNxOfInPortCaseBuilder().setOfInPort(Boolean.TRUE).build())
525                             .setStart(0).setEnd(15).build())
526                     .setValue(actionValues[0]).build();
527             ActionBuilder ab = new ActionBuilder();
528             ab.setKey(new ActionKey(newActionKey));
529             ab.setOrder(newActionKey);
530             ab.setAction(new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder().setNxRegLoad(rb).build());
531             return ab.build();
532         }
533     },
534
535     /**
536      * Load macAddress to SHA(Sender Hardware Address)
537      * <p>
538      * Media address of the sender. In an ARP request this field is used to
539      * indicate the address of the host sending the request. In an ARP reply
540      * this field is used to indicate the address of the host that the request
541      * was looking for.
542      *
543      */
544     load_mac_to_sha {
545
546         @Override
547         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
548             final MacAddress mac = new MacAddress(
549                     actionInfo.getActionValues()[0]);
550             return new ActionBuilder().setKey(new ActionKey(newActionKey))
551                     .setAction(nxLoadRegAction(new DstNxArpShaCaseBuilder()
552                     .setNxArpSha(Boolean.TRUE).build(), BigInteger.valueOf(NWUtil.macToLong(mac)), 47, false))
553                     .build();
554         }
555     },
556
557     /**
558      * Load IP Address to SPA(Sender Protocol Address)
559      * <p>
560      * IP address of the sender. In an ARP request this field is used to
561      * indicate the address of the host sending the request. In an ARP reply
562      * this field is used to indicate the address of the host that the request
563      * was looking for
564      */
565     load_ip_to_spa {
566
567         @Override
568         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
569
570             final String ipAddress = actionInfo.getActionValues()[0];
571             final long ipl = InetAddresses
572                     .coerceToInteger(InetAddresses.forString(ipAddress)) & 0xffffffffL;
573             return new ActionBuilder().setKey(new ActionKey(newActionKey))
574                     .setAction(nxLoadRegAction(new DstOfArpSpaCaseBuilder()
575                             .setOfArpSpa(Boolean.TRUE).build(), BigInteger.valueOf(ipl))).build();
576
577         }
578
579     },
580
581     /**
582      * Move Source Hardware address to Destination address, to where the ARP
583      * response need to be addressed to.
584      *
585      */
586     move_sha_to_tha {
587
588         @Override
589         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
590             return new ActionBuilder().setKey(new ActionKey(newActionKey))
591                     .setAction(nxMoveRegAction(
592                             new SrcNxArpShaCaseBuilder()
593                                     .setNxArpSha(Boolean.TRUE).build(),
594                             new DstNxArpThaCaseBuilder()
595                                     .setNxArpTha(Boolean.TRUE).build(),
596                             47, false)) //Length of the SHA is 6Byte, hence the end offset bit is 47
597                     .build();
598         }
599     },
600
601     /**
602      *
603      * Move Source IP address to Destination IP address, to where the ARP
604      * response need to be addressed to.
605      *
606      */
607     move_spa_to_tpa {
608
609         @Override
610         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
611             return new ActionBuilder().setKey(new ActionKey(newActionKey))
612                     .setAction(nxMoveRegAction(
613                             new SrcOfArpSpaCaseBuilder()
614                                     .setOfArpSpa(Boolean.TRUE).build(),
615                             new DstOfArpTpaCaseBuilder()
616                                     .setOfArpTpa(Boolean.TRUE).build()))
617                     .build();
618         }
619     },
620
621     /**
622      * Set ARP Operation Type that is Request or Replay.
623      */
624     set_arp_op {
625
626         @Override
627         public Action buildAction(int newActionKey, ActionInfo actionInfo) {
628
629             final int val = Integer.parseInt(actionInfo.getActionValues()[0]);
630             return new ActionBuilder().setKey(new ActionKey(newActionKey))
631                     .setAction(nxLoadRegAction(
632                             new DstOfArpOpCaseBuilder().setOfArpOp(Boolean.TRUE)
633                                     .build(),
634                             BigInteger.valueOf(val), 15, false)) // The length of ARP operation field is 2Byte, hence end offset bit is 15
635                     .build();
636         }
637
638     };
639
640     private static final int RADIX_HEX = 16;
641
642     public abstract Action buildAction(int newActionKey, ActionInfo actionInfo);
643
644     private static org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action nxLoadRegAction(
645             DstChoice dstChoice, BigInteger value) {
646         return nxLoadRegAction(dstChoice, value, 31, false);
647
648     }
649
650     private static org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action nxMoveRegAction(
651             final SrcChoice srcChoice, final DstChoice dstChoice,
652             final int endOffset, final boolean groupBucket) {
653         final NxRegMove reg = new NxRegMoveBuilder()
654                 .setSrc(new SrcBuilder().setSrcChoice(srcChoice)
655                         .setStart(0)
656                         .setEnd(endOffset).build())
657                 .setDst(new org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.nx.reg.move.DstBuilder()
658                         .setDstChoice(dstChoice).setStart(0)
659                         .setEnd(endOffset).build())
660                 .build();
661         if (groupBucket) {
662             return new NxActionRegMoveNodesNodeGroupBucketsBucketActionsCaseBuilder()
663                     .setNxRegMove(reg).build();
664         } else {
665             return new NxActionRegMoveNodesNodeTableFlowApplyActionsCaseBuilder()
666                     .setNxRegMove(reg).build();
667         }
668     }
669
670     private static org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action nxMoveRegAction(
671             final SrcChoice srcChoice, final DstChoice dstChoice) {
672         return nxMoveRegAction(srcChoice, dstChoice, 31, false);
673     }
674
675     private static org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action nxLoadRegAction(
676             final DstChoice dstChoice, final BigInteger value,
677             final int endOffset, final boolean groupBucket) {
678         final NxRegLoad reg = new NxRegLoadBuilder()
679                 .setDst(new DstBuilder().setDstChoice(dstChoice)
680                         .setStart(0)
681                         .setEnd(endOffset).build())
682                 .setValue(value).build();
683         if (groupBucket) {
684             return new NxActionRegLoadNodesNodeGroupBucketsBucketActionsCaseBuilder()
685                     .setNxRegLoad(reg).build();
686         } else {
687             return new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder()
688                     .setNxRegLoad(reg).build();
689         }
690     }
691
692 }