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.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;
42 public class ConntrackCodecTest {
44 private ConntrackCodec conntrackCodec;
46 private ByteBuf buffer;
47 private Action action;
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;
55 private final byte nxmCtMarkFieldCode = 107;
56 private final byte setFieldCode = 25;
57 private final int setFieldLength = 16;
61 conntrackCodec = new ConntrackCodec();
62 buffer = ByteBufAllocator.DEFAULT.buffer();
66 public void serializeTest() {
67 action = createAction();
68 conntrackCodec.serialize(action, buffer);
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());
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());
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());
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());
98 Assert.assertEquals(5, buffer.readUnsignedShort());
99 Assert.assertEquals(0x21, buffer.readUnsignedShort());
100 Assert.assertEquals(3232235520L, buffer.readUnsignedInt());
101 Assert.assertEquals(4000, buffer.readUnsignedShort());
103 Assert.assertEquals(setFieldCode, buffer.readUnsignedShort());
104 Assert.assertEquals(setFieldLength, buffer.readUnsignedShort());
106 Assert.assertEquals(nxmCtMarkFieldCode << 1, buffer.readByte() & 0xFF);
108 Assert.assertEquals(36, buffer.readUnsignedInt());
113 public void serializeTestWithoutCtAction() {
114 action = createActionWithoutCtAction();
115 conntrackCodec.serialize(action, buffer);
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());
130 public void deserializeTest() {
131 createBuffer(buffer);
132 action = conntrackCodec.deserialize(buffer);
133 ActionConntrack result = (ActionConntrack) action.getActionChoice();
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());
160 public void deserializeTestWithoutCtAction() {
161 createBufferWIthoutCtAction(buffer);
162 action = conntrackCodec.deserialize(buffer);
164 ActionConntrack result = (ActionConntrack) action.getActionChoice();
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());
172 private static Action createAction() {
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));
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);
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);
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());
221 return actionBuilder.build();
224 private static Action createActionWithoutCtAction() {
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));
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());
239 return actionBuilder.build();
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);
248 message.writeShort(1);
252 message.writeShort(3);
254 message.writeByte(4);
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);
263 message.writeShort(5);
265 message.writeShort(0x3F);
267 message.writeBytes(IetfInetUtil.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
269 message.writeBytes(IetfInetUtil.ipv4AddressBytes(new Ipv4Address("192.168.10.0")));
271 message.writeShort(3000);
273 message.writeShort(4000);
274 message.writeZero(4);
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);
282 message.writeShort(5);
284 message.writeShort(0x21);
286 message.writeBytes(IetfInetUtil.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
288 message.writeShort(4000);
289 message.writeZero(2);
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);
298 message.writeInt(36);
299 message.writeZero(4);
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);
308 message.writeShort(1);
312 message.writeShort(3);
314 message.writeByte(4);
316 message.writeZero(5);