Bump upstreams
[openflowplugin.git] / extension / openflowjava-extension-nicira / src / test / java / org / opendaylight / openflowjava / nx / codec / action / ConntrackCodecTest.java
1 /*
2  * Copyright (c) 2016, 2017 Cisco Systems, Inc. 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 package org.opendaylight.openflowjava.nx.codec.action;
9
10 import io.netty.buffer.ByteBuf;
11 import io.netty.buffer.ByteBufAllocator;
12 import java.util.ArrayList;
13 import java.util.List;
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.opendaylight.openflowjava.nx.api.NiciraConstants;
18 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.aug.nx.action.ActionConntrack;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.aug.nx.action.ActionConntrackBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.NxActionConntrackBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action.conntrack.CtActions;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action.conntrack.CtActionsBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionCtMarkCase;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionCtMarkCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCase;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.ct.mark._case.NxActionCtMark;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.ct.mark._case.NxActionCtMarkBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNat;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNatBuilder;
38 import org.opendaylight.yangtools.yang.common.Uint16;
39 import org.opendaylight.yangtools.yang.common.Uint32;
40 import org.opendaylight.yangtools.yang.common.Uint8;
41
42 public class ConntrackCodecTest {
43
44     private ConntrackCodec conntrackCodec;
45
46     private ByteBuf buffer;
47     private Action action;
48
49     private final int length = 24;
50     private final byte nxastConntrackSubtype = 35;
51     private final int nxNatLengthAction1 = 32;
52     private final int nxNatLengthAction2 = 24;
53     private final byte nxastNatSubtype = 36;
54
55     private final byte nxmCtMarkFieldCode = 107;
56     private final byte setFieldCode = 25;
57     private final int setFieldLength = 16;
58
59     @Before
60     public void setUp() {
61         conntrackCodec = new ConntrackCodec();
62         buffer = ByteBufAllocator.DEFAULT.buffer();
63     }
64
65     @Test
66     public void serializeTest() {
67         action = createAction();
68         conntrackCodec.serialize(action, buffer);
69
70         Assert.assertEquals(length + nxNatLengthAction1 + nxNatLengthAction2 + setFieldLength, buffer.readableBytes());
71         Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
72         Assert.assertEquals(length + nxNatLengthAction1 + nxNatLengthAction2 + setFieldLength,
73                 buffer.readUnsignedShort());
74         Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
75         Assert.assertEquals(nxastConntrackSubtype, buffer.readUnsignedShort());
76         Assert.assertEquals(1, buffer.readUnsignedShort());
77         Assert.assertEquals(2, buffer.readUnsignedInt());
78         Assert.assertEquals(3, buffer.readUnsignedShort());
79         Assert.assertEquals(4, buffer.readByte());
80         buffer.skipBytes(5);
81         Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
82         Assert.assertEquals(nxNatLengthAction1, buffer.readUnsignedShort());
83         Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
84         Assert.assertEquals(nxastNatSubtype, buffer.readUnsignedShort());
85         buffer.skipBytes(2);
86         Assert.assertEquals(5, buffer.readUnsignedShort());
87         Assert.assertEquals(0x3F, buffer.readUnsignedShort());
88         Assert.assertEquals(3232235520L, buffer.readUnsignedInt());
89         Assert.assertEquals(3232238080L, buffer.readUnsignedInt());
90         Assert.assertEquals(3000, buffer.readUnsignedShort());
91         Assert.assertEquals(4000, buffer.readUnsignedShort());
92         buffer.skipBytes(4);
93         Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
94         Assert.assertEquals(nxNatLengthAction2, buffer.readUnsignedShort());
95         Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
96         Assert.assertEquals(nxastNatSubtype, buffer.readUnsignedShort());
97         buffer.skipBytes(2);
98         Assert.assertEquals(5, buffer.readUnsignedShort());
99         Assert.assertEquals(0x21, buffer.readUnsignedShort());
100         Assert.assertEquals(3232235520L, buffer.readUnsignedInt());
101         Assert.assertEquals(4000, buffer.readUnsignedShort());
102         buffer.skipBytes(2);
103         Assert.assertEquals(setFieldCode, buffer.readUnsignedShort());
104         Assert.assertEquals(setFieldLength, buffer.readUnsignedShort());
105         buffer.skipBytes(2);
106         Assert.assertEquals(nxmCtMarkFieldCode << 1, buffer.readByte() & 0xFF);
107         buffer.skipBytes(1);
108         Assert.assertEquals(36, buffer.readUnsignedInt());
109         buffer.skipBytes(4);
110     }
111
112     @Test
113     public void serializeTestWithoutCtAction() {
114         action = createActionWithoutCtAction();
115         conntrackCodec.serialize(action, buffer);
116
117         Assert.assertEquals(24, buffer.readableBytes());
118         Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
119         Assert.assertEquals(length, buffer.readUnsignedShort());
120         Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
121         Assert.assertEquals(nxastConntrackSubtype, buffer.readUnsignedShort());
122         Assert.assertEquals(1, buffer.readUnsignedShort());
123         Assert.assertEquals(2, buffer.readUnsignedInt());
124         Assert.assertEquals(3, buffer.readUnsignedShort());
125         Assert.assertEquals(4, buffer.readByte());
126         buffer.skipBytes(5);
127     }
128
129     @Test
130     public void deserializeTest() {
131         createBuffer(buffer);
132         action = conntrackCodec.deserialize(buffer);
133         ActionConntrack result = (ActionConntrack) action.getActionChoice();
134
135         Assert.assertEquals(1, result.getNxActionConntrack().getFlags().shortValue());
136         Assert.assertEquals(2, result.getNxActionConntrack().getZoneSrc().intValue());
137         Assert.assertEquals(3, result.getNxActionConntrack().getConntrackZone().shortValue());
138         Assert.assertEquals(4, result.getNxActionConntrack().getRecircTable().byteValue());
139         List<CtActions> ctActions = result.getNxActionConntrack().getCtActions();
140         NxActionNatCase nxActionNatCase = (NxActionNatCase) ctActions.get(0).getOfpactActions();
141         NxActionNat natAction = nxActionNatCase.getNxActionNat();
142         Assert.assertEquals(5, natAction.getFlags().shortValue());
143         Assert.assertEquals(0x3F, natAction.getRangePresent().intValue());
144         Assert.assertEquals("192.168.0.0", natAction.getIpAddressMin().getIpv4Address().getValue());
145         Assert.assertEquals("192.168.10.0", natAction.getIpAddressMax().getIpv4Address().getValue());
146         Assert.assertEquals(3000, natAction.getPortMin().shortValue());
147         Assert.assertEquals(4000, natAction.getPortMax().shortValue());
148         nxActionNatCase = (NxActionNatCase) ctActions.get(1).getOfpactActions();
149         natAction = nxActionNatCase.getNxActionNat();
150         Assert.assertEquals(5, natAction.getFlags().shortValue());
151         Assert.assertEquals(0x21, natAction.getRangePresent().intValue());
152         Assert.assertEquals("192.168.0.0", natAction.getIpAddressMin().getIpv4Address().getValue());
153         Assert.assertEquals(4000, natAction.getPortMax().shortValue());
154         NxActionCtMarkCase nxActionCtMarkCase = (NxActionCtMarkCase) ctActions.get(2).getOfpactActions();
155         NxActionCtMark ctMarkAction = nxActionCtMarkCase.getNxActionCtMark();
156         Assert.assertEquals(36, ctMarkAction.getCtMark().longValue());
157     }
158
159     @Test
160     public void deserializeTestWithoutCtAction() {
161         createBufferWIthoutCtAction(buffer);
162         action = conntrackCodec.deserialize(buffer);
163
164         ActionConntrack result = (ActionConntrack) action.getActionChoice();
165
166         Assert.assertEquals(1, result.getNxActionConntrack().getFlags().shortValue());
167         Assert.assertEquals(2, result.getNxActionConntrack().getZoneSrc().intValue());
168         Assert.assertEquals(3, result.getNxActionConntrack().getConntrackZone().shortValue());
169         Assert.assertEquals(4, result.getNxActionConntrack().getRecircTable().byteValue());
170     }
171
172     private static Action createAction() {
173
174         NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder();
175         nxActionConntrackBuilder.setFlags(Uint16.ONE);
176         nxActionConntrackBuilder.setZoneSrc(Uint32.TWO);
177         nxActionConntrackBuilder.setConntrackZone(Uint16.valueOf(3));
178         nxActionConntrackBuilder.setRecircTable(Uint8.valueOf(4));
179
180         NxActionNatBuilder nxActionNatBuilder = new NxActionNatBuilder();
181         nxActionNatBuilder.setFlags(Uint16.valueOf(5));
182         nxActionNatBuilder.setRangePresent(Uint16.valueOf(0x3F));
183         nxActionNatBuilder.setIpAddressMin(new IpAddress(new Ipv4Address("192.168.0.0")));
184         nxActionNatBuilder.setIpAddressMax(new IpAddress(new Ipv4Address("192.168.10.0")));
185         nxActionNatBuilder.setPortMin(Uint16.valueOf(3000));
186         nxActionNatBuilder.setPortMax(Uint16.valueOf(4000));
187         NxActionNatCaseBuilder nxActionNatCaseBuilder = new NxActionNatCaseBuilder();
188         nxActionNatCaseBuilder.setNxActionNat(nxActionNatBuilder.build());
189         CtActionsBuilder ctActionsBuilder = new CtActionsBuilder();
190         ctActionsBuilder.setOfpactActions(nxActionNatCaseBuilder.build());
191         List<CtActions> ctActionsList = new  ArrayList<>();
192         ctActionsList.add(ctActionsBuilder.build());
193         nxActionNatBuilder = new NxActionNatBuilder();
194         nxActionNatBuilder.setFlags(Uint16.valueOf(5));
195         nxActionNatBuilder.setRangePresent(Uint16.valueOf(0x21));
196         nxActionNatBuilder.setIpAddressMin(new IpAddress(new Ipv4Address("192.168.0.0")));
197         nxActionNatBuilder.setPortMax(Uint16.valueOf(4000));
198         nxActionNatCaseBuilder = new NxActionNatCaseBuilder();
199         nxActionNatCaseBuilder.setNxActionNat(nxActionNatBuilder.build());
200         ctActionsBuilder = new CtActionsBuilder();
201         ctActionsBuilder.setOfpactActions(nxActionNatCaseBuilder.build());
202         ctActionsList.add(ctActionsBuilder.build());
203         nxActionConntrackBuilder.setCtActions(ctActionsList);
204
205         NxActionCtMarkBuilder nxActionCtMarkBuilder = new NxActionCtMarkBuilder();
206         nxActionCtMarkBuilder.setCtMark(Uint32.valueOf(36));
207         NxActionCtMarkCaseBuilder nxActionCtMarkCaseBuilder = new NxActionCtMarkCaseBuilder();
208         nxActionCtMarkCaseBuilder.setNxActionCtMark(nxActionCtMarkBuilder.build());
209         ctActionsBuilder = new CtActionsBuilder();
210         ctActionsBuilder.setOfpactActions(nxActionCtMarkCaseBuilder.build());
211         ctActionsList.add(ctActionsBuilder.build());
212         nxActionConntrackBuilder.setCtActions(ctActionsList);
213
214         ExperimenterId experimenterId = new ExperimenterId(NiciraConstants.NX_VENDOR_ID);
215         ActionBuilder actionBuilder = new ActionBuilder();
216         actionBuilder.setExperimenterId(experimenterId);
217         ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder();
218         actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build());
219         actionBuilder.setActionChoice(actionConntrackBuilder.build());
220
221         return actionBuilder.build();
222     }
223
224     private static Action createActionWithoutCtAction() {
225
226         NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder();
227         nxActionConntrackBuilder.setFlags(Uint16.ONE);
228         nxActionConntrackBuilder.setZoneSrc(Uint32.TWO);
229         nxActionConntrackBuilder.setConntrackZone(Uint16.valueOf(3));
230         nxActionConntrackBuilder.setRecircTable(Uint8.valueOf(4));
231
232         ExperimenterId experimenterId = new ExperimenterId(NiciraConstants.NX_VENDOR_ID);
233         ActionBuilder actionBuilder = new ActionBuilder();
234         actionBuilder.setExperimenterId(experimenterId);
235         ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder();
236         actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build());
237         actionBuilder.setActionChoice(actionConntrackBuilder.build());
238
239         return actionBuilder.build();
240     }
241
242     private void createBuffer(final ByteBuf message) {
243         message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
244         message.writeShort(length + nxNatLengthAction1 + nxNatLengthAction2 + setFieldLength);
245         message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
246         message.writeShort(nxastConntrackSubtype);
247         //FLAG = 1
248         message.writeShort(1);
249         //ZONE_SRC = 2
250         message.writeInt(2);
251         //CONNTRACK_ZONE = 3
252         message.writeShort(3);
253         //RECIRC_TABLE = 4
254         message.writeByte(4);
255         //ADDS 5 empty bytes
256         message.writeZero(5);
257         message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
258         message.writeShort(nxNatLengthAction1);
259         message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
260         message.writeShort(nxastNatSubtype);
261         message.writeZero(2);
262         //NAT FLAG
263         message.writeShort(5);
264         //RANGE PRESENT
265         message.writeShort(0x3F);
266         //IP ADDRESS MIN
267         message.writeBytes(IetfInetUtil.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
268         //IP ADDRESS MAX
269         message.writeBytes(IetfInetUtil.ipv4AddressBytes(new Ipv4Address("192.168.10.0")));
270         //PORT MIN
271         message.writeShort(3000);
272         //PORT MAX
273         message.writeShort(4000);
274         message.writeZero(4);
275
276         message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
277         message.writeShort(nxNatLengthAction2);
278         message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
279         message.writeShort(nxastNatSubtype);
280         message.writeZero(2);
281         //NAT FLAG
282         message.writeShort(5);
283         //RANGE PRESENT
284         message.writeShort(0x21);
285         //IP ADDRESS MIN
286         message.writeBytes(IetfInetUtil.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
287         //PORT MAX
288         message.writeShort(4000);
289         message.writeZero(2);
290
291         message.writeShort(setFieldCode);
292         message.writeShort(setFieldLength);
293         message.writeZero(1);
294         message.writeByte(1);
295         message.writeByte(nxmCtMarkFieldCode << 1);
296         message.writeByte(4);
297         // value of ct_mark
298         message.writeInt(36);
299         message.writeZero(4);
300     }
301
302     private void createBufferWIthoutCtAction(final ByteBuf message) {
303         message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
304         message.writeShort(length);
305         message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
306         message.writeShort(nxastConntrackSubtype);
307         //FLAG = 1
308         message.writeShort(1);
309         //ZONE_SRC = 2
310         message.writeInt(2);
311         //CONNTRACK_ZONE = 3
312         message.writeShort(3);
313         //RECIRC_TABLE = 4
314         message.writeByte(4);
315         //ADDS 5 empty bytes
316         message.writeZero(5);
317     }
318 }