Copyright update
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / util / OF10ActionsDeserializer.java
1 /*
2  * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.openflowjava.protocol.impl.util;
10
11 import io.netty.buffer.ByteBuf;
12
13 import java.util.ArrayList;
14 import java.util.List;
15
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressActionBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressAction;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressActionBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosAction;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpActionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidActionBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Enqueue;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlDst;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlSrc;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwDst;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwSrc;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTos;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpDst;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpSrc;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanPcp;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanVid;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.StripVlan;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
51 import org.opendaylight.yangtools.yang.binding.Augmentation;
52
53 import com.google.common.base.Joiner;
54
55 /**
56  * Deserializes ofp_action (OpenFlow v1.0) structures
57  * @author michal.polkorab
58  */
59 public class OF10ActionsDeserializer {
60     
61     private static final byte PADDING_IN_SET_VLAN_VID_ACTION = 2;
62     private static final byte PADDING_IN_SET_VLAN_PCP_ACTION = 3;
63     private static final byte PADDING_IN_STRIP_VLAN_ACTION = 4;
64     private static final byte PADDING_IN_SET_DL_ACTION = 6;
65     private static final byte PADDING_IN_NW_TOS_ACTION = 3;
66     private static final byte PADDING_IN_TP_ACTION = 2;
67     private static final byte PADDING_IN_ENQUEUE_ACTION = 6;
68
69     /**
70      * Creates list of actions (OpenFlow v1.0) from ofp_action structures
71      * @param input input ByteBuf
72      * @return ActionsList list of actions
73      */
74     public static List<ActionsList> createActionsList(ByteBuf input) {
75         List<ActionsList> actions = new ArrayList<>();
76         while (input.readableBytes() > 0) {
77             ActionsListBuilder actionsBuilder = new ActionsListBuilder();
78             int type = input.readUnsignedShort();
79             input.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
80             switch(type) {
81             case 0:  
82                 actions.add(createOutputAction(input, actionsBuilder));
83                 break;
84             case 1: 
85                 actions.add(createSetVlanVidAction(input, actionsBuilder));
86                 break;
87             case 2: 
88                 actions.add(createVlanPcpAction(input, actionsBuilder));
89                 break;
90             case 3: 
91                 actions.add(createStripVlanAction(input, actionsBuilder));
92                 break;
93             case 4:                              
94                 actions.add(createSetDlSrcAction(input, actionsBuilder));
95                 break;
96             case 5: 
97                 actions.add(createSetDlDstAction(input, actionsBuilder));
98                 break;
99             case 6:                              
100                 actions.add(createSetNwSrcAction(input, actionsBuilder));
101                 break;
102             case 7: 
103                 actions.add(createSetNwDstAction(input, actionsBuilder));
104                 break;
105             case 8: 
106                 actions.add(createSetNwTosAction(input, actionsBuilder));
107                 break;
108             case 9: 
109                 actions.add(createSetTpSrcAction(input, actionsBuilder));
110                 break;
111             case 10: 
112                 actions.add(createSetTpDstAction(input, actionsBuilder));
113                 break;
114             case 11: 
115                 actions.add(createEnqueueAction(input, actionsBuilder));
116                 break;
117             case 0xFFFF:
118                 actions.add(createExperimenterAction(input, actionsBuilder));
119                 break;
120             default: 
121                 break;
122             }
123         } 
124         return actions;
125     }
126
127     /**
128      * @param in input ByteBuf
129      * @param builder 
130      * @return ActionList
131      */
132     public static ActionsList createOutputAction(ByteBuf in, ActionsListBuilder builder) {
133         ActionBuilder actionBuilder = new ActionBuilder();
134         actionBuilder.setType(Output.class);
135         createPortAugmentation(in, actionBuilder);
136         MaxLengthActionBuilder maxLen = new MaxLengthActionBuilder();
137         maxLen.setMaxLength(in.readUnsignedShort());
138         actionBuilder.addAugmentation(MaxLengthAction.class, maxLen.build());
139         builder.setAction(actionBuilder.build());
140         return builder.build();
141     }
142
143     private static ActionsList createSetVlanVidAction(ByteBuf input, ActionsListBuilder builder) {
144         ActionBuilder actionBuilder = new ActionBuilder();
145         actionBuilder.setType(SetVlanVid.class);
146         VlanVidActionBuilder vlanBuilder = new VlanVidActionBuilder();
147         vlanBuilder.setVlanVid(input.readUnsignedShort());
148         input.skipBytes(PADDING_IN_SET_VLAN_VID_ACTION);
149         actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());
150         builder.setAction(actionBuilder.build());
151         return builder.build();
152     }
153
154     private static ActionsList createVlanPcpAction(ByteBuf input, ActionsListBuilder builder) {
155         ActionBuilder actionBuilder = new ActionBuilder();
156         actionBuilder.setType(SetVlanPcp.class);
157         VlanPcpActionBuilder vlanBuilder = new VlanPcpActionBuilder();
158         vlanBuilder.setVlanPcp(input.readUnsignedByte());
159         input.skipBytes(PADDING_IN_SET_VLAN_PCP_ACTION);
160         actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());
161         builder.setAction(actionBuilder.build());
162         return builder.build();
163     }
164
165     private static ActionsList createStripVlanAction(ByteBuf input, ActionsListBuilder builder) {
166         ActionBuilder actionBuilder = new ActionBuilder();
167         actionBuilder.setType(StripVlan.class);
168         input.skipBytes(PADDING_IN_STRIP_VLAN_ACTION);
169         builder.setAction(actionBuilder.build());
170         return builder.build();
171     }
172
173     private static ActionsList createSetDlSrcAction(ByteBuf input, ActionsListBuilder builder) {
174         ActionBuilder actionBuilder = new ActionBuilder();
175         actionBuilder.setType(SetDlSrc.class);
176         actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
177         builder.setAction(actionBuilder.build());
178         return builder.build();
179     }
180
181     private static ActionsList createSetDlDstAction(ByteBuf input, ActionsListBuilder builder) {
182         ActionBuilder actionBuilder = new ActionBuilder();
183         actionBuilder.setType(SetDlDst.class);
184         actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
185         builder.setAction(actionBuilder.build());
186         return builder.build();
187     }
188     
189     private static DlAddressAction createDlAugmentationAndPad(ByteBuf input) {
190         DlAddressActionBuilder dlBuilder = new DlAddressActionBuilder();
191         byte[] address = new byte[EncodeConstants.MAC_ADDRESS_LENGTH];
192         input.readBytes(address);
193         dlBuilder.setDlAddress(new MacAddress(ByteBufUtils.macAddressToString(address)));
194         input.skipBytes(PADDING_IN_SET_DL_ACTION);
195         return dlBuilder.build();
196     }
197
198     private static ActionsList createSetNwSrcAction(ByteBuf input, ActionsListBuilder builder) {
199         ActionBuilder actionBuilder = new ActionBuilder();
200         actionBuilder.setType(SetNwSrc.class);
201         actionBuilder.addAugmentation(IpAddressAction.class, createNwAddressAugmentationAndPad(input));
202         builder.setAction(actionBuilder.build());
203         return builder.build();
204     }
205
206     private static ActionsList createSetNwDstAction(ByteBuf input, ActionsListBuilder builder) {
207         ActionBuilder actionBuilder = new ActionBuilder();
208         actionBuilder.setType(SetNwDst.class);
209         actionBuilder.addAugmentation(IpAddressAction.class, createNwAddressAugmentationAndPad(input));
210         builder.setAction(actionBuilder.build());
211         return builder.build();
212     }
213     
214     private static Augmentation<Action> createNwAddressAugmentationAndPad(ByteBuf input) {
215         IpAddressActionBuilder ipBuilder = new IpAddressActionBuilder();
216         List<String> groups = new ArrayList<>();
217         for (int i = 0; i < EncodeConstants.GROUPS_IN_IPV4_ADDRESS; i++) {
218             groups.add(Short.toString(input.readUnsignedByte()));
219         }
220         Joiner joiner = Joiner.on(".");
221         ipBuilder.setIpAddress(new Ipv4Address(joiner.join(groups)));
222         return ipBuilder.build();
223     }
224
225     private static ActionsList createSetNwTosAction(ByteBuf input, ActionsListBuilder builder) {
226         ActionBuilder actionBuilder = new ActionBuilder();
227         actionBuilder.setType(SetNwTos.class);
228         NwTosActionBuilder tosBuilder = new NwTosActionBuilder();
229         tosBuilder.setNwTos(input.readUnsignedByte());
230         actionBuilder.addAugmentation(NwTosAction.class, tosBuilder.build());
231         input.skipBytes(PADDING_IN_NW_TOS_ACTION);
232         builder.setAction(actionBuilder.build());
233         return builder.build();
234     }
235
236     private static ActionsList createSetTpSrcAction(ByteBuf input, ActionsListBuilder builder) {
237         ActionBuilder actionBuilder = new ActionBuilder();
238         actionBuilder.setType(SetTpSrc.class);
239         createPortAugmentation(input, actionBuilder);
240         input.skipBytes(PADDING_IN_TP_ACTION);
241         builder.setAction(actionBuilder.build());
242         return builder.build();
243     }
244
245     private static ActionsList createSetTpDstAction(ByteBuf input, ActionsListBuilder builder) {
246         ActionBuilder actionBuilder = new ActionBuilder();
247         actionBuilder.setType(SetTpDst.class);
248         createPortAugmentation(input, actionBuilder);
249         input.skipBytes(PADDING_IN_TP_ACTION);
250         builder.setAction(actionBuilder.build());
251         return builder.build();
252     }
253     
254     private static void createPortAugmentation(ByteBuf input, ActionBuilder actionBuilder) {
255         PortActionBuilder portBuilder = new PortActionBuilder();
256         portBuilder.setPort(new PortNumber((long) input.readUnsignedShort()));
257         actionBuilder.addAugmentation(PortAction.class, portBuilder.build());
258     }
259
260     private static ActionsList createEnqueueAction(ByteBuf input, ActionsListBuilder builder) {
261         ActionBuilder actionBuilder = new ActionBuilder();
262         actionBuilder.setType(Enqueue.class);
263         createPortAugmentation(input, actionBuilder);
264         input.skipBytes(PADDING_IN_ENQUEUE_ACTION);
265         QueueIdActionBuilder queueBuilder = new QueueIdActionBuilder();
266         queueBuilder.setQueueId(input.readUnsignedInt());
267         actionBuilder.addAugmentation(QueueIdAction.class, queueBuilder.build());
268         builder.setAction(actionBuilder.build());
269         return builder.build();
270     }
271
272     private static ActionsList createExperimenterAction(ByteBuf input, ActionsListBuilder builder) {
273         ActionBuilder actionBuilder = new ActionBuilder();
274         actionBuilder.setType(Enqueue.class);
275         ExperimenterActionBuilder expBuilder = new ExperimenterActionBuilder();
276         expBuilder.setExperimenter(input.readUnsignedInt());
277         actionBuilder.addAugmentation(QueueIdAction.class, expBuilder.build());
278         builder.setAction(actionBuilder.build());
279         return builder.build();
280     }
281     
282     
283 }