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.SetField;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlAction;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlAction;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueAction;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdActionBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlAction;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsAction;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsActionBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
60 import org.opendaylight.yangtools.yang.binding.Augmentation;
61 import org.openflow.protocol.OFPort;
62 import org.slf4j.Logger;
63 import org.slf4j.LoggerFactory;
72 * @author usha@ericsson Action List:This class takes data from SAL layer and
73 * converts into OF Data
76 public final class ActionConvertor {
77 private static final Logger logger = LoggerFactory.getLogger(ActionConvertor.class);
78 private static final String PREFIX_SEPARATOR = "/";
79 private ActionConvertor() {
83 public static List<ActionsList> getActionList(
84 List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions)
87 ActionBuilder actionBuilder = new ActionBuilder();
88 ActionsListBuilder actionsListBuilder = new ActionsListBuilder();
89 List<ActionsList> actionsList = new ArrayList<ActionsList>();
91 for (int actionItem = 0; actionItem < actions.size(); actionItem++)
93 Action action = actions.get(
94 actionItem).getAction();
96 if (action instanceof OutputAction)
97 actionsList.add(salToOFOutputAction(action,actionBuilder,actionsListBuilder));
98 else if (action instanceof GroupAction)
99 actionsList.add(SalToOFGroupAction(action, actionBuilder, actionsListBuilder));
100 else if (action instanceof CopyTtlOut)
101 actionsList.add(SalToOFCopyTTLIOut(actionBuilder, actionsListBuilder));
102 else if (action instanceof CopyTtlIn)
103 actionsList.add(SalToOFCopyTTLIIn(actionBuilder, actionsListBuilder));
104 else if (action instanceof SetMplsTtlAction)
105 actionsList.add(SalToOFSetMplsTtl(action, actionBuilder, actionsListBuilder));
106 else if (action instanceof DecMplsTtl)
107 actionsList.add(SalToOFDecMplsTtl(actionBuilder, actionsListBuilder));
108 else if (action instanceof PushVlanAction)
109 actionsList.add(SalToOFPushVlanAction(action, actionBuilder, actionsListBuilder));
110 else if (action instanceof PopVlanAction)
111 actionsList.add(SalToOFPopVlan(action, actionBuilder, actionsListBuilder));
112 else if (action instanceof PushMplsAction)
113 actionsList.add(SalToOFPushMplsAction(action, actionBuilder, actionsListBuilder));
114 else if (action instanceof PopMplsAction)
115 actionsList.add(SalToOFPopMpls(action, actionBuilder, actionsListBuilder));
116 else if (action instanceof SetQueueAction)
117 actionsList.add(SalToOFSetQueue(action, actionBuilder, actionsListBuilder));
119 else if (action instanceof SetNwTtlAction)
120 actionsList.add(SalToOFSetNwTtl(action, actionBuilder, actionsListBuilder));
121 else if (action instanceof DecNwTtl)
122 actionsList.add(SalToOFDecNwTtl(action, actionBuilder, actionsListBuilder));
123 else if (action instanceof SetField)
124 actionsList.add(SalToOFSetField(action, actionBuilder, actionsListBuilder));
126 else if (action instanceof PushPbbAction)
127 actionsList.add(SalToOFPushPbbAction(action, actionBuilder, actionsListBuilder));
128 else if (action instanceof PopPbbAction)
129 actionsList.add(SalToOFPopPBB(action, actionBuilder, actionsListBuilder));
130 else if (action instanceof ExperimenterAction)
131 actionsList.add(SalToOFExperimenter(action, actionBuilder, actionsListBuilder));
140 private static ActionsList SalToOFSetField(Action action, ActionBuilder actionBuilder,
141 ActionsListBuilder actionsListBuilder) {
143 org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match = ((SetField) action)
146 List<MatchEntries> matchEntries = FlowConvertor.toMatch(match);
148 OxmFieldsActionBuilder oxmFieldsActionBuilder = new OxmFieldsActionBuilder();
150 oxmFieldsActionBuilder.setMatchEntries(matchEntries);
153 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField.class);
155 actionBuilder.addAugmentation(OxmFieldsAction.class, oxmFieldsActionBuilder.build());
156 actionsListBuilder.setAction(actionBuilder.build());
157 return actionsListBuilder.build();
161 private static ActionsList SalToOFDecNwTtl(Action action, ActionBuilder actionBuilder,
162 ActionsListBuilder actionsListBuilder) {
163 actionBuilder.setType(DecNwTtl.class);
165 return emtpyAction(actionBuilder, actionsListBuilder);
168 private static ActionsList SalToOFPushMplsAction(
169 Action action, ActionBuilder actionBuilder,
170 ActionsListBuilder actionsListBuilder) {
172 actionBuilder.setType(PushMpls.class);
174 return SalToOFPushAction(((PushMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
178 private static ActionsList SalToOFPushPbbAction(
179 Action action, ActionBuilder actionBuilder,
180 ActionsListBuilder actionsListBuilder) {
181 actionBuilder.setType(PushPbb.class);
183 return SalToOFPushAction(((PushPbbAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
186 private static ActionsList SalToOFPushVlanAction(
187 Action action, ActionBuilder actionBuilder,
188 ActionsListBuilder actionsListBuilder) {
190 PushVlanAction pushVlanAction = (PushVlanAction) action;
191 VlanId vlanId = new VlanId(pushVlanAction.getVlanId());
192 Integer etherType = vlanId.getValue();
193 actionBuilder.setType(PushVlan.class);
195 return SalToOFPushAction(etherType, actionBuilder, actionsListBuilder);
199 private static ActionsList SalToOFSetNwTtl(
200 Action action, ActionBuilder actionBuilder,
201 ActionsListBuilder actionsListBuilder) {
203 NwTtlActionBuilder nwTtlActionBuilder = new NwTtlActionBuilder();
204 nwTtlActionBuilder.setNwTtl(((SetNwTtlAction) action).getNwTtl());
207 actionBuilder.setType(SetNwTtl.class);
208 actionBuilder.addAugmentation(NwTtlAction.class, nwTtlActionBuilder.build());
209 actionsListBuilder.setAction(actionBuilder.build());
210 return actionsListBuilder.build();
214 private static ActionsList SalToOFSetQueue(
215 Action action, ActionBuilder actionBuilder,
216 ActionsListBuilder actionsListBuilder) {
218 SetQueueAction setQueueAction = (SetQueueAction) action;
220 QueueIdActionBuilder queueIdActionBuilder = new QueueIdActionBuilder();
221 queueIdActionBuilder.setQueueId(Long.getLong(setQueueAction.getQueue()));
222 actionBuilder.setType(SetQueue.class);
223 actionBuilder.addAugmentation(QueueIdAction.class, queueIdActionBuilder.build());
225 actionsListBuilder.setAction(actionBuilder.build());
226 return actionsListBuilder.build();
229 private static ActionsList SalToOFPopMpls(
230 Action action, ActionBuilder actionBuilder,
231 ActionsListBuilder actionsListBuilder) {
233 actionBuilder.setType(PopMpls.class);
235 return SalToOFPushAction(((PopMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
238 private static ActionsList SalToOFPopVlan(
239 Action action, ActionBuilder actionBuilder,
240 ActionsListBuilder actionsListBuilder) {
242 actionBuilder.setType(PushMpls.class);
244 return emtpyAction(actionBuilder, actionsListBuilder);
247 private static ActionsList SalToOFPopPBB(Action action, ActionBuilder actionBuilder,
248 ActionsListBuilder actionsListBuilder) {
249 actionBuilder.setType(PopPbb.class);
250 return emtpyAction(actionBuilder, actionsListBuilder);
253 private static ActionsList SalToOFExperimenter(
254 Action action, ActionBuilder actionBuilder,
255 ActionsListBuilder actionsListBuilder) {
257 ExperimenterActionBuilder experimenterActionBuilder = new ExperimenterActionBuilder();
258 experimenterActionBuilder.setExperimenter(((ExperimenterAction) action).getExperimenter());
259 actionBuilder.setType(Experimenter.class);
262 ExperimenterAction.class,
263 (Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action>) experimenterActionBuilder);
264 actionsListBuilder.setAction(actionBuilder.build());
265 return actionsListBuilder.build();
269 private static ActionsList SalToOFGroupAction(
270 Action action, ActionBuilder actionBuilder,
271 ActionsListBuilder actionsListBuilder) {
273 GroupAction groupAction = (GroupAction) action;
275 GroupIdActionBuilder groupIdBuilder = new GroupIdActionBuilder();
276 groupIdBuilder.setGroupId(Long.getLong(groupAction.getGroup()));
277 actionBuilder.setType(Group.class);
278 actionBuilder.addAugmentation(GroupIdAction.class, groupIdBuilder.build());
279 actionsListBuilder.setAction(actionBuilder.build());
280 return actionsListBuilder.build();
283 private static ActionsList SalToOFPushAction(Integer ethernetType, ActionBuilder actionBuilder,
284 ActionsListBuilder actionsListBuilder) {
286 EthertypeActionBuilder ethertypeActionBuilder = new EthertypeActionBuilder();
287 ethertypeActionBuilder.setEthertype(new EtherType(ethernetType));
290 actionBuilder.addAugmentation(EthertypeAction.class, ethertypeActionBuilder.build());
291 actionsListBuilder.setAction(actionBuilder.build());
292 return actionsListBuilder.build();
295 private static ActionsList SalToOFDecMplsTtl(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
297 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class);
298 return emtpyAction(actionBuilder, actionsListBuilder);
301 private static ActionsList SalToOFSetMplsTtl(
302 Action action, ActionBuilder actionBuilder,
303 ActionsListBuilder actionsListBuilder) {
305 SetMplsTtlAction mplsTtlAction = (SetMplsTtlAction) action;
307 MplsTtlActionBuilder mplsTtlActionBuilder = new MplsTtlActionBuilder();
308 mplsTtlActionBuilder.setMplsTtl(mplsTtlAction.getMplsTtl()/* SAL */);
310 actionBuilder.setType(SetMplsTtl.class);
311 actionBuilder.addAugmentation(MplsTtlAction.class, mplsTtlActionBuilder.build());
312 actionsListBuilder.setAction(actionBuilder.build());
313 return actionsListBuilder.build();
316 private static ActionsList SalToOFCopyTTLIIn(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
318 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class);
319 return emtpyAction(actionBuilder, actionsListBuilder);
322 private static ActionsList SalToOFCopyTTLIOut(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
324 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class);
325 return emtpyAction(actionBuilder, actionsListBuilder);
329 private static ActionsList emtpyAction(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
331 actionsListBuilder.setAction(actionBuilder.build());
332 return actionsListBuilder.build();
335 private static ActionsList salToOFOutputAction(Action action, ActionBuilder actionBuilder,
336 ActionsListBuilder actionsListBuilder) {
339 OutputAction outputAction = ((OutputAction) action);
340 PortActionBuilder portAction = new PortActionBuilder();
341 MaxLengthActionBuilder maxLenActionBuilder = new MaxLengthActionBuilder();
342 maxLenActionBuilder.setMaxLength(outputAction.getMaxLength());
344 actionBuilder.addAugmentation(MaxLengthAction.class, maxLenActionBuilder.build());
346 Uri uri = outputAction.getOutputNodeConnector();
347 if (uri.getValue() == NodeConnectorIDType.ALL)
348 portAction.setPort(new PortNumber((long) OFPort.OFPP_ALL.getValue()));
350 if (uri.getValue() == NodeConnectorIDType.SWSTACK)
351 portAction.setPort(new PortNumber((long) OFPort.OFPP_LOCAL.getValue()));
353 if ((uri.getValue() == NodeConnectorIDType.HWPATH)
354 || (uri.getValue() == NodeConnectorIDType.ONEPK)
355 || (uri.getValue() == NodeConnectorIDType.ONEPK2OPENFLOW)
356 || (uri.getValue() == NodeConnectorIDType.ONEPK2PCEP)
357 || (uri.getValue() == NodeConnectorIDType.OPENFLOW)
358 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2ONEPK)
359 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2PCEP)
360 || (uri.getValue() == NodeConnectorIDType.PCEP)
361 || (uri.getValue() == NodeConnectorIDType.PCEP2ONEPK)
362 || (uri.getValue() == NodeConnectorIDType.PCEP2OPENFLOW)
363 || (uri.getValue() == NodeConnectorIDType.PRODUCTION)) {
364 portAction.setPort(new PortNumber((long) OFPort.OFPP_NORMAL.getValue()));
367 if (uri.getValue() == NodeConnectorIDType.CONTROLLER) {
368 // TODO:Check with michael
369 // portAction.setPort(new PortNumber((long)
370 // OFPort.OFPP_CONTROLLER.getValue()));
371 // FIXME: these constants are different among protocols, we need to know target
372 // version and we need to create enums for all (2) protocols (prefferably
373 // yang generated) and we definitely need to remove the old stuff
377 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
378 actionBuilder.addAugmentation(PortAction.class, portAction.build());
379 actionsListBuilder.setAction(actionBuilder.build());
380 return actionsListBuilder.build();