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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
8 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action;
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.CopyTtlOut;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtl;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupAction;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputAction;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsAction;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbAction;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanAction;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsAction;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbAction;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanAction;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlAction;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlAction;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueAction;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdActionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlAction;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
56 import org.opendaylight.yangtools.yang.binding.Augmentation;
57 import org.openflow.protocol.OFPort;
66 * @author usha@ericsson Action List:This class takes data from SAL layer and
67 * converts into OF Data
70 public final class ActionConvertor {
72 private ActionConvertor() {
76 public static List<ActionsList> getActionList(
77 List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions)
80 ActionBuilder actionBuilder = new ActionBuilder();
81 ActionsListBuilder actionsListBuilder = new ActionsListBuilder();
82 List<ActionsList> actionsList = new ArrayList<ActionsList>();
84 for (int actionItem = 0; actionItem < actions.size(); actionItem++)
86 Action action = actions.get(
87 actionItem).getAction();
89 if (action instanceof OutputAction)
90 actionsList.add(salToOFOutputAction(action,actionBuilder,actionsListBuilder));
91 else if (action instanceof GroupAction)
92 actionsList.add(SalToOFGroupAction(action, actionBuilder, actionsListBuilder));
93 else if (action instanceof CopyTtlOut)
94 actionsList.add(SalToOFCopyTTLIOut(actionBuilder, actionsListBuilder));
95 else if (action instanceof CopyTtlIn)
96 actionsList.add(SalToOFCopyTTLIIn(actionBuilder, actionsListBuilder));
97 else if (action instanceof SetMplsTtlAction)
98 actionsList.add(SalToOFSetMplsTtl(action, actionBuilder, actionsListBuilder));
99 else if (action instanceof DecMplsTtl)
100 actionsList.add(SalToOFDecMplsTtl(actionBuilder, actionsListBuilder));
101 else if (action instanceof PushVlanAction)
102 actionsList.add(SalToOFPushVlanAction(action, actionBuilder, actionsListBuilder));
103 else if (action instanceof PopVlanAction)
104 actionsList.add(SalToOFPopVlan(action, actionBuilder, actionsListBuilder));
105 else if (action instanceof PushMplsAction)
106 actionsList.add(SalToOFPushMplsAction(action, actionBuilder, actionsListBuilder));
107 else if (action instanceof PopMplsAction)
108 actionsList.add(SalToOFPopMpls(action, actionBuilder, actionsListBuilder));
109 else if (action instanceof SetQueueAction)
110 actionsList.add(SalToOFSetQueue(action, actionBuilder, actionsListBuilder));
112 else if (action instanceof SetNwTtlAction)
113 actionsList.add(SalToOFSetNwTtl(action, actionBuilder, actionsListBuilder));
114 else if (action instanceof DecNwTtl)
115 actionsList.add(SalToOFDecNwTtl(action, actionBuilder, actionsListBuilder));
116 // else if(action instanceof SetF) //TODO:SAL Class Missing //
117 // actionsList.add(SalToOFSetField(action));
118 else if (action instanceof PushPbbAction)
119 actionsList.add(SalToOFPushPbbAction(action, actionBuilder, actionsListBuilder));
120 else if (action instanceof PopPbbAction)
121 actionsList.add(SalToOFPopPBB(action, actionBuilder, actionsListBuilder));
122 else if (action instanceof ExperimenterAction)
123 actionsList.add(SalToOFExperimenter(action, actionBuilder, actionsListBuilder));
132 private static ActionsList SalToOFDecNwTtl(Action action, ActionBuilder actionBuilder,
133 ActionsListBuilder actionsListBuilder) {
134 actionBuilder.setType(DecNwTtl.class);
136 return emtpyAction(actionBuilder, actionsListBuilder);
139 private static ActionsList SalToOFPushMplsAction(
140 Action action, ActionBuilder actionBuilder,
141 ActionsListBuilder actionsListBuilder) {
143 actionBuilder.setType(PushMpls.class);
145 return SalToOFPushAction(((PushMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
149 private static ActionsList SalToOFPushPbbAction(
150 Action action, ActionBuilder actionBuilder,
151 ActionsListBuilder actionsListBuilder) {
152 actionBuilder.setType(PushPbb.class);
154 return SalToOFPushAction(((PushPbbAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
157 private static ActionsList SalToOFPushVlanAction(
158 Action action, ActionBuilder actionBuilder,
159 ActionsListBuilder actionsListBuilder) {
161 PushVlanAction pushVlanAction = (PushVlanAction) action;
162 VlanId vlanId = new VlanId(pushVlanAction.getVlanId());
163 Integer etherType = vlanId.getValue();
164 actionBuilder.setType(PushVlan.class);
166 return SalToOFPushAction(etherType, actionBuilder, actionsListBuilder);
170 private static ActionsList SalToOFSetNwTtl(
171 Action action, ActionBuilder actionBuilder,
172 ActionsListBuilder actionsListBuilder) {
174 NwTtlActionBuilder nwTtlActionBuilder = new NwTtlActionBuilder();
175 nwTtlActionBuilder.setNwTtl(((SetNwTtlAction) action).getNwTtl());
178 actionBuilder.setType(SetNwTtl.class);
179 actionBuilder.addAugmentation(NwTtlAction.class, nwTtlActionBuilder.build());
180 actionsListBuilder.setAction(actionBuilder.build());
181 return actionsListBuilder.build();
185 private static ActionsList SalToOFSetQueue(
186 Action action, ActionBuilder actionBuilder,
187 ActionsListBuilder actionsListBuilder) {
189 SetQueueAction setQueueAction = (SetQueueAction) action;
191 QueueIdActionBuilder queueIdActionBuilder = new QueueIdActionBuilder();
192 queueIdActionBuilder.setQueueId(Long.getLong(setQueueAction.getQueue()));
193 actionBuilder.setType(SetQueue.class);
194 actionBuilder.addAugmentation(QueueIdAction.class, queueIdActionBuilder.build());
196 actionsListBuilder.setAction(actionBuilder.build());
197 return actionsListBuilder.build();
200 private static ActionsList SalToOFPopMpls(
201 Action action, ActionBuilder actionBuilder,
202 ActionsListBuilder actionsListBuilder) {
204 actionBuilder.setType(PopMpls.class);
206 return SalToOFPushAction(((PopMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
209 private static ActionsList SalToOFPopVlan(
210 Action action, ActionBuilder actionBuilder,
211 ActionsListBuilder actionsListBuilder) {
213 actionBuilder.setType(PushMpls.class);
215 return emtpyAction(actionBuilder, actionsListBuilder);
218 private static ActionsList SalToOFPopPBB(Action action, ActionBuilder actionBuilder,
219 ActionsListBuilder actionsListBuilder) {
220 actionBuilder.setType(PopPbb.class);
221 return emtpyAction(actionBuilder, actionsListBuilder);
224 private static ActionsList SalToOFExperimenter(
225 Action action, ActionBuilder actionBuilder,
226 ActionsListBuilder actionsListBuilder) {
228 ExperimenterActionBuilder experimenterActionBuilder = new ExperimenterActionBuilder();
229 experimenterActionBuilder.setExperimenter(((ExperimenterAction) action).getExperimenter());
230 actionBuilder.setType(Experimenter.class);
233 ExperimenterAction.class,
234 (Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action>) experimenterActionBuilder);
235 actionsListBuilder.setAction(actionBuilder.build());
236 return actionsListBuilder.build();
240 private static ActionsList SalToOFGroupAction(
241 Action action, ActionBuilder actionBuilder,
242 ActionsListBuilder actionsListBuilder) {
244 GroupAction groupAction = (GroupAction) action;
246 GroupIdActionBuilder groupIdBuilder = new GroupIdActionBuilder();
247 groupIdBuilder.setGroupId(Long.getLong(groupAction.getGroup()));
248 actionBuilder.setType(Group.class);
249 actionBuilder.addAugmentation(GroupIdAction.class, groupIdBuilder.build());
250 actionsListBuilder.setAction(actionBuilder.build());
251 return actionsListBuilder.build();
254 private static ActionsList SalToOFPushAction(Integer ethernetType, ActionBuilder actionBuilder,
255 ActionsListBuilder actionsListBuilder) {
257 EthertypeActionBuilder ethertypeActionBuilder = new EthertypeActionBuilder();
258 ethertypeActionBuilder.setEthertype(new EtherType(ethernetType));
261 actionBuilder.addAugmentation(EthertypeAction.class, ethertypeActionBuilder.build());
262 actionsListBuilder.setAction(actionBuilder.build());
263 return actionsListBuilder.build();
266 private static ActionsList SalToOFDecMplsTtl(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
268 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class);
269 return emtpyAction(actionBuilder, actionsListBuilder);
272 private static ActionsList SalToOFSetMplsTtl(
273 Action action, ActionBuilder actionBuilder,
274 ActionsListBuilder actionsListBuilder) {
276 SetMplsTtlAction mplsTtlAction = (SetMplsTtlAction) action;
278 MplsTtlActionBuilder mplsTtlActionBuilder = new MplsTtlActionBuilder();
279 mplsTtlActionBuilder.setMplsTtl(mplsTtlAction.getMplsTtl()/* SAL */);
281 actionBuilder.setType(SetMplsTtl.class);
282 actionBuilder.addAugmentation(MplsTtlAction.class, mplsTtlActionBuilder.build());
283 actionsListBuilder.setAction(actionBuilder.build());
284 return actionsListBuilder.build();
287 private static ActionsList SalToOFCopyTTLIIn(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
289 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class);
290 return emtpyAction(actionBuilder, actionsListBuilder);
293 private static ActionsList SalToOFCopyTTLIOut(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
295 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class);
296 return emtpyAction(actionBuilder, actionsListBuilder);
300 private static ActionsList emtpyAction(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
302 actionsListBuilder.setAction(actionBuilder.build());
303 return actionsListBuilder.build();
306 private static ActionsList salToOFOutputAction(Action action, ActionBuilder actionBuilder,
307 ActionsListBuilder actionsListBuilder) {
310 OutputAction outputAction = ((OutputAction) action);
311 PortActionBuilder portAction = new PortActionBuilder();
312 MaxLengthActionBuilder maxLenActionBuilder = new MaxLengthActionBuilder();
313 maxLenActionBuilder.setMaxLength(outputAction.getMaxLength());
315 actionBuilder.addAugmentation(MaxLengthAction.class, maxLenActionBuilder.build());
317 Uri uri = outputAction.getOutputNodeConnector();
318 if (uri.getValue() == NodeConnectorIDType.ALL)
319 portAction.setPort(new PortNumber((long) OFPort.OFPP_ALL.getValue()));
321 if (uri.getValue() == NodeConnectorIDType.SWSTACK)
322 portAction.setPort(new PortNumber((long) OFPort.OFPP_LOCAL.getValue()));
324 if ((uri.getValue() == NodeConnectorIDType.HWPATH)
325 || (uri.getValue() == NodeConnectorIDType.ONEPK)
326 || (uri.getValue() == NodeConnectorIDType.ONEPK2OPENFLOW)
327 || (uri.getValue() == NodeConnectorIDType.ONEPK2PCEP)
328 || (uri.getValue() == NodeConnectorIDType.OPENFLOW)
329 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2ONEPK)
330 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2PCEP)
331 || (uri.getValue() == NodeConnectorIDType.PCEP)
332 || (uri.getValue() == NodeConnectorIDType.PCEP2ONEPK)
333 || (uri.getValue() == NodeConnectorIDType.PCEP2OPENFLOW)
334 || (uri.getValue() == NodeConnectorIDType.PRODUCTION)) {
335 portAction.setPort(new PortNumber((long) OFPort.OFPP_NORMAL.getValue()));
338 if (uri.getValue() == NodeConnectorIDType.CONTROLLER) {
339 portAction.setPort(new PortNumber((long) OFPort.OFPP_CONTROLLER.getValue()));
343 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
344 actionBuilder.addAugmentation(PortAction.class, portAction.build());
345 actionsListBuilder.setAction(actionBuilder.build());
346 return actionsListBuilder.build();