Fixed MAC address length to 6 bytes for ArpSha, ArpTha, Ipv6NdSll, Ipv6NdTll match...
[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     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
60 \r
61     /**\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
65      */\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
72             switch(type) {\r
73             case 0:  \r
74                 actions.add(createOutputAction(input, actionsBuilder));\r
75                 break;\r
76             case 1: \r
77                 actions.add(createSetVlanVidAction(input, actionsBuilder));\r
78                 break;\r
79             case 2: \r
80                 actions.add(createVlanPcpAction(input, actionsBuilder));\r
81                 break;\r
82             case 3: \r
83                 actions.add(createStripVlanAction(input, actionsBuilder));\r
84                 break;\r
85             case 4:                              \r
86                 actions.add(createSetDlSrcAction(input, actionsBuilder));\r
87                 break;\r
88             case 5: \r
89                 actions.add(createSetDlDstAction(input, actionsBuilder));\r
90                 break;\r
91             case 6:                              \r
92                 actions.add(createSetNwSrcAction(input, actionsBuilder));\r
93                 break;\r
94             case 7: \r
95                 actions.add(createSetNwDstAction(input, actionsBuilder));\r
96                 break;\r
97             case 8: \r
98                 actions.add(createSetNwTosAction(input, actionsBuilder));\r
99                 break;\r
100             case 9: \r
101                 actions.add(createSetTpSrcAction(input, actionsBuilder));\r
102                 break;\r
103             case 10: \r
104                 actions.add(createSetTpDstAction(input, actionsBuilder));\r
105                 break;\r
106             case 11: \r
107                 actions.add(createEnqueueAction(input, actionsBuilder));\r
108                 break;\r
109             case 0xFFFF:\r
110                 actions.add(createExperimenterAction(input, actionsBuilder));\r
111                 break;\r
112             default: \r
113                 break;\r
114             }\r
115         } \r
116         return actions;\r
117     }\r
118 \r
119     /**\r
120      * @param in input ByteBuf\r
121      * @param builder \r
122      * @return ActionList\r
123      */\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
133     }\r
134 \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
144     }\r
145 \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
155     }\r
156 \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
163     }\r
164 \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
171     }\r
172 \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
179     }\r
180     \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
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         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
211         }\r
212         Joiner joiner = Joiner.on(".");\r
213         ipBuilder.setIpAddress(new Ipv4Address(joiner.join(groups)));\r
214         return ipBuilder.build();\r
215     }\r
216 \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
226     }\r
227 \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
235     }\r
236 \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
244     }\r
245     \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
250     }\r
251 \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
262     }\r
263 \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
272     }\r
273     \r
274     \r
275 }\r