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 * @author michal.polkorab
\r
51 public class OF10ActionsDeserializer {
\r
54 * @param input input ByteBuf
\r
55 * @return ActionsList
\r
57 public static List<ActionsList> createActionsList(ByteBuf input) {
\r
58 List<ActionsList> actions = new ArrayList<>();
\r
59 while (input.readableBytes() > 0) {
\r
60 ActionsListBuilder actionsBuilder = new ActionsListBuilder();
\r
61 int type = input.readUnsignedShort();
\r
62 input.skipBytes(Short.SIZE / Byte.SIZE);
\r
65 actions.add(createOutputAction(input, actionsBuilder));
\r
68 actions.add(createSetVlanVidAction(input, actionsBuilder));
\r
71 actions.add(createVlanPcpAction(input, actionsBuilder));
\r
74 actions.add(createStripVlanAction(input, actionsBuilder));
\r
77 actions.add(createSetDlSrcAction(input, actionsBuilder));
\r
80 actions.add(createSetDlDstAction(input, actionsBuilder));
\r
83 actions.add(createSetNwSrcAction(input, actionsBuilder));
\r
86 actions.add(createSetNwDstAction(input, actionsBuilder));
\r
89 actions.add(createSetNwTosAction(input, actionsBuilder));
\r
92 actions.add(createSetTpSrcAction(input, actionsBuilder));
\r
95 actions.add(createSetTpDstAction(input, actionsBuilder));
\r
98 actions.add(createEnqueueAction(input, actionsBuilder));
\r
101 actions.add(createExperimenterAction(input, actionsBuilder));
\r
111 * @param in input ByteBuf
\r
113 * @return ActionList
\r
115 public static ActionsList createOutputAction(ByteBuf in, ActionsListBuilder builder) {
\r
116 ActionBuilder actionBuilder = new ActionBuilder();
\r
117 actionBuilder.setType(Output.class);
\r
118 createPortAugmentation(in, actionBuilder);
\r
119 MaxLengthActionBuilder maxLen = new MaxLengthActionBuilder();
\r
120 maxLen.setMaxLength(in.readUnsignedShort());
\r
121 actionBuilder.addAugmentation(MaxLengthAction.class, maxLen.build());
\r
122 builder.setAction(actionBuilder.build());
\r
123 return builder.build();
\r
126 private static ActionsList createSetVlanVidAction(ByteBuf input, ActionsListBuilder builder) {
\r
127 final byte PADDING_IN_SET_VLAN_VID_ACTION = 2;
\r
128 ActionBuilder actionBuilder = new ActionBuilder();
\r
129 actionBuilder.setType(SetVlanVid.class);
\r
130 VlanVidActionBuilder vlanBuilder = new VlanVidActionBuilder();
\r
131 vlanBuilder.setVlanVid(input.readUnsignedShort());
\r
132 input.skipBytes(PADDING_IN_SET_VLAN_VID_ACTION);
\r
133 actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());
\r
134 builder.setAction(actionBuilder.build());
\r
135 return builder.build();
\r
138 private static ActionsList createVlanPcpAction(ByteBuf input, ActionsListBuilder builder) {
\r
139 final byte PADDING_IN_SET_VLAN_PCP_ACTION = 3;
\r
140 ActionBuilder actionBuilder = new ActionBuilder();
\r
141 actionBuilder.setType(SetVlanPcp.class);
\r
142 VlanPcpActionBuilder vlanBuilder = new VlanPcpActionBuilder();
\r
143 vlanBuilder.setVlanPcp(input.readUnsignedByte());
\r
144 input.skipBytes(PADDING_IN_SET_VLAN_PCP_ACTION);
\r
145 actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());
\r
146 builder.setAction(actionBuilder.build());
\r
147 return builder.build();
\r
150 private static ActionsList createStripVlanAction(ByteBuf input, ActionsListBuilder builder) {
\r
151 final byte PADDING_IN_STRIP_VLAN_ACTION = 4;
\r
152 ActionBuilder actionBuilder = new ActionBuilder();
\r
153 actionBuilder.setType(StripVlan.class);
\r
154 input.skipBytes(PADDING_IN_STRIP_VLAN_ACTION);
\r
155 builder.setAction(actionBuilder.build());
\r
156 return builder.build();
\r
159 private static ActionsList createSetDlSrcAction(ByteBuf input, ActionsListBuilder builder) {
\r
160 ActionBuilder actionBuilder = new ActionBuilder();
\r
161 actionBuilder.setType(SetDlSrc.class);
\r
162 actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
\r
163 builder.setAction(actionBuilder.build());
\r
164 return builder.build();
\r
167 private static ActionsList createSetDlDstAction(ByteBuf input, ActionsListBuilder builder) {
\r
168 ActionBuilder actionBuilder = new ActionBuilder();
\r
169 actionBuilder.setType(SetDlDst.class);
\r
170 actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
\r
171 builder.setAction(actionBuilder.build());
\r
172 return builder.build();
\r
175 private static DlAddressAction createDlAugmentationAndPad(ByteBuf input) {
\r
176 final byte MAC_ADDRESS_LENGTH = 6;
\r
177 final byte PADDING_IN_SET_DL_ACTION = 6;
\r
178 DlAddressActionBuilder dlBuilder = new DlAddressActionBuilder();
\r
180 StringBuffer macAddress = new StringBuffer();
\r
181 for(int i = 0; i < MAC_ADDRESS_LENGTH; i++){
\r
182 mac = input.readUnsignedByte();
\r
183 macAddress.append(String.format("%02X", mac));
\r
185 dlBuilder.setDlAddress(new MacAddress(macAddress.toString()));
\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 final byte GROUPS_IN_IPV4_ADDRESS = 4;
\r
208 IpAddressActionBuilder ipBuilder = new IpAddressActionBuilder();
\r
209 List<String> groups = new ArrayList<>();
\r
210 for (int i = 0; i < GROUPS_IN_IPV4_ADDRESS; i++) {
\r
211 groups.add(Short.toString(input.readUnsignedByte()));
\r
213 Joiner joiner = Joiner.on(".");
\r
214 ipBuilder.setIpAddress(new Ipv4Address(joiner.join(groups)));
\r
215 return ipBuilder.build();
\r
218 private static ActionsList createSetNwTosAction(ByteBuf input, ActionsListBuilder builder) {
\r
219 final byte PADDING_IN_NW_TOS_ACTION = 3;
\r
220 ActionBuilder actionBuilder = new ActionBuilder();
\r
221 actionBuilder.setType(SetNwTos.class);
\r
222 NwTosActionBuilder tosBuilder = new NwTosActionBuilder();
\r
223 tosBuilder.setNwTos(input.readUnsignedByte());
\r
224 actionBuilder.addAugmentation(NwTosAction.class, tosBuilder.build());
\r
225 input.skipBytes(PADDING_IN_NW_TOS_ACTION);
\r
226 builder.setAction(actionBuilder.build());
\r
227 return builder.build();
\r
230 private static ActionsList createSetTpSrcAction(ByteBuf input, ActionsListBuilder builder) {
\r
231 final byte PADDING_IN_TP_ACTION = 2;
\r
232 ActionBuilder actionBuilder = new ActionBuilder();
\r
233 actionBuilder.setType(SetTpSrc.class);
\r
234 createPortAugmentation(input, actionBuilder);
\r
235 input.skipBytes(PADDING_IN_TP_ACTION);
\r
236 builder.setAction(actionBuilder.build());
\r
237 return builder.build();
\r
240 private static ActionsList createSetTpDstAction(ByteBuf input, ActionsListBuilder builder) {
\r
241 final byte PADDING_IN_TP_ACTION = 2;
\r
242 ActionBuilder actionBuilder = new ActionBuilder();
\r
243 actionBuilder.setType(SetTpDst.class);
\r
244 createPortAugmentation(input, actionBuilder);
\r
245 input.skipBytes(PADDING_IN_TP_ACTION);
\r
246 builder.setAction(actionBuilder.build());
\r
247 return builder.build();
\r
250 private static void createPortAugmentation(ByteBuf input, ActionBuilder actionBuilder) {
\r
251 PortActionBuilder portBuilder = new PortActionBuilder();
\r
252 portBuilder.setPort(new PortNumber((long) input.readUnsignedShort()));
\r
253 actionBuilder.addAugmentation(PortAction.class, portBuilder.build());
\r
256 private static ActionsList createEnqueueAction(ByteBuf input, ActionsListBuilder builder) {
\r
257 final byte PADDING_IN_ENQUEUE_ACTION = 6;
\r
258 ActionBuilder actionBuilder = new ActionBuilder();
\r
259 actionBuilder.setType(Enqueue.class);
\r
260 createPortAugmentation(input, actionBuilder);
\r
261 input.skipBytes(PADDING_IN_ENQUEUE_ACTION);
\r
262 QueueIdActionBuilder queueBuilder = new QueueIdActionBuilder();
\r
263 queueBuilder.setQueueId(input.readUnsignedInt());
\r
264 actionBuilder.addAugmentation(QueueIdAction.class, queueBuilder.build());
\r
265 builder.setAction(actionBuilder.build());
\r
266 return builder.build();
\r
269 private static ActionsList createExperimenterAction(ByteBuf input, ActionsListBuilder builder) {
\r
270 ActionBuilder actionBuilder = new ActionBuilder();
\r
271 actionBuilder.setType(Enqueue.class);
\r
272 ExperimenterActionBuilder expBuilder = new ExperimenterActionBuilder();
\r
273 expBuilder.setExperimenter(input.readUnsignedInt());
\r
274 actionBuilder.addAugmentation(QueueIdAction.class, expBuilder.build());
\r
275 builder.setAction(actionBuilder.build());
\r
276 return builder.build();
\r