blob: f46d668ba2b2b3a5bde6aefba5466499324de9bf [file] [log] [blame]
Jian Li8e7e6cd2018-03-30 13:33:08 +09001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.openstacknetworking.impl;
17
18import org.junit.After;
19import org.junit.Before;
20import org.junit.Test;
21import org.onlab.packet.ARP;
22import org.onlab.packet.Ethernet;
23import org.onlab.packet.IpAddress;
24import org.onlab.packet.MacAddress;
25import org.onosproject.cfg.ComponentConfigAdapter;
Jian Lieae12362018-04-10 18:48:32 +090026import org.onosproject.cluster.ClusterServiceAdapter;
27import org.onosproject.cluster.LeadershipServiceAdapter;
28import org.onosproject.core.ApplicationId;
Jian Li8e7e6cd2018-03-30 13:33:08 +090029import org.onosproject.core.CoreServiceAdapter;
Jian Lieae12362018-04-10 18:48:32 +090030import org.onosproject.core.DefaultApplicationId;
Jian Li8e7e6cd2018-03-30 13:33:08 +090031import org.onosproject.net.DeviceId;
32import org.onosproject.net.PortNumber;
33import org.onosproject.net.packet.DefaultInboundPacket;
34import org.onosproject.net.packet.DefaultPacketContext;
35import org.onosproject.net.packet.InboundPacket;
36import org.onosproject.net.packet.OutboundPacket;
37import org.onosproject.net.packet.PacketContext;
38import org.onosproject.net.packet.PacketProcessor;
39import org.onosproject.net.packet.PacketServiceAdapter;
40import org.onosproject.openstacknetworking.api.InstancePort;
41
42import java.nio.ByteBuffer;
43
44import static org.junit.Assert.assertArrayEquals;
45import static org.junit.Assert.assertEquals;
46import static org.junit.Assert.fail;
47import static org.onosproject.net.NetTestTools.connectPoint;
Jian Lieae12362018-04-10 18:48:32 +090048import static org.onosproject.openstacknetworking.api.Constants.ARP_PROXY_MODE;
Jian Li8e7e6cd2018-03-30 13:33:08 +090049
50public class OpenstackSwitchingArpHandlerTest {
51
52 private OpenstackSwitchingArpHandler arpHandler;
53
54 protected PacketProcessor packetProcessor;
55
56 private static final MacAddress CLIENT_MAC = MacAddress.valueOf("1a:1a:1a:1a:1a:1a");
57 private static final IpAddress CLIENT_IP = IpAddress.valueOf("10.10.10.10");
58 private static final IpAddress TARGET_IP = IpAddress.valueOf("10.10.10.20");
59 private static final MacAddress EXPECTED_MAC = MacAddress.valueOf("2b:2b:2b:2b:2b:2b");
60
61 @Before
62 public void setUp() {
63 arpHandler = new OpenstackSwitchingArpHandler();
64 arpHandler.coreService = new TestCoreService();
65 arpHandler.configService = new TestConfigService();
66 arpHandler.instancePortService = new TestInstancePortService();
67 arpHandler.packetService = new TestPacketService();
68 arpHandler.osNetworkService = new TestOpenstackNetworkService();
Jian Lieae12362018-04-10 18:48:32 +090069 arpHandler.osNodeService = new TestOpenstackNodeService();
70 arpHandler.osFlowRuleService = new TestOpenstackFlowRuleService();
71 arpHandler.arpMode = ARP_PROXY_MODE;
72 arpHandler.clusterService = new TestClusterService();
73 arpHandler.leadershipService = new TestLeadershipService();
Jian Li8e7e6cd2018-03-30 13:33:08 +090074 arpHandler.activate();
75 }
76
77 @After
78 public void tearDown() {
79 arpHandler.deactivate();
80 }
81
82 /**
83 * Tests the response to an ARP Request Packet.
84 */
85 @Test
86 public void testRequest() {
87 Ethernet arpRequest = constructArpPacket(ARP.OP_REQUEST);
88 sendPacket(arpRequest);
89 }
90
91 /**
92 * Sends an Ethernet packet to the process method of the Packet processor.
93 *
94 * @param ethernet Ethernet packet
95 */
96 private void sendPacket(Ethernet ethernet) {
97 final ByteBuffer byteBuffer = ByteBuffer.wrap(ethernet.serialize());
98 InboundPacket inPacket = new DefaultInboundPacket(connectPoint("1", 1),
99 ethernet,
100 byteBuffer);
101
102 PacketContext context = new TestPacketContext(127L, inPacket, null, false);
103 packetProcessor.process(context);
104 }
105
106 /**
107 * Validates the contents of the packet sent by the OpenstackSwitchingArpHandler.
108 *
109 * @param packet Ethernet packet received
110 */
111 private void validatePacket(Ethernet packet) {
112 ARP arpPacket = (ARP) packet.getPayload();
113
114 assertEquals(arpPacket.getOpCode(), ARP.OP_REPLY);
115 assertArrayEquals(arpPacket.getSenderHardwareAddress(), EXPECTED_MAC.toBytes());
116 assertArrayEquals(arpPacket.getSenderProtocolAddress(), TARGET_IP.toOctets());
117 assertArrayEquals(arpPacket.getTargetHardwareAddress(), CLIENT_MAC.toBytes());
118 assertArrayEquals(arpPacket.getTargetProtocolAddress(), CLIENT_IP.toOctets());
119 assertEquals(arpPacket.getProtocolType(), ARP.PROTO_TYPE_IP);
120 assertEquals(arpPacket.getHardwareType(), ARP.HW_TYPE_ETHERNET);
121 }
122
123 /**
124 * Constructs an Ethernet packet containing an ARP payload.
125 *
126 * @return Ethernet packet
127 */
128 private Ethernet constructArpPacket(short pktType) {
129 if (pktType == ARP.OP_REQUEST) {
130
131 return ARP.buildArpRequest(
132 CLIENT_MAC.toBytes(),
133 CLIENT_IP.toOctets(),
134 TARGET_IP.toOctets(),
135 (short) 2);
136 }
137
138 return null;
139 }
140
141 /**
142 * Mocks the CoreService.
143 */
144 private class TestCoreService extends CoreServiceAdapter {
Jian Lieae12362018-04-10 18:48:32 +0900145 @Override
146 public ApplicationId registerApplication(String name) {
147 return new DefaultApplicationId(100, "arpTestApp");
148 }
Jian Li8e7e6cd2018-03-30 13:33:08 +0900149 }
150
151 /**
152 * Mocks the ComponentConfigRegistry.
153 */
154 private class TestConfigService extends ComponentConfigAdapter {
155 }
156
157 /**
Jian Lieae12362018-04-10 18:48:32 +0900158 * Mocks the ClusterService.
159 */
160 private class TestClusterService extends ClusterServiceAdapter {
161 }
162
163 /**
164 * Mocks the LeadershipService.
165 */
166 private class TestLeadershipService extends LeadershipServiceAdapter {
167 }
168
169 /**
170 * Mocks the OpenstackNodeService.
171 */
172 private class TestOpenstackNodeService extends OpenstackNodeServiceAdapter {
173 }
174
175 /**
176 * Mocks the OpenstackFlowRuleService.
177 */
178 private class TestOpenstackFlowRuleService extends OpenstackFlowRuleServiceAdapter {
179 }
180
181 /**
Jian Li8e7e6cd2018-03-30 13:33:08 +0900182 * Mocks the InstancePortService.
183 */
184 private class TestInstancePortService extends InstancePortServiceAdapter {
185
186 @Override
187 public InstancePort instancePort(MacAddress macAddress) {
188 return new TestInstancePort();
189 }
190
191 @Override
192 public InstancePort instancePort(IpAddress ipAddress, String osNetId) {
193 return new TestInstancePort();
194 }
195 }
196
197 /**
198 * Mocks the instance port.
199 */
200 private final class TestInstancePort implements InstancePort {
201
202 @Override
203 public String networkId() {
204 return null;
205 }
206
207 @Override
208 public String portId() {
209 return null;
210 }
211
212 @Override
213 public MacAddress macAddress() {
214 return EXPECTED_MAC;
215 }
216
217 @Override
218 public IpAddress ipAddress() {
219 return null;
220 }
221
222 @Override
223 public DeviceId deviceId() {
224 return null;
225 }
226
227 @Override
228 public PortNumber portNumber() {
229 return null;
230 }
231 }
232
233 /**
234 * Mocks the DefaultPacket context.
235 */
236 private final class TestPacketContext extends DefaultPacketContext {
237 private TestPacketContext(long time, InboundPacket inPkt,
238 OutboundPacket outPkt, boolean block) {
239 super(time, inPkt, outPkt, block);
240 }
241
242 @Override
243 public void send() {
244 // We don't send anything out.
245 }
246 }
247
248 /**
249 * Keeps a reference to the PacketProcessor and verifies the OutboundPackets.
250 */
251 private class TestPacketService extends PacketServiceAdapter {
252 @Override
253 public void addProcessor(PacketProcessor processor, int priority) {
254 packetProcessor = processor;
255 }
256
257 @Override
258 public void emit(OutboundPacket packet) {
259 try {
260 Ethernet eth = Ethernet.deserializer().deserialize(packet.data().array(),
261 0, packet.data().array().length);
262 validatePacket(eth);
263 } catch (Exception e) {
264 fail(e.getMessage());
265 }
266 }
267 }
268
269 /**
270 * Mocks the OpenstackNetworkService.
271 */
272 private class TestOpenstackNetworkService extends OpenstackNetworkServiceAdapter {
273 }
274}