blob: 10a12abad88f0ea0043cf3163719fabebccf87ef [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;
Charles Chan420e7372016-11-17 10:58:17 -080019import com.google.common.collect.Lists;
20import com.google.common.collect.Sets;
Madan Jampania3770c32015-12-11 12:07:41 -080021import com.google.common.util.concurrent.MoreExecutors;
22
alshabib4a179dc2014-10-17 17:17:01 -070023import org.junit.After;
24import org.junit.Before;
25import org.junit.Test;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080026import org.onlab.osgi.ComponentContextAdapter;
27import org.onlab.packet.ARP;
28import org.onlab.packet.ChassisId;
Charles Chane6067892016-11-17 10:23:46 -080029import org.onlab.packet.DHCP;
30import org.onlab.packet.DHCPOption;
31import org.onlab.packet.DHCPPacketType;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080032import org.onlab.packet.Ethernet;
Charles Chane6067892016-11-17 10:23:46 -080033import org.onlab.packet.ICMP;
Charles Chan5d5e0622015-09-25 13:00:06 -070034import org.onlab.packet.ICMP6;
35import org.onlab.packet.IPv4;
36import org.onlab.packet.IPv6;
Charles Chane6067892016-11-17 10:23:46 -080037import org.onlab.packet.Ip4Address;
Charles Chan5d5e0622015-09-25 13:00:06 -070038import org.onlab.packet.Ip6Address;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080039import org.onlab.packet.IpAddress;
40import org.onlab.packet.MacAddress;
Charles Chane6067892016-11-17 10:23:46 -080041import org.onlab.packet.UDP;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080042import org.onlab.packet.VlanId;
Charles Chan5d5e0622015-09-25 13:00:06 -070043import org.onlab.packet.ndp.NeighborAdvertisement;
44import org.onlab.packet.ndp.NeighborSolicitation;
45import org.onlab.packet.ndp.RouterAdvertisement;
46import org.onlab.packet.ndp.RouterSolicitation;
Thomas Vachuska6519e6f2015-03-11 02:29:31 -070047import org.onosproject.cfg.ComponentConfigAdapter;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -080048import org.onosproject.core.ApplicationId;
49import org.onosproject.core.CoreService;
50import org.onosproject.core.DefaultApplicationId;
Brian O'Connorabafb502014-12-02 22:26:20 -080051import org.onosproject.net.ConnectPoint;
52import org.onosproject.net.DefaultDevice;
53import org.onosproject.net.DefaultHost;
54import org.onosproject.net.DefaultPort;
55import org.onosproject.net.Device;
56import org.onosproject.net.DeviceId;
57import org.onosproject.net.Host;
58import org.onosproject.net.HostId;
59import org.onosproject.net.HostLocation;
60import org.onosproject.net.device.DeviceEvent;
61import org.onosproject.net.device.DeviceListener;
62import org.onosproject.net.device.DeviceServiceAdapter;
63import org.onosproject.net.flow.TrafficTreatment;
64import org.onosproject.net.host.HostDescription;
65import org.onosproject.net.host.HostProvider;
66import org.onosproject.net.host.HostProviderRegistry;
67import org.onosproject.net.host.HostProviderService;
68import org.onosproject.net.host.HostServiceAdapter;
69import org.onosproject.net.packet.DefaultInboundPacket;
70import org.onosproject.net.packet.InboundPacket;
71import org.onosproject.net.packet.OutboundPacket;
72import org.onosproject.net.packet.PacketContext;
73import org.onosproject.net.packet.PacketProcessor;
Thomas Vachuska27bee092015-06-23 19:03:10 -070074import org.onosproject.net.packet.PacketServiceAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080075import org.onosproject.net.provider.AbstractProviderService;
76import org.onosproject.net.provider.ProviderId;
77import org.onosproject.net.topology.Topology;
78import org.onosproject.net.topology.TopologyServiceAdapter;
alshabib4a179dc2014-10-17 17:17:01 -070079
Thomas Vachuska27bee092015-06-23 19:03:10 -070080import java.nio.ByteBuffer;
81import java.util.Collections;
82import java.util.Dictionary;
83import java.util.Hashtable;
Charles Chan420e7372016-11-17 10:58:17 -080084import java.util.List;
Thomas Vachuska27bee092015-06-23 19:03:10 -070085import java.util.Set;
86
87import static org.easymock.EasyMock.*;
Charles Chan5d5e0622015-09-25 13:00:06 -070088import static org.hamcrest.Matchers.is;
Thomas Vachuska27bee092015-06-23 19:03:10 -070089import static org.junit.Assert.*;
90import static org.onlab.packet.VlanId.vlanId;
91import static org.onosproject.net.Device.Type.SWITCH;
92import static org.onosproject.net.DeviceId.deviceId;
93import static org.onosproject.net.HostId.hostId;
94import static org.onosproject.net.PortNumber.portNumber;
95import static org.onosproject.net.device.DeviceEvent.Type.*;
Thomas Vachuska33601602014-11-19 03:32:15 -080096
alshabib4a179dc2014-10-17 17:17:01 -070097public class HostLocationProviderTest {
Charles Chan8b0fdaa2016-02-23 18:35:27 -080098 private static final ProviderId PROVIDER_ID =
99 new ProviderId("of", "org.onosproject.provider.host");
100
alshabib4a179dc2014-10-17 17:17:01 -0700101 private static final Integer INPORT = 10;
Charles Chane6067892016-11-17 10:23:46 -0800102 private static final Integer INPORT2 = 11;
alshabib4a179dc2014-10-17 17:17:01 -0700103 private static final String DEV1 = "of:1";
104 private static final String DEV2 = "of:2";
105 private static final String DEV3 = "of:3";
Charles Chan5d5e0622015-09-25 13:00:06 -0700106 private static final String DEV4 = "of:4";
107 private static final String DEV5 = "of:5";
108 private static final String DEV6 = "of:6";
alshabib4a179dc2014-10-17 17:17:01 -0700109
Thomas Vachuska33601602014-11-19 03:32:15 -0800110 private static final VlanId VLAN = vlanId();
Charles Chan5d5e0622015-09-25 13:00:06 -0700111
112 // IPv4 Host
alshabib4a179dc2014-10-17 17:17:01 -0700113 private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01");
114 private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff");
115 private static final byte[] IP = new byte[]{10, 0, 0, 1};
Thomas Vachuska33601602014-11-19 03:32:15 -0800116 private static final IpAddress IP_ADDRESS =
117 IpAddress.valueOf(IpAddress.Version.INET, IP);
118 private static final HostLocation LOCATION =
119 new HostLocation(deviceId(DEV1), portNumber(INPORT), 0L);
Thomas Vachuska33601602014-11-19 03:32:15 -0800120 private static final DefaultHost HOST =
Charles Chan8b0fdaa2016-02-23 18:35:27 -0800121 new DefaultHost(PROVIDER_ID, hostId(MAC), MAC,
Charles Chane6067892016-11-17 10:23:46 -0800122 VLAN, LOCATION,
123 ImmutableSet.of(IP_ADDRESS));
Thomas Vachuska33601602014-11-19 03:32:15 -0800124
Charles Chan5d5e0622015-09-25 13:00:06 -0700125 // IPv6 Host
126 private static final MacAddress MAC2 = MacAddress.valueOf("00:00:22:00:00:02");
127 private static final MacAddress BCMAC2 = MacAddress.valueOf("33:33:00:00:00:01");
128 private static final byte[] IP2 = Ip6Address.valueOf("1000::1").toOctets();
129 private static final IpAddress IP_ADDRESS2 =
130 IpAddress.valueOf(IpAddress.Version.INET6, IP2);
131 private static final HostLocation LOCATION2 =
132 new HostLocation(deviceId(DEV4), portNumber(INPORT), 0L);
133 private static final DefaultHost HOST2 =
Charles Chan8b0fdaa2016-02-23 18:35:27 -0800134 new DefaultHost(PROVIDER_ID, hostId(MAC2), MAC2,
Charles Chane6067892016-11-17 10:23:46 -0800135 VLAN, LOCATION2,
136 ImmutableSet.of(IP_ADDRESS2));
137
138 // DHCP Server
139 private static final MacAddress MAC3 = MacAddress.valueOf("00:00:33:00:00:03");
140 private static final byte[] IP3 = new byte[]{10, 0, 0, 2};
141 private static final IpAddress IP_ADDRESS3 =
142 IpAddress.valueOf(IpAddress.Version.INET, IP3);
143
144 private static final HostLocation LOCATION3 =
145 new HostLocation(deviceId(DEV1), portNumber(INPORT2), 0L);
146 private static final DefaultHost HOST3 =
147 new DefaultHost(PROVIDER_ID, hostId(MAC3), MAC3,
148 VLAN, LOCATION3,
149 ImmutableSet.of(IP_ADDRESS3));
Charles Chan5d5e0622015-09-25 13:00:06 -0700150
Thomas Vachuska33601602014-11-19 03:32:15 -0800151 private static final ComponentContextAdapter CTX_FOR_REMOVE =
152 new ComponentContextAdapter() {
153 @Override
154 public Dictionary getProperties() {
155 Hashtable<String, String> props = new Hashtable<>();
156 props.put("hostRemovalEnabled", "true");
157 return props;
158 }
159 };
160
161 public static final ComponentContextAdapter CTX_FOR_NO_REMOVE =
162 new ComponentContextAdapter() {
163 @Override
164 public Dictionary getProperties() {
165 return new Hashtable();
166 }
167 };
168
alshabib4a179dc2014-10-17 17:17:01 -0700169 private final HostLocationProvider provider = new HostLocationProvider();
Thomas Vachuska33601602014-11-19 03:32:15 -0800170 private final TestHostRegistry hostRegistry = new TestHostRegistry();
alshabib4a179dc2014-10-17 17:17:01 -0700171 private final TestTopologyService topoService = new TestTopologyService();
Thomas Vachuska33601602014-11-19 03:32:15 -0800172 private final TestDeviceService deviceService = new TestDeviceService();
173 private final TestHostService hostService = new TestHostService();
alshabib4a179dc2014-10-17 17:17:01 -0700174 private final TestPacketService packetService = new TestPacketService();
175
176 private PacketProcessor testProcessor;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800177 private CoreService coreService;
alshabib4a179dc2014-10-17 17:17:01 -0700178 private TestHostProviderService providerService;
179
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800180 private ApplicationId appId =
181 new DefaultApplicationId(100, "org.onosproject.provider.host");
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800182
alshabib4a179dc2014-10-17 17:17:01 -0700183 @Before
184 public void setUp() {
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800185
186 coreService = createMock(CoreService.class);
187 expect(coreService.registerApplication(appId.name()))
Thomas Vachuska27bee092015-06-23 19:03:10 -0700188 .andReturn(appId).anyTimes();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800189 replay(coreService);
190
Thomas Vachuska6519e6f2015-03-11 02:29:31 -0700191 provider.cfgService = new ComponentConfigAdapter();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800192 provider.coreService = coreService;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800193
Thomas Vachuska33601602014-11-19 03:32:15 -0800194 provider.providerRegistry = hostRegistry;
alshabib4a179dc2014-10-17 17:17:01 -0700195 provider.topologyService = topoService;
Pavlin Radoslavovd6612f92015-02-23 13:53:32 -0800196 provider.packetService = packetService;
Thomas Vachuska33601602014-11-19 03:32:15 -0800197 provider.deviceService = deviceService;
198 provider.hostService = hostService;
alshabib4a179dc2014-10-17 17:17:01 -0700199
Thomas Vachuska33601602014-11-19 03:32:15 -0800200 provider.activate(CTX_FOR_NO_REMOVE);
Madan Jampania3770c32015-12-11 12:07:41 -0800201
202 provider.eventHandler = MoreExecutors.newDirectExecutorService();
alshabib4a179dc2014-10-17 17:17:01 -0700203 }
204
205 @Test
206 public void basics() {
207 assertNotNull("registration expected", providerService);
208 assertEquals("incorrect provider", provider, providerService.provider());
209 }
210
211 @Test
212 public void events() {
Charles Chan420e7372016-11-17 10:58:17 -0800213 // New host. Expect one additional host description.
Charles Chan5d5e0622015-09-25 13:00:06 -0700214 testProcessor.process(new TestArpPacketContext(DEV1));
Charles Chan420e7372016-11-17 10:58:17 -0800215 assertThat("New host expected", providerService.descriptions.size(), is(1));
alshabib4a179dc2014-10-17 17:17:01 -0700216
Charles Chan420e7372016-11-17 10:58:17 -0800217 // The host moved to new switch. Expect one additional host description.
218 // The second host description should have a different location.
Charles Chan5d5e0622015-09-25 13:00:06 -0700219 testProcessor.process(new TestArpPacketContext(DEV2));
Charles Chan420e7372016-11-17 10:58:17 -0800220 assertThat("Host motion expected", providerService.descriptions.size(), is(2));
221 HostLocation loc1 = providerService.descriptions.get(0).location();
222 HostLocation loc2 = providerService.descriptions.get(1).location();
223 assertNotEquals("Host location should be different", loc1, loc2);
alshabib4a179dc2014-10-17 17:17:01 -0700224
Charles Chan420e7372016-11-17 10:58:17 -0800225 // The host was misheard on a spine. Expect no additional host description.
Charles Chan5d5e0622015-09-25 13:00:06 -0700226 testProcessor.process(new TestArpPacketContext(DEV3));
Charles Chan420e7372016-11-17 10:58:17 -0800227 assertThat("Host misheard on spine switch", providerService.descriptions.size(), is(2));
Charles Chan5d5e0622015-09-25 13:00:06 -0700228
229 providerService.clear();
230
Charles Chan420e7372016-11-17 10:58:17 -0800231 // New host. Expect one additional host description.
Jonathan Hartb35540a2015-11-17 09:30:56 -0800232 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800233 assertThat("New host expected", providerService.descriptions.size(), is(1));
Charles Chan5d5e0622015-09-25 13:00:06 -0700234
Charles Chan420e7372016-11-17 10:58:17 -0800235 // The host moved to new switch. Expect one additional host description.
236 // The second host description should have a different location.
Jonathan Hartb35540a2015-11-17 09:30:56 -0800237 testProcessor.process(new TestNaPacketContext(DEV5));
Charles Chan420e7372016-11-17 10:58:17 -0800238 assertThat("Host motion expected", providerService.descriptions.size(), is(2));
239 loc1 = providerService.descriptions.get(0).location();
240 loc2 = providerService.descriptions.get(1).location();
241 assertNotEquals("Host location should be different", loc1, loc2);
Charles Chan5d5e0622015-09-25 13:00:06 -0700242
Charles Chan420e7372016-11-17 10:58:17 -0800243 // The host was misheard on a spine. Expect no additional host description.
Jonathan Hartb35540a2015-11-17 09:30:56 -0800244 testProcessor.process(new TestNaPacketContext(DEV6));
Charles Chan420e7372016-11-17 10:58:17 -0800245 assertThat("Host misheard on spine switch", providerService.descriptions.size(), is(2));
alshabib4a179dc2014-10-17 17:17:01 -0700246 }
247
Thomas Vachuska33601602014-11-19 03:32:15 -0800248 @Test
249 public void removeHostByDeviceRemove() {
250 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700251 testProcessor.process(new TestArpPacketContext(DEV1));
Jonathan Hartb35540a2015-11-17 09:30:56 -0800252 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan5d5e0622015-09-25 13:00:06 -0700253
Thomas Vachuska33601602014-11-19 03:32:15 -0800254 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
255 "m", "h", "s", "n", new ChassisId(0L));
256 deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
Charles Chane6067892016-11-17 10:23:46 -0800257 assertEquals("incorrect remove count", 2, providerService.removeCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700258
259 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
260 "m", "h", "s", "n", new ChassisId(0L));
261 deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
Charles Chane6067892016-11-17 10:23:46 -0800262 assertEquals("incorrect remove count", 3, providerService.removeCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800263 }
264
265 @Test
266 public void removeHostByDeviceOffline() {
267 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700268 testProcessor.process(new TestArpPacketContext(DEV1));
269 testProcessor.process(new TestArpPacketContext(DEV4));
270
Thomas Vachuska33601602014-11-19 03:32:15 -0800271 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
272 "m", "h", "s", "n", new ChassisId(0L));
273 deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
Charles Chane6067892016-11-17 10:23:46 -0800274 assertEquals("incorrect remove count", 2, providerService.removeCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700275
276 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
277 "m", "h", "s", "n", new ChassisId(0L));
278 deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
Charles Chane6067892016-11-17 10:23:46 -0800279 assertEquals("incorrect remove count", 3, providerService.removeCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800280 }
281
282 @Test
283 public void removeHostByDevicePortDown() {
284 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700285 testProcessor.process(new TestArpPacketContext(DEV1));
286 testProcessor.process(new TestArpPacketContext(DEV4));
287
Thomas Vachuska33601602014-11-19 03:32:15 -0800288 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
289 "m", "h", "s", "n", new ChassisId(0L));
290 deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
Charles Chan5d5e0622015-09-25 13:00:06 -0700291 new DefaultPort(device, portNumber(INPORT), false)));
Thomas Vachuska33601602014-11-19 03:32:15 -0800292 assertEquals("incorrect remove count", 1, providerService.removeCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700293
294 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
295 "m", "h", "s", "n", new ChassisId(0L));
296 deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
297 new DefaultPort(device, portNumber(INPORT), false)));
298 assertEquals("incorrect remove count", 2, providerService.removeCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800299 }
300
Charles Chan5d5e0622015-09-25 13:00:06 -0700301 /**
302 * When receiving ARP, updates location and IP.
303 */
304 @Test
305 public void testReceiveArp() {
306 testProcessor.process(new TestArpPacketContext(DEV1));
Charles Chan420e7372016-11-17 10:58:17 -0800307 assertThat("testReceiveArp. One host description expected",
308 providerService.descriptions.size(), is(1));
309 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700310 assertThat(descr.location(), is(LOCATION));
311 assertThat(descr.hwAddress(), is(MAC));
312 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS));
313 assertThat(descr.vlan(), is(VLAN));
314 }
315
316 /**
317 * When receiving IPv4, updates location only.
318 */
319 @Test
320 public void testReceiveIpv4() {
321 testProcessor.process(new TestIpv4PacketContext(DEV1));
Charles Chan420e7372016-11-17 10:58:17 -0800322 assertThat("testReceiveIpv4. One host description expected",
323 providerService.descriptions.size(), is(1));
324 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700325 assertThat(descr.location(), is(LOCATION));
326 assertThat(descr.hwAddress(), is(MAC));
327 assertThat(descr.ipAddress().size(), is(0));
328 assertThat(descr.vlan(), is(VLAN));
329 }
330
331 /**
Charles Chane6067892016-11-17 10:23:46 -0800332 * When receiving DHCP REQUEST, update MAC, location of client.
333 * When receiving DHCP ACK, update MAC, location of server and IP of client.
334 */
335 @Test
336 public void testReceiveDhcp() {
337 // DHCP Request
338 testProcessor.process(new TestDhcpRequestPacketContext(DEV1));
339 assertThat("testReceiveDhcpRequest. One host description expected",
340 providerService.descriptions.size(), is(1));
341 // Should learn the MAC and location of DHCP client
342 HostDescription descr = providerService.descriptions.get(0);
343 assertThat(descr.location(), is(LOCATION));
344 assertThat(descr.hwAddress(), is(MAC));
345 assertThat(descr.ipAddress().size(), is(0));
346 assertThat(descr.vlan(), is(VLAN));
347
348 // DHCP Ack
349 testProcessor.process(new TestDhcpAckPacketContext(DEV1));
350 assertThat("testReceiveDhcpAck. Two additional host descriptions expected",
351 providerService.descriptions.size(), is(3));
352 // Should learn the IP of DHCP client
353 HostDescription descr2 = providerService.descriptions.get(1);
354 assertThat(descr2.location(), is(LOCATION));
355 assertThat(descr2.hwAddress(), is(MAC));
356 assertThat(descr2.ipAddress().size(), is(1));
357 assertTrue(descr2.ipAddress().contains(IP_ADDRESS));
358 assertThat(descr2.vlan(), is(VLAN));
359 // Should also learn the MAC, location of DHCP server
360 HostDescription descr3 = providerService.descriptions.get(2);
361 assertThat(descr3.location(), is(LOCATION3));
362 assertThat(descr3.hwAddress(), is(MAC3));
363 assertThat(descr3.ipAddress().size(), is(0));
364 assertThat(descr3.vlan(), is(VLAN));
365
366 }
367
368 /**
Charles Chan5d5e0622015-09-25 13:00:06 -0700369 * When receiving NeighborAdvertisement, updates location and IP.
370 */
371 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800372 public void testReceiveNa() {
373 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800374 assertThat("testReceiveNa. One host description expected",
375 providerService.descriptions.size(), is(1));
376 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700377 assertThat(descr.location(), is(LOCATION2));
378 assertThat(descr.hwAddress(), is(MAC2));
379 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS2));
380 assertThat(descr.vlan(), is(VLAN));
381 }
382
383 /**
384 * When receiving NeighborSolicitation, updates location and IP.
385 */
386 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800387 public void testReceiveNs() {
388 testProcessor.process(new TestNsPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800389 assertThat("testReceiveNs. One host description expected",
390 providerService.descriptions.size(), is(1));
391 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700392 assertThat(descr.location(), is(LOCATION2));
393 assertThat(descr.hwAddress(), is(MAC2));
394 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS2));
395 assertThat(descr.vlan(), is(VLAN));
396 }
397
398 /**
399 * When receiving RouterAdvertisement, ignores it.
400 */
401 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800402 public void testReceivesRa() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700403 testProcessor.process(new TestRAPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800404 assertThat("testReceiveRa. No host description expected",
405 providerService.descriptions.size(), is(0));
Charles Chan5d5e0622015-09-25 13:00:06 -0700406 }
407
408 /**
409 * When receiving RouterSolicitation, ignores it.
410 */
411 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800412 public void testReceiveRs() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700413 testProcessor.process(new TestRSPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800414 assertThat("testReceiveRs. No host description expected",
415 providerService.descriptions.size(), is(0));
Charles Chan5d5e0622015-09-25 13:00:06 -0700416 }
417
418 /**
419 * When receiving Duplicate Address Detection (DAD), ignores it.
420 */
421 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800422 public void testReceiveDad() {
423 testProcessor.process(new TestDadPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800424 assertThat("testReceiveDad. No host description expected",
425 providerService.descriptions.size(), is(0));
Charles Chan5d5e0622015-09-25 13:00:06 -0700426 }
427
428 /**
429 * When receiving IPv6 multicast packet, ignores it.
430 */
431 @Test
432 public void testReceiveIpv6Multicast() {
433 testProcessor.process(new TestIpv6McastPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800434 assertThat("testReceiveIpv6Multicast. No host description expected",
435 providerService.descriptions.size(), is(0));
Charles Chan5d5e0622015-09-25 13:00:06 -0700436 }
437
438 /**
439 * When receiving IPv6 unicast packet, updates location only.
440 */
441 @Test
442 public void testReceiveIpv6Unicast() {
443 testProcessor.process(new TestIpv6PacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800444 assertThat("testReceiveIpv6Unicast. One host description expected",
445 providerService.descriptions.size(), is(1));
446 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700447 assertThat(descr.location(), is(LOCATION2));
448 assertThat(descr.hwAddress(), is(MAC2));
449 assertThat(descr.ipAddress().size(), is(0));
450 assertThat(descr.vlan(), is(VLAN));
451 }
Thomas Vachuska33601602014-11-19 03:32:15 -0800452
alshabib4a179dc2014-10-17 17:17:01 -0700453 @After
454 public void tearDown() {
455 provider.deactivate();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800456 provider.coreService = null;
alshabib4a179dc2014-10-17 17:17:01 -0700457 provider.providerRegistry = null;
alshabib4a179dc2014-10-17 17:17:01 -0700458 }
459
460 private class TestHostRegistry implements HostProviderRegistry {
461
462 @Override
463 public HostProviderService register(HostProvider provider) {
464 providerService = new TestHostProviderService(provider);
465 return providerService;
466 }
467
468 @Override
469 public void unregister(HostProvider provider) {
470 }
471
472 @Override
473 public Set<ProviderId> getProviders() {
474 return null;
475 }
476
477 }
478
479 private class TestHostProviderService
480 extends AbstractProviderService<HostProvider>
481 implements HostProviderService {
482
Charles Chan420e7372016-11-17 10:58:17 -0800483 List<HostDescription> descriptions = Lists.newArrayList();
484 int removeCount;
alshabib4a179dc2014-10-17 17:17:01 -0700485
Charles Chan5d5e0622015-09-25 13:00:06 -0700486 public void clear() {
Charles Chan420e7372016-11-17 10:58:17 -0800487 descriptions.clear();
Charles Chan5d5e0622015-09-25 13:00:06 -0700488 removeCount = 0;
489 }
490
alshabib4a179dc2014-10-17 17:17:01 -0700491 protected TestHostProviderService(HostProvider provider) {
492 super(provider);
493 }
494
495 @Override
Brian O'Connorf107bd72015-09-21 15:31:03 -0700496 public void hostDetected(HostId hostId, HostDescription hostDescription, boolean replaceIps) {
Charles Chan420e7372016-11-17 10:58:17 -0800497 descriptions.add(hostDescription);
alshabib4a179dc2014-10-17 17:17:01 -0700498 }
499
500 @Override
501 public void hostVanished(HostId hostId) {
Thomas Vachuska33601602014-11-19 03:32:15 -0800502 removeCount++;
alshabib4a179dc2014-10-17 17:17:01 -0700503 }
504
samanwita palc40e5ed2015-09-24 11:01:51 -0700505 @Override
506 public void removeIpFromHost(HostId hostId, IpAddress ipAddress) {
507 }
508
alshabib4a179dc2014-10-17 17:17:01 -0700509 }
510
Thomas Vachuska27bee092015-06-23 19:03:10 -0700511 private class TestPacketService extends PacketServiceAdapter {
alshabib4a179dc2014-10-17 17:17:01 -0700512 @Override
513 public void addProcessor(PacketProcessor processor, int priority) {
514 testProcessor = processor;
515 }
alshabib4a179dc2014-10-17 17:17:01 -0700516 }
517
alshabib4a179dc2014-10-17 17:17:01 -0700518 private class TestTopologyService extends TopologyServiceAdapter {
519 @Override
520 public boolean isInfrastructure(Topology topology,
521 ConnectPoint connectPoint) {
522 //simulate DPID3 as an infrastructure switch
Charles Chan5d5e0622015-09-25 13:00:06 -0700523 if ((connectPoint.deviceId()).equals(deviceId(DEV3)) ||
524 connectPoint.deviceId().equals(deviceId(DEV6))) {
alshabib4a179dc2014-10-17 17:17:01 -0700525 return true;
526 }
527 return false;
528 }
529 }
530
Charles Chan5d5e0622015-09-25 13:00:06 -0700531 /**
532 * Generates ARP packet.
533 */
534 private class TestArpPacketContext implements PacketContext {
alshabib4a179dc2014-10-17 17:17:01 -0700535 private final String deviceId;
536
Charles Chan5d5e0622015-09-25 13:00:06 -0700537 public TestArpPacketContext(String deviceId) {
alshabib4a179dc2014-10-17 17:17:01 -0700538 this.deviceId = deviceId;
539 }
540
541 @Override
542 public long time() {
543 return 0;
544 }
545
546 @Override
547 public InboundPacket inPacket() {
548 ARP arp = new ARP();
549 arp.setSenderProtocolAddress(IP)
550 .setSenderHardwareAddress(MAC.toBytes())
551 .setTargetHardwareAddress(BCMAC.toBytes())
552 .setTargetProtocolAddress(IP);
553
554 Ethernet eth = new Ethernet();
555 eth.setEtherType(Ethernet.TYPE_ARP)
556 .setVlanID(VLAN.toShort())
557 .setSourceMACAddress(MAC.toBytes())
Yuta HIGUCHI3e848a82014-11-02 20:19:42 -0800558 .setDestinationMACAddress(BCMAC)
alshabib4a179dc2014-10-17 17:17:01 -0700559 .setPayload(arp);
Thomas Vachuska33601602014-11-19 03:32:15 -0800560 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
561 portNumber(INPORT));
alshabib4a179dc2014-10-17 17:17:01 -0700562 return new DefaultInboundPacket(receivedFrom, eth,
563 ByteBuffer.wrap(eth.serialize()));
564 }
565
566 @Override
567 public OutboundPacket outPacket() {
568 return null;
569 }
570
571 @Override
572 public TrafficTreatment.Builder treatmentBuilder() {
573 return null;
574 }
575
576 @Override
577 public void send() {
578
579 }
580
581 @Override
582 public boolean block() {
583 return false;
584 }
585
586 @Override
587 public boolean isHandled() {
588 return false;
589 }
590 }
Thomas Vachuska33601602014-11-19 03:32:15 -0800591
Charles Chan5d5e0622015-09-25 13:00:06 -0700592 /**
Charles Chane6067892016-11-17 10:23:46 -0800593 * Generates IPv4 Unicast packet.
Charles Chan5d5e0622015-09-25 13:00:06 -0700594 */
595 private class TestIpv4PacketContext implements PacketContext {
596 private final String deviceId;
597
598 public TestIpv4PacketContext(String deviceId) {
599 this.deviceId = deviceId;
600 }
601
602 @Override
603 public long time() {
604 return 0;
605 }
606
607 @Override
608 public InboundPacket inPacket() {
609 IPv4 ipv4 = new IPv4();
610 ipv4.setDestinationAddress("10.0.0.1");
611 ipv4.setSourceAddress(IP_ADDRESS.toString());
612 Ethernet eth = new Ethernet();
613 eth.setEtherType(Ethernet.TYPE_IPV4)
614 .setVlanID(VLAN.toShort())
615 .setSourceMACAddress(MAC)
616 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
617 .setPayload(ipv4);
618 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
619 portNumber(INPORT));
620 return new DefaultInboundPacket(receivedFrom, eth,
621 ByteBuffer.wrap(eth.serialize()));
622 }
623
624 @Override
625 public OutboundPacket outPacket() {
626 return null;
627 }
628
629 @Override
630 public TrafficTreatment.Builder treatmentBuilder() {
631 return null;
632 }
633
634 @Override
635 public void send() {
636
637 }
638
639 @Override
640 public boolean block() {
641 return false;
642 }
643
644 @Override
645 public boolean isHandled() {
646 return false;
647 }
648 }
Charles Chane6067892016-11-17 10:23:46 -0800649 /**
650 * Generates DHCP REQUEST packet.
651 */
652 private class TestDhcpRequestPacketContext implements PacketContext {
653 private final String deviceId;
654
655 public TestDhcpRequestPacketContext(String deviceId) {
656 this.deviceId = deviceId;
657 }
658
659 @Override
660 public long time() {
661 return 0;
662 }
663
664 @Override
665 public InboundPacket inPacket() {
666 byte[] dhcpMsgType = new byte[1];
667 dhcpMsgType[0] = (byte) DHCPPacketType.DHCPREQUEST.getValue();
668
669 DHCPOption dhcpOption = new DHCPOption();
670 dhcpOption.setCode(DHCP.DHCPOptionCode.OptionCode_MessageType.getValue());
671 dhcpOption.setData(dhcpMsgType);
672 dhcpOption.setLength((byte) 1);
673 DHCP dhcp = new DHCP();
674 dhcp.setOptions(Collections.singletonList(dhcpOption));
675 dhcp.setClientHardwareAddress(MAC.toBytes());
676 UDP udp = new UDP();
677 udp.setPayload(dhcp);
678 udp.setSourcePort(UDP.DHCP_CLIENT_PORT);
679 udp.setDestinationPort(UDP.DHCP_SERVER_PORT);
680 IPv4 ipv4 = new IPv4();
681 ipv4.setPayload(udp);
682 ipv4.setDestinationAddress(IP_ADDRESS3.toString());
683 ipv4.setSourceAddress(IP_ADDRESS.toString());
684 Ethernet eth = new Ethernet();
685 eth.setEtherType(Ethernet.TYPE_IPV4)
686 .setVlanID(VLAN.toShort())
687 .setSourceMACAddress(MAC)
688 .setDestinationMACAddress(MAC3)
689 .setPayload(ipv4);
690 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
691 portNumber(INPORT));
692 return new DefaultInboundPacket(receivedFrom, eth,
693 ByteBuffer.wrap(eth.serialize()));
694 }
695
696 @Override
697 public OutboundPacket outPacket() {
698 return null;
699 }
700
701 @Override
702 public TrafficTreatment.Builder treatmentBuilder() {
703 return null;
704 }
705
706 @Override
707 public void send() {
708
709 }
710
711 @Override
712 public boolean block() {
713 return false;
714 }
715
716 @Override
717 public boolean isHandled() {
718 return false;
719 }
720 }
721
722 /**
723 * Generates DHCP ACK packet.
724 */
725 private class TestDhcpAckPacketContext implements PacketContext {
726 private final String deviceId;
727
728 public TestDhcpAckPacketContext(String deviceId) {
729 this.deviceId = deviceId;
730 }
731
732 @Override
733 public long time() {
734 return 0;
735 }
736
737 @Override
738 public InboundPacket inPacket() {
739 byte[] dhcpMsgType = new byte[1];
740 dhcpMsgType[0] = (byte) DHCPPacketType.DHCPACK.getValue();
741
742 DHCPOption dhcpOption = new DHCPOption();
743 dhcpOption.setCode(DHCP.DHCPOptionCode.OptionCode_MessageType.getValue());
744 dhcpOption.setData(dhcpMsgType);
745 dhcpOption.setLength((byte) 1);
746 DHCP dhcp = new DHCP();
747 dhcp.setOptions(Collections.singletonList(dhcpOption));
748 dhcp.setClientHardwareAddress(MAC.toBytes());
749 dhcp.setYourIPAddress(IP_ADDRESS.getIp4Address().toInt());
750 UDP udp = new UDP();
751 udp.setPayload(dhcp);
752 udp.setSourcePort(UDP.DHCP_SERVER_PORT);
753 udp.setDestinationPort(UDP.DHCP_CLIENT_PORT);
754 IPv4 ipv4 = new IPv4();
755 ipv4.setPayload(udp);
756 ipv4.setDestinationAddress(IP_ADDRESS.toString());
757 ipv4.setSourceAddress(IP_ADDRESS3.toString());
758 Ethernet eth = new Ethernet();
759 eth.setEtherType(Ethernet.TYPE_IPV4)
760 .setVlanID(VLAN.toShort())
761 .setSourceMACAddress(MAC3)
762 .setDestinationMACAddress(MAC)
763 .setPayload(ipv4);
764 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
765 portNumber(INPORT2));
766 return new DefaultInboundPacket(receivedFrom, eth,
767 ByteBuffer.wrap(eth.serialize()));
768 }
769
770 @Override
771 public OutboundPacket outPacket() {
772 return null;
773 }
774
775 @Override
776 public TrafficTreatment.Builder treatmentBuilder() {
777 return null;
778 }
779
780 @Override
781 public void send() {
782
783 }
784
785 @Override
786 public boolean block() {
787 return false;
788 }
789
790 @Override
791 public boolean isHandled() {
792 return false;
793 }
794 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700795
796 /**
797 * Generates NeighborAdvertisement packet.
798 */
Jonathan Hartb35540a2015-11-17 09:30:56 -0800799 private class TestNaPacketContext implements PacketContext {
Charles Chan5d5e0622015-09-25 13:00:06 -0700800 private final String deviceId;
801
Jonathan Hartb35540a2015-11-17 09:30:56 -0800802 public TestNaPacketContext(String deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -0700803 this.deviceId = deviceId;
804 }
805
806 @Override
807 public long time() {
808 return 0;
809 }
810
811 @Override
812 public InboundPacket inPacket() {
813 NeighborAdvertisement na = new NeighborAdvertisement();
814 ICMP6 icmp6 = new ICMP6();
815 icmp6.setPayload(na);
816 IPv6 ipv6 = new IPv6();
817 ipv6.setPayload(icmp6);
818 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
819 ipv6.setSourceAddress(IP2);
820 Ethernet eth = new Ethernet();
821 eth.setEtherType(Ethernet.TYPE_IPV6)
822 .setVlanID(VLAN.toShort())
823 .setSourceMACAddress(MAC2.toBytes())
824 .setDestinationMACAddress(BCMAC2)
825 .setPayload(ipv6);
826 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
827 portNumber(INPORT));
828 return new DefaultInboundPacket(receivedFrom, eth,
829 ByteBuffer.wrap(eth.serialize()));
830 }
831
832 @Override
833 public OutboundPacket outPacket() {
834 return null;
835 }
836
837 @Override
838 public TrafficTreatment.Builder treatmentBuilder() {
839 return null;
840 }
841
842 @Override
843 public void send() {
844
845 }
846
847 @Override
848 public boolean block() {
849 return false;
850 }
851
852 @Override
853 public boolean isHandled() {
854 return false;
855 }
856 }
857
858 /**
859 * Generates NeighborSolicitation packet.
860 */
Jonathan Hartb35540a2015-11-17 09:30:56 -0800861 private class TestNsPacketContext implements PacketContext {
Charles Chan5d5e0622015-09-25 13:00:06 -0700862 private final String deviceId;
863
Jonathan Hartb35540a2015-11-17 09:30:56 -0800864 public TestNsPacketContext(String deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -0700865 this.deviceId = deviceId;
866 }
867
868 @Override
869 public long time() {
870 return 0;
871 }
872
873 @Override
874 public InboundPacket inPacket() {
875 NeighborSolicitation ns = new NeighborSolicitation();
876 ICMP6 icmp6 = new ICMP6();
877 icmp6.setPayload(ns);
878 IPv6 ipv6 = new IPv6();
879 ipv6.setPayload(icmp6);
880 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1:ff00:0000").toOctets());
881 ipv6.setSourceAddress(IP2);
882 Ethernet eth = new Ethernet();
883 eth.setEtherType(Ethernet.TYPE_IPV6)
884 .setVlanID(VLAN.toShort())
885 .setSourceMACAddress(MAC2.toBytes())
886 .setDestinationMACAddress(BCMAC2)
887 .setPayload(ipv6);
888 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
889 portNumber(INPORT));
890 return new DefaultInboundPacket(receivedFrom, eth,
891 ByteBuffer.wrap(eth.serialize()));
892 }
893
894 @Override
895 public OutboundPacket outPacket() {
896 return null;
897 }
898
899 @Override
900 public TrafficTreatment.Builder treatmentBuilder() {
901 return null;
902 }
903
904 @Override
905 public void send() {
906
907 }
908
909 @Override
910 public boolean block() {
911 return false;
912 }
913
914 @Override
915 public boolean isHandled() {
916 return false;
917 }
918 }
919
920 /**
921 * Generates Duplicate Address Detection packet.
922 */
Jonathan Hartb35540a2015-11-17 09:30:56 -0800923 private class TestDadPacketContext implements PacketContext {
Charles Chan5d5e0622015-09-25 13:00:06 -0700924 private final String deviceId;
925
Jonathan Hartb35540a2015-11-17 09:30:56 -0800926 public TestDadPacketContext(String deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -0700927 this.deviceId = deviceId;
928 }
929
930 @Override
931 public long time() {
932 return 0;
933 }
934
935 @Override
936 public InboundPacket inPacket() {
937 NeighborSolicitation ns = new NeighborSolicitation();
938 ICMP6 icmp6 = new ICMP6();
939 icmp6.setPayload(ns);
940 IPv6 ipv6 = new IPv6();
941 ipv6.setPayload(icmp6);
942 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
943 ipv6.setSourceAddress(Ip6Address.valueOf("::").toOctets());
944 Ethernet eth = new Ethernet();
945 eth.setEtherType(Ethernet.TYPE_IPV6)
946 .setVlanID(VLAN.toShort())
947 .setSourceMACAddress(MAC2.toBytes())
948 .setDestinationMACAddress(BCMAC2)
949 .setPayload(ipv6);
950 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
951 portNumber(INPORT));
952 return new DefaultInboundPacket(receivedFrom, eth,
953 ByteBuffer.wrap(eth.serialize()));
954 }
955
956 @Override
957 public OutboundPacket outPacket() {
958 return null;
959 }
960
961 @Override
962 public TrafficTreatment.Builder treatmentBuilder() {
963 return null;
964 }
965
966 @Override
967 public void send() {
968
969 }
970
971 @Override
972 public boolean block() {
973 return false;
974 }
975
976 @Override
977 public boolean isHandled() {
978 return false;
979 }
980 }
981
982 /**
983 * Generates Router Solicitation packet.
984 */
985 private class TestRSPacketContext implements PacketContext {
986 private final String deviceId;
987
988 public TestRSPacketContext(String deviceId) {
989 this.deviceId = deviceId;
990 }
991
992 @Override
993 public long time() {
994 return 0;
995 }
996
997 @Override
998 public InboundPacket inPacket() {
999 RouterSolicitation ns = new RouterSolicitation();
1000 ICMP6 icmp6 = new ICMP6();
1001 icmp6.setPayload(ns);
1002 IPv6 ipv6 = new IPv6();
1003 ipv6.setPayload(icmp6);
1004 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::2").toOctets());
1005 ipv6.setSourceAddress(Ip6Address.valueOf("::").toOctets());
1006 Ethernet eth = new Ethernet();
1007 eth.setEtherType(Ethernet.TYPE_IPV6)
1008 .setVlanID(VLAN.toShort())
1009 .setSourceMACAddress(MAC2.toBytes())
1010 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:02"))
1011 .setPayload(ipv6);
1012 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1013 portNumber(INPORT));
1014 return new DefaultInboundPacket(receivedFrom, eth,
1015 ByteBuffer.wrap(eth.serialize()));
1016 }
1017
1018 @Override
1019 public OutboundPacket outPacket() {
1020 return null;
1021 }
1022
1023 @Override
1024 public TrafficTreatment.Builder treatmentBuilder() {
1025 return null;
1026 }
1027
1028 @Override
1029 public void send() {
1030
1031 }
1032
1033 @Override
1034 public boolean block() {
1035 return false;
1036 }
1037
1038 @Override
1039 public boolean isHandled() {
1040 return false;
1041 }
1042 }
1043
1044 /**
1045 * Generates Router Advertisement packet.
1046 */
1047 private class TestRAPacketContext implements PacketContext {
1048 private final String deviceId;
1049
1050 public TestRAPacketContext(String deviceId) {
1051 this.deviceId = deviceId;
1052 }
1053
1054 @Override
1055 public long time() {
1056 return 0;
1057 }
1058
1059 @Override
1060 public InboundPacket inPacket() {
1061 RouterAdvertisement ns = new RouterAdvertisement();
1062 ICMP6 icmp6 = new ICMP6();
1063 icmp6.setPayload(ns);
1064 IPv6 ipv6 = new IPv6();
1065 ipv6.setPayload(icmp6);
1066 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
1067 ipv6.setSourceAddress(IP2);
1068 Ethernet eth = new Ethernet();
1069 eth.setEtherType(Ethernet.TYPE_IPV6)
1070 .setVlanID(VLAN.toShort())
1071 .setSourceMACAddress(MAC2.toBytes())
1072 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
1073 .setPayload(ipv6);
1074 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1075 portNumber(INPORT));
1076 return new DefaultInboundPacket(receivedFrom, eth,
1077 ByteBuffer.wrap(eth.serialize()));
1078 }
1079
1080 @Override
1081 public OutboundPacket outPacket() {
1082 return null;
1083 }
1084
1085 @Override
1086 public TrafficTreatment.Builder treatmentBuilder() {
1087 return null;
1088 }
1089
1090 @Override
1091 public void send() {
1092
1093 }
1094
1095 @Override
1096 public boolean block() {
1097 return false;
1098 }
1099
1100 @Override
1101 public boolean isHandled() {
1102 return false;
1103 }
1104 }
1105
1106 /**
1107 * Generates IPv6 Multicast packet.
1108 */
1109 private class TestIpv6McastPacketContext implements PacketContext {
1110 private final String deviceId;
1111
1112 public TestIpv6McastPacketContext(String deviceId) {
1113 this.deviceId = deviceId;
1114 }
1115
1116 @Override
1117 public long time() {
1118 return 0;
1119 }
1120
1121 @Override
1122 public InboundPacket inPacket() {
1123 IPv6 ipv6 = new IPv6();
1124 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
1125 ipv6.setSourceAddress(IP2);
1126 Ethernet eth = new Ethernet();
1127 eth.setEtherType(Ethernet.TYPE_IPV6)
1128 .setVlanID(VLAN.toShort())
1129 .setSourceMACAddress(MAC2.toBytes())
1130 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
1131 .setPayload(ipv6);
1132 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1133 portNumber(INPORT));
1134 return new DefaultInboundPacket(receivedFrom, eth,
1135 ByteBuffer.wrap(eth.serialize()));
1136 }
1137
1138 @Override
1139 public OutboundPacket outPacket() {
1140 return null;
1141 }
1142
1143 @Override
1144 public TrafficTreatment.Builder treatmentBuilder() {
1145 return null;
1146 }
1147
1148 @Override
1149 public void send() {
1150
1151 }
1152
1153 @Override
1154 public boolean block() {
1155 return false;
1156 }
1157
1158 @Override
1159 public boolean isHandled() {
1160 return false;
1161 }
1162 }
1163
1164 /**
1165 * Generates IPv6 Unicast packet.
1166 */
1167 private class TestIpv6PacketContext implements PacketContext {
1168 private final String deviceId;
1169
1170 public TestIpv6PacketContext(String deviceId) {
1171 this.deviceId = deviceId;
1172 }
1173
1174 @Override
1175 public long time() {
1176 return 0;
1177 }
1178
1179 @Override
1180 public InboundPacket inPacket() {
1181 IPv6 ipv6 = new IPv6();
1182 ipv6.setDestinationAddress(Ip6Address.valueOf("1000::1").toOctets());
1183 ipv6.setSourceAddress(IP2);
1184 Ethernet eth = new Ethernet();
1185 eth.setEtherType(Ethernet.TYPE_IPV6)
1186 .setVlanID(VLAN.toShort())
1187 .setSourceMACAddress(MAC2)
1188 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
1189 .setPayload(ipv6);
1190 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1191 portNumber(INPORT));
1192 return new DefaultInboundPacket(receivedFrom, eth,
1193 ByteBuffer.wrap(eth.serialize()));
1194 }
1195
1196 @Override
1197 public OutboundPacket outPacket() {
1198 return null;
1199 }
1200
1201 @Override
1202 public TrafficTreatment.Builder treatmentBuilder() {
1203 return null;
1204 }
1205
1206 @Override
1207 public void send() {
1208
1209 }
1210
1211 @Override
1212 public boolean block() {
1213 return false;
1214 }
1215
1216 @Override
1217 public boolean isHandled() {
1218 return false;
1219 }
1220 }
1221
Thomas Vachuska33601602014-11-19 03:32:15 -08001222 private class TestDeviceService extends DeviceServiceAdapter {
1223 private DeviceListener listener;
1224
1225 @Override
1226 public void addListener(DeviceListener listener) {
1227 this.listener = listener;
1228 }
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -08001229
1230 @Override
1231 public Iterable<Device> getDevices() {
1232 return Collections.emptyList();
1233 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001234 }
1235
1236 private class TestHostService extends HostServiceAdapter {
1237 @Override
1238 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
Charles Chan5d5e0622015-09-25 13:00:06 -07001239 ConnectPoint cp1 = new ConnectPoint(deviceId(DEV1), portNumber(INPORT));
1240 ConnectPoint cp2 = new ConnectPoint(deviceId(DEV4), portNumber(INPORT));
Charles Chane6067892016-11-17 10:23:46 -08001241 ConnectPoint cp3 = new ConnectPoint(deviceId(DEV1), portNumber(INPORT2));
Charles Chan5d5e0622015-09-25 13:00:06 -07001242 if (connectPoint.equals(cp1)) {
1243 return ImmutableSet.of(HOST);
1244 } else if (connectPoint.equals(cp2)) {
1245 return ImmutableSet.of(HOST2);
Charles Chane6067892016-11-17 10:23:46 -08001246 } else if (connectPoint.equals(cp3)) {
1247 return ImmutableSet.of(HOST3);
Charles Chan5d5e0622015-09-25 13:00:06 -07001248 } else {
1249 return ImmutableSet.of();
1250 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001251 }
1252
1253 @Override
1254 public Set<Host> getConnectedHosts(DeviceId deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -07001255 if (deviceId.equals(deviceId(DEV1))) {
Charles Chane6067892016-11-17 10:23:46 -08001256 return ImmutableSet.of(HOST, HOST3);
Charles Chan5d5e0622015-09-25 13:00:06 -07001257 } else if (deviceId.equals(deviceId(DEV4))) {
1258 return ImmutableSet.of(HOST2);
1259 } else {
1260 return ImmutableSet.of();
1261 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001262 }
1263
Charles Chane6067892016-11-17 10:23:46 -08001264 @Override
1265 public Host getHost(HostId hostId) {
1266 if (hostId.equals(HostId.hostId(MAC, VLAN))) {
1267 return HOST;
1268 } else if (hostId.equals(HostId.hostId(MAC2, VLAN))) {
1269 return HOST2;
1270 } else if (hostId.equals(HostId.hostId(MAC3, VLAN))) {
1271 return HOST3;
1272 }
1273 return null;
1274 }
1275
Thomas Vachuska33601602014-11-19 03:32:15 -08001276 }
alshabib4a179dc2014-10-17 17:17:01 -07001277}