Javadoc update
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / util / OF10ActionsDeserializer.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.util;\r
3 \r
4 import io.netty.buffer.ByteBuf;\r
5 \r
6 import java.util.ArrayList;\r
7 import java.util.List;\r
8 \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
44 \r
45 import com.google.common.base.Joiner;\r
46 \r
47 /**\r
48  * Deserializes ofp_action (OpenFlow v1.0) structures\r
49  * @author michal.polkorab\r
50  */\r
51 public class OF10ActionsDeserializer {\r
52 \r
53     /**\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
57      */\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
64             switch(type) {\r
65             case 0:  \r
66                 actions.add(createOutputAction(input, actionsBuilder));\r
67                 break;\r
68             case 1: \r
69                 actions.add(createSetVlanVidAction(input, actionsBuilder));\r
70                 break;\r
71             case 2: \r
72                 actions.add(createVlanPcpAction(input, actionsBuilder));\r
73                 break;\r
74             case 3: \r
75                 actions.add(createStripVlanAction(input, actionsBuilder));\r
76                 break;\r
77             case 4:                              \r
78                 actions.add(createSetDlSrcAction(input, actionsBuilder));\r
79                 break;\r
80             case 5: \r
81                 actions.add(createSetDlDstAction(input, actionsBuilder));\r
82                 break;\r
83             case 6:                              \r
84                 actions.add(createSetNwSrcAction(input, actionsBuilder));\r
85                 break;\r
86             case 7: \r
87                 actions.add(createSetNwDstAction(input, actionsBuilder));\r
88                 break;\r
89             case 8: \r
90                 actions.add(createSetNwTosAction(input, actionsBuilder));\r
91                 break;\r
92             case 9: \r
93                 actions.add(createSetTpSrcAction(input, actionsBuilder));\r
94                 break;\r
95             case 10: \r
96                 actions.add(createSetTpDstAction(input, actionsBuilder));\r
97                 break;\r
98             case 11: \r
99                 actions.add(createEnqueueAction(input, actionsBuilder));\r
100                 break;\r
101             case 0xFFFF:\r
102                 actions.add(createExperimenterAction(input, actionsBuilder));\r
103                 break;\r
104             default: \r
105                 break;\r
106             }\r
107         } \r
108         return actions;\r
109     }\r
110 \r
111     /**\r
112      * @param in input ByteBuf\r
113      * @param builder \r
114      * @return ActionList\r
115      */\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
125     }\r
126 \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
137     }\r
138 \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
149     }\r
150 \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
158     }\r
159 \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
166     }\r
167 \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
174     }\r
175     \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
180         short mac = 0;\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
185         }\r
186         dlBuilder.setDlAddress(new MacAddress(macAddress.toString()));\r
187         input.skipBytes(PADDING_IN_SET_DL_ACTION);\r
188         return dlBuilder.build();\r
189     }\r
190 \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
197     }\r
198 \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
205     }\r
206     \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
213         }\r
214         Joiner joiner = Joiner.on(".");\r
215         ipBuilder.setIpAddress(new Ipv4Address(joiner.join(groups)));\r
216         return ipBuilder.build();\r
217     }\r
218 \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
229     }\r
230 \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
239     }\r
240 \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
249     }\r
250     \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
255     }\r
256 \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
268     }\r
269 \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
278     }\r
279     \r
280     \r
281 }\r