Added support for OF 1.0
[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  * @author michal.polkorab\r
49  *\r
50  */\r
51 public class OF10ActionsDeserializer {\r
52 \r
53     /**\r
54      * @param input input ByteBuf\r
55      * @return ActionsList\r
56      */\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
63             switch(type) {\r
64             case 0:  \r
65                 actions.add(createOutputAction(input, actionsBuilder));\r
66                 break;\r
67             case 1: \r
68                 actions.add(createSetVlanVidAction(input, actionsBuilder));\r
69                 break;\r
70             case 2: \r
71                 actions.add(createVlanPcpAction(input, actionsBuilder));\r
72                 break;\r
73             case 3: \r
74                 actions.add(createStripVlanAction(input, actionsBuilder));\r
75                 break;\r
76             case 4:                              \r
77                 actions.add(createSetDlSrcAction(input, actionsBuilder));\r
78                 break;\r
79             case 5: \r
80                 actions.add(createSetDlDstAction(input, actionsBuilder));\r
81                 break;\r
82             case 6:                              \r
83                 actions.add(createSetNwSrcAction(input, actionsBuilder));\r
84                 break;\r
85             case 7: \r
86                 actions.add(createSetNwDstAction(input, actionsBuilder));\r
87                 break;\r
88             case 8: \r
89                 actions.add(createSetNwTosAction(input, actionsBuilder));\r
90                 break;\r
91             case 9: \r
92                 actions.add(createSetTpSrcAction(input, actionsBuilder));\r
93                 break;\r
94             case 10: \r
95                 actions.add(createSetTpDstAction(input, actionsBuilder));\r
96                 break;\r
97             case 11: \r
98                 actions.add(createEnqueueAction(input, actionsBuilder));\r
99                 break;\r
100             case 0xFFFF:\r
101                 actions.add(createExperimenterAction(input, actionsBuilder));\r
102                 break;\r
103             default: \r
104                 break;\r
105             }\r
106         } \r
107         return actions;\r
108     }\r
109 \r
110     /**\r
111      * @param in input ByteBuf\r
112      * @param builder \r
113      * @return ActionList\r
114      */\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
124     }\r
125 \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
136     }\r
137 \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
148     }\r
149 \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
157     }\r
158 \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
165     }\r
166 \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
173     }\r
174     \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
179         short mac = 0;\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
184         }\r
185         dlBuilder.setDlAddress(new MacAddress(macAddress.toString()));\r
186         input.skipBytes(PADDING_IN_SET_DL_ACTION);\r
187         return dlBuilder.build();\r
188     }\r
189 \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
196     }\r
197 \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
204     }\r
205     \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
212         }\r
213         Joiner joiner = Joiner.on(".");\r
214         ipBuilder.setIpAddress(new Ipv4Address(joiner.join(groups)));\r
215         return ipBuilder.build();\r
216     }\r
217 \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
228     }\r
229 \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
238     }\r
239 \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
248     }\r
249     \r
250     private static void createPortAugmentation(ByteBuf input, ActionBuilder actionBuilder) {\r
251         PortActionBuilder portBuilder = new PortActionBuilder();\r
252         portBuilder.setPort(new PortNumber(new Long(input.readUnsignedShort())));\r
253         actionBuilder.addAugmentation(PortAction.class, portBuilder.build());\r
254     }\r
255 \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
267     }\r
268 \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
277     }\r
278     \r
279     \r
280 }\r