blob: 3a780cfed2ea45b41b3c25e2c14a958957d15df3 [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2014-present Open Networking Laboratory
Thomas Vachuska781d18b2014-10-27 10:31:25 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * 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
Thomas Vachuska781d18b2014-10-27 10:31:25 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * 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.
Thomas Vachuska781d18b2014-10-27 10:31:25 -070015 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.provider.host.impl;
alshabib4a179dc2014-10-17 17:17:01 -070017
Thomas Vachuska27bee092015-06-23 19:03:10 -070018import com.google.common.collect.ImmutableSet;
Madan Jampania3770c32015-12-11 12:07:41 -080019import com.google.common.util.concurrent.MoreExecutors;
20
alshabib4a179dc2014-10-17 17:17:01 -070021import org.junit.After;
22import org.junit.Before;
23import org.junit.Test;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080024import org.onlab.osgi.ComponentContextAdapter;
25import org.onlab.packet.ARP;
26import org.onlab.packet.ChassisId;
27import org.onlab.packet.Ethernet;
Charles Chan5d5e0622015-09-25 13:00:06 -070028import org.onlab.packet.ICMP6;
29import org.onlab.packet.IPv4;
30import org.onlab.packet.IPv6;
31import org.onlab.packet.Ip6Address;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080032import org.onlab.packet.IpAddress;
33import org.onlab.packet.MacAddress;
34import org.onlab.packet.VlanId;
Charles Chan5d5e0622015-09-25 13:00:06 -070035import org.onlab.packet.ndp.NeighborAdvertisement;
36import org.onlab.packet.ndp.NeighborSolicitation;
37import org.onlab.packet.ndp.RouterAdvertisement;
38import org.onlab.packet.ndp.RouterSolicitation;
Thomas Vachuska6519e6f2015-03-11 02:29:31 -070039import org.onosproject.cfg.ComponentConfigAdapter;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -080040import org.onosproject.core.ApplicationId;
41import org.onosproject.core.CoreService;
42import org.onosproject.core.DefaultApplicationId;
Brian O'Connorabafb502014-12-02 22:26:20 -080043import org.onosproject.net.ConnectPoint;
44import org.onosproject.net.DefaultDevice;
45import org.onosproject.net.DefaultHost;
46import org.onosproject.net.DefaultPort;
47import org.onosproject.net.Device;
48import org.onosproject.net.DeviceId;
49import org.onosproject.net.Host;
50import org.onosproject.net.HostId;
51import org.onosproject.net.HostLocation;
52import org.onosproject.net.device.DeviceEvent;
53import org.onosproject.net.device.DeviceListener;
54import org.onosproject.net.device.DeviceServiceAdapter;
55import org.onosproject.net.flow.TrafficTreatment;
56import org.onosproject.net.host.HostDescription;
57import org.onosproject.net.host.HostProvider;
58import org.onosproject.net.host.HostProviderRegistry;
59import org.onosproject.net.host.HostProviderService;
60import org.onosproject.net.host.HostServiceAdapter;
61import org.onosproject.net.packet.DefaultInboundPacket;
62import org.onosproject.net.packet.InboundPacket;
63import org.onosproject.net.packet.OutboundPacket;
64import org.onosproject.net.packet.PacketContext;
65import org.onosproject.net.packet.PacketProcessor;
Thomas Vachuska27bee092015-06-23 19:03:10 -070066import org.onosproject.net.packet.PacketServiceAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080067import org.onosproject.net.provider.AbstractProviderService;
68import org.onosproject.net.provider.ProviderId;
69import org.onosproject.net.topology.Topology;
70import org.onosproject.net.topology.TopologyServiceAdapter;
alshabib4a179dc2014-10-17 17:17:01 -070071
Thomas Vachuska27bee092015-06-23 19:03:10 -070072import java.nio.ByteBuffer;
73import java.util.Collections;
74import java.util.Dictionary;
75import java.util.Hashtable;
76import java.util.Set;
77
78import static org.easymock.EasyMock.*;
Charles Chan5d5e0622015-09-25 13:00:06 -070079import static org.hamcrest.Matchers.is;
Thomas Vachuska27bee092015-06-23 19:03:10 -070080import static org.junit.Assert.*;
81import static org.onlab.packet.VlanId.vlanId;
82import static org.onosproject.net.Device.Type.SWITCH;
83import static org.onosproject.net.DeviceId.deviceId;
84import static org.onosproject.net.HostId.hostId;
85import static org.onosproject.net.PortNumber.portNumber;
86import static org.onosproject.net.device.DeviceEvent.Type.*;
Thomas Vachuska33601602014-11-19 03:32:15 -080087
alshabib4a179dc2014-10-17 17:17:01 -070088public class HostLocationProviderTest {
Charles Chan8b0fdaa2016-02-23 18:35:27 -080089 private static final ProviderId PROVIDER_ID =
90 new ProviderId("of", "org.onosproject.provider.host");
91
alshabib4a179dc2014-10-17 17:17:01 -070092 private static final Integer INPORT = 10;
93 private static final String DEV1 = "of:1";
94 private static final String DEV2 = "of:2";
95 private static final String DEV3 = "of:3";
Charles Chan5d5e0622015-09-25 13:00:06 -070096 private static final String DEV4 = "of:4";
97 private static final String DEV5 = "of:5";
98 private static final String DEV6 = "of:6";
alshabib4a179dc2014-10-17 17:17:01 -070099
Thomas Vachuska33601602014-11-19 03:32:15 -0800100 private static final VlanId VLAN = vlanId();
Charles Chan5d5e0622015-09-25 13:00:06 -0700101
102 // IPv4 Host
alshabib4a179dc2014-10-17 17:17:01 -0700103 private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01");
104 private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff");
105 private static final byte[] IP = new byte[]{10, 0, 0, 1};
Thomas Vachuska33601602014-11-19 03:32:15 -0800106 private static final IpAddress IP_ADDRESS =
107 IpAddress.valueOf(IpAddress.Version.INET, IP);
108 private static final HostLocation LOCATION =
109 new HostLocation(deviceId(DEV1), portNumber(INPORT), 0L);
Thomas Vachuska33601602014-11-19 03:32:15 -0800110 private static final DefaultHost HOST =
Charles Chan8b0fdaa2016-02-23 18:35:27 -0800111 new DefaultHost(PROVIDER_ID, hostId(MAC), MAC,
Thomas Vachuska33601602014-11-19 03:32:15 -0800112 vlanId(VlanId.UNTAGGED), LOCATION,
113 ImmutableSet.of(IP_ADDRESS));
114
Charles Chan5d5e0622015-09-25 13:00:06 -0700115 // IPv6 Host
116 private static final MacAddress MAC2 = MacAddress.valueOf("00:00:22:00:00:02");
117 private static final MacAddress BCMAC2 = MacAddress.valueOf("33:33:00:00:00:01");
118 private static final byte[] IP2 = Ip6Address.valueOf("1000::1").toOctets();
119 private static final IpAddress IP_ADDRESS2 =
120 IpAddress.valueOf(IpAddress.Version.INET6, IP2);
121 private static final HostLocation LOCATION2 =
122 new HostLocation(deviceId(DEV4), portNumber(INPORT), 0L);
123 private static final DefaultHost HOST2 =
Charles Chan8b0fdaa2016-02-23 18:35:27 -0800124 new DefaultHost(PROVIDER_ID, hostId(MAC2), MAC2,
Charles Chan5d5e0622015-09-25 13:00:06 -0700125 vlanId(VlanId.UNTAGGED), LOCATION2,
126 ImmutableSet.of(IP_ADDRESS2));
127
Thomas Vachuska33601602014-11-19 03:32:15 -0800128 private static final ComponentContextAdapter CTX_FOR_REMOVE =
129 new ComponentContextAdapter() {
130 @Override
131 public Dictionary getProperties() {
132 Hashtable<String, String> props = new Hashtable<>();
133 props.put("hostRemovalEnabled", "true");
134 return props;
135 }
136 };
137
138 public static final ComponentContextAdapter CTX_FOR_NO_REMOVE =
139 new ComponentContextAdapter() {
140 @Override
141 public Dictionary getProperties() {
142 return new Hashtable();
143 }
144 };
145
alshabib4a179dc2014-10-17 17:17:01 -0700146 private final HostLocationProvider provider = new HostLocationProvider();
Thomas Vachuska33601602014-11-19 03:32:15 -0800147 private final TestHostRegistry hostRegistry = new TestHostRegistry();
alshabib4a179dc2014-10-17 17:17:01 -0700148 private final TestTopologyService topoService = new TestTopologyService();
Thomas Vachuska33601602014-11-19 03:32:15 -0800149 private final TestDeviceService deviceService = new TestDeviceService();
150 private final TestHostService hostService = new TestHostService();
alshabib4a179dc2014-10-17 17:17:01 -0700151 private final TestPacketService packetService = new TestPacketService();
152
153 private PacketProcessor testProcessor;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800154 private CoreService coreService;
alshabib4a179dc2014-10-17 17:17:01 -0700155 private TestHostProviderService providerService;
156
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800157 private ApplicationId appId =
158 new DefaultApplicationId(100, "org.onosproject.provider.host");
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800159
alshabib4a179dc2014-10-17 17:17:01 -0700160 @Before
161 public void setUp() {
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800162
163 coreService = createMock(CoreService.class);
164 expect(coreService.registerApplication(appId.name()))
Thomas Vachuska27bee092015-06-23 19:03:10 -0700165 .andReturn(appId).anyTimes();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800166 replay(coreService);
167
Thomas Vachuska6519e6f2015-03-11 02:29:31 -0700168 provider.cfgService = new ComponentConfigAdapter();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800169 provider.coreService = coreService;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800170
Thomas Vachuska33601602014-11-19 03:32:15 -0800171 provider.providerRegistry = hostRegistry;
alshabib4a179dc2014-10-17 17:17:01 -0700172 provider.topologyService = topoService;
Pavlin Radoslavovd6612f92015-02-23 13:53:32 -0800173 provider.packetService = packetService;
Thomas Vachuska33601602014-11-19 03:32:15 -0800174 provider.deviceService = deviceService;
175 provider.hostService = hostService;
alshabib4a179dc2014-10-17 17:17:01 -0700176
Thomas Vachuska33601602014-11-19 03:32:15 -0800177 provider.activate(CTX_FOR_NO_REMOVE);
Madan Jampania3770c32015-12-11 12:07:41 -0800178
179 provider.eventHandler = MoreExecutors.newDirectExecutorService();
alshabib4a179dc2014-10-17 17:17:01 -0700180 }
181
182 @Test
183 public void basics() {
184 assertNotNull("registration expected", providerService);
185 assertEquals("incorrect provider", provider, providerService.provider());
186 }
187
188 @Test
189 public void events() {
190 // new host
Charles Chan5d5e0622015-09-25 13:00:06 -0700191 testProcessor.process(new TestArpPacketContext(DEV1));
alshabib4a179dc2014-10-17 17:17:01 -0700192 assertNotNull("new host expected", providerService.added);
193 assertNull("host motion unexpected", providerService.moved);
194
195 // the host moved to new switch
Charles Chan5d5e0622015-09-25 13:00:06 -0700196 testProcessor.process(new TestArpPacketContext(DEV2));
alshabib4a179dc2014-10-17 17:17:01 -0700197 assertNotNull("host motion expected", providerService.moved);
198
199 // the host was misheard on a spine
Charles Chan5d5e0622015-09-25 13:00:06 -0700200 testProcessor.process(new TestArpPacketContext(DEV3));
201 assertNull("host misheard on spine switch", providerService.spine);
202
203 providerService.clear();
204
205 // new host
Jonathan Hartb35540a2015-11-17 09:30:56 -0800206 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan5d5e0622015-09-25 13:00:06 -0700207 assertNotNull("new host expected", providerService.added);
208 assertNull("host motion unexpected", providerService.moved);
209
210 // the host moved to new switch
Jonathan Hartb35540a2015-11-17 09:30:56 -0800211 testProcessor.process(new TestNaPacketContext(DEV5));
Charles Chan5d5e0622015-09-25 13:00:06 -0700212 assertNotNull("host motion expected", providerService.moved);
213
214 // the host was misheard on a spine
Jonathan Hartb35540a2015-11-17 09:30:56 -0800215 testProcessor.process(new TestNaPacketContext(DEV6));
alshabib4a179dc2014-10-17 17:17:01 -0700216 assertNull("host misheard on spine switch", providerService.spine);
217 }
218
Thomas Vachuska33601602014-11-19 03:32:15 -0800219 @Test
220 public void removeHostByDeviceRemove() {
221 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700222 testProcessor.process(new TestArpPacketContext(DEV1));
Jonathan Hartb35540a2015-11-17 09:30:56 -0800223 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan5d5e0622015-09-25 13:00:06 -0700224
Thomas Vachuska33601602014-11-19 03:32:15 -0800225 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
226 "m", "h", "s", "n", new ChassisId(0L));
227 deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
228 assertEquals("incorrect remove count", 1, providerService.removeCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700229
230 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
231 "m", "h", "s", "n", new ChassisId(0L));
232 deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
233 assertEquals("incorrect remove count", 2, providerService.removeCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800234 }
235
236 @Test
237 public void removeHostByDeviceOffline() {
238 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700239 testProcessor.process(new TestArpPacketContext(DEV1));
240 testProcessor.process(new TestArpPacketContext(DEV4));
241
Thomas Vachuska33601602014-11-19 03:32:15 -0800242 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
243 "m", "h", "s", "n", new ChassisId(0L));
244 deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
245 assertEquals("incorrect remove count", 1, providerService.removeCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700246
247 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
248 "m", "h", "s", "n", new ChassisId(0L));
249 deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
250 assertEquals("incorrect remove count", 2, providerService.removeCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800251 }
252
253 @Test
254 public void removeHostByDevicePortDown() {
255 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700256 testProcessor.process(new TestArpPacketContext(DEV1));
257 testProcessor.process(new TestArpPacketContext(DEV4));
258
Thomas Vachuska33601602014-11-19 03:32:15 -0800259 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
260 "m", "h", "s", "n", new ChassisId(0L));
261 deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
Charles Chan5d5e0622015-09-25 13:00:06 -0700262 new DefaultPort(device, portNumber(INPORT), false)));
Thomas Vachuska33601602014-11-19 03:32:15 -0800263 assertEquals("incorrect remove count", 1, providerService.removeCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700264
265 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
266 "m", "h", "s", "n", new ChassisId(0L));
267 deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
268 new DefaultPort(device, portNumber(INPORT), false)));
269 assertEquals("incorrect remove count", 2, providerService.removeCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800270 }
271
Charles Chan5d5e0622015-09-25 13:00:06 -0700272 /**
273 * When receiving ARP, updates location and IP.
274 */
275 @Test
276 public void testReceiveArp() {
277 testProcessor.process(new TestArpPacketContext(DEV1));
278 HostDescription descr = providerService.added;
279 assertThat(descr.location(), is(LOCATION));
280 assertThat(descr.hwAddress(), is(MAC));
281 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS));
282 assertThat(descr.vlan(), is(VLAN));
283 }
284
285 /**
286 * When receiving IPv4, updates location only.
287 */
288 @Test
289 public void testReceiveIpv4() {
290 testProcessor.process(new TestIpv4PacketContext(DEV1));
291 HostDescription descr = providerService.added;
292 assertThat(descr.location(), is(LOCATION));
293 assertThat(descr.hwAddress(), is(MAC));
294 assertThat(descr.ipAddress().size(), is(0));
295 assertThat(descr.vlan(), is(VLAN));
296 }
297
298 /**
299 * When receiving NeighborAdvertisement, updates location and IP.
300 */
301 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800302 public void testReceiveNa() {
303 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan5d5e0622015-09-25 13:00:06 -0700304 assertNotNull(providerService.added);
305 HostDescription descr = providerService.added;
306 assertThat(descr.location(), is(LOCATION2));
307 assertThat(descr.hwAddress(), is(MAC2));
308 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS2));
309 assertThat(descr.vlan(), is(VLAN));
310 }
311
312 /**
313 * When receiving NeighborSolicitation, updates location and IP.
314 */
315 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800316 public void testReceiveNs() {
317 testProcessor.process(new TestNsPacketContext(DEV4));
Charles Chan5d5e0622015-09-25 13:00:06 -0700318 HostDescription descr = providerService.added;
319 assertThat(descr.location(), is(LOCATION2));
320 assertThat(descr.hwAddress(), is(MAC2));
321 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS2));
322 assertThat(descr.vlan(), is(VLAN));
323 }
324
325 /**
326 * When receiving RouterAdvertisement, ignores it.
327 */
328 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800329 public void testReceivesRa() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700330 testProcessor.process(new TestRAPacketContext(DEV4));
331 assertNull(providerService.added);
332 }
333
334 /**
335 * When receiving RouterSolicitation, ignores it.
336 */
337 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800338 public void testReceiveRs() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700339 testProcessor.process(new TestRSPacketContext(DEV4));
340 assertNull(providerService.added);
341 }
342
343 /**
344 * When receiving Duplicate Address Detection (DAD), ignores it.
345 */
346 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800347 public void testReceiveDad() {
348 testProcessor.process(new TestDadPacketContext(DEV4));
Charles Chan5d5e0622015-09-25 13:00:06 -0700349 assertNull(providerService.added);
350 }
351
352 /**
353 * When receiving IPv6 multicast packet, ignores it.
354 */
355 @Test
356 public void testReceiveIpv6Multicast() {
357 testProcessor.process(new TestIpv6McastPacketContext(DEV4));
358 assertNull(providerService.added);
359 }
360
361 /**
362 * When receiving IPv6 unicast packet, updates location only.
363 */
364 @Test
365 public void testReceiveIpv6Unicast() {
366 testProcessor.process(new TestIpv6PacketContext(DEV4));
367 assertNotNull(providerService.added);
368 HostDescription descr = providerService.added;
369 assertThat(descr.location(), is(LOCATION2));
370 assertThat(descr.hwAddress(), is(MAC2));
371 assertThat(descr.ipAddress().size(), is(0));
372 assertThat(descr.vlan(), is(VLAN));
373 }
Thomas Vachuska33601602014-11-19 03:32:15 -0800374
alshabib4a179dc2014-10-17 17:17:01 -0700375 @After
376 public void tearDown() {
377 provider.deactivate();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800378 provider.coreService = null;
alshabib4a179dc2014-10-17 17:17:01 -0700379 provider.providerRegistry = null;
alshabib4a179dc2014-10-17 17:17:01 -0700380 }
381
382 private class TestHostRegistry implements HostProviderRegistry {
383
384 @Override
385 public HostProviderService register(HostProvider provider) {
386 providerService = new TestHostProviderService(provider);
387 return providerService;
388 }
389
390 @Override
391 public void unregister(HostProvider provider) {
392 }
393
394 @Override
395 public Set<ProviderId> getProviders() {
396 return null;
397 }
398
399 }
400
401 private class TestHostProviderService
402 extends AbstractProviderService<HostProvider>
403 implements HostProviderService {
404
Charles Chan5d5e0622015-09-25 13:00:06 -0700405 HostDescription added = null;
406 HostDescription moved = null;
407 HostDescription spine = null;
Thomas Vachuska33601602014-11-19 03:32:15 -0800408 public int removeCount;
alshabib4a179dc2014-10-17 17:17:01 -0700409
Charles Chan5d5e0622015-09-25 13:00:06 -0700410 public void clear() {
411 added = null;
412 moved = null;
413 spine = null;
414 removeCount = 0;
415 }
416
alshabib4a179dc2014-10-17 17:17:01 -0700417 protected TestHostProviderService(HostProvider provider) {
418 super(provider);
419 }
420
421 @Override
Brian O'Connorf107bd72015-09-21 15:31:03 -0700422 public void hostDetected(HostId hostId, HostDescription hostDescription, boolean replaceIps) {
alshabib4a179dc2014-10-17 17:17:01 -0700423 if (added == null) {
Charles Chan5d5e0622015-09-25 13:00:06 -0700424 added = hostDescription;
HIGUCHI Yuta703a5af2015-11-18 23:43:50 -0800425 } else if ((moved == null) && hostDescription != added) {
Charles Chan5d5e0622015-09-25 13:00:06 -0700426 moved = hostDescription;
alshabib4a179dc2014-10-17 17:17:01 -0700427 } else {
Charles Chan5d5e0622015-09-25 13:00:06 -0700428 spine = hostDescription;
alshabib4a179dc2014-10-17 17:17:01 -0700429 }
430 }
431
432 @Override
433 public void hostVanished(HostId hostId) {
Thomas Vachuska33601602014-11-19 03:32:15 -0800434 removeCount++;
alshabib4a179dc2014-10-17 17:17:01 -0700435 }
436
samanwita palc40e5ed2015-09-24 11:01:51 -0700437 @Override
438 public void removeIpFromHost(HostId hostId, IpAddress ipAddress) {
439 }
440
alshabib4a179dc2014-10-17 17:17:01 -0700441 }
442
Thomas Vachuska27bee092015-06-23 19:03:10 -0700443 private class TestPacketService extends PacketServiceAdapter {
alshabib4a179dc2014-10-17 17:17:01 -0700444 @Override
445 public void addProcessor(PacketProcessor processor, int priority) {
446 testProcessor = processor;
447 }
alshabib4a179dc2014-10-17 17:17:01 -0700448 }
449
alshabib4a179dc2014-10-17 17:17:01 -0700450 private class TestTopologyService extends TopologyServiceAdapter {
451 @Override
452 public boolean isInfrastructure(Topology topology,
453 ConnectPoint connectPoint) {
454 //simulate DPID3 as an infrastructure switch
Charles Chan5d5e0622015-09-25 13:00:06 -0700455 if ((connectPoint.deviceId()).equals(deviceId(DEV3)) ||
456 connectPoint.deviceId().equals(deviceId(DEV6))) {
alshabib4a179dc2014-10-17 17:17:01 -0700457 return true;
458 }
459 return false;
460 }
461 }
462
Charles Chan5d5e0622015-09-25 13:00:06 -0700463 /**
464 * Generates ARP packet.
465 */
466 private class TestArpPacketContext implements PacketContext {
alshabib4a179dc2014-10-17 17:17:01 -0700467 private final String deviceId;
468
Charles Chan5d5e0622015-09-25 13:00:06 -0700469 public TestArpPacketContext(String deviceId) {
alshabib4a179dc2014-10-17 17:17:01 -0700470 this.deviceId = deviceId;
471 }
472
473 @Override
474 public long time() {
475 return 0;
476 }
477
478 @Override
479 public InboundPacket inPacket() {
480 ARP arp = new ARP();
481 arp.setSenderProtocolAddress(IP)
482 .setSenderHardwareAddress(MAC.toBytes())
483 .setTargetHardwareAddress(BCMAC.toBytes())
484 .setTargetProtocolAddress(IP);
485
486 Ethernet eth = new Ethernet();
487 eth.setEtherType(Ethernet.TYPE_ARP)
488 .setVlanID(VLAN.toShort())
489 .setSourceMACAddress(MAC.toBytes())
Yuta HIGUCHI3e848a82014-11-02 20:19:42 -0800490 .setDestinationMACAddress(BCMAC)
alshabib4a179dc2014-10-17 17:17:01 -0700491 .setPayload(arp);
Thomas Vachuska33601602014-11-19 03:32:15 -0800492 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
493 portNumber(INPORT));
alshabib4a179dc2014-10-17 17:17:01 -0700494 return new DefaultInboundPacket(receivedFrom, eth,
495 ByteBuffer.wrap(eth.serialize()));
496 }
497
498 @Override
499 public OutboundPacket outPacket() {
500 return null;
501 }
502
503 @Override
504 public TrafficTreatment.Builder treatmentBuilder() {
505 return null;
506 }
507
508 @Override
509 public void send() {
510
511 }
512
513 @Override
514 public boolean block() {
515 return false;
516 }
517
518 @Override
519 public boolean isHandled() {
520 return false;
521 }
522 }
Thomas Vachuska33601602014-11-19 03:32:15 -0800523
Charles Chan5d5e0622015-09-25 13:00:06 -0700524 /**
525 * Generates IPv6 Unicast packet.
526 */
527 private class TestIpv4PacketContext implements PacketContext {
528 private final String deviceId;
529
530 public TestIpv4PacketContext(String deviceId) {
531 this.deviceId = deviceId;
532 }
533
534 @Override
535 public long time() {
536 return 0;
537 }
538
539 @Override
540 public InboundPacket inPacket() {
541 IPv4 ipv4 = new IPv4();
542 ipv4.setDestinationAddress("10.0.0.1");
543 ipv4.setSourceAddress(IP_ADDRESS.toString());
544 Ethernet eth = new Ethernet();
545 eth.setEtherType(Ethernet.TYPE_IPV4)
546 .setVlanID(VLAN.toShort())
547 .setSourceMACAddress(MAC)
548 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
549 .setPayload(ipv4);
550 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
551 portNumber(INPORT));
552 return new DefaultInboundPacket(receivedFrom, eth,
553 ByteBuffer.wrap(eth.serialize()));
554 }
555
556 @Override
557 public OutboundPacket outPacket() {
558 return null;
559 }
560
561 @Override
562 public TrafficTreatment.Builder treatmentBuilder() {
563 return null;
564 }
565
566 @Override
567 public void send() {
568
569 }
570
571 @Override
572 public boolean block() {
573 return false;
574 }
575
576 @Override
577 public boolean isHandled() {
578 return false;
579 }
580 }
581
582 /**
583 * Generates NeighborAdvertisement packet.
584 */
Jonathan Hartb35540a2015-11-17 09:30:56 -0800585 private class TestNaPacketContext implements PacketContext {
Charles Chan5d5e0622015-09-25 13:00:06 -0700586 private final String deviceId;
587
Jonathan Hartb35540a2015-11-17 09:30:56 -0800588 public TestNaPacketContext(String deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -0700589 this.deviceId = deviceId;
590 }
591
592 @Override
593 public long time() {
594 return 0;
595 }
596
597 @Override
598 public InboundPacket inPacket() {
599 NeighborAdvertisement na = new NeighborAdvertisement();
600 ICMP6 icmp6 = new ICMP6();
601 icmp6.setPayload(na);
602 IPv6 ipv6 = new IPv6();
603 ipv6.setPayload(icmp6);
604 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
605 ipv6.setSourceAddress(IP2);
606 Ethernet eth = new Ethernet();
607 eth.setEtherType(Ethernet.TYPE_IPV6)
608 .setVlanID(VLAN.toShort())
609 .setSourceMACAddress(MAC2.toBytes())
610 .setDestinationMACAddress(BCMAC2)
611 .setPayload(ipv6);
612 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
613 portNumber(INPORT));
614 return new DefaultInboundPacket(receivedFrom, eth,
615 ByteBuffer.wrap(eth.serialize()));
616 }
617
618 @Override
619 public OutboundPacket outPacket() {
620 return null;
621 }
622
623 @Override
624 public TrafficTreatment.Builder treatmentBuilder() {
625 return null;
626 }
627
628 @Override
629 public void send() {
630
631 }
632
633 @Override
634 public boolean block() {
635 return false;
636 }
637
638 @Override
639 public boolean isHandled() {
640 return false;
641 }
642 }
643
644 /**
645 * Generates NeighborSolicitation packet.
646 */
Jonathan Hartb35540a2015-11-17 09:30:56 -0800647 private class TestNsPacketContext implements PacketContext {
Charles Chan5d5e0622015-09-25 13:00:06 -0700648 private final String deviceId;
649
Jonathan Hartb35540a2015-11-17 09:30:56 -0800650 public TestNsPacketContext(String deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -0700651 this.deviceId = deviceId;
652 }
653
654 @Override
655 public long time() {
656 return 0;
657 }
658
659 @Override
660 public InboundPacket inPacket() {
661 NeighborSolicitation ns = new NeighborSolicitation();
662 ICMP6 icmp6 = new ICMP6();
663 icmp6.setPayload(ns);
664 IPv6 ipv6 = new IPv6();
665 ipv6.setPayload(icmp6);
666 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1:ff00:0000").toOctets());
667 ipv6.setSourceAddress(IP2);
668 Ethernet eth = new Ethernet();
669 eth.setEtherType(Ethernet.TYPE_IPV6)
670 .setVlanID(VLAN.toShort())
671 .setSourceMACAddress(MAC2.toBytes())
672 .setDestinationMACAddress(BCMAC2)
673 .setPayload(ipv6);
674 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
675 portNumber(INPORT));
676 return new DefaultInboundPacket(receivedFrom, eth,
677 ByteBuffer.wrap(eth.serialize()));
678 }
679
680 @Override
681 public OutboundPacket outPacket() {
682 return null;
683 }
684
685 @Override
686 public TrafficTreatment.Builder treatmentBuilder() {
687 return null;
688 }
689
690 @Override
691 public void send() {
692
693 }
694
695 @Override
696 public boolean block() {
697 return false;
698 }
699
700 @Override
701 public boolean isHandled() {
702 return false;
703 }
704 }
705
706 /**
707 * Generates Duplicate Address Detection packet.
708 */
Jonathan Hartb35540a2015-11-17 09:30:56 -0800709 private class TestDadPacketContext implements PacketContext {
Charles Chan5d5e0622015-09-25 13:00:06 -0700710 private final String deviceId;
711
Jonathan Hartb35540a2015-11-17 09:30:56 -0800712 public TestDadPacketContext(String deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -0700713 this.deviceId = deviceId;
714 }
715
716 @Override
717 public long time() {
718 return 0;
719 }
720
721 @Override
722 public InboundPacket inPacket() {
723 NeighborSolicitation ns = new NeighborSolicitation();
724 ICMP6 icmp6 = new ICMP6();
725 icmp6.setPayload(ns);
726 IPv6 ipv6 = new IPv6();
727 ipv6.setPayload(icmp6);
728 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
729 ipv6.setSourceAddress(Ip6Address.valueOf("::").toOctets());
730 Ethernet eth = new Ethernet();
731 eth.setEtherType(Ethernet.TYPE_IPV6)
732 .setVlanID(VLAN.toShort())
733 .setSourceMACAddress(MAC2.toBytes())
734 .setDestinationMACAddress(BCMAC2)
735 .setPayload(ipv6);
736 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
737 portNumber(INPORT));
738 return new DefaultInboundPacket(receivedFrom, eth,
739 ByteBuffer.wrap(eth.serialize()));
740 }
741
742 @Override
743 public OutboundPacket outPacket() {
744 return null;
745 }
746
747 @Override
748 public TrafficTreatment.Builder treatmentBuilder() {
749 return null;
750 }
751
752 @Override
753 public void send() {
754
755 }
756
757 @Override
758 public boolean block() {
759 return false;
760 }
761
762 @Override
763 public boolean isHandled() {
764 return false;
765 }
766 }
767
768 /**
769 * Generates Router Solicitation packet.
770 */
771 private class TestRSPacketContext implements PacketContext {
772 private final String deviceId;
773
774 public TestRSPacketContext(String deviceId) {
775 this.deviceId = deviceId;
776 }
777
778 @Override
779 public long time() {
780 return 0;
781 }
782
783 @Override
784 public InboundPacket inPacket() {
785 RouterSolicitation ns = new RouterSolicitation();
786 ICMP6 icmp6 = new ICMP6();
787 icmp6.setPayload(ns);
788 IPv6 ipv6 = new IPv6();
789 ipv6.setPayload(icmp6);
790 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::2").toOctets());
791 ipv6.setSourceAddress(Ip6Address.valueOf("::").toOctets());
792 Ethernet eth = new Ethernet();
793 eth.setEtherType(Ethernet.TYPE_IPV6)
794 .setVlanID(VLAN.toShort())
795 .setSourceMACAddress(MAC2.toBytes())
796 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:02"))
797 .setPayload(ipv6);
798 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
799 portNumber(INPORT));
800 return new DefaultInboundPacket(receivedFrom, eth,
801 ByteBuffer.wrap(eth.serialize()));
802 }
803
804 @Override
805 public OutboundPacket outPacket() {
806 return null;
807 }
808
809 @Override
810 public TrafficTreatment.Builder treatmentBuilder() {
811 return null;
812 }
813
814 @Override
815 public void send() {
816
817 }
818
819 @Override
820 public boolean block() {
821 return false;
822 }
823
824 @Override
825 public boolean isHandled() {
826 return false;
827 }
828 }
829
830 /**
831 * Generates Router Advertisement packet.
832 */
833 private class TestRAPacketContext implements PacketContext {
834 private final String deviceId;
835
836 public TestRAPacketContext(String deviceId) {
837 this.deviceId = deviceId;
838 }
839
840 @Override
841 public long time() {
842 return 0;
843 }
844
845 @Override
846 public InboundPacket inPacket() {
847 RouterAdvertisement ns = new RouterAdvertisement();
848 ICMP6 icmp6 = new ICMP6();
849 icmp6.setPayload(ns);
850 IPv6 ipv6 = new IPv6();
851 ipv6.setPayload(icmp6);
852 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
853 ipv6.setSourceAddress(IP2);
854 Ethernet eth = new Ethernet();
855 eth.setEtherType(Ethernet.TYPE_IPV6)
856 .setVlanID(VLAN.toShort())
857 .setSourceMACAddress(MAC2.toBytes())
858 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
859 .setPayload(ipv6);
860 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
861 portNumber(INPORT));
862 return new DefaultInboundPacket(receivedFrom, eth,
863 ByteBuffer.wrap(eth.serialize()));
864 }
865
866 @Override
867 public OutboundPacket outPacket() {
868 return null;
869 }
870
871 @Override
872 public TrafficTreatment.Builder treatmentBuilder() {
873 return null;
874 }
875
876 @Override
877 public void send() {
878
879 }
880
881 @Override
882 public boolean block() {
883 return false;
884 }
885
886 @Override
887 public boolean isHandled() {
888 return false;
889 }
890 }
891
892 /**
893 * Generates IPv6 Multicast packet.
894 */
895 private class TestIpv6McastPacketContext implements PacketContext {
896 private final String deviceId;
897
898 public TestIpv6McastPacketContext(String deviceId) {
899 this.deviceId = deviceId;
900 }
901
902 @Override
903 public long time() {
904 return 0;
905 }
906
907 @Override
908 public InboundPacket inPacket() {
909 IPv6 ipv6 = new IPv6();
910 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
911 ipv6.setSourceAddress(IP2);
912 Ethernet eth = new Ethernet();
913 eth.setEtherType(Ethernet.TYPE_IPV6)
914 .setVlanID(VLAN.toShort())
915 .setSourceMACAddress(MAC2.toBytes())
916 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
917 .setPayload(ipv6);
918 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
919 portNumber(INPORT));
920 return new DefaultInboundPacket(receivedFrom, eth,
921 ByteBuffer.wrap(eth.serialize()));
922 }
923
924 @Override
925 public OutboundPacket outPacket() {
926 return null;
927 }
928
929 @Override
930 public TrafficTreatment.Builder treatmentBuilder() {
931 return null;
932 }
933
934 @Override
935 public void send() {
936
937 }
938
939 @Override
940 public boolean block() {
941 return false;
942 }
943
944 @Override
945 public boolean isHandled() {
946 return false;
947 }
948 }
949
950 /**
951 * Generates IPv6 Unicast packet.
952 */
953 private class TestIpv6PacketContext implements PacketContext {
954 private final String deviceId;
955
956 public TestIpv6PacketContext(String deviceId) {
957 this.deviceId = deviceId;
958 }
959
960 @Override
961 public long time() {
962 return 0;
963 }
964
965 @Override
966 public InboundPacket inPacket() {
967 IPv6 ipv6 = new IPv6();
968 ipv6.setDestinationAddress(Ip6Address.valueOf("1000::1").toOctets());
969 ipv6.setSourceAddress(IP2);
970 Ethernet eth = new Ethernet();
971 eth.setEtherType(Ethernet.TYPE_IPV6)
972 .setVlanID(VLAN.toShort())
973 .setSourceMACAddress(MAC2)
974 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
975 .setPayload(ipv6);
976 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
977 portNumber(INPORT));
978 return new DefaultInboundPacket(receivedFrom, eth,
979 ByteBuffer.wrap(eth.serialize()));
980 }
981
982 @Override
983 public OutboundPacket outPacket() {
984 return null;
985 }
986
987 @Override
988 public TrafficTreatment.Builder treatmentBuilder() {
989 return null;
990 }
991
992 @Override
993 public void send() {
994
995 }
996
997 @Override
998 public boolean block() {
999 return false;
1000 }
1001
1002 @Override
1003 public boolean isHandled() {
1004 return false;
1005 }
1006 }
1007
Thomas Vachuska33601602014-11-19 03:32:15 -08001008 private class TestDeviceService extends DeviceServiceAdapter {
1009 private DeviceListener listener;
1010
1011 @Override
1012 public void addListener(DeviceListener listener) {
1013 this.listener = listener;
1014 }
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -08001015
1016 @Override
1017 public Iterable<Device> getDevices() {
1018 return Collections.emptyList();
1019 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001020 }
1021
1022 private class TestHostService extends HostServiceAdapter {
1023 @Override
1024 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
Charles Chan5d5e0622015-09-25 13:00:06 -07001025 ConnectPoint cp1 = new ConnectPoint(deviceId(DEV1), portNumber(INPORT));
1026 ConnectPoint cp2 = new ConnectPoint(deviceId(DEV4), portNumber(INPORT));
1027 if (connectPoint.equals(cp1)) {
1028 return ImmutableSet.of(HOST);
1029 } else if (connectPoint.equals(cp2)) {
1030 return ImmutableSet.of(HOST2);
1031 } else {
1032 return ImmutableSet.of();
1033 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001034 }
1035
1036 @Override
1037 public Set<Host> getConnectedHosts(DeviceId deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -07001038 if (deviceId.equals(deviceId(DEV1))) {
1039 return ImmutableSet.of(HOST);
1040 } else if (deviceId.equals(deviceId(DEV4))) {
1041 return ImmutableSet.of(HOST2);
1042 } else {
1043 return ImmutableSet.of();
1044 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001045 }
1046
1047 }
alshabib4a179dc2014-10-17 17:17:01 -07001048}