ccd9d18f2b43b28a2d8541ae2bd6f85bafb750c7
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / ActionConvertor.java
1 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.opendaylight.openflowjava.protocol.api.util.BinContent;
7 import org.opendaylight.openflowplugin.openflow.md.OFConstants;
8 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl;
9 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
10 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
11 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCase;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCase;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCaseBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCase;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCaseBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCase;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCase;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCase;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCase;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCase;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCase;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCase;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCase;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCase;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCase;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCase;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCase;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCase;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCase;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCase;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCase;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCase;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCase;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.StripVlanActionCase;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.out._case.CopyTtlOutBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupAction;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputAction;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.pbb.action._case.PopPbbActionBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanAction;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.dst.action._case.SetDlDstAction;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.src.action._case.SetDlSrcAction;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlAction;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlActionBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.dst.action._case.SetNwDstAction;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.src.action._case.SetNwSrcAction;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.ttl.action._case.SetNwTtlActionBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.queue.action._case.SetQueueAction;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.queue.action._case.SetQueueActionBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.dst.action._case.SetTpDstAction;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.src.action._case.SetTpSrcAction;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdAction;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpAction;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressActionBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdActionBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressActionBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlAction;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsAction;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsActionBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpAction;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpActionBuilder;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidActionBuilder;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValues;
125 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValuesV10;
126 import org.opendaylight.yangtools.yang.binding.Augmentation;
127 import org.slf4j.Logger;
128 import org.slf4j.LoggerFactory;
129
130 /**
131  * @author usha@ericsson Action List:This class takes data from SAL layer and
132  *         converts into OF Data
133  * @author avishnoi@in.ibm.com Added convertor for OF bucket actions to SAL
134  *         actions
135  *
136  */
137 public final class ActionConvertor {
138     private static final Logger logger = LoggerFactory.getLogger(ActionConvertor.class);
139     private static final String PREFIX_SEPARATOR = "/";
140     final private static Long MAXPortOF13 = new Long(4294967040L); // 0xffffff00
141     final private static Long MAXPortOF10 = new Long(0xff00);
142
143     private ActionConvertor() {
144         // NOOP
145     }
146
147     public static List<ActionsList> getActionList(
148             List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions,
149             short version)
150
151     {
152         ActionsListBuilder actionsListBuilder = new ActionsListBuilder();
153         List<ActionsList> actionsList = new ArrayList<ActionsList>();
154
155         for (int actionItem = 0; actionItem < actions.size(); actionItem++) {
156
157             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = actions.get(
158                     actionItem).getAction();
159
160             if (action instanceof OutputActionCase)
161                 actionsList.add(salToOFOutputAction(action, actionsListBuilder, version));
162             else if (action instanceof GroupActionCase)
163                 actionsList.add(SalToOFGroupAction(action, actionsListBuilder));
164             else if (action instanceof CopyTtlOutCase)
165                 actionsList.add(SalToOFCopyTTLIOut(actionsListBuilder));
166             else if (action instanceof CopyTtlInCase)
167                 actionsList.add(SalToOFCopyTTLIIn(actionsListBuilder));
168             else if (action instanceof SetMplsTtlActionCase)
169                 actionsList.add(SalToOFSetMplsTtl(action, actionsListBuilder));
170             else if (action instanceof DecMplsTtlCase)
171                 actionsList.add(SalToOFDecMplsTtl(actionsListBuilder));
172             else if (action instanceof PushVlanActionCase)
173                 actionsList.add(SalToOFPushVlanAction(action, actionsListBuilder));
174             else if (action instanceof PopVlanActionCase)
175                 actionsList.add(SalToOFPopVlan(action, actionsListBuilder));
176             else if (action instanceof PushMplsActionCase)
177                 actionsList.add(SalToOFPushMplsAction(action, actionsListBuilder));
178             else if (action instanceof PopMplsActionCase)
179                 actionsList.add(SalToOFPopMpls(action, actionsListBuilder));
180             else if (action instanceof SetQueueActionCase)
181                 actionsList.add(SalToOFSetQueue(action, actionsListBuilder));
182             else if (action instanceof SetNwTtlActionCase)
183                 actionsList.add(SalToOFSetNwTtl(action, actionsListBuilder));
184             else if (action instanceof DecNwTtlCase)
185                 actionsList.add(SalToOFDecNwTtl(action, actionsListBuilder));
186             else if (action instanceof SetFieldCase)
187                 actionsList.add(SalToOFSetField(action, actionsListBuilder, version));
188             else if (action instanceof PushPbbActionCase)
189                 actionsList.add(SalToOFPushPbbAction(action, actionsListBuilder));
190             else if (action instanceof PopPbbActionCase)
191                 actionsList.add(SalToOFPopPBB(action, actionsListBuilder));
192             else if (action instanceof ExperimenterAction)
193                 actionsList.add(SalToOFExperimenter(action, actionsListBuilder));
194
195             // 1.0 Actions
196             else if (action instanceof SetVlanIdActionCase)
197                 actionsList.add(SalToOFSetVlanId(action, actionsListBuilder, version));
198             else if (action instanceof SetVlanPcpActionCase)
199                 actionsList.add(SalToOFSetVlanpcp(action, actionsListBuilder, version));
200             else if (action instanceof StripVlanActionCase)
201                 actionsList.add(SalToOFStripVlan(action, actionsListBuilder, version));
202             else if (action instanceof SetDlSrcActionCase)
203                 actionsList.add(SalToOFSetDlSrc(action, actionsListBuilder, version));
204             else if (action instanceof SetDlDstActionCase)
205                 actionsList.add(SalToOFSetDlDst(action, actionsListBuilder, version));
206             else if (action instanceof SetNwSrcActionCase)
207                 actionsList.add(SalToOFSetNwSrc(action, actionsListBuilder, version));
208             else if (action instanceof SetNwDstActionCase)
209                 actionsList.add(SalToOFSetNwDst(action, actionsListBuilder, version));
210             else if (action instanceof SetTpSrcActionCase)
211                 actionsList.add(SalToOFSetTpSrc(action, actionsListBuilder, version));
212             else if (action instanceof SetTpDstActionCase)
213                 actionsList.add(SalToOFSetTpDst(action, actionsListBuilder, version));
214
215         }
216         return actionsList;
217
218     }
219
220     private static ActionsList SalToOFSetField(
221             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
222             ActionsListBuilder actionsListBuilder, short version) {
223
224         SetFieldCase setFieldCase = (SetFieldCase) action;
225         org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match = setFieldCase
226                 .getSetField();
227
228         OxmFieldsActionBuilder oxmFieldsActionBuilder = new OxmFieldsActionBuilder();
229         MatchReactor.getInstance().convert(match, version, oxmFieldsActionBuilder);
230
231         ActionBuilder actionBuilder = new ActionBuilder();
232         actionBuilder
233                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField.class);
234
235         actionBuilder.addAugmentation(OxmFieldsAction.class, oxmFieldsActionBuilder.build());
236         actionsListBuilder.setAction(actionBuilder.build());
237         return actionsListBuilder.build();
238
239     }
240
241     private static ActionsList SalToOFDecNwTtl(
242             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
243             ActionsListBuilder actionsListBuilder) {
244         ActionBuilder actionBuilder = new ActionBuilder();
245         actionBuilder
246                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl.class);
247
248         return emtpyAction(actionBuilder, actionsListBuilder);
249     }
250
251     private static ActionsList SalToOFPushMplsAction(
252             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
253             ActionsListBuilder actionsListBuilder) {
254         ActionBuilder actionBuilder = new ActionBuilder();
255         PushMplsActionCase pushMplsActionCase = (PushMplsActionCase) action;
256
257         actionBuilder.setType(PushMpls.class);
258
259         return SalToOFPushAction(pushMplsActionCase.getPushMplsAction().getEthernetType(), actionBuilder,
260                 actionsListBuilder);
261
262     }
263
264     private static ActionsList SalToOFPushPbbAction(
265             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
266             ActionsListBuilder actionsListBuilder) {
267         ActionBuilder actionBuilder = new ActionBuilder();
268         PushPbbActionCase pushPbbActionCase = (PushPbbActionCase) action;
269         actionBuilder.setType(PushPbb.class);
270
271         return SalToOFPushAction(pushPbbActionCase.getPushPbbAction().getEthernetType(), actionBuilder,
272                 actionsListBuilder);
273     }
274
275     private static ActionsList SalToOFPushVlanAction(
276             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
277             ActionsListBuilder actionsListBuilder) {
278         ActionBuilder actionBuilder = new ActionBuilder();
279         PushVlanActionCase pushVlanActionCase = (PushVlanActionCase) action;
280         PushVlanAction pushVlanAction = pushVlanActionCase.getPushVlanAction();
281         actionBuilder.setType(PushVlan.class);
282
283         return SalToOFPushAction(pushVlanAction.getEthernetType(), actionBuilder, actionsListBuilder);
284
285     }
286
287     private static ActionsList SalToOFSetNwTtl(
288             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
289             ActionsListBuilder actionsListBuilder) {
290         ActionBuilder actionBuilder = new ActionBuilder();
291         SetNwTtlActionCase nwTtlActionCase = (SetNwTtlActionCase) action;
292         NwTtlActionBuilder nwTtlActionBuilder = new NwTtlActionBuilder();
293         nwTtlActionBuilder.setNwTtl(nwTtlActionCase.getSetNwTtlAction().getNwTtl());
294         actionBuilder.setType(SetNwTtl.class);
295         actionBuilder.addAugmentation(NwTtlAction.class, nwTtlActionBuilder.build());
296         actionsListBuilder.setAction(actionBuilder.build());
297         return actionsListBuilder.build();
298
299     }
300
301     private static ActionsList SalToOFSetQueue(
302             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
303             ActionsListBuilder actionsListBuilder) {
304         ActionBuilder actionBuilder = new ActionBuilder();
305         SetQueueActionCase setQueueActionCase = (SetQueueActionCase) action;
306         SetQueueAction setQueueAction = setQueueActionCase.getSetQueueAction();
307
308         QueueIdActionBuilder queueIdActionBuilder = new QueueIdActionBuilder();
309         queueIdActionBuilder.setQueueId(setQueueAction.getQueueId());
310         actionBuilder.setType(SetQueue.class);
311         actionBuilder.addAugmentation(QueueIdAction.class, queueIdActionBuilder.build());
312
313         actionsListBuilder.setAction(actionBuilder.build());
314         return actionsListBuilder.build();
315     }
316
317     private static ActionsList SalToOFPopMpls(
318             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
319             ActionsListBuilder actionsListBuilder) {
320         ActionBuilder actionBuilder = new ActionBuilder();
321         PopMplsActionCase popMplsActionCase = (PopMplsActionCase) action;
322         actionBuilder.setType(PopMpls.class);
323
324         return SalToOFPushAction(popMplsActionCase.getPopMplsAction().getEthernetType(), actionBuilder,
325                 actionsListBuilder);
326     }
327
328     private static ActionsList SalToOFPopVlan(
329             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
330             ActionsListBuilder actionsListBuilder) {
331         ActionBuilder actionBuilder = new ActionBuilder();
332         actionBuilder.setType(PopVlan.class);
333
334         return emtpyAction(actionBuilder, actionsListBuilder);
335     }
336
337     private static ActionsList SalToOFPopPBB(
338             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
339             ActionsListBuilder actionsListBuilder) {
340         ActionBuilder actionBuilder = new ActionBuilder();
341         actionBuilder.setType(PopPbb.class);
342         return emtpyAction(actionBuilder, actionsListBuilder);
343     }
344
345     private static ActionsList SalToOFExperimenter(
346             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
347             ActionsListBuilder actionsListBuilder) {
348
349         ActionBuilder actionBuilder = new ActionBuilder();
350         ExperimenterActionBuilder experimenterActionBuilder = new ExperimenterActionBuilder();
351         experimenterActionBuilder.setExperimenter(((ExperimenterAction) action).getExperimenter());
352         actionBuilder.setType(Experimenter.class);
353         actionBuilder
354                 .addAugmentation(
355                         ExperimenterAction.class,
356                         (Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action>) experimenterActionBuilder);
357         actionsListBuilder.setAction(actionBuilder.build());
358         return actionsListBuilder.build();
359
360     }
361
362     private static ActionsList SalToOFSetVlanId(
363             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
364             ActionsListBuilder actionsListBuilder, short version) {
365
366         if (version == OFConstants.OFP_VERSION_1_0) {
367             ActionBuilder actionBuilder = new ActionBuilder();
368             SetVlanIdActionCase setvlanidcase = (SetVlanIdActionCase) action;
369             SetVlanIdAction setvlanidaction = setvlanidcase.getSetVlanIdAction();
370
371             VlanVidActionBuilder vlanidActionBuilder = new VlanVidActionBuilder();
372             vlanidActionBuilder.setVlanVid(setvlanidaction.getVlanId().getValue());
373             actionBuilder
374                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanVid.class);
375             actionBuilder.addAugmentation(VlanVidAction.class, vlanidActionBuilder.build());
376             actionsListBuilder.setAction(actionBuilder.build());
377             return actionsListBuilder.build();
378         } else {
379             logger.error("Unknown Action Type for the Version", version);
380             return null;
381         }
382
383     }
384
385     private static ActionsList SalToOFSetVlanpcp(
386             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
387             ActionsListBuilder actionsListBuilder, short version) {
388
389         if (version == OFConstants.OFP_VERSION_1_0) {
390             ActionBuilder actionBuilder = new ActionBuilder();
391             SetVlanPcpActionCase setvlanpcpcase = (SetVlanPcpActionCase) action;
392             SetVlanPcpAction setvlanpcpaction = setvlanpcpcase.getSetVlanPcpAction();
393
394             VlanPcpActionBuilder vlanpcpActionBuilder = new VlanPcpActionBuilder();
395             vlanpcpActionBuilder.setVlanPcp(setvlanpcpaction.getVlanPcp().getValue());
396             actionBuilder
397                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanPcp.class);
398             actionBuilder.addAugmentation(VlanPcpAction.class, vlanpcpActionBuilder.build());
399             actionsListBuilder.setAction(actionBuilder.build());
400             return actionsListBuilder.build();
401         } else {
402             logger.error("Unknown Action Type for the Version", version);
403             return null;
404         }
405
406     }
407
408     private static ActionsList SalToOFStripVlan(
409             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
410             ActionsListBuilder actionsListBuilder, short version) {
411
412         if (version == OFConstants.OFP_VERSION_1_0) {
413             ActionBuilder actionBuilder = new ActionBuilder();
414             actionBuilder
415                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.StripVlan.class);
416
417             return emtpyAction(actionBuilder, actionsListBuilder);
418         } else {
419             logger.error("Unknown Action Type for the Version", version);
420             return null;
421         }
422
423     }
424
425     private static ActionsList SalToOFSetDlSrc(
426             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
427             ActionsListBuilder actionsListBuilder, short version) {
428
429         if (version == OFConstants.OFP_VERSION_1_0) {
430             ActionBuilder actionBuilder = new ActionBuilder();
431             SetDlSrcActionCase setdlsrccase = (SetDlSrcActionCase) action;
432             SetDlSrcAction setdlsrcaction = setdlsrccase.getSetDlSrcAction();
433
434             DlAddressActionBuilder dladdressactionbuilder = new DlAddressActionBuilder();
435             dladdressactionbuilder.setDlAddress(setdlsrcaction.getAddress());
436             actionBuilder
437                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlSrc.class);
438             actionBuilder.addAugmentation(DlAddressAction.class, dladdressactionbuilder.build());
439             actionsListBuilder.setAction(actionBuilder.build());
440             return actionsListBuilder.build();
441         } else {
442             logger.error("Unknown Action Type for the Version", version);
443             return null;
444         }
445
446     }
447
448     private static ActionsList SalToOFSetDlDst(
449             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
450             ActionsListBuilder actionsListBuilder, short version) {
451
452         if (version == OFConstants.OFP_VERSION_1_0) {
453             ActionBuilder actionBuilder = new ActionBuilder();
454             SetDlDstActionCase setdldstcase = (SetDlDstActionCase) action;
455             SetDlDstAction setdldstaction = setdldstcase.getSetDlDstAction();
456
457             DlAddressActionBuilder dladdressactionbuilder = new DlAddressActionBuilder();
458             dladdressactionbuilder.setDlAddress(setdldstaction.getAddress());
459             actionBuilder
460                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlDst.class);
461             actionBuilder.addAugmentation(DlAddressAction.class, dladdressactionbuilder.build());
462             actionsListBuilder.setAction(actionBuilder.build());
463             return actionsListBuilder.build();
464         } else {
465             logger.error("Unknown Action Type for the Version", version);
466             return null;
467         }
468
469     }
470
471     private static ActionsList SalToOFSetNwSrc(
472             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
473             ActionsListBuilder actionsListBuilder, short version) {
474
475         if (version == OFConstants.OFP_VERSION_1_0) {
476             ActionBuilder actionBuilder = new ActionBuilder();
477             SetNwSrcActionCase setnwsrccase = (SetNwSrcActionCase) action;
478             SetNwSrcAction setnwsrcaction = setnwsrccase.getSetNwSrcAction();
479
480             IpAddressActionBuilder ipvaddress = new IpAddressActionBuilder();
481             ipvaddress.setIpAddress((Ipv4Address) setnwsrcaction.getAddress());
482             actionBuilder
483                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwSrc.class);
484             actionBuilder.addAugmentation(
485                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressAction.class,
486                     ipvaddress.build());
487             actionsListBuilder.setAction(actionBuilder.build());
488             return actionsListBuilder.build();
489         } else {
490             logger.error("Unknown Action Type for the Version", version);
491             return null;
492         }
493
494     }
495
496     private static ActionsList SalToOFSetNwDst(
497             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
498             ActionsListBuilder actionsListBuilder, short version) {
499
500         if (version == OFConstants.OFP_VERSION_1_0) {
501             ActionBuilder actionBuilder = new ActionBuilder();
502             SetNwDstActionCase setnwdstcase = (SetNwDstActionCase) action;
503             SetNwDstAction setnwdstaction = setnwdstcase.getSetNwDstAction();
504
505             IpAddressActionBuilder ipvaddress = new IpAddressActionBuilder();
506             ipvaddress.setIpAddress((Ipv4Address) setnwdstaction.getAddress());
507             actionBuilder
508                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwDst.class);
509             actionBuilder.addAugmentation(
510                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressAction.class,
511                     ipvaddress.build());
512             actionsListBuilder.setAction(actionBuilder.build());
513             return actionsListBuilder.build();
514
515         } else {
516             logger.error("Unknown Action Type for the Version", version);
517             return null;
518         }
519
520     }
521
522     private static ActionsList SalToOFSetTpSrc(
523             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
524             ActionsListBuilder actionsListBuilder, short version) {
525
526         if (version == OFConstants.OFP_VERSION_1_0) {
527             ActionBuilder actionBuilder = new ActionBuilder();
528             SetTpSrcActionCase settpsrccase = (SetTpSrcActionCase) action;
529             SetTpSrcAction settpsrcaction = settpsrccase.getSetTpSrcAction();
530
531             PortActionBuilder settpsrc = new PortActionBuilder();
532             PortNumber port = new PortNumber(settpsrcaction.getPort().getValue().longValue());
533             settpsrc.setPort(port);
534
535             actionBuilder
536                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpSrc.class);
537             actionBuilder.addAugmentation(PortAction.class, settpsrc.build());
538             actionsListBuilder.setAction(actionBuilder.build());
539             return actionsListBuilder.build();
540         } else {
541             logger.error("Unknown Action Type for the Version", version);
542             return null;
543         }
544
545     }
546
547     private static ActionsList SalToOFSetTpDst(
548             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
549             ActionsListBuilder actionsListBuilder, short version) {
550
551         if (version == OFConstants.OFP_VERSION_1_0) {
552             ActionBuilder actionBuilder = new ActionBuilder();
553
554             SetTpDstActionCase settpdstcase = (SetTpDstActionCase) action;
555             SetTpDstAction settpdstaction = settpdstcase.getSetTpDstAction();
556             PortActionBuilder settpdst = new PortActionBuilder();
557             PortNumber port = new PortNumber(settpdstaction.getPort().getValue().longValue());
558             settpdst.setPort(port);
559
560             actionBuilder
561                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpDst.class);
562             actionBuilder.addAugmentation(PortAction.class, settpdst.build());
563             actionsListBuilder.setAction(actionBuilder.build());
564             return actionsListBuilder.build();
565         } else {
566             logger.error("Unknown Action Type for the Version", version);
567             return null;
568         }
569
570     }
571
572     private static ActionsList SalToOFGroupAction(
573             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
574             ActionsListBuilder actionsListBuilder) {
575
576         GroupActionCase groupActionCase = (GroupActionCase) action;
577         GroupAction groupAction = groupActionCase.getGroupAction();
578
579         GroupIdActionBuilder groupIdBuilder = new GroupIdActionBuilder();
580         groupIdBuilder.setGroupId(groupAction.getGroupId());
581         ActionBuilder actionBuilder = new ActionBuilder();
582         actionBuilder.setType(Group.class);
583         actionBuilder.addAugmentation(GroupIdAction.class, groupIdBuilder.build());
584         actionsListBuilder.setAction(actionBuilder.build());
585         return actionsListBuilder.build();
586     }
587
588     private static ActionsList SalToOFPushAction(Integer ethernetType, ActionBuilder actionBuilder,
589             ActionsListBuilder actionsListBuilder) {
590
591         EthertypeActionBuilder ethertypeActionBuilder = new EthertypeActionBuilder();
592         ethertypeActionBuilder.setEthertype(new EtherType(ethernetType));
593
594         /* OF */
595         actionBuilder.addAugmentation(EthertypeAction.class, ethertypeActionBuilder.build());
596         actionsListBuilder.setAction(actionBuilder.build());
597         return actionsListBuilder.build();
598     }
599
600     private static ActionsList SalToOFDecMplsTtl(ActionsListBuilder actionsListBuilder) {
601         ActionBuilder actionBuilder = new ActionBuilder();
602         actionBuilder
603                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class);
604         return emtpyAction(actionBuilder, actionsListBuilder);
605     }
606
607     private static ActionsList SalToOFSetMplsTtl(
608             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
609             ActionsListBuilder actionsListBuilder) {
610         ActionBuilder actionBuilder = new ActionBuilder();
611
612         SetMplsTtlActionCase mplsTtlActionCase = (SetMplsTtlActionCase) action;
613         SetMplsTtlAction mplsTtlAction = mplsTtlActionCase.getSetMplsTtlAction();
614
615         MplsTtlActionBuilder mplsTtlActionBuilder = new MplsTtlActionBuilder();
616         mplsTtlActionBuilder.setMplsTtl(mplsTtlAction.getMplsTtl()/* SAL */);
617         /* OF */
618         actionBuilder.setType(SetMplsTtl.class);
619         actionBuilder.addAugmentation(MplsTtlAction.class, mplsTtlActionBuilder.build());
620         actionsListBuilder.setAction(actionBuilder.build());
621         return actionsListBuilder.build();
622     }
623
624     private static ActionsList SalToOFCopyTTLIIn(ActionsListBuilder actionsListBuilder) {
625         ActionBuilder actionBuilder = new ActionBuilder();
626         actionBuilder
627                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class);
628         return emtpyAction(actionBuilder, actionsListBuilder);
629     }
630
631     private static ActionsList SalToOFCopyTTLIOut(ActionsListBuilder actionsListBuilder) {
632         ActionBuilder actionBuilder = new ActionBuilder();
633         actionBuilder
634                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class);
635         return emtpyAction(actionBuilder, actionsListBuilder);
636
637     }
638
639     private static ActionsList emtpyAction(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
640
641         actionsListBuilder.setAction(actionBuilder.build());
642         return actionsListBuilder.build();
643     }
644
645     private static ActionsList salToOFOutputAction(
646             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
647             ActionsListBuilder actionsListBuilder, short version) {
648
649         OutputActionCase outputActionCase = ((OutputActionCase) action);
650         OutputAction outputAction = outputActionCase.getOutputAction();
651         PortActionBuilder portAction = new PortActionBuilder();
652         MaxLengthActionBuilder maxLenActionBuilder = new MaxLengthActionBuilder();
653         maxLenActionBuilder.setMaxLength(outputAction.getMaxLength());
654         ActionBuilder actionBuilder = new ActionBuilder();
655         actionBuilder.addAugmentation(MaxLengthAction.class, maxLenActionBuilder.build());
656
657         Uri uri = outputAction.getOutputNodeConnector();
658
659         if (version >= OFConstants.OFP_VERSION_1_3) {
660             if (uri.getValue().equals(OutputPortValues.CONTROLLER.toString())) {
661                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.CONTROLLER
662                         .getIntValue())));
663             } else if (uri.getValue().equals(OutputPortValues.ALL.toString())) {
664                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.ALL.getIntValue())));
665             } else if (uri.getValue().equals(OutputPortValues.ANY.toString())) {
666                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.ANY.getIntValue())));
667
668             } else if (uri.getValue().equals(OutputPortValues.FLOOD.toString())) {
669                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.FLOOD.getIntValue())));
670
671             } else if (uri.getValue().equals(OutputPortValues.INPORT.toString())) {
672                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.INPORT.getIntValue())));
673
674             } else if (uri.getValue().equals(OutputPortValues.LOCAL.toString())) {
675                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.LOCAL.getIntValue())));
676
677             } else if (uri.getValue().equals(OutputPortValues.NORMAL.toString())) {
678                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.NORMAL.getIntValue())));
679
680             } else if (uri.getValue().equals(OutputPortValues.TABLE.toString())) {
681                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.TABLE.getIntValue())));
682
683             } else if (uri.getValue().equals(OutputPortValues.NONE.toString())) {
684                 logger.error("Unknown Port Type for the Version");
685             } else if (Long.parseLong(uri.getValue()) > 0 && Long.parseLong(uri.getValue()) < MAXPortOF13) {
686                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(Integer.parseInt(uri.getValue()))));
687             } else {
688                 logger.error("Invalid Port for Output Action");
689             }
690         } else if (version == OFConstants.OFP_VERSION_1_0) {
691
692             if (uri.getValue().equals(OutputPortValues.CONTROLLER.toString())) {
693                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.CONTROLLER.getIntValue()));
694             } else if (uri.getValue().equals(OutputPortValues.ALL.toString())) {
695                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.ALL.getIntValue()));
696             } else if (uri.getValue().equals(OutputPortValues.FLOOD.toString())) {
697                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.FLOOD.getIntValue()));
698             } else if (uri.getValue().equals(OutputPortValues.INPORT.toString())) {
699                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.INPORT.getIntValue()));
700             } else if (uri.getValue().equals(OutputPortValues.LOCAL.toString())) {
701                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.LOCAL.getIntValue()));
702             } else if (uri.getValue().equals(OutputPortValues.NORMAL.toString())) {
703                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.NORMAL.getIntValue()));
704             } else if (uri.getValue().equals(OutputPortValues.TABLE.toString())) {
705                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.TABLE.getIntValue()));
706             } else if (uri.getValue().equals(OutputPortValues.NONE.toString())) {
707                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.NONE.getIntValue()));
708             } else if (uri.getValue().equals(OutputPortValues.ANY.toString())) {
709                 logger.error("Unknown Port Type for the Version");
710             } else if (Long.parseLong(uri.getValue()) > 0 && Long.parseLong(uri.getValue()) < MAXPortOF10) {
711                 portAction.setPort(new PortNumber((long) Integer.parseInt(uri.getValue())));
712             } else {
713                 logger.error("Invalid Port for Output Action");
714             }
715         }
716
717         actionBuilder
718                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
719         actionBuilder.addAugmentation(PortAction.class, portAction.build());
720         actionsListBuilder.setAction(actionBuilder.build());
721         return actionsListBuilder.build();
722
723     }
724
725     /**
726      * Method to convert OF actions associated with bucket to SAL Actions.
727      *
728      * @param actionList
729      * @return List of converted SAL Actions.
730      */
731     public static List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> toSALBucketActions(
732             List<ActionsList> actionList) {
733
734         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> bucketActions = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action>();
735         for (ActionsList actionDesc : actionList) {
736
737             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action = actionDesc
738                     .getAction();
739
740             if (action.getType().equals(
741                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class))
742                 bucketActions.add(ofToSALOutputAction(action));
743             else if (action.getType().equals(
744                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group.class))
745                 bucketActions.add(ofToSALGroupAction(action));
746             else if (action.getType().equals(
747                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class)) {
748                 CopyTtlOutBuilder copyTtlOutaction = new CopyTtlOutBuilder();
749                 bucketActions.add(new CopyTtlOutCaseBuilder().setCopyTtlOut(copyTtlOutaction.build()).build());
750             } else if (action.getType().equals(
751                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class)) {
752                 CopyTtlInBuilder copyTtlInaction = new CopyTtlInBuilder();
753                 bucketActions.add(new CopyTtlInCaseBuilder().setCopyTtlIn(copyTtlInaction.build()).build());
754             } else if (action.getType().equals(
755                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl.class))
756                 bucketActions.add(ofToSALSetMplsTtl(action));
757             else if (action.getType().equals(
758                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class)) {
759                 DecMplsTtlBuilder decMplsTtl = new DecMplsTtlBuilder();
760                 bucketActions.add(new DecMplsTtlCaseBuilder().setDecMplsTtl(decMplsTtl.build()).build());
761             } else if (action.getType().equals(
762                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan.class))
763                 bucketActions.add(ofToSALPushVlanAction(action));
764             else if (action.getType().equals(
765                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan.class)) {
766                 PopVlanActionBuilder popVlan = new PopVlanActionBuilder();
767                 bucketActions.add(new PopVlanActionCaseBuilder().setPopVlanAction(popVlan.build()).build());
768             } else if (action.getType().equals(
769                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls.class)) {
770                 PushMplsActionBuilder pushMpls = new PushMplsActionBuilder();
771                 bucketActions.add(new PushMplsActionCaseBuilder().setPushMplsAction(pushMpls.build()).build());
772             } else if (action.getType().equals(
773                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls.class)) {
774                 PopMplsActionBuilder popMpls = new PopMplsActionBuilder();
775                 bucketActions.add(new PopMplsActionCaseBuilder().setPopMplsAction(popMpls.build()).build());
776             } else if (action.getType().equals(
777                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue.class))
778                 bucketActions.add(ofToSALSetQueue(action));
779
780             else if (action.getType().equals(
781                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl.class))
782                 bucketActions.add(ofToSALSetNwTtl(action));
783             else if (action.getType().equals(
784                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl.class)) {
785                 DecNwTtlBuilder decNwTtl = new DecNwTtlBuilder();
786                 bucketActions.add(new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl.build()).build());
787             } else if (action.getType().equals(
788                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField.class))
789                 bucketActions.add(new SetFieldCaseBuilder().setSetField(MatchConvertorImpl.ofToSALSetField(action))
790                         .build());
791
792             else if (action.getType().equals(
793                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb.class))
794                 bucketActions.add(ofToSALPushPbbAction(action));
795             else if (action.getType().equals(
796                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb.class)) {
797                 PopPbbActionBuilder popPbb = new PopPbbActionBuilder();
798                 bucketActions.add(new PopPbbActionCaseBuilder().setPopPbbAction(popPbb.build()).build());
799             } else if (action.getType().equals(
800                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter.class)) {
801                 // bucketActions.add(ofToSALExperimenter(action));
802                 // TODO: Need to explore/discuss on how to handle experimenter
803                 // case.
804             }
805
806         }
807         return bucketActions;
808     }
809
810     /**
811      * Method converts OF Output action object to SAL Output action object.
812      *
813      * @param action
814      *            org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.
815      *            action.rev130731.actions.actions.list.Action
816      * @return OutputAction
817      */
818     public static OutputActionCase ofToSALOutputAction(
819             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
820
821         OutputActionBuilder outputAction = new OutputActionBuilder();
822         PortAction port = action.getAugmentation(PortAction.class);
823         if (port != null) {
824             outputAction.setOutputNodeConnector(new Uri(port.getPort().getValue().toString()));
825         } else {
826             logger.error("Provided action is not OF Output action, no associated port found!");
827         }
828
829         MaxLengthAction length = action.getAugmentation(MaxLengthAction.class);
830         if (length != null) {
831             outputAction.setMaxLength(length.getMaxLength());
832         } else {
833             logger.error("Provided action is not OF Output action, no associated length found!");
834         }
835
836         return new OutputActionCaseBuilder().setOutputAction(outputAction.build()).build();
837     }
838
839     /**
840      * Method converts OF GroupAction object to SAL GroupAction object
841      *
842      * @param action
843      * @return GroupAction
844      */
845     public static GroupActionCase ofToSALGroupAction(
846             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
847
848         GroupActionBuilder groupAction = new GroupActionBuilder();
849
850         GroupIdAction groupId = action.getAugmentation(GroupIdAction.class);
851         groupAction.setGroupId(groupId.getGroupId());
852
853         return new GroupActionCaseBuilder().setGroupAction(groupAction.build()).build();
854     }
855
856     /**
857      * Method converts OF SetMplsTTL action object to SAL SetMplsTTL action
858      * object.
859      *
860      * @param action
861      * @return
862      */
863     public static SetMplsTtlActionCase ofToSALSetMplsTtl(
864             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
865
866         SetMplsTtlActionBuilder mplsTtlAction = new SetMplsTtlActionBuilder();
867         MplsTtlAction mplsTtl = action.getAugmentation(MplsTtlAction.class);
868         mplsTtlAction.setMplsTtl(mplsTtl.getMplsTtl());
869         return new SetMplsTtlActionCaseBuilder().setSetMplsTtlAction(mplsTtlAction.build()).build();
870     }
871
872     /**
873      * Method converts OF Pushvlan action to SAL PushVlan action.
874      *
875      * @param action
876      * @return PushVlanAction
877      */
878     public static PushVlanActionCase ofToSALPushVlanAction(
879             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
880
881         PushVlanActionBuilder pushVlanAction = new PushVlanActionBuilder();
882
883         EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
884         pushVlanAction.setVlanId(new VlanId(etherType.getEthertype().getValue()));
885
886         return new PushVlanActionCaseBuilder().setPushVlanAction(pushVlanAction.build()).build();
887     }
888
889     /**
890      * Method converts OF SetQueue action to SAL SetQueue action.
891      *
892      * @param action
893      * @return SetQueueAction
894      */
895     public static SetQueueActionCase ofToSALSetQueue(
896             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
897
898         SetQueueActionBuilder setQueueAction = new SetQueueActionBuilder();
899
900         QueueIdAction queueId = action.getAugmentation(QueueIdAction.class);
901         setQueueAction.setQueueId(queueId.getQueueId());
902
903         return new SetQueueActionCaseBuilder().setSetQueueAction(setQueueAction.build()).build();
904     }
905
906     /**
907      * Method converts OF SetNwTtl action to SAL SetNwTtl action.
908      *
909      * @param action
910      * @return SetNwTtlAction
911      */
912     public static SetNwTtlActionCase ofToSALSetNwTtl(
913             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
914
915         SetNwTtlActionBuilder setNwTtl = new SetNwTtlActionBuilder();
916         NwTtlAction nwTtl = action.getAugmentation(NwTtlAction.class);
917         setNwTtl.setNwTtl(nwTtl.getNwTtl());
918
919         return new SetNwTtlActionCaseBuilder().setSetNwTtlAction(setNwTtl.build()).build();
920     }
921
922     /**
923      * Method converts OF Pushvlan action to SAL PushVlan action.
924      *
925      * @param action
926      * @return PushVlanAction
927      */
928     public static PushPbbActionCase ofToSALPushPbbAction(
929             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
930
931         PushPbbActionBuilder pushPbbAction = new PushPbbActionBuilder();
932
933         EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
934         pushPbbAction.setEthernetType(etherType.getEthertype().getValue());
935
936         return new PushPbbActionCaseBuilder().setPushPbbAction(pushPbbAction.build()).build();
937     }
938
939     public static Object ofToSALExperimenter(
940             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
941
942         ExperimenterAction ExperimenterAction = action.getAugmentation(ExperimenterAction.class);
943
944         return null;
945         /*
946          * TODO: Need to explore/discuss about how to handle experimenter
947          */
948
949     }
950 }