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
54 * Creates list of actions (OpenFlow v1.0) from ofp_action structures
\r
55 * @param input input ByteBuf
\r
56 * @return ActionsList list of actions
\r
58 public static List<ActionsList> createActionsList(ByteBuf input) {
\r
59 List<ActionsList> actions = new ArrayList<>();
\r
60 while (input.readableBytes() > 0) {
\r
61 ActionsListBuilder actionsBuilder = new ActionsListBuilder();
\r
62 int type = input.readUnsignedShort();
\r
63 input.skipBytes(Short.SIZE / Byte.SIZE);
\r
66 actions.add(createOutputAction(input, actionsBuilder));
\r
69 actions.add(createSetVlanVidAction(input, actionsBuilder));
\r
72 actions.add(createVlanPcpAction(input, actionsBuilder));
\r
75 actions.add(createStripVlanAction(input, actionsBuilder));
\r
78 actions.add(createSetDlSrcAction(input, actionsBuilder));
\r
81 actions.add(createSetDlDstAction(input, actionsBuilder));
\r
84 actions.add(createSetNwSrcAction(input, actionsBuilder));
\r
87 actions.add(createSetNwDstAction(input, actionsBuilder));
\r
90 actions.add(createSetNwTosAction(input, actionsBuilder));
\r
93 actions.add(createSetTpSrcAction(input, actionsBuilder));
\r
96 actions.add(createSetTpDstAction(input, actionsBuilder));
\r
99 actions.add(createEnqueueAction(input, actionsBuilder));
\r
102 actions.add(createExperimenterAction(input, actionsBuilder));
\r
112 * @param in input ByteBuf
\r
114 * @return ActionList
\r
116 public static ActionsList createOutputAction(ByteBuf in, ActionsListBuilder builder) {
\r
117 ActionBuilder actionBuilder = new ActionBuilder();
\r
118 actionBuilder.setType(Output.class);
\r
119 createPortAugmentation(in, actionBuilder);
\r
120 MaxLengthActionBuilder maxLen = new MaxLengthActionBuilder();
\r
121 maxLen.setMaxLength(in.readUnsignedShort());
\r
122 actionBuilder.addAugmentation(MaxLengthAction.class, maxLen.build());
\r
123 builder.setAction(actionBuilder.build());
\r
124 return builder.build();
\r
127 private static ActionsList createSetVlanVidAction(ByteBuf input, ActionsListBuilder builder) {
\r
128 final byte PADDING_IN_SET_VLAN_VID_ACTION = 2;
\r
129 ActionBuilder actionBuilder = new ActionBuilder();
\r
130 actionBuilder.setType(SetVlanVid.class);
\r
131 VlanVidActionBuilder vlanBuilder = new VlanVidActionBuilder();
\r
132 vlanBuilder.setVlanVid(input.readUnsignedShort());
\r
133 input.skipBytes(PADDING_IN_SET_VLAN_VID_ACTION);
\r
134 actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());
\r
135 builder.setAction(actionBuilder.build());
\r
136 return builder.build();
\r
139 private static ActionsList createVlanPcpAction(ByteBuf input, ActionsListBuilder builder) {
\r
140 final byte PADDING_IN_SET_VLAN_PCP_ACTION = 3;
\r
141 ActionBuilder actionBuilder = new ActionBuilder();
\r
142 actionBuilder.setType(SetVlanPcp.class);
\r
143 VlanPcpActionBuilder vlanBuilder = new VlanPcpActionBuilder();
\r
144 vlanBuilder.setVlanPcp(input.readUnsignedByte());
\r
145 input.skipBytes(PADDING_IN_SET_VLAN_PCP_ACTION);
\r
146 actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());
\r
147 builder.setAction(actionBuilder.build());
\r
148 return builder.build();
\r
151 private static ActionsList createStripVlanAction(ByteBuf input, ActionsListBuilder builder) {
\r
152 final byte PADDING_IN_STRIP_VLAN_ACTION = 4;
\r
153 ActionBuilder actionBuilder = new ActionBuilder();
\r
154 actionBuilder.setType(StripVlan.class);
\r
155 input.skipBytes(PADDING_IN_STRIP_VLAN_ACTION);
\r
156 builder.setAction(actionBuilder.build());
\r
157 return builder.build();
\r
160 private static ActionsList createSetDlSrcAction(ByteBuf input, ActionsListBuilder builder) {
\r
161 ActionBuilder actionBuilder = new ActionBuilder();
\r
162 actionBuilder.setType(SetDlSrc.class);
\r
163 actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
\r
164 builder.setAction(actionBuilder.build());
\r
165 return builder.build();
\r
168 private static ActionsList createSetDlDstAction(ByteBuf input, ActionsListBuilder builder) {
\r
169 ActionBuilder actionBuilder = new ActionBuilder();
\r
170 actionBuilder.setType(SetDlDst.class);
\r
171 actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
\r
172 builder.setAction(actionBuilder.build());
\r
173 return builder.build();
\r
176 private static DlAddressAction createDlAugmentationAndPad(ByteBuf input) {
\r
177 final byte MAC_ADDRESS_LENGTH = 6;
\r
178 final byte PADDING_IN_SET_DL_ACTION = 6;
\r
179 DlAddressActionBuilder dlBuilder = new DlAddressActionBuilder();
\r
181 StringBuffer macAddress = new StringBuffer();
\r
182 for(int i = 0; i < MAC_ADDRESS_LENGTH; i++){
\r
183 mac = input.readUnsignedByte();
\r
184 macAddress.append(String.format("%02X", mac));
\r
186 dlBuilder.setDlAddress(new MacAddress(macAddress.toString()));
\r
187 input.skipBytes(PADDING_IN_SET_DL_ACTION);
\r
188 return dlBuilder.build();
\r
191 private static ActionsList createSetNwSrcAction(ByteBuf input, ActionsListBuilder builder) {
\r
192 ActionBuilder actionBuilder = new ActionBuilder();
\r
193 actionBuilder.setType(SetNwSrc.class);
\r
194 actionBuilder.addAugmentation(DlAddressAction.class, createNwAddressAugmentationAndPad(input));
\r
195 builder.setAction(actionBuilder.build());
\r
196 return builder.build();
\r
199 private static ActionsList createSetNwDstAction(ByteBuf input, ActionsListBuilder builder) {
\r
200 ActionBuilder actionBuilder = new ActionBuilder();
\r
201 actionBuilder.setType(SetNwDst.class);
\r
202 actionBuilder.addAugmentation(DlAddressAction.class, createNwAddressAugmentationAndPad(input));
\r
203 builder.setAction(actionBuilder.build());
\r
204 return builder.build();
\r
207 private static Augmentation<Action> createNwAddressAugmentationAndPad(ByteBuf input) {
\r
208 final byte GROUPS_IN_IPV4_ADDRESS = 4;
\r
209 IpAddressActionBuilder ipBuilder = new IpAddressActionBuilder();
\r
210 List<String> groups = new ArrayList<>();
\r
211 for (int i = 0; i < GROUPS_IN_IPV4_ADDRESS; i++) {
\r
212 groups.add(Short.toString(input.readUnsignedByte()));
\r
214 Joiner joiner = Joiner.on(".");
\r
215 ipBuilder.setIpAddress(new Ipv4Address(joiner.join(groups)));
\r
216 return ipBuilder.build();
\r
219 private static ActionsList createSetNwTosAction(ByteBuf input, ActionsListBuilder builder) {
\r
220 final byte PADDING_IN_NW_TOS_ACTION = 3;
\r
221 ActionBuilder actionBuilder = new ActionBuilder();
\r
222 actionBuilder.setType(SetNwTos.class);
\r
223 NwTosActionBuilder tosBuilder = new NwTosActionBuilder();
\r
224 tosBuilder.setNwTos(input.readUnsignedByte());
\r
225 actionBuilder.addAugmentation(NwTosAction.class, tosBuilder.build());
\r
226 input.skipBytes(PADDING_IN_NW_TOS_ACTION);
\r
227 builder.setAction(actionBuilder.build());
\r
228 return builder.build();
\r
231 private static ActionsList createSetTpSrcAction(ByteBuf input, ActionsListBuilder builder) {
\r
232 final byte PADDING_IN_TP_ACTION = 2;
\r
233 ActionBuilder actionBuilder = new ActionBuilder();
\r
234 actionBuilder.setType(SetTpSrc.class);
\r
235 createPortAugmentation(input, actionBuilder);
\r
236 input.skipBytes(PADDING_IN_TP_ACTION);
\r
237 builder.setAction(actionBuilder.build());
\r
238 return builder.build();
\r
241 private static ActionsList createSetTpDstAction(ByteBuf input, ActionsListBuilder builder) {
\r
242 final byte PADDING_IN_TP_ACTION = 2;
\r
243 ActionBuilder actionBuilder = new ActionBuilder();
\r
244 actionBuilder.setType(SetTpDst.class);
\r
245 createPortAugmentation(input, actionBuilder);
\r
246 input.skipBytes(PADDING_IN_TP_ACTION);
\r
247 builder.setAction(actionBuilder.build());
\r
248 return builder.build();
\r
251 private static void createPortAugmentation(ByteBuf input, ActionBuilder actionBuilder) {
\r
252 PortActionBuilder portBuilder = new PortActionBuilder();
\r
253 portBuilder.setPort(new PortNumber((long) input.readUnsignedShort()));
\r
254 actionBuilder.addAugmentation(PortAction.class, portBuilder.build());
\r
257 private static ActionsList createEnqueueAction(ByteBuf input, ActionsListBuilder builder) {
\r
258 final byte PADDING_IN_ENQUEUE_ACTION = 6;
\r
259 ActionBuilder actionBuilder = new ActionBuilder();
\r
260 actionBuilder.setType(Enqueue.class);
\r
261 createPortAugmentation(input, actionBuilder);
\r
262 input.skipBytes(PADDING_IN_ENQUEUE_ACTION);
\r
263 QueueIdActionBuilder queueBuilder = new QueueIdActionBuilder();
\r
264 queueBuilder.setQueueId(input.readUnsignedInt());
\r
265 actionBuilder.addAugmentation(QueueIdAction.class, queueBuilder.build());
\r
266 builder.setAction(actionBuilder.build());
\r
267 return builder.build();
\r
270 private static ActionsList createExperimenterAction(ByteBuf input, ActionsListBuilder builder) {
\r
271 ActionBuilder actionBuilder = new ActionBuilder();
\r
272 actionBuilder.setType(Enqueue.class);
\r
273 ExperimenterActionBuilder expBuilder = new ExperimenterActionBuilder();
\r
274 expBuilder.setExperimenter(input.readUnsignedInt());
\r
275 actionBuilder.addAugmentation(QueueIdAction.class, expBuilder.build());
\r
276 builder.setAction(actionBuilder.build());
\r
277 return builder.build();
\r