1 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
3 import java.util.ArrayList;
6 import org.opendaylight.controller.sal.core.NodeConnector.NodeConnectorIDType;
7 import org.opendaylight.openflowplugin.openflow.md.OFConstants;
8 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action;
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlIn;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInBuilder;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOut;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutBuilder;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtl;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupAction;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputAction;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsAction;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbAction;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanAction;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsAction;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbAction;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanAction;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetField;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlAction;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlAction;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueAction;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdActionBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlAction;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsAction;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsActionBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValues;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValuesV10;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
78 import org.opendaylight.yangtools.yang.binding.Augmentation;
79 import org.slf4j.Logger;
80 import org.slf4j.LoggerFactory;
83 * @author usha@ericsson Action List:This class takes data from SAL layer and
84 * converts into OF Data
85 * @author avishnoi@in.ibm.com Added convertor for OF bucket actions to SAL actions
88 public final class ActionConvertor {
89 private static final Logger logger = LoggerFactory.getLogger(ActionConvertor.class);
90 private static final String PREFIX_SEPARATOR = "/";
91 private ActionConvertor() {
95 public static List<ActionsList> getActionList(
96 List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions,
100 ActionBuilder actionBuilder = new ActionBuilder();
101 ActionsListBuilder actionsListBuilder = new ActionsListBuilder();
102 List<ActionsList> actionsList = new ArrayList<ActionsList>();
104 for (int actionItem = 0; actionItem < actions.size(); actionItem++)
107 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = actions.get(
108 actionItem).getAction();
110 if (action instanceof OutputAction)
111 actionsList.add(salToOFOutputAction(action, actionBuilder, actionsListBuilder, version));
112 else if (action instanceof GroupAction)
113 actionsList.add(SalToOFGroupAction(action, actionBuilder, actionsListBuilder));
114 else if (action instanceof CopyTtlOut)
115 actionsList.add(SalToOFCopyTTLIOut(actionBuilder, actionsListBuilder));
116 else if (action instanceof CopyTtlIn)
117 actionsList.add(SalToOFCopyTTLIIn(actionBuilder, actionsListBuilder));
118 else if (action instanceof SetMplsTtlAction)
119 actionsList.add(SalToOFSetMplsTtl(action, actionBuilder, actionsListBuilder));
120 else if (action instanceof DecMplsTtl)
121 actionsList.add(SalToOFDecMplsTtl(actionBuilder, actionsListBuilder));
122 else if (action instanceof PushVlanAction)
123 actionsList.add(SalToOFPushVlanAction(action, actionBuilder, actionsListBuilder));
124 else if (action instanceof PopVlanAction)
125 actionsList.add(SalToOFPopVlan(action, actionBuilder, actionsListBuilder));
126 else if (action instanceof PushMplsAction)
127 actionsList.add(SalToOFPushMplsAction(action, actionBuilder, actionsListBuilder));
128 else if (action instanceof PopMplsAction)
129 actionsList.add(SalToOFPopMpls(action, actionBuilder, actionsListBuilder));
130 else if (action instanceof SetQueueAction)
131 actionsList.add(SalToOFSetQueue(action, actionBuilder, actionsListBuilder));
133 else if (action instanceof SetNwTtlAction)
134 actionsList.add(SalToOFSetNwTtl(action, actionBuilder, actionsListBuilder));
135 else if (action instanceof DecNwTtl)
136 actionsList.add(SalToOFDecNwTtl(action, actionBuilder, actionsListBuilder));
137 else if (action instanceof SetField)
138 actionsList.add(SalToOFSetField(action, actionBuilder, actionsListBuilder));
140 else if (action instanceof PushPbbAction)
141 actionsList.add(SalToOFPushPbbAction(action, actionBuilder, actionsListBuilder));
142 else if (action instanceof PopPbbAction)
143 actionsList.add(SalToOFPopPBB(action, actionBuilder, actionsListBuilder));
144 else if (action instanceof ExperimenterAction)
145 actionsList.add(SalToOFExperimenter(action, actionBuilder, actionsListBuilder));
154 private static ActionsList SalToOFSetField(
155 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
156 ActionBuilder actionBuilder,
157 ActionsListBuilder actionsListBuilder) {
159 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetField setField = (org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetField) action;
160 org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match = setField.getMatch();
162 List<MatchEntries> matchEntries = FlowConvertor.toMatch(match);
164 OxmFieldsActionBuilder oxmFieldsActionBuilder = new OxmFieldsActionBuilder();
166 oxmFieldsActionBuilder.setMatchEntries(matchEntries);
169 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField.class);
171 actionBuilder.addAugmentation(OxmFieldsAction.class, oxmFieldsActionBuilder.build());
172 actionsListBuilder.setAction(actionBuilder.build());
173 return actionsListBuilder.build();
177 private static ActionsList SalToOFDecNwTtl(
178 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
179 ActionBuilder actionBuilder,
180 ActionsListBuilder actionsListBuilder) {
181 actionBuilder.setType(DecNwTtl.class);
183 return emtpyAction(actionBuilder, actionsListBuilder);
186 private static ActionsList SalToOFPushMplsAction(
187 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
188 ActionBuilder actionBuilder,
189 ActionsListBuilder actionsListBuilder) {
191 actionBuilder.setType(PushMpls.class);
193 return SalToOFPushAction(((PushMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
197 private static ActionsList SalToOFPushPbbAction(
198 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
199 ActionBuilder actionBuilder,
200 ActionsListBuilder actionsListBuilder) {
201 actionBuilder.setType(PushPbb.class);
203 return SalToOFPushAction(((PushPbbAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
206 private static ActionsList SalToOFPushVlanAction(
207 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
208 ActionBuilder actionBuilder,
209 ActionsListBuilder actionsListBuilder) {
211 PushVlanAction pushVlanAction = (PushVlanAction) action;
212 VlanId vlanId = new VlanId(pushVlanAction.getVlanId());
213 Integer etherType = vlanId.getValue();
214 actionBuilder.setType(PushVlan.class);
216 return SalToOFPushAction(etherType, actionBuilder, actionsListBuilder);
220 private static ActionsList SalToOFSetNwTtl(
221 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
222 ActionBuilder actionBuilder,
223 ActionsListBuilder actionsListBuilder) {
225 NwTtlActionBuilder nwTtlActionBuilder = new NwTtlActionBuilder();
226 nwTtlActionBuilder.setNwTtl(((SetNwTtlAction) action).getNwTtl());
229 actionBuilder.setType(SetNwTtl.class);
230 actionBuilder.addAugmentation(NwTtlAction.class, nwTtlActionBuilder.build());
231 actionsListBuilder.setAction(actionBuilder.build());
232 return actionsListBuilder.build();
236 private static ActionsList SalToOFSetQueue(
237 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
238 ActionBuilder actionBuilder,
239 ActionsListBuilder actionsListBuilder) {
241 SetQueueAction setQueueAction = (SetQueueAction) action;
243 QueueIdActionBuilder queueIdActionBuilder = new QueueIdActionBuilder();
244 queueIdActionBuilder.setQueueId(Long.getLong(setQueueAction.getQueue()));
245 actionBuilder.setType(SetQueue.class);
246 actionBuilder.addAugmentation(QueueIdAction.class, queueIdActionBuilder.build());
248 actionsListBuilder.setAction(actionBuilder.build());
249 return actionsListBuilder.build();
252 private static ActionsList SalToOFPopMpls(
253 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
254 ActionBuilder actionBuilder,
255 ActionsListBuilder actionsListBuilder) {
257 actionBuilder.setType(PopMpls.class);
259 return SalToOFPushAction(((PopMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
262 private static ActionsList SalToOFPopVlan(
263 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
264 ActionBuilder actionBuilder,
265 ActionsListBuilder actionsListBuilder) {
267 actionBuilder.setType(PushMpls.class);
269 return emtpyAction(actionBuilder, actionsListBuilder);
272 private static ActionsList SalToOFPopPBB(
273 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
274 ActionBuilder actionBuilder,
275 ActionsListBuilder actionsListBuilder) {
276 actionBuilder.setType(PopPbb.class);
277 return emtpyAction(actionBuilder, actionsListBuilder);
280 private static ActionsList SalToOFExperimenter(
281 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
282 ActionBuilder actionBuilder,
283 ActionsListBuilder actionsListBuilder) {
285 ExperimenterActionBuilder experimenterActionBuilder = new ExperimenterActionBuilder();
286 experimenterActionBuilder.setExperimenter(((ExperimenterAction) action).getExperimenter());
287 actionBuilder.setType(Experimenter.class);
290 ExperimenterAction.class,
291 (Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action>) experimenterActionBuilder);
292 actionsListBuilder.setAction(actionBuilder.build());
293 return actionsListBuilder.build();
297 private static ActionsList SalToOFGroupAction(
298 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
299 ActionBuilder actionBuilder,
300 ActionsListBuilder actionsListBuilder) {
302 GroupAction groupAction = (GroupAction) action;
304 GroupIdActionBuilder groupIdBuilder = new GroupIdActionBuilder();
305 groupIdBuilder.setGroupId(Long.getLong(groupAction.getGroup()));
306 actionBuilder.setType(Group.class);
307 actionBuilder.addAugmentation(GroupIdAction.class, groupIdBuilder.build());
308 actionsListBuilder.setAction(actionBuilder.build());
309 return actionsListBuilder.build();
312 private static ActionsList SalToOFPushAction(Integer ethernetType, ActionBuilder actionBuilder,
313 ActionsListBuilder actionsListBuilder) {
315 EthertypeActionBuilder ethertypeActionBuilder = new EthertypeActionBuilder();
316 ethertypeActionBuilder.setEthertype(new EtherType(ethernetType));
319 actionBuilder.addAugmentation(EthertypeAction.class, ethertypeActionBuilder.build());
320 actionsListBuilder.setAction(actionBuilder.build());
321 return actionsListBuilder.build();
324 private static ActionsList SalToOFDecMplsTtl(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
326 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class);
327 return emtpyAction(actionBuilder, actionsListBuilder);
330 private static ActionsList SalToOFSetMplsTtl(
331 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
332 ActionBuilder actionBuilder,
333 ActionsListBuilder actionsListBuilder) {
335 SetMplsTtlAction mplsTtlAction = (SetMplsTtlAction) action;
337 MplsTtlActionBuilder mplsTtlActionBuilder = new MplsTtlActionBuilder();
338 mplsTtlActionBuilder.setMplsTtl(mplsTtlAction.getMplsTtl()/* SAL */);
340 actionBuilder.setType(SetMplsTtl.class);
341 actionBuilder.addAugmentation(MplsTtlAction.class, mplsTtlActionBuilder.build());
342 actionsListBuilder.setAction(actionBuilder.build());
343 return actionsListBuilder.build();
346 private static ActionsList SalToOFCopyTTLIIn(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
348 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class);
349 return emtpyAction(actionBuilder, actionsListBuilder);
352 private static ActionsList SalToOFCopyTTLIOut(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
354 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class);
355 return emtpyAction(actionBuilder, actionsListBuilder);
359 private static ActionsList emtpyAction(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
361 actionsListBuilder.setAction(actionBuilder.build());
362 return actionsListBuilder.build();
365 private static ActionsList salToOFOutputAction(
366 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
367 ActionBuilder actionBuilder,
368 ActionsListBuilder actionsListBuilder, short version) {
371 OutputAction outputAction = ((OutputAction) action);
372 PortActionBuilder portAction = new PortActionBuilder();
373 MaxLengthActionBuilder maxLenActionBuilder = new MaxLengthActionBuilder();
374 maxLenActionBuilder.setMaxLength(outputAction.getMaxLength());
376 actionBuilder.addAugmentation(MaxLengthAction.class, maxLenActionBuilder.build());
378 Uri uri = outputAction.getOutputNodeConnector();
379 if (uri.getValue() == NodeConnectorIDType.ALL)
380 portAction.setPort(new PortNumber((long) OFConstants.OFPP_ALL));
382 if (uri.getValue() == NodeConnectorIDType.SWSTACK)
383 portAction.setPort(new PortNumber((long) OFConstants.OFPP_LOCAL));
385 if ((uri.getValue() == NodeConnectorIDType.HWPATH)
386 || (uri.getValue() == NodeConnectorIDType.ONEPK)
387 || (uri.getValue() == NodeConnectorIDType.ONEPK2OPENFLOW)
388 || (uri.getValue() == NodeConnectorIDType.ONEPK2PCEP)
389 || (uri.getValue() == NodeConnectorIDType.OPENFLOW)
390 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2ONEPK)
391 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2PCEP)
392 || (uri.getValue() == NodeConnectorIDType.PCEP)
393 || (uri.getValue() == NodeConnectorIDType.PCEP2ONEPK)
394 || (uri.getValue() == NodeConnectorIDType.PCEP2OPENFLOW)
395 || (uri.getValue() == NodeConnectorIDType.PRODUCTION)) {
396 portAction.setPort(new PortNumber((long) OFConstants.OFPP_NORMAL));
399 if (uri.getValue() == NodeConnectorIDType.CONTROLLER) {
401 if (version == 0X4) {
402 // TODO:To remove the and operation once the BitContent is in
403 // place in OF Plugin .
404 portAction.setPort(new PortNumber(PortNumberValues.CONTROLLER.getIntValue() & 0x00000000ffffffffL));
406 portAction.setPort(new PortNumber((long) PortNumberValuesV10.CONTROLLER.getIntValue()));
412 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
413 actionBuilder.addAugmentation(PortAction.class, portAction.build());
414 actionsListBuilder.setAction(actionBuilder.build());
415 return actionsListBuilder.build();
419 * Method to convert OF actions associated with bucket to SAL Actions.
421 * @return List of converted SAL Actions.
423 public static List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> toSALBucketActions(List<ActionsList> actionList){
425 List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> bucketActions =
426 new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action>();
428 for(ActionsList actionDesc : actionList){
430 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action
431 = actionDesc.getAction();
433 if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output)
434 bucketActions.add(ofToSALOutputAction(action));
435 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group)
436 bucketActions.add(ofToSALGroupAction(action));
437 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut){
438 CopyTtlOutBuilder copyTtlOutaction = new CopyTtlOutBuilder();
439 bucketActions.add(copyTtlOutaction.build());
441 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn){
442 CopyTtlInBuilder copyTtlInaction = new CopyTtlInBuilder();
443 bucketActions.add(copyTtlInaction.build());
445 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl)
446 bucketActions.add(ofToSALSetMplsTtl(action));
447 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl){
448 DecMplsTtlBuilder decMplsTtl = new DecMplsTtlBuilder();
449 bucketActions.add(decMplsTtl.build());
451 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan)
452 bucketActions.add(ofToSALPushVlanAction(action));
453 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan){
454 PopVlanActionBuilder popVlan = new PopVlanActionBuilder();
455 bucketActions.add(popVlan.build());
457 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls){
458 PushMplsActionBuilder pushMpls = new PushMplsActionBuilder();
459 bucketActions.add(pushMpls.build());
461 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls){
462 PopMplsActionBuilder popMpls = new PopMplsActionBuilder();
463 bucketActions.add(popMpls.build());
465 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue)
466 bucketActions.add(ofToSALSetQueue(action));
468 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl)
469 bucketActions.add(ofToSALSetNwTtl(action));
470 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl){
471 DecNwTtlBuilder decNwTtl = new DecNwTtlBuilder();
472 bucketActions.add(decNwTtl.build());
474 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField)
475 bucketActions.add(FlowConvertor.ofToSALSetField(action));
477 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb)
478 bucketActions.add(ofToSALPushPbbAction(action));
479 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb){
480 PopPbbActionBuilder popPbb = new PopPbbActionBuilder();
481 bucketActions.add(popPbb.build());
483 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter){
484 //bucketActions.add(ofToSALExperimenter(action));
485 // TODO: Need to explore/discuss on how to handle experimenter case.
489 return bucketActions;
493 * Method converts OF Output action object to SAL Output action object.
494 * @param action org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action
495 * @return OutputAction
497 public static OutputAction ofToSALOutputAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
499 OutputActionBuilder outputAction = new OutputActionBuilder();
500 PortAction port = action.getAugmentation(PortAction.class);
502 outputAction.setOutputNodeConnector(new Uri(port.getPort().getValue().toString()));
504 logger.error("Provided action is not OF Output action, no associated port found!" );
507 MaxLengthAction length = action.getAugmentation(MaxLengthAction.class);
509 outputAction.setMaxLength(length.getMaxLength());
511 logger.error("Provided action is not OF Output action, no associated length found!");
514 return outputAction.build();
518 * Method converts OF GroupAction object to SAL GroupAction object
520 * @return GroupAction
522 public static GroupAction ofToSALGroupAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
524 GroupActionBuilder groupAction = new GroupActionBuilder();
526 GroupIdAction groupId = action.getAugmentation(GroupIdAction.class);
527 groupAction.setGroupId(groupId.getGroupId());
529 return groupAction.build();
533 * Method converts OF SetMplsTTL action object to SAL SetMplsTTL action object.
537 public static SetMplsTtlAction ofToSALSetMplsTtl(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action){
539 SetMplsTtlActionBuilder mplsTtlAction = new SetMplsTtlActionBuilder();
540 MplsTtlAction mplsTtl = action.getAugmentation(MplsTtlAction.class);
541 mplsTtlAction.setMplsTtl(mplsTtl.getMplsTtl());
542 return mplsTtlAction.build();
546 * Method converts OF Pushvlan action to SAL PushVlan action.
548 * @return PushVlanAction
550 public static PushVlanAction ofToSALPushVlanAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
552 PushVlanActionBuilder pushVlanAction = new PushVlanActionBuilder();
554 EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
555 pushVlanAction.setVlanId(new VlanId(etherType.getEthertype().getValue()));
557 return pushVlanAction.build();
561 * Method converts OF SetQueue action to SAL SetQueue action.
563 * @return SetQueueAction
565 public static SetQueueAction ofToSALSetQueue(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
567 SetQueueActionBuilder setQueueAction = new SetQueueActionBuilder();
569 QueueIdAction queueId = action.getAugmentation(QueueIdAction.class);
570 setQueueAction.setQueueId(queueId.getQueueId());
572 return setQueueAction.build();
576 * Method converts OF SetNwTtl action to SAL SetNwTtl action.
578 * @return SetNwTtlAction
580 public static SetNwTtlAction ofToSALSetNwTtl(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
582 SetNwTtlActionBuilder setNwTtl = new SetNwTtlActionBuilder();
583 NwTtlAction nwTtl = action.getAugmentation(NwTtlAction.class);
584 setNwTtl.setNwTtl(nwTtl.getNwTtl());
586 return setNwTtl.build();
590 * Method converts OF Pushvlan action to SAL PushVlan action.
592 * @return PushVlanAction
594 public static PushPbbAction ofToSALPushPbbAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
596 PushPbbActionBuilder pushPbbAction = new PushPbbActionBuilder();
598 EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
599 pushPbbAction.setEthernetType(etherType.getEthertype().getValue());
601 return pushPbbAction.build();
604 public static Object ofToSALExperimenter(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action){
606 ExperimenterAction ExperimenterAction = action.getAugmentation(ExperimenterAction.class);
610 * TODO: Need to explore/discuss about how to handle experimenter