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.openflowjava.protocol.api.util.BinContent;
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.CopyTtlIn;
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInBuilder;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOut;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutBuilder;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtl;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupAction;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputAction;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsAction;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbAction;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanAction;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsAction;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbAction;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanAction;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetField;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlAction;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlAction;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueAction;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdActionBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlAction;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsAction;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsActionBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValues;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValuesV10;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
77 import org.opendaylight.yangtools.yang.binding.Augmentation;
78 import org.slf4j.Logger;
79 import org.slf4j.LoggerFactory;
82 * @author usha@ericsson Action List:This class takes data from SAL layer and
83 * converts into OF Data
84 * @author avishnoi@in.ibm.com Added convertor for OF bucket actions to SAL
88 public final class ActionConvertor {
89 private static final Logger logger = LoggerFactory.getLogger(ActionConvertor.class);
90 private static final String PREFIX_SEPARATOR = "/";
91 final private static short OF10 = 1;
92 final private static short OF13 = 4;
94 private ActionConvertor() {
98 public static List<ActionsList> getActionList(
99 List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions,
103 ActionBuilder actionBuilder = new ActionBuilder();
104 ActionsListBuilder actionsListBuilder = new ActionsListBuilder();
105 List<ActionsList> actionsList = new ArrayList<ActionsList>();
107 for (int actionItem = 0; actionItem < actions.size(); actionItem++) {
109 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = actions.get(
110 actionItem).getAction();
112 if (action instanceof OutputAction)
113 actionsList.add(salToOFOutputAction(action, actionBuilder, actionsListBuilder, version));
114 else if (action instanceof GroupAction)
115 actionsList.add(SalToOFGroupAction(action, actionBuilder, actionsListBuilder));
116 else if (action instanceof CopyTtlOut)
117 actionsList.add(SalToOFCopyTTLIOut(actionBuilder, actionsListBuilder));
118 else if (action instanceof CopyTtlIn)
119 actionsList.add(SalToOFCopyTTLIIn(actionBuilder, actionsListBuilder));
120 else if (action instanceof SetMplsTtlAction)
121 actionsList.add(SalToOFSetMplsTtl(action, actionBuilder, actionsListBuilder));
122 else if (action instanceof DecMplsTtl)
123 actionsList.add(SalToOFDecMplsTtl(actionBuilder, actionsListBuilder));
124 else if (action instanceof PushVlanAction)
125 actionsList.add(SalToOFPushVlanAction(action, actionBuilder, actionsListBuilder));
126 else if (action instanceof PopVlanAction)
127 actionsList.add(SalToOFPopVlan(action, actionBuilder, actionsListBuilder));
128 else if (action instanceof PushMplsAction)
129 actionsList.add(SalToOFPushMplsAction(action, actionBuilder, actionsListBuilder));
130 else if (action instanceof PopMplsAction)
131 actionsList.add(SalToOFPopMpls(action, actionBuilder, actionsListBuilder));
132 else if (action instanceof SetQueueAction)
133 actionsList.add(SalToOFSetQueue(action, actionBuilder, actionsListBuilder));
135 else if (action instanceof SetNwTtlAction)
136 actionsList.add(SalToOFSetNwTtl(action, actionBuilder, actionsListBuilder));
137 else if (action instanceof DecNwTtl)
138 actionsList.add(SalToOFDecNwTtl(action, actionBuilder, actionsListBuilder));
139 else if (action instanceof SetField)
140 actionsList.add(SalToOFSetField(action, actionBuilder, actionsListBuilder));
142 else if (action instanceof PushPbbAction)
143 actionsList.add(SalToOFPushPbbAction(action, actionBuilder, actionsListBuilder));
144 else if (action instanceof PopPbbAction)
145 actionsList.add(SalToOFPopPBB(action, actionBuilder, actionsListBuilder));
146 else if (action instanceof ExperimenterAction)
147 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, ActionsListBuilder actionsListBuilder) {
158 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;
159 org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match = setField.getMatch();
161 List<MatchEntries> matchEntries = FlowConvertor.toMatch(match);
163 OxmFieldsActionBuilder oxmFieldsActionBuilder = new OxmFieldsActionBuilder();
165 oxmFieldsActionBuilder.setMatchEntries(matchEntries);
168 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField.class);
170 actionBuilder.addAugmentation(OxmFieldsAction.class, oxmFieldsActionBuilder.build());
171 actionsListBuilder.setAction(actionBuilder.build());
172 return actionsListBuilder.build();
176 private static ActionsList SalToOFDecNwTtl(
177 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
178 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
179 actionBuilder.setType(DecNwTtl.class);
181 return emtpyAction(actionBuilder, actionsListBuilder);
184 private static ActionsList SalToOFPushMplsAction(
185 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
186 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
188 actionBuilder.setType(PushMpls.class);
190 return SalToOFPushAction(((PushMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
194 private static ActionsList SalToOFPushPbbAction(
195 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
196 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
197 actionBuilder.setType(PushPbb.class);
199 return SalToOFPushAction(((PushPbbAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
202 private static ActionsList SalToOFPushVlanAction(
203 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
204 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
206 PushVlanAction pushVlanAction = (PushVlanAction) action;
207 VlanId vlanId = new VlanId(pushVlanAction.getVlanId());
208 Integer etherType = vlanId.getValue();
209 actionBuilder.setType(PushVlan.class);
211 return SalToOFPushAction(etherType, actionBuilder, actionsListBuilder);
215 private static ActionsList SalToOFSetNwTtl(
216 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
217 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
219 NwTtlActionBuilder nwTtlActionBuilder = new NwTtlActionBuilder();
220 nwTtlActionBuilder.setNwTtl(((SetNwTtlAction) action).getNwTtl());
222 actionBuilder.setType(SetNwTtl.class);
223 actionBuilder.addAugmentation(NwTtlAction.class, nwTtlActionBuilder.build());
224 actionsListBuilder.setAction(actionBuilder.build());
225 return actionsListBuilder.build();
229 private static ActionsList SalToOFSetQueue(
230 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
231 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
233 SetQueueAction setQueueAction = (SetQueueAction) action;
235 QueueIdActionBuilder queueIdActionBuilder = new QueueIdActionBuilder();
236 queueIdActionBuilder.setQueueId(Long.getLong(setQueueAction.getQueue()));
237 actionBuilder.setType(SetQueue.class);
238 actionBuilder.addAugmentation(QueueIdAction.class, queueIdActionBuilder.build());
240 actionsListBuilder.setAction(actionBuilder.build());
241 return actionsListBuilder.build();
244 private static ActionsList SalToOFPopMpls(
245 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
246 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
248 actionBuilder.setType(PopMpls.class);
250 return SalToOFPushAction(((PopMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
253 private static ActionsList SalToOFPopVlan(
254 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
255 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
257 actionBuilder.setType(PushMpls.class);
259 return emtpyAction(actionBuilder, actionsListBuilder);
262 private static ActionsList SalToOFPopPBB(
263 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
264 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
265 actionBuilder.setType(PopPbb.class);
266 return emtpyAction(actionBuilder, actionsListBuilder);
269 private static ActionsList SalToOFExperimenter(
270 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
271 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
273 ExperimenterActionBuilder experimenterActionBuilder = new ExperimenterActionBuilder();
274 experimenterActionBuilder.setExperimenter(((ExperimenterAction) action).getExperimenter());
275 actionBuilder.setType(Experimenter.class);
278 ExperimenterAction.class,
279 (Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action>) experimenterActionBuilder);
280 actionsListBuilder.setAction(actionBuilder.build());
281 return actionsListBuilder.build();
285 private static ActionsList SalToOFGroupAction(
286 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
287 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
289 GroupAction groupAction = (GroupAction) action;
291 GroupIdActionBuilder groupIdBuilder = new GroupIdActionBuilder();
292 groupIdBuilder.setGroupId(Long.getLong(groupAction.getGroup()));
293 actionBuilder.setType(Group.class);
294 actionBuilder.addAugmentation(GroupIdAction.class, groupIdBuilder.build());
295 actionsListBuilder.setAction(actionBuilder.build());
296 return actionsListBuilder.build();
299 private static ActionsList SalToOFPushAction(Integer ethernetType, ActionBuilder actionBuilder,
300 ActionsListBuilder actionsListBuilder) {
302 EthertypeActionBuilder ethertypeActionBuilder = new EthertypeActionBuilder();
303 ethertypeActionBuilder.setEthertype(new EtherType(ethernetType));
306 actionBuilder.addAugmentation(EthertypeAction.class, ethertypeActionBuilder.build());
307 actionsListBuilder.setAction(actionBuilder.build());
308 return actionsListBuilder.build();
311 private static ActionsList SalToOFDecMplsTtl(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
313 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class);
314 return emtpyAction(actionBuilder, actionsListBuilder);
317 private static ActionsList SalToOFSetMplsTtl(
318 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
319 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
321 SetMplsTtlAction mplsTtlAction = (SetMplsTtlAction) action;
323 MplsTtlActionBuilder mplsTtlActionBuilder = new MplsTtlActionBuilder();
324 mplsTtlActionBuilder.setMplsTtl(mplsTtlAction.getMplsTtl()/* SAL */);
326 actionBuilder.setType(SetMplsTtl.class);
327 actionBuilder.addAugmentation(MplsTtlAction.class, mplsTtlActionBuilder.build());
328 actionsListBuilder.setAction(actionBuilder.build());
329 return actionsListBuilder.build();
332 private static ActionsList SalToOFCopyTTLIIn(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
334 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class);
335 return emtpyAction(actionBuilder, actionsListBuilder);
338 private static ActionsList SalToOFCopyTTLIOut(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
340 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class);
341 return emtpyAction(actionBuilder, actionsListBuilder);
345 private static ActionsList emtpyAction(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
347 actionsListBuilder.setAction(actionBuilder.build());
348 return actionsListBuilder.build();
351 private static ActionsList salToOFOutputAction(
352 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
353 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder, short version) {
355 OutputAction outputAction = ((OutputAction) action);
356 PortActionBuilder portAction = new PortActionBuilder();
357 MaxLengthActionBuilder maxLenActionBuilder = new MaxLengthActionBuilder();
358 maxLenActionBuilder.setMaxLength(outputAction.getMaxLength());
360 actionBuilder.addAugmentation(MaxLengthAction.class, maxLenActionBuilder.build());
362 Uri uri = outputAction.getOutputNodeConnector();
363 if (uri.getValue() == NodeConnectorIDType.ALL) {
364 if (version >= OF13) {
365 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.ALL.getIntValue())));
367 } else if (version == OF10) {
368 portAction.setPort(new PortNumber((long) PortNumberValuesV10.ALL.getIntValue()));
372 if (uri.getValue() == NodeConnectorIDType.SWSTACK) {
373 if (version >= OF13) {
374 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.LOCAL.getIntValue())));
376 } else if (version == OF10) {
377 portAction.setPort(new PortNumber((long) PortNumberValuesV10.LOCAL.getIntValue()));
382 if ((uri.getValue() == NodeConnectorIDType.HWPATH) || (uri.getValue() == NodeConnectorIDType.ONEPK)
383 || (uri.getValue() == NodeConnectorIDType.ONEPK2OPENFLOW)
384 || (uri.getValue() == NodeConnectorIDType.ONEPK2PCEP)
385 || (uri.getValue() == NodeConnectorIDType.OPENFLOW)
386 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2ONEPK)
387 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2PCEP)
388 || (uri.getValue() == NodeConnectorIDType.PCEP) || (uri.getValue() == NodeConnectorIDType.PCEP2ONEPK)
389 || (uri.getValue() == NodeConnectorIDType.PCEP2OPENFLOW)
390 || (uri.getValue() == NodeConnectorIDType.PRODUCTION)) {
391 if (version >= OF13) {
392 portAction.setPort(new PortNumber((long) PortNumberValuesV10.NORMAL.getIntValue()));
394 } else if (version == OF10) {
395 portAction.setPort(new PortNumber((long) PortNumberValuesV10.NORMAL.getIntValue()));
399 if (uri.getValue() == NodeConnectorIDType.CONTROLLER) {
401 if (version >= OF13) {
402 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.CONTROLLER
405 } else if (version == OF10) {
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.
422 * @return List of converted SAL Actions.
424 public static List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> toSALBucketActions(
425 List<ActionsList> actionList) {
427 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>();
429 for (ActionsList actionDesc : actionList) {
431 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action = actionDesc
434 if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output)
435 bucketActions.add(ofToSALOutputAction(action));
436 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group)
437 bucketActions.add(ofToSALGroupAction(action));
438 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut) {
439 CopyTtlOutBuilder copyTtlOutaction = new CopyTtlOutBuilder();
440 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());
444 } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl)
445 bucketActions.add(ofToSALSetMplsTtl(action));
446 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl) {
447 DecMplsTtlBuilder decMplsTtl = new DecMplsTtlBuilder();
448 bucketActions.add(decMplsTtl.build());
449 } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan)
450 bucketActions.add(ofToSALPushVlanAction(action));
451 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan) {
452 PopVlanActionBuilder popVlan = new PopVlanActionBuilder();
453 bucketActions.add(popVlan.build());
454 } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls) {
455 PushMplsActionBuilder pushMpls = new PushMplsActionBuilder();
456 bucketActions.add(pushMpls.build());
457 } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls) {
458 PopMplsActionBuilder popMpls = new PopMplsActionBuilder();
459 bucketActions.add(popMpls.build());
460 } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue)
461 bucketActions.add(ofToSALSetQueue(action));
463 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl)
464 bucketActions.add(ofToSALSetNwTtl(action));
465 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl) {
466 DecNwTtlBuilder decNwTtl = new DecNwTtlBuilder();
467 bucketActions.add(decNwTtl.build());
468 } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField)
469 bucketActions.add(FlowConvertor.ofToSALSetField(action));
471 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb)
472 bucketActions.add(ofToSALPushPbbAction(action));
473 else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb) {
474 PopPbbActionBuilder popPbb = new PopPbbActionBuilder();
475 bucketActions.add(popPbb.build());
476 } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter) {
477 // bucketActions.add(ofToSALExperimenter(action));
478 // TODO: Need to explore/discuss on how to handle experimenter
483 return bucketActions;
487 * Method converts OF Output action object to SAL Output action object.
490 * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.
491 * action.rev130731.actions.actions.list.Action
492 * @return OutputAction
494 public static OutputAction ofToSALOutputAction(
495 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
497 OutputActionBuilder outputAction = new OutputActionBuilder();
498 PortAction port = action.getAugmentation(PortAction.class);
500 outputAction.setOutputNodeConnector(new Uri(port.getPort().getValue().toString()));
502 logger.error("Provided action is not OF Output action, no associated port found!");
505 MaxLengthAction length = action.getAugmentation(MaxLengthAction.class);
506 if (length != null) {
507 outputAction.setMaxLength(length.getMaxLength());
509 logger.error("Provided action is not OF Output action, no associated length found!");
512 return outputAction.build();
516 * Method converts OF GroupAction object to SAL GroupAction object
519 * @return GroupAction
521 public static GroupAction ofToSALGroupAction(
522 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
539 public static SetMplsTtlAction ofToSALSetMplsTtl(
540 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
542 SetMplsTtlActionBuilder mplsTtlAction = new SetMplsTtlActionBuilder();
543 MplsTtlAction mplsTtl = action.getAugmentation(MplsTtlAction.class);
544 mplsTtlAction.setMplsTtl(mplsTtl.getMplsTtl());
545 return mplsTtlAction.build();
549 * Method converts OF Pushvlan action to SAL PushVlan action.
552 * @return PushVlanAction
554 public static PushVlanAction ofToSALPushVlanAction(
555 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
557 PushVlanActionBuilder pushVlanAction = new PushVlanActionBuilder();
559 EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
560 pushVlanAction.setVlanId(new VlanId(etherType.getEthertype().getValue()));
562 return pushVlanAction.build();
566 * Method converts OF SetQueue action to SAL SetQueue action.
569 * @return SetQueueAction
571 public static SetQueueAction ofToSALSetQueue(
572 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
574 SetQueueActionBuilder setQueueAction = new SetQueueActionBuilder();
576 QueueIdAction queueId = action.getAugmentation(QueueIdAction.class);
577 setQueueAction.setQueueId(queueId.getQueueId());
579 return setQueueAction.build();
583 * Method converts OF SetNwTtl action to SAL SetNwTtl action.
586 * @return SetNwTtlAction
588 public static SetNwTtlAction ofToSALSetNwTtl(
589 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
591 SetNwTtlActionBuilder setNwTtl = new SetNwTtlActionBuilder();
592 NwTtlAction nwTtl = action.getAugmentation(NwTtlAction.class);
593 setNwTtl.setNwTtl(nwTtl.getNwTtl());
595 return setNwTtl.build();
599 * Method converts OF Pushvlan action to SAL PushVlan action.
602 * @return PushVlanAction
604 public static PushPbbAction ofToSALPushPbbAction(
605 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
607 PushPbbActionBuilder pushPbbAction = new PushPbbActionBuilder();
609 EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
610 pushPbbAction.setEthernetType(etherType.getEthertype().getValue());
612 return pushPbbAction.build();
615 public static Object ofToSALExperimenter(
616 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
618 ExperimenterAction ExperimenterAction = action.getAugmentation(ExperimenterAction.class);
622 * TODO: Need to explore/discuss about how to handle experimenter