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
9 package org.opendaylight.openflowjava.nx.codec.action;
11 import io.netty.buffer.ByteBuf;
12 import io.netty.buffer.ByteBufAllocator;
14 import java.util.ArrayList;
15 import java.util.List;
17 import org.junit.Assert;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.opendaylight.openflowjava.nx.api.NiciraConstants;
21 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionConntrack;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionConntrackBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.NxActionConntrackBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action.conntrack.CtActions;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action.conntrack.CtActionsBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCase;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNat;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNatBuilder;
38 public class ConntrackCodecTest {
40 private ConntrackCodec conntrackCodec;
42 private ByteBuf buffer;
43 private Action action;
45 private final int length = 24;
46 private final byte nxastConntrackSubtype = 35;
47 private final int nxNatLengthAction1 = 32;
48 private final int nxNatLengthAction2 = 24;
49 private final byte nxastNatSubtype = 36;
53 conntrackCodec = new ConntrackCodec();
54 buffer = ByteBufAllocator.DEFAULT.buffer();
58 public void serializeTest() {
59 action = createAction();
60 conntrackCodec.serialize(action, buffer);
62 Assert.assertEquals(length + nxNatLengthAction1 + nxNatLengthAction2, buffer.readableBytes());
63 Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
64 Assert.assertEquals(length + nxNatLengthAction1 + nxNatLengthAction2, buffer.readUnsignedShort());
65 Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
66 Assert.assertEquals(nxastConntrackSubtype, buffer.readUnsignedShort());
67 Assert.assertEquals(1, buffer.readUnsignedShort());
68 Assert.assertEquals(2, buffer.readUnsignedInt());
69 Assert.assertEquals(3, buffer.readUnsignedShort());
70 Assert.assertEquals(4, buffer.readByte());
72 Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
73 Assert.assertEquals(nxNatLengthAction1, buffer.readUnsignedShort());
74 Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
75 Assert.assertEquals(nxastNatSubtype, buffer.readUnsignedShort());
77 Assert.assertEquals(5, buffer.readUnsignedShort());
78 Assert.assertEquals(0x3F, buffer.readUnsignedShort());
79 Assert.assertEquals(3232235520L, buffer.readUnsignedInt());
80 Assert.assertEquals(3232238080L, buffer.readUnsignedInt());
81 Assert.assertEquals(3000, buffer.readUnsignedShort());
82 Assert.assertEquals(4000, buffer.readUnsignedShort());
84 Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
85 Assert.assertEquals(nxNatLengthAction2, buffer.readUnsignedShort());
86 Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
87 Assert.assertEquals(nxastNatSubtype, buffer.readUnsignedShort());
89 Assert.assertEquals(5, buffer.readUnsignedShort());
90 Assert.assertEquals(0x21, buffer.readUnsignedShort());
91 Assert.assertEquals(3232235520L, buffer.readUnsignedInt());
92 Assert.assertEquals(4000, buffer.readUnsignedShort());
97 public void serializeTestWithoutCtAction() {
98 action = createActionWithoutCtAction();
99 conntrackCodec.serialize(action, buffer);
101 Assert.assertEquals(24, buffer.readableBytes());
102 Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
103 Assert.assertEquals(length, buffer.readUnsignedShort());
104 Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
105 Assert.assertEquals(nxastConntrackSubtype, buffer.readUnsignedShort());
106 Assert.assertEquals(1, buffer.readUnsignedShort());
107 Assert.assertEquals(2, buffer.readUnsignedInt());
108 Assert.assertEquals(3, buffer.readUnsignedShort());
109 Assert.assertEquals(4, buffer.readByte());
114 public void deserializeTest() {
116 action = conntrackCodec.deserialize(buffer);
118 ActionConntrack result = (ActionConntrack) action.getActionChoice();
120 Assert.assertEquals(1, result.getNxActionConntrack().getFlags().shortValue());
121 Assert.assertEquals(2, result.getNxActionConntrack().getZoneSrc().intValue());
122 Assert.assertEquals(3, result.getNxActionConntrack().getConntrackZone().shortValue());
123 Assert.assertEquals(4, result.getNxActionConntrack().getRecircTable().byteValue());
124 List<CtActions> ctActions = result.getNxActionConntrack().getCtActions();
125 NxActionNatCase nxActionNatCase = (NxActionNatCase) ctActions.get(0).getOfpactActions();
126 NxActionNat natAction = nxActionNatCase.getNxActionNat();
127 Assert.assertEquals(5, natAction.getFlags().shortValue());
128 Assert.assertEquals(0x3F, natAction.getRangePresent().intValue());
129 Assert.assertEquals("192.168.0.0", natAction.getIpAddressMin().getIpv4Address().getValue());
130 Assert.assertEquals("192.168.10.0", natAction.getIpAddressMax().getIpv4Address().getValue());
131 Assert.assertEquals(3000, natAction.getPortMin().shortValue());
132 Assert.assertEquals(4000, natAction.getPortMax().shortValue());
133 nxActionNatCase = (NxActionNatCase) ctActions.get(1).getOfpactActions();
134 natAction = nxActionNatCase.getNxActionNat();
135 Assert.assertEquals(5, natAction.getFlags().shortValue());
136 Assert.assertEquals(0x21, natAction.getRangePresent().intValue());
137 Assert.assertEquals("192.168.0.0", natAction.getIpAddressMin().getIpv4Address().getValue());
138 Assert.assertEquals(4000, natAction.getPortMax().shortValue());
142 public void deserializeTestWithoutCtAction() {
143 createBuferWIthoutCtAction(buffer);
144 action = conntrackCodec.deserialize(buffer);
146 ActionConntrack result = (ActionConntrack) action.getActionChoice();
148 Assert.assertEquals(1, result.getNxActionConntrack().getFlags().shortValue());
149 Assert.assertEquals(2, result.getNxActionConntrack().getZoneSrc().intValue());
150 Assert.assertEquals(3, result.getNxActionConntrack().getConntrackZone().shortValue());
151 Assert.assertEquals(4, result.getNxActionConntrack().getRecircTable().byteValue());
154 private Action createAction() {
156 NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder();
157 nxActionConntrackBuilder.setFlags(1);
158 nxActionConntrackBuilder.setZoneSrc((long) 2);
159 nxActionConntrackBuilder.setConntrackZone(3);
160 nxActionConntrackBuilder.setRecircTable((short) 4);
162 NxActionNatBuilder nxActionNatBuilder = new NxActionNatBuilder();
163 nxActionNatBuilder.setFlags(5);
164 nxActionNatBuilder.setRangePresent(0x3F);
165 nxActionNatBuilder.setIpAddressMin(new IpAddress("192.168.0.0".toCharArray()));
166 nxActionNatBuilder.setIpAddressMax(new IpAddress("192.168.10.0".toCharArray()));
167 nxActionNatBuilder.setPortMin(3000);
168 nxActionNatBuilder.setPortMax(4000);
169 NxActionNatCaseBuilder nxActionNatCaseBuilder = new NxActionNatCaseBuilder();
170 nxActionNatCaseBuilder.setNxActionNat(nxActionNatBuilder.build());
171 CtActionsBuilder ctActionsBuilder = new CtActionsBuilder();
172 ctActionsBuilder.setOfpactActions(nxActionNatCaseBuilder.build());
173 List<CtActions> ctActionsList = new ArrayList<>();
174 ctActionsList.add(ctActionsBuilder.build());
175 nxActionNatBuilder = new NxActionNatBuilder();
176 nxActionNatBuilder.setFlags(5);
177 nxActionNatBuilder.setRangePresent(0x21);
178 nxActionNatBuilder.setIpAddressMin(new IpAddress("192.168.0.0".toCharArray()));
179 nxActionNatBuilder.setPortMax(4000);
180 nxActionNatCaseBuilder = new NxActionNatCaseBuilder();
181 nxActionNatCaseBuilder.setNxActionNat(nxActionNatBuilder.build());
182 ctActionsBuilder = new CtActionsBuilder();
183 ctActionsBuilder.setOfpactActions(nxActionNatCaseBuilder.build());
184 ctActionsList.add(ctActionsBuilder.build());
185 nxActionConntrackBuilder.setCtActions(ctActionsList);
187 ExperimenterId experimenterId = new ExperimenterId(NiciraConstants.NX_VENDOR_ID);
188 ActionBuilder actionBuilder = new ActionBuilder();
189 actionBuilder.setExperimenterId(experimenterId);
190 ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder();
191 actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build());
192 actionBuilder.setActionChoice(actionConntrackBuilder.build());
194 return actionBuilder.build();
197 private Action createActionWithoutCtAction() {
199 NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder();
200 nxActionConntrackBuilder.setFlags(1);
201 nxActionConntrackBuilder.setZoneSrc((long) 2);
202 nxActionConntrackBuilder.setConntrackZone(3);
203 nxActionConntrackBuilder.setRecircTable((short) 4);
205 ExperimenterId experimenterId = new ExperimenterId(NiciraConstants.NX_VENDOR_ID);
206 ActionBuilder actionBuilder = new ActionBuilder();
207 actionBuilder.setExperimenterId(experimenterId);
208 ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder();
209 actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build());
210 actionBuilder.setActionChoice(actionConntrackBuilder.build());
212 return actionBuilder.build();
215 private void createBufer(ByteBuf message) {
216 message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
217 message.writeShort(length + nxNatLengthAction1 + nxNatLengthAction2);
218 message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
219 message.writeShort(nxastConntrackSubtype);
221 message.writeShort(1);
225 message.writeShort(3);
227 message.writeByte(4);
229 message.writeZero(5);
230 message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
231 message.writeShort(nxNatLengthAction1);
232 message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
233 message.writeShort(nxastNatSubtype);
234 message.writeZero(2);
236 message.writeShort(5);
238 message.writeShort(0x3F);
240 message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
242 message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.10.0")));
244 message.writeShort(3000);
246 message.writeShort(4000);
247 message.writeZero(4);
249 message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
250 message.writeShort(nxNatLengthAction2);
251 message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
252 message.writeShort(nxastNatSubtype);
253 message.writeZero(2);
255 message.writeShort(5);
257 message.writeShort(0x21);
259 message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
261 message.writeShort(4000);
262 message.writeZero(2);
265 private void createBuferWIthoutCtAction(ByteBuf message) {
266 message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
267 message.writeShort(length);
268 message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
269 message.writeShort(nxastConntrackSubtype);
271 message.writeShort(1);
275 message.writeShort(3);
277 message.writeByte(4);
279 message.writeZero(5);