blob: c47ba5680c7aeb9e48585c803a198a9a385ce04d [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;
Madan Jampania3770c32015-12-11 12:07:41 -080020import com.google.common.util.concurrent.MoreExecutors;
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;
Charles Chane6067892016-11-17 10:23:46 -080027import org.onlab.packet.DHCP;
28import org.onlab.packet.DHCPOption;
29import org.onlab.packet.DHCPPacketType;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080030import org.onlab.packet.Ethernet;
Charles Chan5d5e0622015-09-25 13:00:06 -070031import org.onlab.packet.ICMP6;
32import org.onlab.packet.IPv4;
33import org.onlab.packet.IPv6;
34import org.onlab.packet.Ip6Address;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080035import org.onlab.packet.IpAddress;
36import org.onlab.packet.MacAddress;
Charles Chane6067892016-11-17 10:23:46 -080037import org.onlab.packet.UDP;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080038import org.onlab.packet.VlanId;
Charles Chan5d5e0622015-09-25 13:00:06 -070039import org.onlab.packet.ndp.NeighborAdvertisement;
40import org.onlab.packet.ndp.NeighborSolicitation;
41import org.onlab.packet.ndp.RouterAdvertisement;
42import org.onlab.packet.ndp.RouterSolicitation;
Thomas Vachuska6519e6f2015-03-11 02:29:31 -070043import org.onosproject.cfg.ComponentConfigAdapter;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -080044import org.onosproject.core.ApplicationId;
45import org.onosproject.core.CoreService;
46import org.onosproject.core.DefaultApplicationId;
Brian O'Connorabafb502014-12-02 22:26:20 -080047import org.onosproject.net.ConnectPoint;
48import org.onosproject.net.DefaultDevice;
49import org.onosproject.net.DefaultHost;
50import org.onosproject.net.DefaultPort;
51import org.onosproject.net.Device;
52import org.onosproject.net.DeviceId;
53import org.onosproject.net.Host;
54import org.onosproject.net.HostId;
55import org.onosproject.net.HostLocation;
56import org.onosproject.net.device.DeviceEvent;
57import org.onosproject.net.device.DeviceListener;
58import org.onosproject.net.device.DeviceServiceAdapter;
59import org.onosproject.net.flow.TrafficTreatment;
60import org.onosproject.net.host.HostDescription;
61import org.onosproject.net.host.HostProvider;
62import org.onosproject.net.host.HostProviderRegistry;
63import org.onosproject.net.host.HostProviderService;
64import org.onosproject.net.host.HostServiceAdapter;
65import org.onosproject.net.packet.DefaultInboundPacket;
66import org.onosproject.net.packet.InboundPacket;
67import org.onosproject.net.packet.OutboundPacket;
68import org.onosproject.net.packet.PacketContext;
69import org.onosproject.net.packet.PacketProcessor;
Thomas Vachuska27bee092015-06-23 19:03:10 -070070import org.onosproject.net.packet.PacketServiceAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080071import org.onosproject.net.provider.AbstractProviderService;
72import org.onosproject.net.provider.ProviderId;
73import org.onosproject.net.topology.Topology;
74import org.onosproject.net.topology.TopologyServiceAdapter;
alshabib4a179dc2014-10-17 17:17:01 -070075
Thomas Vachuska27bee092015-06-23 19:03:10 -070076import java.nio.ByteBuffer;
77import java.util.Collections;
78import java.util.Dictionary;
79import java.util.Hashtable;
Charles Chan420e7372016-11-17 10:58:17 -080080import java.util.List;
Thomas Vachuska27bee092015-06-23 19:03:10 -070081import java.util.Set;
82
Michele Santuari72f6bee2016-11-18 12:56:30 +010083import static org.easymock.EasyMock.createMock;
84import static org.easymock.EasyMock.expect;
85import static org.easymock.EasyMock.replay;
Charles Chan5d5e0622015-09-25 13:00:06 -070086import static org.hamcrest.Matchers.is;
Michele Santuari72f6bee2016-11-18 12:56:30 +010087import static org.junit.Assert.assertEquals;
88import static org.junit.Assert.assertNotEquals;
89import static org.junit.Assert.assertNotNull;
90import static org.junit.Assert.assertThat;
91import static org.junit.Assert.assertTrue;
Thomas Vachuska27bee092015-06-23 19:03:10 -070092import static org.onlab.packet.VlanId.vlanId;
93import static org.onosproject.net.Device.Type.SWITCH;
94import static org.onosproject.net.DeviceId.deviceId;
95import static org.onosproject.net.HostId.hostId;
96import static org.onosproject.net.PortNumber.portNumber;
Michele Santuari72f6bee2016-11-18 12:56:30 +010097import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
98import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_REMOVED;
99import static org.onosproject.net.device.DeviceEvent.Type.PORT_UPDATED;
Thomas Vachuska33601602014-11-19 03:32:15 -0800100
alshabib4a179dc2014-10-17 17:17:01 -0700101public class HostLocationProviderTest {
Charles Chan8b0fdaa2016-02-23 18:35:27 -0800102 private static final ProviderId PROVIDER_ID =
103 new ProviderId("of", "org.onosproject.provider.host");
104
alshabib4a179dc2014-10-17 17:17:01 -0700105 private static final Integer INPORT = 10;
Charles Chane6067892016-11-17 10:23:46 -0800106 private static final Integer INPORT2 = 11;
alshabib4a179dc2014-10-17 17:17:01 -0700107 private static final String DEV1 = "of:1";
108 private static final String DEV2 = "of:2";
109 private static final String DEV3 = "of:3";
Charles Chan5d5e0622015-09-25 13:00:06 -0700110 private static final String DEV4 = "of:4";
111 private static final String DEV5 = "of:5";
112 private static final String DEV6 = "of:6";
alshabib4a179dc2014-10-17 17:17:01 -0700113
Thomas Vachuska33601602014-11-19 03:32:15 -0800114 private static final VlanId VLAN = vlanId();
Charles Chan5d5e0622015-09-25 13:00:06 -0700115
116 // IPv4 Host
alshabib4a179dc2014-10-17 17:17:01 -0700117 private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01");
118 private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff");
119 private static final byte[] IP = new byte[]{10, 0, 0, 1};
Thomas Vachuska33601602014-11-19 03:32:15 -0800120 private static final IpAddress IP_ADDRESS =
121 IpAddress.valueOf(IpAddress.Version.INET, IP);
122 private static final HostLocation LOCATION =
123 new HostLocation(deviceId(DEV1), portNumber(INPORT), 0L);
Thomas Vachuska33601602014-11-19 03:32:15 -0800124 private static final DefaultHost HOST =
Charles Chan8b0fdaa2016-02-23 18:35:27 -0800125 new DefaultHost(PROVIDER_ID, hostId(MAC), MAC,
Charles Chane6067892016-11-17 10:23:46 -0800126 VLAN, LOCATION,
127 ImmutableSet.of(IP_ADDRESS));
Thomas Vachuska33601602014-11-19 03:32:15 -0800128
Charles Chan5d5e0622015-09-25 13:00:06 -0700129 // IPv6 Host
130 private static final MacAddress MAC2 = MacAddress.valueOf("00:00:22:00:00:02");
131 private static final MacAddress BCMAC2 = MacAddress.valueOf("33:33:00:00:00:01");
132 private static final byte[] IP2 = Ip6Address.valueOf("1000::1").toOctets();
133 private static final IpAddress IP_ADDRESS2 =
134 IpAddress.valueOf(IpAddress.Version.INET6, IP2);
135 private static final HostLocation LOCATION2 =
136 new HostLocation(deviceId(DEV4), portNumber(INPORT), 0L);
137 private static final DefaultHost HOST2 =
Charles Chan8b0fdaa2016-02-23 18:35:27 -0800138 new DefaultHost(PROVIDER_ID, hostId(MAC2), MAC2,
Charles Chane6067892016-11-17 10:23:46 -0800139 VLAN, LOCATION2,
140 ImmutableSet.of(IP_ADDRESS2));
141
142 // DHCP Server
143 private static final MacAddress MAC3 = MacAddress.valueOf("00:00:33:00:00:03");
144 private static final byte[] IP3 = new byte[]{10, 0, 0, 2};
145 private static final IpAddress IP_ADDRESS3 =
146 IpAddress.valueOf(IpAddress.Version.INET, IP3);
147
148 private static final HostLocation LOCATION3 =
149 new HostLocation(deviceId(DEV1), portNumber(INPORT2), 0L);
150 private static final DefaultHost HOST3 =
151 new DefaultHost(PROVIDER_ID, hostId(MAC3), MAC3,
152 VLAN, LOCATION3,
153 ImmutableSet.of(IP_ADDRESS3));
Charles Chan5d5e0622015-09-25 13:00:06 -0700154
Thomas Vachuska33601602014-11-19 03:32:15 -0800155 private static final ComponentContextAdapter CTX_FOR_REMOVE =
156 new ComponentContextAdapter() {
157 @Override
158 public Dictionary getProperties() {
159 Hashtable<String, String> props = new Hashtable<>();
160 props.put("hostRemovalEnabled", "true");
161 return props;
162 }
163 };
164
165 public static final ComponentContextAdapter CTX_FOR_NO_REMOVE =
166 new ComponentContextAdapter() {
167 @Override
168 public Dictionary getProperties() {
169 return new Hashtable();
170 }
171 };
172
alshabib4a179dc2014-10-17 17:17:01 -0700173 private final HostLocationProvider provider = new HostLocationProvider();
Thomas Vachuska33601602014-11-19 03:32:15 -0800174 private final TestHostRegistry hostRegistry = new TestHostRegistry();
alshabib4a179dc2014-10-17 17:17:01 -0700175 private final TestTopologyService topoService = new TestTopologyService();
Thomas Vachuska33601602014-11-19 03:32:15 -0800176 private final TestDeviceService deviceService = new TestDeviceService();
177 private final TestHostService hostService = new TestHostService();
alshabib4a179dc2014-10-17 17:17:01 -0700178 private final TestPacketService packetService = new TestPacketService();
179
180 private PacketProcessor testProcessor;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800181 private CoreService coreService;
alshabib4a179dc2014-10-17 17:17:01 -0700182 private TestHostProviderService providerService;
183
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800184 private ApplicationId appId =
185 new DefaultApplicationId(100, "org.onosproject.provider.host");
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800186
alshabib4a179dc2014-10-17 17:17:01 -0700187 @Before
188 public void setUp() {
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800189
190 coreService = createMock(CoreService.class);
191 expect(coreService.registerApplication(appId.name()))
Thomas Vachuska27bee092015-06-23 19:03:10 -0700192 .andReturn(appId).anyTimes();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800193 replay(coreService);
194
Thomas Vachuska6519e6f2015-03-11 02:29:31 -0700195 provider.cfgService = new ComponentConfigAdapter();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800196 provider.coreService = coreService;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800197
Thomas Vachuska33601602014-11-19 03:32:15 -0800198 provider.providerRegistry = hostRegistry;
alshabib4a179dc2014-10-17 17:17:01 -0700199 provider.topologyService = topoService;
Pavlin Radoslavovd6612f92015-02-23 13:53:32 -0800200 provider.packetService = packetService;
Thomas Vachuska33601602014-11-19 03:32:15 -0800201 provider.deviceService = deviceService;
202 provider.hostService = hostService;
alshabib4a179dc2014-10-17 17:17:01 -0700203
Thomas Vachuska33601602014-11-19 03:32:15 -0800204 provider.activate(CTX_FOR_NO_REMOVE);
Madan Jampania3770c32015-12-11 12:07:41 -0800205
206 provider.eventHandler = MoreExecutors.newDirectExecutorService();
alshabib4a179dc2014-10-17 17:17:01 -0700207 }
208
209 @Test
210 public void basics() {
211 assertNotNull("registration expected", providerService);
212 assertEquals("incorrect provider", provider, providerService.provider());
213 }
214
215 @Test
216 public void events() {
Charles Chan420e7372016-11-17 10:58:17 -0800217 // New host. Expect one additional host description.
Charles Chan5d5e0622015-09-25 13:00:06 -0700218 testProcessor.process(new TestArpPacketContext(DEV1));
Charles Chan420e7372016-11-17 10:58:17 -0800219 assertThat("New host expected", providerService.descriptions.size(), is(1));
alshabib4a179dc2014-10-17 17:17:01 -0700220
Charles Chan420e7372016-11-17 10:58:17 -0800221 // The host moved to new switch. Expect one additional host description.
222 // The second host description should have a different location.
Charles Chan5d5e0622015-09-25 13:00:06 -0700223 testProcessor.process(new TestArpPacketContext(DEV2));
Charles Chan420e7372016-11-17 10:58:17 -0800224 assertThat("Host motion expected", providerService.descriptions.size(), is(2));
225 HostLocation loc1 = providerService.descriptions.get(0).location();
226 HostLocation loc2 = providerService.descriptions.get(1).location();
227 assertNotEquals("Host location should be different", loc1, loc2);
alshabib4a179dc2014-10-17 17:17:01 -0700228
Charles Chan420e7372016-11-17 10:58:17 -0800229 // The host was misheard on a spine. Expect no additional host description.
Charles Chan5d5e0622015-09-25 13:00:06 -0700230 testProcessor.process(new TestArpPacketContext(DEV3));
Charles Chan420e7372016-11-17 10:58:17 -0800231 assertThat("Host misheard on spine switch", providerService.descriptions.size(), is(2));
Charles Chan5d5e0622015-09-25 13:00:06 -0700232
233 providerService.clear();
234
Charles Chan420e7372016-11-17 10:58:17 -0800235 // New host. Expect one additional host description.
Jonathan Hartb35540a2015-11-17 09:30:56 -0800236 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800237 assertThat("New host expected", providerService.descriptions.size(), is(1));
Charles Chan5d5e0622015-09-25 13:00:06 -0700238
Charles Chan420e7372016-11-17 10:58:17 -0800239 // The host moved to new switch. Expect one additional host description.
240 // The second host description should have a different location.
Jonathan Hartb35540a2015-11-17 09:30:56 -0800241 testProcessor.process(new TestNaPacketContext(DEV5));
Charles Chan420e7372016-11-17 10:58:17 -0800242 assertThat("Host motion expected", providerService.descriptions.size(), is(2));
243 loc1 = providerService.descriptions.get(0).location();
244 loc2 = providerService.descriptions.get(1).location();
245 assertNotEquals("Host location should be different", loc1, loc2);
Charles Chan5d5e0622015-09-25 13:00:06 -0700246
Charles Chan420e7372016-11-17 10:58:17 -0800247 // The host was misheard on a spine. Expect no additional host description.
Jonathan Hartb35540a2015-11-17 09:30:56 -0800248 testProcessor.process(new TestNaPacketContext(DEV6));
Charles Chan420e7372016-11-17 10:58:17 -0800249 assertThat("Host misheard on spine switch", providerService.descriptions.size(), is(2));
alshabib4a179dc2014-10-17 17:17:01 -0700250 }
251
Thomas Vachuska33601602014-11-19 03:32:15 -0800252 @Test
253 public void removeHostByDeviceRemove() {
254 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700255 testProcessor.process(new TestArpPacketContext(DEV1));
Jonathan Hartb35540a2015-11-17 09:30:56 -0800256 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan5d5e0622015-09-25 13:00:06 -0700257
Thomas Vachuska33601602014-11-19 03:32:15 -0800258 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
259 "m", "h", "s", "n", new ChassisId(0L));
260 deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
Charles Chane6067892016-11-17 10:23:46 -0800261 assertEquals("incorrect remove count", 2, providerService.removeCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700262
263 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
264 "m", "h", "s", "n", new ChassisId(0L));
265 deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
Charles Chane6067892016-11-17 10:23:46 -0800266 assertEquals("incorrect remove count", 3, providerService.removeCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800267 }
268
269 @Test
270 public void removeHostByDeviceOffline() {
271 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700272 testProcessor.process(new TestArpPacketContext(DEV1));
273 testProcessor.process(new TestArpPacketContext(DEV4));
274
Thomas Vachuska33601602014-11-19 03:32:15 -0800275 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
276 "m", "h", "s", "n", new ChassisId(0L));
277 deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
Charles Chane6067892016-11-17 10:23:46 -0800278 assertEquals("incorrect remove count", 2, providerService.removeCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700279
280 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
281 "m", "h", "s", "n", new ChassisId(0L));
282 deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
Charles Chane6067892016-11-17 10:23:46 -0800283 assertEquals("incorrect remove count", 3, providerService.removeCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800284 }
285
286 @Test
287 public void removeHostByDevicePortDown() {
288 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700289 testProcessor.process(new TestArpPacketContext(DEV1));
290 testProcessor.process(new TestArpPacketContext(DEV4));
291
Thomas Vachuska33601602014-11-19 03:32:15 -0800292 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
293 "m", "h", "s", "n", new ChassisId(0L));
294 deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
Charles Chan5d5e0622015-09-25 13:00:06 -0700295 new DefaultPort(device, portNumber(INPORT), false)));
Thomas Vachuska33601602014-11-19 03:32:15 -0800296 assertEquals("incorrect remove count", 1, providerService.removeCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700297
298 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
299 "m", "h", "s", "n", new ChassisId(0L));
300 deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
301 new DefaultPort(device, portNumber(INPORT), false)));
302 assertEquals("incorrect remove count", 2, providerService.removeCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800303 }
304
Charles Chan5d5e0622015-09-25 13:00:06 -0700305 /**
306 * When receiving ARP, updates location and IP.
307 */
308 @Test
309 public void testReceiveArp() {
310 testProcessor.process(new TestArpPacketContext(DEV1));
Charles Chan420e7372016-11-17 10:58:17 -0800311 assertThat("testReceiveArp. One host description expected",
312 providerService.descriptions.size(), is(1));
313 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700314 assertThat(descr.location(), is(LOCATION));
315 assertThat(descr.hwAddress(), is(MAC));
316 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS));
317 assertThat(descr.vlan(), is(VLAN));
318 }
319
320 /**
321 * When receiving IPv4, updates location only.
322 */
323 @Test
324 public void testReceiveIpv4() {
325 testProcessor.process(new TestIpv4PacketContext(DEV1));
Charles Chan420e7372016-11-17 10:58:17 -0800326 assertThat("testReceiveIpv4. One host description expected",
327 providerService.descriptions.size(), is(1));
328 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700329 assertThat(descr.location(), is(LOCATION));
330 assertThat(descr.hwAddress(), is(MAC));
331 assertThat(descr.ipAddress().size(), is(0));
332 assertThat(descr.vlan(), is(VLAN));
333 }
334
335 /**
Charles Chane6067892016-11-17 10:23:46 -0800336 * When receiving DHCP REQUEST, update MAC, location of client.
337 * When receiving DHCP ACK, update MAC, location of server and IP of client.
338 */
339 @Test
340 public void testReceiveDhcp() {
341 // DHCP Request
342 testProcessor.process(new TestDhcpRequestPacketContext(DEV1));
343 assertThat("testReceiveDhcpRequest. One host description expected",
344 providerService.descriptions.size(), is(1));
345 // Should learn the MAC and location of DHCP client
346 HostDescription descr = providerService.descriptions.get(0);
347 assertThat(descr.location(), is(LOCATION));
348 assertThat(descr.hwAddress(), is(MAC));
349 assertThat(descr.ipAddress().size(), is(0));
350 assertThat(descr.vlan(), is(VLAN));
351
352 // DHCP Ack
353 testProcessor.process(new TestDhcpAckPacketContext(DEV1));
354 assertThat("testReceiveDhcpAck. Two additional host descriptions expected",
355 providerService.descriptions.size(), is(3));
356 // Should learn the IP of DHCP client
357 HostDescription descr2 = providerService.descriptions.get(1);
358 assertThat(descr2.location(), is(LOCATION));
359 assertThat(descr2.hwAddress(), is(MAC));
360 assertThat(descr2.ipAddress().size(), is(1));
361 assertTrue(descr2.ipAddress().contains(IP_ADDRESS));
362 assertThat(descr2.vlan(), is(VLAN));
363 // Should also learn the MAC, location of DHCP server
364 HostDescription descr3 = providerService.descriptions.get(2);
365 assertThat(descr3.location(), is(LOCATION3));
366 assertThat(descr3.hwAddress(), is(MAC3));
367 assertThat(descr3.ipAddress().size(), is(0));
368 assertThat(descr3.vlan(), is(VLAN));
369
370 }
371
372 /**
Charles Chan5d5e0622015-09-25 13:00:06 -0700373 * When receiving NeighborAdvertisement, updates location and IP.
374 */
375 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800376 public void testReceiveNa() {
377 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800378 assertThat("testReceiveNa. One host description expected",
379 providerService.descriptions.size(), is(1));
380 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700381 assertThat(descr.location(), is(LOCATION2));
382 assertThat(descr.hwAddress(), is(MAC2));
383 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS2));
384 assertThat(descr.vlan(), is(VLAN));
385 }
386
387 /**
388 * When receiving NeighborSolicitation, updates location and IP.
389 */
390 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800391 public void testReceiveNs() {
392 testProcessor.process(new TestNsPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800393 assertThat("testReceiveNs. One host description expected",
394 providerService.descriptions.size(), is(1));
395 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700396 assertThat(descr.location(), is(LOCATION2));
397 assertThat(descr.hwAddress(), is(MAC2));
398 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS2));
399 assertThat(descr.vlan(), is(VLAN));
400 }
401
402 /**
403 * When receiving RouterAdvertisement, ignores it.
404 */
405 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800406 public void testReceivesRa() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700407 testProcessor.process(new TestRAPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800408 assertThat("testReceiveRa. No host description expected",
409 providerService.descriptions.size(), is(0));
Charles Chan5d5e0622015-09-25 13:00:06 -0700410 }
411
412 /**
413 * When receiving RouterSolicitation, ignores it.
414 */
415 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800416 public void testReceiveRs() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700417 testProcessor.process(new TestRSPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800418 assertThat("testReceiveRs. No host description expected",
419 providerService.descriptions.size(), is(0));
Charles Chan5d5e0622015-09-25 13:00:06 -0700420 }
421
422 /**
423 * When receiving Duplicate Address Detection (DAD), ignores it.
424 */
425 @Test
Jonathan Hartb35540a2015-11-17 09:30:56 -0800426 public void testReceiveDad() {
427 testProcessor.process(new TestDadPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800428 assertThat("testReceiveDad. No host description expected",
429 providerService.descriptions.size(), is(0));
Charles Chan5d5e0622015-09-25 13:00:06 -0700430 }
431
432 /**
433 * When receiving IPv6 multicast packet, ignores it.
434 */
435 @Test
436 public void testReceiveIpv6Multicast() {
437 testProcessor.process(new TestIpv6McastPacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800438 assertThat("testReceiveIpv6Multicast. No host description expected",
439 providerService.descriptions.size(), is(0));
Charles Chan5d5e0622015-09-25 13:00:06 -0700440 }
441
442 /**
443 * When receiving IPv6 unicast packet, updates location only.
444 */
445 @Test
446 public void testReceiveIpv6Unicast() {
447 testProcessor.process(new TestIpv6PacketContext(DEV4));
Charles Chan420e7372016-11-17 10:58:17 -0800448 assertThat("testReceiveIpv6Unicast. One host description expected",
449 providerService.descriptions.size(), is(1));
450 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700451 assertThat(descr.location(), is(LOCATION2));
452 assertThat(descr.hwAddress(), is(MAC2));
453 assertThat(descr.ipAddress().size(), is(0));
454 assertThat(descr.vlan(), is(VLAN));
455 }
Thomas Vachuska33601602014-11-19 03:32:15 -0800456
alshabib4a179dc2014-10-17 17:17:01 -0700457 @After
458 public void tearDown() {
459 provider.deactivate();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800460 provider.coreService = null;
alshabib4a179dc2014-10-17 17:17:01 -0700461 provider.providerRegistry = null;
alshabib4a179dc2014-10-17 17:17:01 -0700462 }
463
464 private class TestHostRegistry implements HostProviderRegistry {
465
466 @Override
467 public HostProviderService register(HostProvider provider) {
468 providerService = new TestHostProviderService(provider);
469 return providerService;
470 }
471
472 @Override
473 public void unregister(HostProvider provider) {
474 }
475
476 @Override
477 public Set<ProviderId> getProviders() {
478 return null;
479 }
480
481 }
482
483 private class TestHostProviderService
484 extends AbstractProviderService<HostProvider>
485 implements HostProviderService {
486
Charles Chan420e7372016-11-17 10:58:17 -0800487 List<HostDescription> descriptions = Lists.newArrayList();
488 int removeCount;
alshabib4a179dc2014-10-17 17:17:01 -0700489
Charles Chan5d5e0622015-09-25 13:00:06 -0700490 public void clear() {
Charles Chan420e7372016-11-17 10:58:17 -0800491 descriptions.clear();
Charles Chan5d5e0622015-09-25 13:00:06 -0700492 removeCount = 0;
493 }
494
alshabib4a179dc2014-10-17 17:17:01 -0700495 protected TestHostProviderService(HostProvider provider) {
496 super(provider);
497 }
498
499 @Override
Brian O'Connorf107bd72015-09-21 15:31:03 -0700500 public void hostDetected(HostId hostId, HostDescription hostDescription, boolean replaceIps) {
Charles Chan420e7372016-11-17 10:58:17 -0800501 descriptions.add(hostDescription);
alshabib4a179dc2014-10-17 17:17:01 -0700502 }
503
504 @Override
505 public void hostVanished(HostId hostId) {
Thomas Vachuska33601602014-11-19 03:32:15 -0800506 removeCount++;
alshabib4a179dc2014-10-17 17:17:01 -0700507 }
508
samanwita palc40e5ed2015-09-24 11:01:51 -0700509 @Override
510 public void removeIpFromHost(HostId hostId, IpAddress ipAddress) {
511 }
512
alshabib4a179dc2014-10-17 17:17:01 -0700513 }
514
Thomas Vachuska27bee092015-06-23 19:03:10 -0700515 private class TestPacketService extends PacketServiceAdapter {
alshabib4a179dc2014-10-17 17:17:01 -0700516 @Override
517 public void addProcessor(PacketProcessor processor, int priority) {
518 testProcessor = processor;
519 }
alshabib4a179dc2014-10-17 17:17:01 -0700520 }
521
alshabib4a179dc2014-10-17 17:17:01 -0700522 private class TestTopologyService extends TopologyServiceAdapter {
523 @Override
524 public boolean isInfrastructure(Topology topology,
525 ConnectPoint connectPoint) {
526 //simulate DPID3 as an infrastructure switch
Charles Chan5d5e0622015-09-25 13:00:06 -0700527 if ((connectPoint.deviceId()).equals(deviceId(DEV3)) ||
528 connectPoint.deviceId().equals(deviceId(DEV6))) {
alshabib4a179dc2014-10-17 17:17:01 -0700529 return true;
530 }
531 return false;
532 }
533 }
534
Charles Chan5d5e0622015-09-25 13:00:06 -0700535 /**
536 * Generates ARP packet.
537 */
538 private class TestArpPacketContext implements PacketContext {
alshabib4a179dc2014-10-17 17:17:01 -0700539 private final String deviceId;
540
Charles Chan5d5e0622015-09-25 13:00:06 -0700541 public TestArpPacketContext(String deviceId) {
alshabib4a179dc2014-10-17 17:17:01 -0700542 this.deviceId = deviceId;
543 }
544
545 @Override
546 public long time() {
547 return 0;
548 }
549
550 @Override
551 public InboundPacket inPacket() {
552 ARP arp = new ARP();
553 arp.setSenderProtocolAddress(IP)
554 .setSenderHardwareAddress(MAC.toBytes())
555 .setTargetHardwareAddress(BCMAC.toBytes())
556 .setTargetProtocolAddress(IP);
557
558 Ethernet eth = new Ethernet();
559 eth.setEtherType(Ethernet.TYPE_ARP)
560 .setVlanID(VLAN.toShort())
561 .setSourceMACAddress(MAC.toBytes())
Yuta HIGUCHI3e848a82014-11-02 20:19:42 -0800562 .setDestinationMACAddress(BCMAC)
alshabib4a179dc2014-10-17 17:17:01 -0700563 .setPayload(arp);
Thomas Vachuska33601602014-11-19 03:32:15 -0800564 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
565 portNumber(INPORT));
alshabib4a179dc2014-10-17 17:17:01 -0700566 return new DefaultInboundPacket(receivedFrom, eth,
567 ByteBuffer.wrap(eth.serialize()));
568 }
569
570 @Override
571 public OutboundPacket outPacket() {
572 return null;
573 }
574
575 @Override
576 public TrafficTreatment.Builder treatmentBuilder() {
577 return null;
578 }
579
580 @Override
581 public void send() {
582
583 }
584
585 @Override
586 public boolean block() {
587 return false;
588 }
589
590 @Override
591 public boolean isHandled() {
592 return false;
593 }
594 }
Thomas Vachuska33601602014-11-19 03:32:15 -0800595
Charles Chan5d5e0622015-09-25 13:00:06 -0700596 /**
Charles Chane6067892016-11-17 10:23:46 -0800597 * Generates IPv4 Unicast packet.
Charles Chan5d5e0622015-09-25 13:00:06 -0700598 */
599 private class TestIpv4PacketContext implements PacketContext {
600 private final String deviceId;
601
602 public TestIpv4PacketContext(String deviceId) {
603 this.deviceId = deviceId;
604 }
605
606 @Override
607 public long time() {
608 return 0;
609 }
610
611 @Override
612 public InboundPacket inPacket() {
613 IPv4 ipv4 = new IPv4();
614 ipv4.setDestinationAddress("10.0.0.1");
615 ipv4.setSourceAddress(IP_ADDRESS.toString());
616 Ethernet eth = new Ethernet();
617 eth.setEtherType(Ethernet.TYPE_IPV4)
618 .setVlanID(VLAN.toShort())
619 .setSourceMACAddress(MAC)
620 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
621 .setPayload(ipv4);
622 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
623 portNumber(INPORT));
624 return new DefaultInboundPacket(receivedFrom, eth,
625 ByteBuffer.wrap(eth.serialize()));
626 }
627
628 @Override
629 public OutboundPacket outPacket() {
630 return null;
631 }
632
633 @Override
634 public TrafficTreatment.Builder treatmentBuilder() {
635 return null;
636 }
637
638 @Override
639 public void send() {
640
641 }
642
643 @Override
644 public boolean block() {
645 return false;
646 }
647
648 @Override
649 public boolean isHandled() {
650 return false;
651 }
652 }
Charles Chane6067892016-11-17 10:23:46 -0800653 /**
654 * Generates DHCP REQUEST packet.
655 */
656 private class TestDhcpRequestPacketContext implements PacketContext {
657 private final String deviceId;
658
659 public TestDhcpRequestPacketContext(String deviceId) {
660 this.deviceId = deviceId;
661 }
662
663 @Override
664 public long time() {
665 return 0;
666 }
667
668 @Override
669 public InboundPacket inPacket() {
670 byte[] dhcpMsgType = new byte[1];
671 dhcpMsgType[0] = (byte) DHCPPacketType.DHCPREQUEST.getValue();
672
673 DHCPOption dhcpOption = new DHCPOption();
674 dhcpOption.setCode(DHCP.DHCPOptionCode.OptionCode_MessageType.getValue());
675 dhcpOption.setData(dhcpMsgType);
676 dhcpOption.setLength((byte) 1);
677 DHCP dhcp = new DHCP();
678 dhcp.setOptions(Collections.singletonList(dhcpOption));
679 dhcp.setClientHardwareAddress(MAC.toBytes());
680 UDP udp = new UDP();
681 udp.setPayload(dhcp);
682 udp.setSourcePort(UDP.DHCP_CLIENT_PORT);
683 udp.setDestinationPort(UDP.DHCP_SERVER_PORT);
684 IPv4 ipv4 = new IPv4();
685 ipv4.setPayload(udp);
686 ipv4.setDestinationAddress(IP_ADDRESS3.toString());
687 ipv4.setSourceAddress(IP_ADDRESS.toString());
688 Ethernet eth = new Ethernet();
689 eth.setEtherType(Ethernet.TYPE_IPV4)
690 .setVlanID(VLAN.toShort())
691 .setSourceMACAddress(MAC)
692 .setDestinationMACAddress(MAC3)
693 .setPayload(ipv4);
694 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
695 portNumber(INPORT));
696 return new DefaultInboundPacket(receivedFrom, eth,
697 ByteBuffer.wrap(eth.serialize()));
698 }
699
700 @Override
701 public OutboundPacket outPacket() {
702 return null;
703 }
704
705 @Override
706 public TrafficTreatment.Builder treatmentBuilder() {
707 return null;
708 }
709
710 @Override
711 public void send() {
712
713 }
714
715 @Override
716 public boolean block() {
717 return false;
718 }
719
720 @Override
721 public boolean isHandled() {
722 return false;
723 }
724 }
725
726 /**
727 * Generates DHCP ACK packet.
728 */
729 private class TestDhcpAckPacketContext implements PacketContext {
730 private final String deviceId;
731
732 public TestDhcpAckPacketContext(String deviceId) {
733 this.deviceId = deviceId;
734 }
735
736 @Override
737 public long time() {
738 return 0;
739 }
740
741 @Override
742 public InboundPacket inPacket() {
743 byte[] dhcpMsgType = new byte[1];
744 dhcpMsgType[0] = (byte) DHCPPacketType.DHCPACK.getValue();
745
746 DHCPOption dhcpOption = new DHCPOption();
747 dhcpOption.setCode(DHCP.DHCPOptionCode.OptionCode_MessageType.getValue());
748 dhcpOption.setData(dhcpMsgType);
749 dhcpOption.setLength((byte) 1);
750 DHCP dhcp = new DHCP();
751 dhcp.setOptions(Collections.singletonList(dhcpOption));
752 dhcp.setClientHardwareAddress(MAC.toBytes());
753 dhcp.setYourIPAddress(IP_ADDRESS.getIp4Address().toInt());
754 UDP udp = new UDP();
755 udp.setPayload(dhcp);
756 udp.setSourcePort(UDP.DHCP_SERVER_PORT);
757 udp.setDestinationPort(UDP.DHCP_CLIENT_PORT);
758 IPv4 ipv4 = new IPv4();
759 ipv4.setPayload(udp);
760 ipv4.setDestinationAddress(IP_ADDRESS.toString());
761 ipv4.setSourceAddress(IP_ADDRESS3.toString());
762 Ethernet eth = new Ethernet();
763 eth.setEtherType(Ethernet.TYPE_IPV4)
764 .setVlanID(VLAN.toShort())
765 .setSourceMACAddress(MAC3)
766 .setDestinationMACAddress(MAC)
767 .setPayload(ipv4);
768 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
769 portNumber(INPORT2));
770 return new DefaultInboundPacket(receivedFrom, eth,
771 ByteBuffer.wrap(eth.serialize()));
772 }
773
774 @Override
775 public OutboundPacket outPacket() {
776 return null;
777 }
778
779 @Override
780 public TrafficTreatment.Builder treatmentBuilder() {
781 return null;
782 }
783
784 @Override
785 public void send() {
786
787 }
788
789 @Override
790 public boolean block() {
791 return false;
792 }
793
794 @Override
795 public boolean isHandled() {
796 return false;
797 }
798 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700799
800 /**
801 * Generates NeighborAdvertisement packet.
802 */
Jonathan Hartb35540a2015-11-17 09:30:56 -0800803 private class TestNaPacketContext implements PacketContext {
Charles Chan5d5e0622015-09-25 13:00:06 -0700804 private final String deviceId;
805
Jonathan Hartb35540a2015-11-17 09:30:56 -0800806 public TestNaPacketContext(String deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -0700807 this.deviceId = deviceId;
808 }
809
810 @Override
811 public long time() {
812 return 0;
813 }
814
815 @Override
816 public InboundPacket inPacket() {
817 NeighborAdvertisement na = new NeighborAdvertisement();
818 ICMP6 icmp6 = new ICMP6();
819 icmp6.setPayload(na);
820 IPv6 ipv6 = new IPv6();
821 ipv6.setPayload(icmp6);
822 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
823 ipv6.setSourceAddress(IP2);
824 Ethernet eth = new Ethernet();
825 eth.setEtherType(Ethernet.TYPE_IPV6)
826 .setVlanID(VLAN.toShort())
827 .setSourceMACAddress(MAC2.toBytes())
828 .setDestinationMACAddress(BCMAC2)
829 .setPayload(ipv6);
830 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
831 portNumber(INPORT));
832 return new DefaultInboundPacket(receivedFrom, eth,
833 ByteBuffer.wrap(eth.serialize()));
834 }
835
836 @Override
837 public OutboundPacket outPacket() {
838 return null;
839 }
840
841 @Override
842 public TrafficTreatment.Builder treatmentBuilder() {
843 return null;
844 }
845
846 @Override
847 public void send() {
848
849 }
850
851 @Override
852 public boolean block() {
853 return false;
854 }
855
856 @Override
857 public boolean isHandled() {
858 return false;
859 }
860 }
861
862 /**
863 * Generates NeighborSolicitation packet.
864 */
Jonathan Hartb35540a2015-11-17 09:30:56 -0800865 private class TestNsPacketContext implements PacketContext {
Charles Chan5d5e0622015-09-25 13:00:06 -0700866 private final String deviceId;
867
Jonathan Hartb35540a2015-11-17 09:30:56 -0800868 public TestNsPacketContext(String deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -0700869 this.deviceId = deviceId;
870 }
871
872 @Override
873 public long time() {
874 return 0;
875 }
876
877 @Override
878 public InboundPacket inPacket() {
879 NeighborSolicitation ns = new NeighborSolicitation();
880 ICMP6 icmp6 = new ICMP6();
881 icmp6.setPayload(ns);
882 IPv6 ipv6 = new IPv6();
883 ipv6.setPayload(icmp6);
884 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1:ff00:0000").toOctets());
885 ipv6.setSourceAddress(IP2);
886 Ethernet eth = new Ethernet();
887 eth.setEtherType(Ethernet.TYPE_IPV6)
888 .setVlanID(VLAN.toShort())
889 .setSourceMACAddress(MAC2.toBytes())
890 .setDestinationMACAddress(BCMAC2)
891 .setPayload(ipv6);
892 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
893 portNumber(INPORT));
894 return new DefaultInboundPacket(receivedFrom, eth,
895 ByteBuffer.wrap(eth.serialize()));
896 }
897
898 @Override
899 public OutboundPacket outPacket() {
900 return null;
901 }
902
903 @Override
904 public TrafficTreatment.Builder treatmentBuilder() {
905 return null;
906 }
907
908 @Override
909 public void send() {
910
911 }
912
913 @Override
914 public boolean block() {
915 return false;
916 }
917
918 @Override
919 public boolean isHandled() {
920 return false;
921 }
922 }
923
924 /**
925 * Generates Duplicate Address Detection packet.
926 */
Jonathan Hartb35540a2015-11-17 09:30:56 -0800927 private class TestDadPacketContext implements PacketContext {
Charles Chan5d5e0622015-09-25 13:00:06 -0700928 private final String deviceId;
929
Jonathan Hartb35540a2015-11-17 09:30:56 -0800930 public TestDadPacketContext(String deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -0700931 this.deviceId = deviceId;
932 }
933
934 @Override
935 public long time() {
936 return 0;
937 }
938
939 @Override
940 public InboundPacket inPacket() {
941 NeighborSolicitation ns = new NeighborSolicitation();
942 ICMP6 icmp6 = new ICMP6();
943 icmp6.setPayload(ns);
944 IPv6 ipv6 = new IPv6();
945 ipv6.setPayload(icmp6);
946 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
947 ipv6.setSourceAddress(Ip6Address.valueOf("::").toOctets());
948 Ethernet eth = new Ethernet();
949 eth.setEtherType(Ethernet.TYPE_IPV6)
950 .setVlanID(VLAN.toShort())
951 .setSourceMACAddress(MAC2.toBytes())
952 .setDestinationMACAddress(BCMAC2)
953 .setPayload(ipv6);
954 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
955 portNumber(INPORT));
956 return new DefaultInboundPacket(receivedFrom, eth,
957 ByteBuffer.wrap(eth.serialize()));
958 }
959
960 @Override
961 public OutboundPacket outPacket() {
962 return null;
963 }
964
965 @Override
966 public TrafficTreatment.Builder treatmentBuilder() {
967 return null;
968 }
969
970 @Override
971 public void send() {
972
973 }
974
975 @Override
976 public boolean block() {
977 return false;
978 }
979
980 @Override
981 public boolean isHandled() {
982 return false;
983 }
984 }
985
986 /**
987 * Generates Router Solicitation packet.
988 */
989 private class TestRSPacketContext implements PacketContext {
990 private final String deviceId;
991
992 public TestRSPacketContext(String deviceId) {
993 this.deviceId = deviceId;
994 }
995
996 @Override
997 public long time() {
998 return 0;
999 }
1000
1001 @Override
1002 public InboundPacket inPacket() {
1003 RouterSolicitation ns = new RouterSolicitation();
1004 ICMP6 icmp6 = new ICMP6();
1005 icmp6.setPayload(ns);
1006 IPv6 ipv6 = new IPv6();
1007 ipv6.setPayload(icmp6);
1008 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::2").toOctets());
1009 ipv6.setSourceAddress(Ip6Address.valueOf("::").toOctets());
1010 Ethernet eth = new Ethernet();
1011 eth.setEtherType(Ethernet.TYPE_IPV6)
1012 .setVlanID(VLAN.toShort())
1013 .setSourceMACAddress(MAC2.toBytes())
1014 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:02"))
1015 .setPayload(ipv6);
1016 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1017 portNumber(INPORT));
1018 return new DefaultInboundPacket(receivedFrom, eth,
1019 ByteBuffer.wrap(eth.serialize()));
1020 }
1021
1022 @Override
1023 public OutboundPacket outPacket() {
1024 return null;
1025 }
1026
1027 @Override
1028 public TrafficTreatment.Builder treatmentBuilder() {
1029 return null;
1030 }
1031
1032 @Override
1033 public void send() {
1034
1035 }
1036
1037 @Override
1038 public boolean block() {
1039 return false;
1040 }
1041
1042 @Override
1043 public boolean isHandled() {
1044 return false;
1045 }
1046 }
1047
1048 /**
1049 * Generates Router Advertisement packet.
1050 */
1051 private class TestRAPacketContext implements PacketContext {
1052 private final String deviceId;
1053
1054 public TestRAPacketContext(String deviceId) {
1055 this.deviceId = deviceId;
1056 }
1057
1058 @Override
1059 public long time() {
1060 return 0;
1061 }
1062
1063 @Override
1064 public InboundPacket inPacket() {
1065 RouterAdvertisement ns = new RouterAdvertisement();
1066 ICMP6 icmp6 = new ICMP6();
1067 icmp6.setPayload(ns);
1068 IPv6 ipv6 = new IPv6();
1069 ipv6.setPayload(icmp6);
1070 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
1071 ipv6.setSourceAddress(IP2);
1072 Ethernet eth = new Ethernet();
1073 eth.setEtherType(Ethernet.TYPE_IPV6)
1074 .setVlanID(VLAN.toShort())
1075 .setSourceMACAddress(MAC2.toBytes())
1076 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
1077 .setPayload(ipv6);
1078 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1079 portNumber(INPORT));
1080 return new DefaultInboundPacket(receivedFrom, eth,
1081 ByteBuffer.wrap(eth.serialize()));
1082 }
1083
1084 @Override
1085 public OutboundPacket outPacket() {
1086 return null;
1087 }
1088
1089 @Override
1090 public TrafficTreatment.Builder treatmentBuilder() {
1091 return null;
1092 }
1093
1094 @Override
1095 public void send() {
1096
1097 }
1098
1099 @Override
1100 public boolean block() {
1101 return false;
1102 }
1103
1104 @Override
1105 public boolean isHandled() {
1106 return false;
1107 }
1108 }
1109
1110 /**
1111 * Generates IPv6 Multicast packet.
1112 */
1113 private class TestIpv6McastPacketContext implements PacketContext {
1114 private final String deviceId;
1115
1116 public TestIpv6McastPacketContext(String deviceId) {
1117 this.deviceId = deviceId;
1118 }
1119
1120 @Override
1121 public long time() {
1122 return 0;
1123 }
1124
1125 @Override
1126 public InboundPacket inPacket() {
1127 IPv6 ipv6 = new IPv6();
1128 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
1129 ipv6.setSourceAddress(IP2);
1130 Ethernet eth = new Ethernet();
1131 eth.setEtherType(Ethernet.TYPE_IPV6)
1132 .setVlanID(VLAN.toShort())
1133 .setSourceMACAddress(MAC2.toBytes())
1134 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
1135 .setPayload(ipv6);
1136 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1137 portNumber(INPORT));
1138 return new DefaultInboundPacket(receivedFrom, eth,
1139 ByteBuffer.wrap(eth.serialize()));
1140 }
1141
1142 @Override
1143 public OutboundPacket outPacket() {
1144 return null;
1145 }
1146
1147 @Override
1148 public TrafficTreatment.Builder treatmentBuilder() {
1149 return null;
1150 }
1151
1152 @Override
1153 public void send() {
1154
1155 }
1156
1157 @Override
1158 public boolean block() {
1159 return false;
1160 }
1161
1162 @Override
1163 public boolean isHandled() {
1164 return false;
1165 }
1166 }
1167
1168 /**
1169 * Generates IPv6 Unicast packet.
1170 */
1171 private class TestIpv6PacketContext implements PacketContext {
1172 private final String deviceId;
1173
1174 public TestIpv6PacketContext(String deviceId) {
1175 this.deviceId = deviceId;
1176 }
1177
1178 @Override
1179 public long time() {
1180 return 0;
1181 }
1182
1183 @Override
1184 public InboundPacket inPacket() {
1185 IPv6 ipv6 = new IPv6();
1186 ipv6.setDestinationAddress(Ip6Address.valueOf("1000::1").toOctets());
1187 ipv6.setSourceAddress(IP2);
1188 Ethernet eth = new Ethernet();
1189 eth.setEtherType(Ethernet.TYPE_IPV6)
1190 .setVlanID(VLAN.toShort())
1191 .setSourceMACAddress(MAC2)
1192 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
1193 .setPayload(ipv6);
1194 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1195 portNumber(INPORT));
1196 return new DefaultInboundPacket(receivedFrom, eth,
1197 ByteBuffer.wrap(eth.serialize()));
1198 }
1199
1200 @Override
1201 public OutboundPacket outPacket() {
1202 return null;
1203 }
1204
1205 @Override
1206 public TrafficTreatment.Builder treatmentBuilder() {
1207 return null;
1208 }
1209
1210 @Override
1211 public void send() {
1212
1213 }
1214
1215 @Override
1216 public boolean block() {
1217 return false;
1218 }
1219
1220 @Override
1221 public boolean isHandled() {
1222 return false;
1223 }
1224 }
1225
Thomas Vachuska33601602014-11-19 03:32:15 -08001226 private class TestDeviceService extends DeviceServiceAdapter {
1227 private DeviceListener listener;
1228
1229 @Override
1230 public void addListener(DeviceListener listener) {
1231 this.listener = listener;
1232 }
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -08001233
1234 @Override
1235 public Iterable<Device> getDevices() {
1236 return Collections.emptyList();
1237 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001238 }
1239
1240 private class TestHostService extends HostServiceAdapter {
1241 @Override
1242 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
Charles Chan5d5e0622015-09-25 13:00:06 -07001243 ConnectPoint cp1 = new ConnectPoint(deviceId(DEV1), portNumber(INPORT));
1244 ConnectPoint cp2 = new ConnectPoint(deviceId(DEV4), portNumber(INPORT));
Charles Chane6067892016-11-17 10:23:46 -08001245 ConnectPoint cp3 = new ConnectPoint(deviceId(DEV1), portNumber(INPORT2));
Charles Chan5d5e0622015-09-25 13:00:06 -07001246 if (connectPoint.equals(cp1)) {
1247 return ImmutableSet.of(HOST);
1248 } else if (connectPoint.equals(cp2)) {
1249 return ImmutableSet.of(HOST2);
Charles Chane6067892016-11-17 10:23:46 -08001250 } else if (connectPoint.equals(cp3)) {
1251 return ImmutableSet.of(HOST3);
Charles Chan5d5e0622015-09-25 13:00:06 -07001252 } else {
1253 return ImmutableSet.of();
1254 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001255 }
1256
1257 @Override
1258 public Set<Host> getConnectedHosts(DeviceId deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -07001259 if (deviceId.equals(deviceId(DEV1))) {
Charles Chane6067892016-11-17 10:23:46 -08001260 return ImmutableSet.of(HOST, HOST3);
Charles Chan5d5e0622015-09-25 13:00:06 -07001261 } else if (deviceId.equals(deviceId(DEV4))) {
1262 return ImmutableSet.of(HOST2);
1263 } else {
1264 return ImmutableSet.of();
1265 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001266 }
1267
Charles Chane6067892016-11-17 10:23:46 -08001268 @Override
1269 public Host getHost(HostId hostId) {
1270 if (hostId.equals(HostId.hostId(MAC, VLAN))) {
1271 return HOST;
1272 } else if (hostId.equals(HostId.hostId(MAC2, VLAN))) {
1273 return HOST2;
1274 } else if (hostId.equals(HostId.hostId(MAC3, VLAN))) {
1275 return HOST3;
1276 }
1277 return null;
1278 }
1279
Thomas Vachuska33601602014-11-19 03:32:15 -08001280 }
alshabib4a179dc2014-10-17 17:17:01 -07001281}