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.DecNwTtl;
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.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.PopVlan;
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
89 public final class ActionConvertor {
90 private static final Logger logger = LoggerFactory.getLogger(ActionConvertor.class);
91 private static final String PREFIX_SEPARATOR = "/";
92 final private static short OF10 = 1;
93 final private static short OF13 = 4;
95 private ActionConvertor() {
99 public static List<ActionsList> getActionList(
100 List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions,
104 ActionBuilder actionBuilder = new ActionBuilder();
105 ActionsListBuilder actionsListBuilder = new ActionsListBuilder();
106 List<ActionsList> actionsList = new ArrayList<ActionsList>();
108 for (int actionItem = 0; actionItem < actions.size(); actionItem++) {
110 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = actions.get(
111 actionItem).getAction();
113 if (action instanceof OutputAction)
114 actionsList.add(salToOFOutputAction(action, actionBuilder, actionsListBuilder, version));
115 else if (action instanceof GroupAction)
116 actionsList.add(SalToOFGroupAction(action, actionBuilder, actionsListBuilder));
117 else if (action instanceof CopyTtlOut)
118 actionsList.add(SalToOFCopyTTLIOut(actionBuilder, actionsListBuilder));
119 else if (action instanceof CopyTtlIn)
120 actionsList.add(SalToOFCopyTTLIIn(actionBuilder, actionsListBuilder));
121 else if (action instanceof SetMplsTtlAction)
122 actionsList.add(SalToOFSetMplsTtl(action, actionBuilder, actionsListBuilder));
123 else if (action instanceof DecMplsTtl)
124 actionsList.add(SalToOFDecMplsTtl(actionBuilder, actionsListBuilder));
125 else if (action instanceof PushVlanAction)
126 actionsList.add(SalToOFPushVlanAction(action, actionBuilder, actionsListBuilder));
127 else if (action instanceof PopVlanAction)
128 actionsList.add(SalToOFPopVlan(action, actionBuilder, actionsListBuilder));
129 else if (action instanceof PushMplsAction)
130 actionsList.add(SalToOFPushMplsAction(action, actionBuilder, actionsListBuilder));
131 else if (action instanceof PopMplsAction)
132 actionsList.add(SalToOFPopMpls(action, actionBuilder, actionsListBuilder));
133 else if (action instanceof SetQueueAction)
134 actionsList.add(SalToOFSetQueue(action, actionBuilder, actionsListBuilder));
136 else if (action instanceof SetNwTtlAction)
137 actionsList.add(SalToOFSetNwTtl(action, actionBuilder, actionsListBuilder));
138 else if (action instanceof DecNwTtl)
139 actionsList.add(SalToOFDecNwTtl(action, actionBuilder, actionsListBuilder));
140 else if (action instanceof SetField)
141 actionsList.add(SalToOFSetField(action, actionBuilder, actionsListBuilder));
143 else if (action instanceof PushPbbAction)
144 actionsList.add(SalToOFPushPbbAction(action, actionBuilder, actionsListBuilder));
145 else if (action instanceof PopPbbAction)
146 actionsList.add(SalToOFPopPBB(action, actionBuilder, actionsListBuilder));
147 else if (action instanceof ExperimenterAction)
148 actionsList.add(SalToOFExperimenter(action, actionBuilder, actionsListBuilder));
155 private static ActionsList SalToOFSetField(
156 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
157 ActionBuilder actionBuilder, 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 = MatchConvertor.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, ActionsListBuilder actionsListBuilder) {
180 actionBuilder.setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl.class);
182 return emtpyAction(actionBuilder, actionsListBuilder);
185 private static ActionsList SalToOFPushMplsAction(
186 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
187 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
189 actionBuilder.setType(PushMpls.class);
191 return SalToOFPushAction(((PushMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
195 private static ActionsList SalToOFPushPbbAction(
196 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
197 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
198 actionBuilder.setType(PushPbb.class);
200 return SalToOFPushAction(((PushPbbAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
203 private static ActionsList SalToOFPushVlanAction(
204 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
205 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
207 PushVlanAction pushVlanAction = (PushVlanAction) action;
208 VlanId vlanId = new VlanId(pushVlanAction.getVlanId());
209 Integer etherType = vlanId.getValue();
210 actionBuilder.setType(PushVlan.class);
212 return SalToOFPushAction(etherType, actionBuilder, actionsListBuilder);
216 private static ActionsList SalToOFSetNwTtl(
217 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
218 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
220 NwTtlActionBuilder nwTtlActionBuilder = new NwTtlActionBuilder();
221 nwTtlActionBuilder.setNwTtl(((SetNwTtlAction) action).getNwTtl());
223 actionBuilder.setType(SetNwTtl.class);
224 actionBuilder.addAugmentation(NwTtlAction.class, nwTtlActionBuilder.build());
225 actionsListBuilder.setAction(actionBuilder.build());
226 return actionsListBuilder.build();
230 private static ActionsList SalToOFSetQueue(
231 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
232 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
234 SetQueueAction setQueueAction = (SetQueueAction) action;
236 QueueIdActionBuilder queueIdActionBuilder = new QueueIdActionBuilder();
237 queueIdActionBuilder.setQueueId(Long.getLong(setQueueAction.getQueue()));
238 actionBuilder.setType(SetQueue.class);
239 actionBuilder.addAugmentation(QueueIdAction.class, queueIdActionBuilder.build());
241 actionsListBuilder.setAction(actionBuilder.build());
242 return actionsListBuilder.build();
245 private static ActionsList SalToOFPopMpls(
246 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
247 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
249 actionBuilder.setType(PopMpls.class);
251 return SalToOFPushAction(((PopMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
254 private static ActionsList SalToOFPopVlan(
255 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
256 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
258 actionBuilder.setType(PopVlan.class);
260 return emtpyAction(actionBuilder, actionsListBuilder);
263 private static ActionsList SalToOFPopPBB(
264 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
265 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
266 actionBuilder.setType(PopPbb.class);
267 return emtpyAction(actionBuilder, actionsListBuilder);
270 private static ActionsList SalToOFExperimenter(
271 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
272 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
274 ExperimenterActionBuilder experimenterActionBuilder = new ExperimenterActionBuilder();
275 experimenterActionBuilder.setExperimenter(((ExperimenterAction) action).getExperimenter());
276 actionBuilder.setType(Experimenter.class);
279 ExperimenterAction.class,
280 (Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action>) experimenterActionBuilder);
281 actionsListBuilder.setAction(actionBuilder.build());
282 return actionsListBuilder.build();
286 private static ActionsList SalToOFGroupAction(
287 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
288 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
290 GroupAction groupAction = (GroupAction) action;
292 GroupIdActionBuilder groupIdBuilder = new GroupIdActionBuilder();
293 groupIdBuilder.setGroupId(Long.getLong(groupAction.getGroup()));
294 actionBuilder.setType(Group.class);
295 actionBuilder.addAugmentation(GroupIdAction.class, groupIdBuilder.build());
296 actionsListBuilder.setAction(actionBuilder.build());
297 return actionsListBuilder.build();
300 private static ActionsList SalToOFPushAction(Integer ethernetType, ActionBuilder actionBuilder,
301 ActionsListBuilder actionsListBuilder) {
303 EthertypeActionBuilder ethertypeActionBuilder = new EthertypeActionBuilder();
304 ethertypeActionBuilder.setEthertype(new EtherType(ethernetType));
307 actionBuilder.addAugmentation(EthertypeAction.class, ethertypeActionBuilder.build());
308 actionsListBuilder.setAction(actionBuilder.build());
309 return actionsListBuilder.build();
312 private static ActionsList SalToOFDecMplsTtl(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
314 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class);
315 return emtpyAction(actionBuilder, actionsListBuilder);
318 private static ActionsList SalToOFSetMplsTtl(
319 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
320 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
322 SetMplsTtlAction mplsTtlAction = (SetMplsTtlAction) action;
324 MplsTtlActionBuilder mplsTtlActionBuilder = new MplsTtlActionBuilder();
325 mplsTtlActionBuilder.setMplsTtl(mplsTtlAction.getMplsTtl()/* SAL */);
327 actionBuilder.setType(SetMplsTtl.class);
328 actionBuilder.addAugmentation(MplsTtlAction.class, mplsTtlActionBuilder.build());
329 actionsListBuilder.setAction(actionBuilder.build());
330 return actionsListBuilder.build();
333 private static ActionsList SalToOFCopyTTLIIn(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
335 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class);
336 return emtpyAction(actionBuilder, actionsListBuilder);
339 private static ActionsList SalToOFCopyTTLIOut(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
341 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class);
342 return emtpyAction(actionBuilder, actionsListBuilder);
346 private static ActionsList emtpyAction(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
348 actionsListBuilder.setAction(actionBuilder.build());
349 return actionsListBuilder.build();
352 private static ActionsList salToOFOutputAction(
353 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
354 ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder, short version) {
356 OutputAction outputAction = ((OutputAction) action);
357 PortActionBuilder portAction = new PortActionBuilder();
358 MaxLengthActionBuilder maxLenActionBuilder = new MaxLengthActionBuilder();
359 maxLenActionBuilder.setMaxLength(outputAction.getMaxLength());
361 actionBuilder.addAugmentation(MaxLengthAction.class, maxLenActionBuilder.build());
363 Uri uri = outputAction.getOutputNodeConnector();
364 if (uri.getValue() == NodeConnectorIDType.ALL) {
365 if (version >= OF13) {
366 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.ALL.getIntValue())));
368 } else if (version == OF10) {
369 portAction.setPort(new PortNumber((long) PortNumberValuesV10.ALL.getIntValue()));
373 if (uri.getValue() == NodeConnectorIDType.SWSTACK) {
374 if (version >= OF13) {
375 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.LOCAL.getIntValue())));
377 } else if (version == OF10) {
378 portAction.setPort(new PortNumber((long) PortNumberValuesV10.LOCAL.getIntValue()));
383 if ((uri.getValue() == NodeConnectorIDType.HWPATH) || (uri.getValue() == NodeConnectorIDType.ONEPK)
384 || (uri.getValue() == NodeConnectorIDType.ONEPK2OPENFLOW)
385 || (uri.getValue() == NodeConnectorIDType.ONEPK2PCEP)
386 || (uri.getValue() == NodeConnectorIDType.OPENFLOW)
387 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2ONEPK)
388 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2PCEP)
389 || (uri.getValue() == NodeConnectorIDType.PCEP) || (uri.getValue() == NodeConnectorIDType.PCEP2ONEPK)
390 || (uri.getValue() == NodeConnectorIDType.PCEP2OPENFLOW)
391 || (uri.getValue() == NodeConnectorIDType.PRODUCTION)) {
392 if (version >= OF13) {
393 portAction.setPort(new PortNumber((long) PortNumberValuesV10.NORMAL.getIntValue()));
395 } else if (version == OF10) {
396 portAction.setPort(new PortNumber((long) PortNumberValuesV10.NORMAL.getIntValue()));
400 if (uri.getValue() == NodeConnectorIDType.CONTROLLER) {
402 if (version >= OF13) {
403 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.CONTROLLER
406 } else if (version == OF10) {
407 portAction.setPort(new PortNumber((long) PortNumberValuesV10.CONTROLLER.getIntValue()));
413 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
414 actionBuilder.addAugmentation(PortAction.class, portAction.build());
415 actionsListBuilder.setAction(actionBuilder.build());
416 return actionsListBuilder.build();
420 * Method to convert OF actions associated with bucket to SAL Actions.
423 * @return List of converted SAL Actions.
425 public static List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> toSALBucketActions(
426 List<ActionsList> actionList) {
428 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.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class))
435 bucketActions.add(ofToSALOutputAction(action));
436 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group.class))
437 bucketActions.add(ofToSALGroupAction(action));
438 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class)){
439 CopyTtlOutBuilder copyTtlOutaction = new CopyTtlOutBuilder();
440 bucketActions.add(copyTtlOutaction.build());
442 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class)){
443 CopyTtlInBuilder copyTtlInaction = new CopyTtlInBuilder();
444 bucketActions.add(copyTtlInaction.build());
446 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl.class))
447 bucketActions.add(ofToSALSetMplsTtl(action));
448 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class)){
449 DecMplsTtlBuilder decMplsTtl = new DecMplsTtlBuilder();
450 bucketActions.add(decMplsTtl.build());
452 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan.class))
453 bucketActions.add(ofToSALPushVlanAction(action));
454 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan.class)){
455 PopVlanActionBuilder popVlan = new PopVlanActionBuilder();
456 bucketActions.add(popVlan.build());
458 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls.class)){
459 PushMplsActionBuilder pushMpls = new PushMplsActionBuilder();
460 bucketActions.add(pushMpls.build());
462 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls.class)){
463 PopMplsActionBuilder popMpls = new PopMplsActionBuilder();
464 bucketActions.add(popMpls.build());
466 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue.class))
467 bucketActions.add(ofToSALSetQueue(action));
469 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl.class))
470 bucketActions.add(ofToSALSetNwTtl(action));
471 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl.class)){
472 DecNwTtlBuilder decNwTtl = new DecNwTtlBuilder();
473 bucketActions.add(decNwTtl.build());
475 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField.class))
476 bucketActions.add(MatchConvertor.ofToSALSetField(action));
478 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb.class))
479 bucketActions.add(ofToSALPushPbbAction(action));
480 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb.class)){
481 PopPbbActionBuilder popPbb = new PopPbbActionBuilder();
482 bucketActions.add(popPbb.build());
484 else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter.class)){
485 //bucketActions.add(ofToSALExperimenter(action));
486 // TODO: Need to explore/discuss on how to handle experimenter case.
490 return bucketActions;
494 * Method converts OF Output action object to SAL Output action object.
497 * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.
498 * action.rev130731.actions.actions.list.Action
499 * @return OutputAction
501 public static OutputAction ofToSALOutputAction(
502 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
504 OutputActionBuilder outputAction = new OutputActionBuilder();
505 PortAction port = action.getAugmentation(PortAction.class);
507 outputAction.setOutputNodeConnector(new Uri(port.getPort().getValue().toString()));
509 logger.error("Provided action is not OF Output action, no associated port found!");
512 MaxLengthAction length = action.getAugmentation(MaxLengthAction.class);
513 if (length != null) {
514 outputAction.setMaxLength(length.getMaxLength());
516 logger.error("Provided action is not OF Output action, no associated length found!");
519 return outputAction.build();
523 * Method converts OF GroupAction object to SAL GroupAction object
526 * @return GroupAction
528 public static GroupAction ofToSALGroupAction(
529 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
531 GroupActionBuilder groupAction = new GroupActionBuilder();
533 GroupIdAction groupId = action.getAugmentation(GroupIdAction.class);
534 groupAction.setGroupId(groupId.getGroupId());
536 return groupAction.build();
540 * Method converts OF SetMplsTTL action object to SAL SetMplsTTL action
546 public static SetMplsTtlAction ofToSALSetMplsTtl(
547 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
549 SetMplsTtlActionBuilder mplsTtlAction = new SetMplsTtlActionBuilder();
550 MplsTtlAction mplsTtl = action.getAugmentation(MplsTtlAction.class);
551 mplsTtlAction.setMplsTtl(mplsTtl.getMplsTtl());
552 return mplsTtlAction.build();
556 * Method converts OF Pushvlan action to SAL PushVlan action.
559 * @return PushVlanAction
561 public static PushVlanAction ofToSALPushVlanAction(
562 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
564 PushVlanActionBuilder pushVlanAction = new PushVlanActionBuilder();
566 EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
567 pushVlanAction.setVlanId(new VlanId(etherType.getEthertype().getValue()));
569 return pushVlanAction.build();
573 * Method converts OF SetQueue action to SAL SetQueue action.
576 * @return SetQueueAction
578 public static SetQueueAction ofToSALSetQueue(
579 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
581 SetQueueActionBuilder setQueueAction = new SetQueueActionBuilder();
583 QueueIdAction queueId = action.getAugmentation(QueueIdAction.class);
584 setQueueAction.setQueueId(queueId.getQueueId());
586 return setQueueAction.build();
590 * Method converts OF SetNwTtl action to SAL SetNwTtl action.
593 * @return SetNwTtlAction
595 public static SetNwTtlAction ofToSALSetNwTtl(
596 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
598 SetNwTtlActionBuilder setNwTtl = new SetNwTtlActionBuilder();
599 NwTtlAction nwTtl = action.getAugmentation(NwTtlAction.class);
600 setNwTtl.setNwTtl(nwTtl.getNwTtl());
602 return setNwTtl.build();
606 * Method converts OF Pushvlan action to SAL PushVlan action.
609 * @return PushVlanAction
611 public static PushPbbAction ofToSALPushPbbAction(
612 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
614 PushPbbActionBuilder pushPbbAction = new PushPbbActionBuilder();
616 EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
617 pushPbbAction.setEthernetType(etherType.getEthertype().getValue());
619 return pushPbbAction.build();
622 public static Object ofToSALExperimenter(
623 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
625 ExperimenterAction ExperimenterAction = action.getAugmentation(ExperimenterAction.class);
629 * TODO: Need to explore/discuss about how to handle experimenter