1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
\r
2 package org.opendaylight.openflowjava.protocol.impl.util;
\r
4 import io.netty.buffer.ByteBuf;
\r
6 import java.util.ArrayList;
\r
7 import java.util.List;
\r
9 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
\r
10 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
\r
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction;
\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressActionBuilder;
\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressActionBuilder;
\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosAction;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosActionBuilder;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpActionBuilder;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidActionBuilder;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Enqueue;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlDst;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlSrc;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwDst;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwSrc;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTos;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpDst;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpSrc;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanPcp;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanVid;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.StripVlan;
\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action;
\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
\r
43 import org.opendaylight.yangtools.yang.binding.Augmentation;
\r
45 import com.google.common.base.Joiner;
\r
48 * Deserializes ofp_action (OpenFlow v1.0) structures
\r
49 * @author michal.polkorab
\r
51 public class OF10ActionsDeserializer {
\r
53 private static final byte PADDING_IN_SET_VLAN_VID_ACTION = 2;
\r
54 private static final byte PADDING_IN_SET_VLAN_PCP_ACTION = 3;
\r
55 private static final byte PADDING_IN_STRIP_VLAN_ACTION = 4;
\r
56 private static final byte PADDING_IN_SET_DL_ACTION = 6;
\r
57 private static final byte PADDING_IN_NW_TOS_ACTION = 3;
\r
58 private static final byte PADDING_IN_TP_ACTION = 2;
\r
59 private static final byte PADDING_IN_ENQUEUE_ACTION = 6;
\r
62 * Creates list of actions (OpenFlow v1.0) from ofp_action structures
\r
63 * @param input input ByteBuf
\r
64 * @return ActionsList list of actions
\r
66 public static List<ActionsList> createActionsList(ByteBuf input) {
\r
67 List<ActionsList> actions = new ArrayList<>();
\r
68 while (input.readableBytes() > 0) {
\r
69 ActionsListBuilder actionsBuilder = new ActionsListBuilder();
\r
70 int type = input.readUnsignedShort();
\r
71 input.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r
74 actions.add(createOutputAction(input, actionsBuilder));
\r
77 actions.add(createSetVlanVidAction(input, actionsBuilder));
\r
80 actions.add(createVlanPcpAction(input, actionsBuilder));
\r
83 actions.add(createStripVlanAction(input, actionsBuilder));
\r
86 actions.add(createSetDlSrcAction(input, actionsBuilder));
\r
89 actions.add(createSetDlDstAction(input, actionsBuilder));
\r
92 actions.add(createSetNwSrcAction(input, actionsBuilder));
\r
95 actions.add(createSetNwDstAction(input, actionsBuilder));
\r
98 actions.add(createSetNwTosAction(input, actionsBuilder));
\r
101 actions.add(createSetTpSrcAction(input, actionsBuilder));
\r
104 actions.add(createSetTpDstAction(input, actionsBuilder));
\r
107 actions.add(createEnqueueAction(input, actionsBuilder));
\r
110 actions.add(createExperimenterAction(input, actionsBuilder));
\r
120 * @param in input ByteBuf
\r
122 * @return ActionList
\r
124 public static ActionsList createOutputAction(ByteBuf in, ActionsListBuilder builder) {
\r
125 ActionBuilder actionBuilder = new ActionBuilder();
\r
126 actionBuilder.setType(Output.class);
\r
127 createPortAugmentation(in, actionBuilder);
\r
128 MaxLengthActionBuilder maxLen = new MaxLengthActionBuilder();
\r
129 maxLen.setMaxLength(in.readUnsignedShort());
\r
130 actionBuilder.addAugmentation(MaxLengthAction.class, maxLen.build());
\r
131 builder.setAction(actionBuilder.build());
\r
132 return builder.build();
\r
135 private static ActionsList createSetVlanVidAction(ByteBuf input, ActionsListBuilder builder) {
\r
136 ActionBuilder actionBuilder = new ActionBuilder();
\r
137 actionBuilder.setType(SetVlanVid.class);
\r
138 VlanVidActionBuilder vlanBuilder = new VlanVidActionBuilder();
\r
139 vlanBuilder.setVlanVid(input.readUnsignedShort());
\r
140 input.skipBytes(PADDING_IN_SET_VLAN_VID_ACTION);
\r
141 actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());
\r
142 builder.setAction(actionBuilder.build());
\r
143 return builder.build();
\r
146 private static ActionsList createVlanPcpAction(ByteBuf input, ActionsListBuilder builder) {
\r
147 ActionBuilder actionBuilder = new ActionBuilder();
\r
148 actionBuilder.setType(SetVlanPcp.class);
\r
149 VlanPcpActionBuilder vlanBuilder = new VlanPcpActionBuilder();
\r
150 vlanBuilder.setVlanPcp(input.readUnsignedByte());
\r
151 input.skipBytes(PADDING_IN_SET_VLAN_PCP_ACTION);
\r
152 actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());
\r
153 builder.setAction(actionBuilder.build());
\r
154 return builder.build();
\r
157 private static ActionsList createStripVlanAction(ByteBuf input, ActionsListBuilder builder) {
\r
158 ActionBuilder actionBuilder = new ActionBuilder();
\r
159 actionBuilder.setType(StripVlan.class);
\r
160 input.skipBytes(PADDING_IN_STRIP_VLAN_ACTION);
\r
161 builder.setAction(actionBuilder.build());
\r
162 return builder.build();
\r
165 private static ActionsList createSetDlSrcAction(ByteBuf input, ActionsListBuilder builder) {
\r
166 ActionBuilder actionBuilder = new ActionBuilder();
\r
167 actionBuilder.setType(SetDlSrc.class);
\r
168 actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
\r
169 builder.setAction(actionBuilder.build());
\r
170 return builder.build();
\r
173 private static ActionsList createSetDlDstAction(ByteBuf input, ActionsListBuilder builder) {
\r
174 ActionBuilder actionBuilder = new ActionBuilder();
\r
175 actionBuilder.setType(SetDlDst.class);
\r
176 actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
\r
177 builder.setAction(actionBuilder.build());
\r
178 return builder.build();
\r
181 private static DlAddressAction createDlAugmentationAndPad(ByteBuf input) {
\r
182 DlAddressActionBuilder dlBuilder = new DlAddressActionBuilder();
\r
183 byte[] address = new byte[EncodeConstants.MAC_ADDRESS_LENGTH];
\r
184 input.readBytes(address);
\r
185 dlBuilder.setDlAddress(new MacAddress(ByteBufUtils.macAddressToString(address)));
\r
186 input.skipBytes(PADDING_IN_SET_DL_ACTION);
\r
187 return dlBuilder.build();
\r
190 private static ActionsList createSetNwSrcAction(ByteBuf input, ActionsListBuilder builder) {
\r
191 ActionBuilder actionBuilder = new ActionBuilder();
\r
192 actionBuilder.setType(SetNwSrc.class);
\r
193 actionBuilder.addAugmentation(DlAddressAction.class, createNwAddressAugmentationAndPad(input));
\r
194 builder.setAction(actionBuilder.build());
\r
195 return builder.build();
\r
198 private static ActionsList createSetNwDstAction(ByteBuf input, ActionsListBuilder builder) {
\r
199 ActionBuilder actionBuilder = new ActionBuilder();
\r
200 actionBuilder.setType(SetNwDst.class);
\r
201 actionBuilder.addAugmentation(DlAddressAction.class, createNwAddressAugmentationAndPad(input));
\r
202 builder.setAction(actionBuilder.build());
\r
203 return builder.build();
\r
206 private static Augmentation<Action> createNwAddressAugmentationAndPad(ByteBuf input) {
\r
207 IpAddressActionBuilder ipBuilder = new IpAddressActionBuilder();
\r
208 List<String> groups = new ArrayList<>();
\r
209 for (int i = 0; i < EncodeConstants.GROUPS_IN_IPV4_ADDRESS; i++) {
\r
210 groups.add(Short.toString(input.readUnsignedByte()));
\r
212 Joiner joiner = Joiner.on(".");
\r
213 ipBuilder.setIpAddress(new Ipv4Address(joiner.join(groups)));
\r
214 return ipBuilder.build();
\r
217 private static ActionsList createSetNwTosAction(ByteBuf input, ActionsListBuilder builder) {
\r
218 ActionBuilder actionBuilder = new ActionBuilder();
\r
219 actionBuilder.setType(SetNwTos.class);
\r
220 NwTosActionBuilder tosBuilder = new NwTosActionBuilder();
\r
221 tosBuilder.setNwTos(input.readUnsignedByte());
\r
222 actionBuilder.addAugmentation(NwTosAction.class, tosBuilder.build());
\r
223 input.skipBytes(PADDING_IN_NW_TOS_ACTION);
\r
224 builder.setAction(actionBuilder.build());
\r
225 return builder.build();
\r
228 private static ActionsList createSetTpSrcAction(ByteBuf input, ActionsListBuilder builder) {
\r
229 ActionBuilder actionBuilder = new ActionBuilder();
\r
230 actionBuilder.setType(SetTpSrc.class);
\r
231 createPortAugmentation(input, actionBuilder);
\r
232 input.skipBytes(PADDING_IN_TP_ACTION);
\r
233 builder.setAction(actionBuilder.build());
\r
234 return builder.build();
\r
237 private static ActionsList createSetTpDstAction(ByteBuf input, ActionsListBuilder builder) {
\r
238 ActionBuilder actionBuilder = new ActionBuilder();
\r
239 actionBuilder.setType(SetTpDst.class);
\r
240 createPortAugmentation(input, actionBuilder);
\r
241 input.skipBytes(PADDING_IN_TP_ACTION);
\r
242 builder.setAction(actionBuilder.build());
\r
243 return builder.build();
\r
246 private static void createPortAugmentation(ByteBuf input, ActionBuilder actionBuilder) {
\r
247 PortActionBuilder portBuilder = new PortActionBuilder();
\r
248 portBuilder.setPort(new PortNumber((long) input.readUnsignedShort()));
\r
249 actionBuilder.addAugmentation(PortAction.class, portBuilder.build());
\r
252 private static ActionsList createEnqueueAction(ByteBuf input, ActionsListBuilder builder) {
\r
253 ActionBuilder actionBuilder = new ActionBuilder();
\r
254 actionBuilder.setType(Enqueue.class);
\r
255 createPortAugmentation(input, actionBuilder);
\r
256 input.skipBytes(PADDING_IN_ENQUEUE_ACTION);
\r
257 QueueIdActionBuilder queueBuilder = new QueueIdActionBuilder();
\r
258 queueBuilder.setQueueId(input.readUnsignedInt());
\r
259 actionBuilder.addAugmentation(QueueIdAction.class, queueBuilder.build());
\r
260 builder.setAction(actionBuilder.build());
\r
261 return builder.build();
\r
264 private static ActionsList createExperimenterAction(ByteBuf input, ActionsListBuilder builder) {
\r
265 ActionBuilder actionBuilder = new ActionBuilder();
\r
266 actionBuilder.setType(Enqueue.class);
\r
267 ExperimenterActionBuilder expBuilder = new ExperimenterActionBuilder();
\r
268 expBuilder.setExperimenter(input.readUnsignedInt());
\r
269 actionBuilder.addAugmentation(QueueIdAction.class, expBuilder.build());
\r
270 builder.setAction(actionBuilder.build());
\r
271 return builder.build();
\r