2 * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.openflowjava.protocol.impl.util;
11 import io.netty.buffer.ByteBuf;
13 import java.util.ArrayList;
14 import java.util.List;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressActionBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressAction;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressActionBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosAction;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpActionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidActionBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Enqueue;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlDst;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlSrc;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwDst;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwSrc;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTos;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpDst;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpSrc;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanPcp;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanVid;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.StripVlan;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
51 import org.opendaylight.yangtools.yang.binding.Augmentation;
53 import com.google.common.base.Joiner;
56 * Deserializes ofp_action (OpenFlow v1.0) structures
57 * @author michal.polkorab
59 public class OF10ActionsDeserializer {
61 private static final byte PADDING_IN_SET_VLAN_VID_ACTION = 2;
62 private static final byte PADDING_IN_SET_VLAN_PCP_ACTION = 3;
63 private static final byte PADDING_IN_STRIP_VLAN_ACTION = 4;
64 private static final byte PADDING_IN_SET_DL_ACTION = 6;
65 private static final byte PADDING_IN_NW_TOS_ACTION = 3;
66 private static final byte PADDING_IN_TP_ACTION = 2;
67 private static final byte PADDING_IN_ENQUEUE_ACTION = 6;
70 * Creates list of actions (OpenFlow v1.0) from ofp_action structures
71 * @param input input ByteBuf
72 * @return ActionsList list of actions
74 public static List<ActionsList> createActionsList(ByteBuf input) {
75 List<ActionsList> actions = new ArrayList<>();
76 while (input.readableBytes() > 0) {
77 ActionsListBuilder actionsBuilder = new ActionsListBuilder();
78 int type = input.readUnsignedShort();
79 input.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
82 actions.add(createOutputAction(input, actionsBuilder));
85 actions.add(createSetVlanVidAction(input, actionsBuilder));
88 actions.add(createVlanPcpAction(input, actionsBuilder));
91 actions.add(createStripVlanAction(input, actionsBuilder));
94 actions.add(createSetDlSrcAction(input, actionsBuilder));
97 actions.add(createSetDlDstAction(input, actionsBuilder));
100 actions.add(createSetNwSrcAction(input, actionsBuilder));
103 actions.add(createSetNwDstAction(input, actionsBuilder));
106 actions.add(createSetNwTosAction(input, actionsBuilder));
109 actions.add(createSetTpSrcAction(input, actionsBuilder));
112 actions.add(createSetTpDstAction(input, actionsBuilder));
115 actions.add(createEnqueueAction(input, actionsBuilder));
118 actions.add(createExperimenterAction(input, actionsBuilder));
128 * @param in input ByteBuf
132 public static ActionsList createOutputAction(ByteBuf in, ActionsListBuilder builder) {
133 ActionBuilder actionBuilder = new ActionBuilder();
134 actionBuilder.setType(Output.class);
135 createPortAugmentation(in, actionBuilder);
136 MaxLengthActionBuilder maxLen = new MaxLengthActionBuilder();
137 maxLen.setMaxLength(in.readUnsignedShort());
138 actionBuilder.addAugmentation(MaxLengthAction.class, maxLen.build());
139 builder.setAction(actionBuilder.build());
140 return builder.build();
143 private static ActionsList createSetVlanVidAction(ByteBuf input, ActionsListBuilder builder) {
144 ActionBuilder actionBuilder = new ActionBuilder();
145 actionBuilder.setType(SetVlanVid.class);
146 VlanVidActionBuilder vlanBuilder = new VlanVidActionBuilder();
147 vlanBuilder.setVlanVid(input.readUnsignedShort());
148 input.skipBytes(PADDING_IN_SET_VLAN_VID_ACTION);
149 actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());
150 builder.setAction(actionBuilder.build());
151 return builder.build();
154 private static ActionsList createVlanPcpAction(ByteBuf input, ActionsListBuilder builder) {
155 ActionBuilder actionBuilder = new ActionBuilder();
156 actionBuilder.setType(SetVlanPcp.class);
157 VlanPcpActionBuilder vlanBuilder = new VlanPcpActionBuilder();
158 vlanBuilder.setVlanPcp(input.readUnsignedByte());
159 input.skipBytes(PADDING_IN_SET_VLAN_PCP_ACTION);
160 actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());
161 builder.setAction(actionBuilder.build());
162 return builder.build();
165 private static ActionsList createStripVlanAction(ByteBuf input, ActionsListBuilder builder) {
166 ActionBuilder actionBuilder = new ActionBuilder();
167 actionBuilder.setType(StripVlan.class);
168 input.skipBytes(PADDING_IN_STRIP_VLAN_ACTION);
169 builder.setAction(actionBuilder.build());
170 return builder.build();
173 private static ActionsList createSetDlSrcAction(ByteBuf input, ActionsListBuilder builder) {
174 ActionBuilder actionBuilder = new ActionBuilder();
175 actionBuilder.setType(SetDlSrc.class);
176 actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
177 builder.setAction(actionBuilder.build());
178 return builder.build();
181 private static ActionsList createSetDlDstAction(ByteBuf input, ActionsListBuilder builder) {
182 ActionBuilder actionBuilder = new ActionBuilder();
183 actionBuilder.setType(SetDlDst.class);
184 actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
185 builder.setAction(actionBuilder.build());
186 return builder.build();
189 private static DlAddressAction createDlAugmentationAndPad(ByteBuf input) {
190 DlAddressActionBuilder dlBuilder = new DlAddressActionBuilder();
191 byte[] address = new byte[EncodeConstants.MAC_ADDRESS_LENGTH];
192 input.readBytes(address);
193 dlBuilder.setDlAddress(new MacAddress(ByteBufUtils.macAddressToString(address)));
194 input.skipBytes(PADDING_IN_SET_DL_ACTION);
195 return dlBuilder.build();
198 private static ActionsList createSetNwSrcAction(ByteBuf input, ActionsListBuilder builder) {
199 ActionBuilder actionBuilder = new ActionBuilder();
200 actionBuilder.setType(SetNwSrc.class);
201 actionBuilder.addAugmentation(IpAddressAction.class, createNwAddressAugmentationAndPad(input));
202 builder.setAction(actionBuilder.build());
203 return builder.build();
206 private static ActionsList createSetNwDstAction(ByteBuf input, ActionsListBuilder builder) {
207 ActionBuilder actionBuilder = new ActionBuilder();
208 actionBuilder.setType(SetNwDst.class);
209 actionBuilder.addAugmentation(IpAddressAction.class, createNwAddressAugmentationAndPad(input));
210 builder.setAction(actionBuilder.build());
211 return builder.build();
214 private static Augmentation<Action> createNwAddressAugmentationAndPad(ByteBuf input) {
215 IpAddressActionBuilder ipBuilder = new IpAddressActionBuilder();
216 List<String> groups = new ArrayList<>();
217 for (int i = 0; i < EncodeConstants.GROUPS_IN_IPV4_ADDRESS; i++) {
218 groups.add(Short.toString(input.readUnsignedByte()));
220 Joiner joiner = Joiner.on(".");
221 ipBuilder.setIpAddress(new Ipv4Address(joiner.join(groups)));
222 return ipBuilder.build();
225 private static ActionsList createSetNwTosAction(ByteBuf input, ActionsListBuilder builder) {
226 ActionBuilder actionBuilder = new ActionBuilder();
227 actionBuilder.setType(SetNwTos.class);
228 NwTosActionBuilder tosBuilder = new NwTosActionBuilder();
229 tosBuilder.setNwTos(input.readUnsignedByte());
230 actionBuilder.addAugmentation(NwTosAction.class, tosBuilder.build());
231 input.skipBytes(PADDING_IN_NW_TOS_ACTION);
232 builder.setAction(actionBuilder.build());
233 return builder.build();
236 private static ActionsList createSetTpSrcAction(ByteBuf input, ActionsListBuilder builder) {
237 ActionBuilder actionBuilder = new ActionBuilder();
238 actionBuilder.setType(SetTpSrc.class);
239 createPortAugmentation(input, actionBuilder);
240 input.skipBytes(PADDING_IN_TP_ACTION);
241 builder.setAction(actionBuilder.build());
242 return builder.build();
245 private static ActionsList createSetTpDstAction(ByteBuf input, ActionsListBuilder builder) {
246 ActionBuilder actionBuilder = new ActionBuilder();
247 actionBuilder.setType(SetTpDst.class);
248 createPortAugmentation(input, actionBuilder);
249 input.skipBytes(PADDING_IN_TP_ACTION);
250 builder.setAction(actionBuilder.build());
251 return builder.build();
254 private static void createPortAugmentation(ByteBuf input, ActionBuilder actionBuilder) {
255 PortActionBuilder portBuilder = new PortActionBuilder();
256 portBuilder.setPort(new PortNumber((long) input.readUnsignedShort()));
257 actionBuilder.addAugmentation(PortAction.class, portBuilder.build());
260 private static ActionsList createEnqueueAction(ByteBuf input, ActionsListBuilder builder) {
261 ActionBuilder actionBuilder = new ActionBuilder();
262 actionBuilder.setType(Enqueue.class);
263 createPortAugmentation(input, actionBuilder);
264 input.skipBytes(PADDING_IN_ENQUEUE_ACTION);
265 QueueIdActionBuilder queueBuilder = new QueueIdActionBuilder();
266 queueBuilder.setQueueId(input.readUnsignedInt());
267 actionBuilder.addAugmentation(QueueIdAction.class, queueBuilder.build());
268 builder.setAction(actionBuilder.build());
269 return builder.build();
272 private static ActionsList createExperimenterAction(ByteBuf input, ActionsListBuilder builder) {
273 ActionBuilder actionBuilder = new ActionBuilder();
274 actionBuilder.setType(Enqueue.class);
275 ExperimenterActionBuilder expBuilder = new ExperimenterActionBuilder();
276 expBuilder.setExperimenter(input.readUnsignedInt());
277 actionBuilder.addAugmentation(QueueIdAction.class, expBuilder.build());
278 builder.setAction(actionBuilder.build());
279 return builder.build();