2 * Copyright (c) 2016, 2017 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.openflowjava.nx.codec.action;
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.IpAddressBuilder;
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.action.container.action.choice.ActionConntrack;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.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;
39 public class ConntrackCodecTest {
41 private ConntrackCodec conntrackCodec;
43 private ByteBuf buffer;
44 private Action action;
46 private final int length = 24;
47 private final byte nxastConntrackSubtype = 35;
48 private final int nxNatLengthAction1 = 32;
49 private final int nxNatLengthAction2 = 24;
50 private final byte nxastNatSubtype = 36;
52 private final byte nxmCtMarkFieldCode = 107;
53 private final byte setFieldCode = 25;
54 private final int setFieldLength = 16;
58 conntrackCodec = new ConntrackCodec();
59 buffer = ByteBufAllocator.DEFAULT.buffer();
63 public void serializeTest() {
64 action = createAction();
65 conntrackCodec.serialize(action, buffer);
67 Assert.assertEquals(length + nxNatLengthAction1 + nxNatLengthAction2 + setFieldLength, buffer.readableBytes());
68 Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
69 Assert.assertEquals(length + nxNatLengthAction1 + nxNatLengthAction2 + setFieldLength,
70 buffer.readUnsignedShort());
71 Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
72 Assert.assertEquals(nxastConntrackSubtype, buffer.readUnsignedShort());
73 Assert.assertEquals(1, buffer.readUnsignedShort());
74 Assert.assertEquals(2, buffer.readUnsignedInt());
75 Assert.assertEquals(3, buffer.readUnsignedShort());
76 Assert.assertEquals(4, buffer.readByte());
78 Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
79 Assert.assertEquals(nxNatLengthAction1, buffer.readUnsignedShort());
80 Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
81 Assert.assertEquals(nxastNatSubtype, buffer.readUnsignedShort());
83 Assert.assertEquals(5, buffer.readUnsignedShort());
84 Assert.assertEquals(0x3F, buffer.readUnsignedShort());
85 Assert.assertEquals(3232235520L, buffer.readUnsignedInt());
86 Assert.assertEquals(3232238080L, buffer.readUnsignedInt());
87 Assert.assertEquals(3000, buffer.readUnsignedShort());
88 Assert.assertEquals(4000, buffer.readUnsignedShort());
90 Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
91 Assert.assertEquals(nxNatLengthAction2, buffer.readUnsignedShort());
92 Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
93 Assert.assertEquals(nxastNatSubtype, buffer.readUnsignedShort());
95 Assert.assertEquals(5, buffer.readUnsignedShort());
96 Assert.assertEquals(0x21, buffer.readUnsignedShort());
97 Assert.assertEquals(3232235520L, buffer.readUnsignedInt());
98 Assert.assertEquals(4000, buffer.readUnsignedShort());
100 Assert.assertEquals(setFieldCode, buffer.readUnsignedShort());
101 Assert.assertEquals(setFieldLength, buffer.readUnsignedShort());
103 Assert.assertEquals(nxmCtMarkFieldCode << 1, buffer.readByte() & 0xFF);
105 Assert.assertEquals(36, buffer.readUnsignedInt());
110 public void serializeTestWithoutCtAction() {
111 action = createActionWithoutCtAction();
112 conntrackCodec.serialize(action, buffer);
114 Assert.assertEquals(24, buffer.readableBytes());
115 Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
116 Assert.assertEquals(length, buffer.readUnsignedShort());
117 Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
118 Assert.assertEquals(nxastConntrackSubtype, buffer.readUnsignedShort());
119 Assert.assertEquals(1, buffer.readUnsignedShort());
120 Assert.assertEquals(2, buffer.readUnsignedInt());
121 Assert.assertEquals(3, buffer.readUnsignedShort());
122 Assert.assertEquals(4, buffer.readByte());
127 public void deserializeTest() {
128 createBuffer(buffer);
129 action = conntrackCodec.deserialize(buffer);
130 ActionConntrack result = (ActionConntrack) action.getActionChoice();
132 Assert.assertEquals(1, result.getNxActionConntrack().getFlags().shortValue());
133 Assert.assertEquals(2, result.getNxActionConntrack().getZoneSrc().intValue());
134 Assert.assertEquals(3, result.getNxActionConntrack().getConntrackZone().shortValue());
135 Assert.assertEquals(4, result.getNxActionConntrack().getRecircTable().byteValue());
136 List<CtActions> ctActions = result.getNxActionConntrack().getCtActions();
137 NxActionNatCase nxActionNatCase = (NxActionNatCase) ctActions.get(0).getOfpactActions();
138 NxActionNat natAction = nxActionNatCase.getNxActionNat();
139 Assert.assertEquals(5, natAction.getFlags().shortValue());
140 Assert.assertEquals(0x3F, natAction.getRangePresent().intValue());
141 Assert.assertEquals("192.168.0.0", natAction.getIpAddressMin().getIpv4Address().getValue());
142 Assert.assertEquals("192.168.10.0", natAction.getIpAddressMax().getIpv4Address().getValue());
143 Assert.assertEquals(3000, natAction.getPortMin().shortValue());
144 Assert.assertEquals(4000, natAction.getPortMax().shortValue());
145 nxActionNatCase = (NxActionNatCase) ctActions.get(1).getOfpactActions();
146 natAction = nxActionNatCase.getNxActionNat();
147 Assert.assertEquals(5, natAction.getFlags().shortValue());
148 Assert.assertEquals(0x21, natAction.getRangePresent().intValue());
149 Assert.assertEquals("192.168.0.0", natAction.getIpAddressMin().getIpv4Address().getValue());
150 Assert.assertEquals(4000, natAction.getPortMax().shortValue());
151 NxActionCtMarkCase nxActionCtMarkCase = (NxActionCtMarkCase) ctActions.get(2).getOfpactActions();
152 NxActionCtMark ctMarkAction = nxActionCtMarkCase.getNxActionCtMark();
153 Assert.assertEquals(36, ctMarkAction.getCtMark().longValue());
157 public void deserializeTestWithoutCtAction() {
158 createBufferWIthoutCtAction(buffer);
159 action = conntrackCodec.deserialize(buffer);
161 ActionConntrack result = (ActionConntrack) action.getActionChoice();
163 Assert.assertEquals(1, result.getNxActionConntrack().getFlags().shortValue());
164 Assert.assertEquals(2, result.getNxActionConntrack().getZoneSrc().intValue());
165 Assert.assertEquals(3, result.getNxActionConntrack().getConntrackZone().shortValue());
166 Assert.assertEquals(4, result.getNxActionConntrack().getRecircTable().byteValue());
169 private static Action createAction() {
171 NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder();
172 nxActionConntrackBuilder.setFlags(1);
173 nxActionConntrackBuilder.setZoneSrc((long) 2);
174 nxActionConntrackBuilder.setConntrackZone(3);
175 nxActionConntrackBuilder.setRecircTable((short) 4);
177 NxActionNatBuilder nxActionNatBuilder = new NxActionNatBuilder();
178 nxActionNatBuilder.setFlags(5);
179 nxActionNatBuilder.setRangePresent(0x3F);
180 nxActionNatBuilder.setIpAddressMin(IpAddressBuilder.getDefaultInstance("192.168.0.0"));
181 nxActionNatBuilder.setIpAddressMax(IpAddressBuilder.getDefaultInstance("192.168.10.0"));
182 nxActionNatBuilder.setPortMin(3000);
183 nxActionNatBuilder.setPortMax(4000);
184 NxActionNatCaseBuilder nxActionNatCaseBuilder = new NxActionNatCaseBuilder();
185 nxActionNatCaseBuilder.setNxActionNat(nxActionNatBuilder.build());
186 CtActionsBuilder ctActionsBuilder = new CtActionsBuilder();
187 ctActionsBuilder.setOfpactActions(nxActionNatCaseBuilder.build());
188 List<CtActions> ctActionsList = new ArrayList<>();
189 ctActionsList.add(ctActionsBuilder.build());
190 nxActionNatBuilder = new NxActionNatBuilder();
191 nxActionNatBuilder.setFlags(5);
192 nxActionNatBuilder.setRangePresent(0x21);
193 nxActionNatBuilder.setIpAddressMin(IpAddressBuilder.getDefaultInstance("192.168.0.0"));
194 nxActionNatBuilder.setPortMax(4000);
195 nxActionNatCaseBuilder = new NxActionNatCaseBuilder();
196 nxActionNatCaseBuilder.setNxActionNat(nxActionNatBuilder.build());
197 ctActionsBuilder = new CtActionsBuilder();
198 ctActionsBuilder.setOfpactActions(nxActionNatCaseBuilder.build());
199 ctActionsList.add(ctActionsBuilder.build());
200 nxActionConntrackBuilder.setCtActions(ctActionsList);
202 NxActionCtMarkBuilder nxActionCtMarkBuilder = new NxActionCtMarkBuilder();
203 nxActionCtMarkBuilder.setCtMark((long) 36);
204 NxActionCtMarkCaseBuilder nxActionCtMarkCaseBuilder = new NxActionCtMarkCaseBuilder();
205 nxActionCtMarkCaseBuilder.setNxActionCtMark(nxActionCtMarkBuilder.build());
206 ctActionsBuilder = new CtActionsBuilder();
207 ctActionsBuilder.setOfpactActions(nxActionCtMarkCaseBuilder.build());
208 ctActionsList.add(ctActionsBuilder.build());
209 nxActionConntrackBuilder.setCtActions(ctActionsList);
211 ExperimenterId experimenterId = new ExperimenterId(NiciraConstants.NX_VENDOR_ID);
212 ActionBuilder actionBuilder = new ActionBuilder();
213 actionBuilder.setExperimenterId(experimenterId);
214 ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder();
215 actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build());
216 actionBuilder.setActionChoice(actionConntrackBuilder.build());
218 return actionBuilder.build();
221 private static Action createActionWithoutCtAction() {
223 NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder();
224 nxActionConntrackBuilder.setFlags(1);
225 nxActionConntrackBuilder.setZoneSrc((long) 2);
226 nxActionConntrackBuilder.setConntrackZone(3);
227 nxActionConntrackBuilder.setRecircTable((short) 4);
229 ExperimenterId experimenterId = new ExperimenterId(NiciraConstants.NX_VENDOR_ID);
230 ActionBuilder actionBuilder = new ActionBuilder();
231 actionBuilder.setExperimenterId(experimenterId);
232 ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder();
233 actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build());
234 actionBuilder.setActionChoice(actionConntrackBuilder.build());
236 return actionBuilder.build();
239 private void createBuffer(final ByteBuf message) {
240 message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
241 message.writeShort(length + nxNatLengthAction1 + nxNatLengthAction2 + setFieldLength);
242 message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
243 message.writeShort(nxastConntrackSubtype);
245 message.writeShort(1);
249 message.writeShort(3);
251 message.writeByte(4);
253 message.writeZero(5);
254 message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
255 message.writeShort(nxNatLengthAction1);
256 message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
257 message.writeShort(nxastNatSubtype);
258 message.writeZero(2);
260 message.writeShort(5);
262 message.writeShort(0x3F);
264 message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
266 message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.10.0")));
268 message.writeShort(3000);
270 message.writeShort(4000);
271 message.writeZero(4);
273 message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
274 message.writeShort(nxNatLengthAction2);
275 message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
276 message.writeShort(nxastNatSubtype);
277 message.writeZero(2);
279 message.writeShort(5);
281 message.writeShort(0x21);
283 message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
285 message.writeShort(4000);
286 message.writeZero(2);
288 message.writeShort(setFieldCode);
289 message.writeShort(setFieldLength);
290 message.writeZero(1);
291 message.writeByte(1);
292 message.writeByte(nxmCtMarkFieldCode << 1);
293 message.writeByte(4);
295 message.writeInt(36);
296 message.writeZero(4);
299 private void createBufferWIthoutCtAction(final ByteBuf message) {
300 message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
301 message.writeShort(length);
302 message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
303 message.writeShort(nxastConntrackSubtype);
305 message.writeShort(1);
309 message.writeShort(3);
311 message.writeByte(4);
313 message.writeZero(5);