blob: 0fab86e02c3776c8fcc6476653cc3df77327e275 [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2014-present Open Networking Foundation
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
Yi Tseng7a38f9a2017-06-09 14:36:40 -070018import com.google.common.collect.ImmutableList;
Thomas Vachuska27bee092015-06-23 19:03:10 -070019import com.google.common.collect.ImmutableSet;
Charles Chan420e7372016-11-17 10:58:17 -080020import com.google.common.collect.Lists;
Andreas Pantelopoulos19416412018-06-12 13:19:52 -070021import com.google.common.collect.Sets;
Madan Jampania3770c32015-12-11 12:07:41 -080022import com.google.common.util.concurrent.MoreExecutors;
alshabib4a179dc2014-10-17 17:17:01 -070023import org.junit.After;
24import org.junit.Before;
25import org.junit.Test;
Charles Chan07f15f22018-05-08 21:35:50 -070026import org.onlab.junit.TestTools;
Yi Tseng7a38f9a2017-06-09 14:36:40 -070027import org.onlab.junit.TestUtils;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080028import org.onlab.osgi.ComponentContextAdapter;
29import org.onlab.packet.ARP;
30import org.onlab.packet.ChassisId;
Charles Chane6067892016-11-17 10:23:46 -080031import org.onlab.packet.DHCP;
Yi Tsengfcf5dce2017-07-26 14:30:41 -070032import org.onlab.packet.DHCP6;
33import org.onlab.packet.dhcp.Dhcp6ClientIdOption;
34import org.onlab.packet.dhcp.Dhcp6Duid;
35import org.onlab.packet.dhcp.Dhcp6IaAddressOption;
36import org.onlab.packet.dhcp.Dhcp6IaNaOption;
37import org.onlab.packet.dhcp.Dhcp6Option;
Yi Tsengc7403c22017-06-19 16:23:22 -070038import org.onlab.packet.dhcp.DhcpOption;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080039import org.onlab.packet.Ethernet;
Charles Chan5d5e0622015-09-25 13:00:06 -070040import org.onlab.packet.ICMP6;
41import org.onlab.packet.IPv4;
42import org.onlab.packet.IPv6;
43import org.onlab.packet.Ip6Address;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080044import org.onlab.packet.IpAddress;
45import org.onlab.packet.MacAddress;
Charles Chane6067892016-11-17 10:23:46 -080046import org.onlab.packet.UDP;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080047import org.onlab.packet.VlanId;
Charles Chan5d5e0622015-09-25 13:00:06 -070048import org.onlab.packet.ndp.NeighborAdvertisement;
49import org.onlab.packet.ndp.NeighborSolicitation;
50import org.onlab.packet.ndp.RouterAdvertisement;
51import org.onlab.packet.ndp.RouterSolicitation;
Thomas Vachuska6519e6f2015-03-11 02:29:31 -070052import org.onosproject.cfg.ComponentConfigAdapter;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -080053import org.onosproject.core.ApplicationId;
54import org.onosproject.core.CoreService;
55import org.onosproject.core.DefaultApplicationId;
Andreas Pantelopoulos19416412018-06-12 13:19:52 -070056import org.onosproject.net.config.Config;
57import org.onosproject.net.config.NetworkConfigRegistryAdapter;
58import org.onosproject.net.config.NetworkConfigServiceAdapter;
Ray Milkeyfacf2862017-08-03 11:58:29 -070059import org.onosproject.net.intf.Interface;
60import org.onosproject.net.intf.InterfaceListener;
61import org.onosproject.net.intf.InterfaceService;
Brian O'Connorabafb502014-12-02 22:26:20 -080062import org.onosproject.net.ConnectPoint;
63import org.onosproject.net.DefaultDevice;
64import org.onosproject.net.DefaultHost;
65import org.onosproject.net.DefaultPort;
66import org.onosproject.net.Device;
67import org.onosproject.net.DeviceId;
68import org.onosproject.net.Host;
69import org.onosproject.net.HostId;
70import org.onosproject.net.HostLocation;
71import org.onosproject.net.device.DeviceEvent;
72import org.onosproject.net.device.DeviceListener;
73import org.onosproject.net.device.DeviceServiceAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080074import org.onosproject.net.host.HostDescription;
75import org.onosproject.net.host.HostProvider;
76import org.onosproject.net.host.HostProviderRegistry;
77import org.onosproject.net.host.HostProviderService;
78import org.onosproject.net.host.HostServiceAdapter;
Yi Tseng7a38f9a2017-06-09 14:36:40 -070079import org.onosproject.net.host.InterfaceIpAddress;
Brian O'Connorabafb502014-12-02 22:26:20 -080080import org.onosproject.net.packet.DefaultInboundPacket;
81import org.onosproject.net.packet.InboundPacket;
Andrey Komarov2398d962016-09-26 15:11:23 +030082import org.onosproject.net.packet.PacketContextAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080083import org.onosproject.net.packet.PacketProcessor;
Thomas Vachuska27bee092015-06-23 19:03:10 -070084import org.onosproject.net.packet.PacketServiceAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080085import org.onosproject.net.provider.AbstractProviderService;
86import org.onosproject.net.provider.ProviderId;
87import org.onosproject.net.topology.Topology;
88import org.onosproject.net.topology.TopologyServiceAdapter;
alshabib4a179dc2014-10-17 17:17:01 -070089
Thomas Vachuska27bee092015-06-23 19:03:10 -070090import java.nio.ByteBuffer;
91import java.util.Collections;
92import java.util.Dictionary;
93import java.util.Hashtable;
Charles Chan420e7372016-11-17 10:58:17 -080094import java.util.List;
Thomas Vachuska27bee092015-06-23 19:03:10 -070095import java.util.Set;
96
Michele Santuari72f6bee2016-11-18 12:56:30 +010097import static org.easymock.EasyMock.createMock;
98import static org.easymock.EasyMock.expect;
99import static org.easymock.EasyMock.replay;
Charles Chan5d5e0622015-09-25 13:00:06 -0700100import static org.hamcrest.Matchers.is;
Michele Santuari72f6bee2016-11-18 12:56:30 +0100101import static org.junit.Assert.assertEquals;
102import static org.junit.Assert.assertNotEquals;
103import static org.junit.Assert.assertNotNull;
104import static org.junit.Assert.assertThat;
Charles Chan178b0f52017-10-08 23:51:22 -0400105import static org.junit.Assert.assertTrue;
Thomas Vachuska27bee092015-06-23 19:03:10 -0700106import static org.onlab.packet.VlanId.vlanId;
107import static org.onosproject.net.Device.Type.SWITCH;
108import static org.onosproject.net.DeviceId.deviceId;
109import static org.onosproject.net.HostId.hostId;
110import static org.onosproject.net.PortNumber.portNumber;
Michele Santuari72f6bee2016-11-18 12:56:30 +0100111import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
112import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_REMOVED;
113import static org.onosproject.net.device.DeviceEvent.Type.PORT_UPDATED;
Thomas Vachuska33601602014-11-19 03:32:15 -0800114
alshabib4a179dc2014-10-17 17:17:01 -0700115public class HostLocationProviderTest {
Charles Chan8b0fdaa2016-02-23 18:35:27 -0800116 private static final ProviderId PROVIDER_ID =
117 new ProviderId("of", "org.onosproject.provider.host");
118
Charles Chan07f15f22018-05-08 21:35:50 -0700119 private static final int ASSERTION_DELAY = 100; // millis
120
alshabib4a179dc2014-10-17 17:17:01 -0700121 private static final Integer INPORT = 10;
Charles Chane6067892016-11-17 10:23:46 -0800122 private static final Integer INPORT2 = 11;
alshabib4a179dc2014-10-17 17:17:01 -0700123 private static final String DEV1 = "of:1";
124 private static final String DEV2 = "of:2";
125 private static final String DEV3 = "of:3";
Charles Chan5d5e0622015-09-25 13:00:06 -0700126 private static final String DEV4 = "of:4";
127 private static final String DEV5 = "of:5";
128 private static final String DEV6 = "of:6";
alshabib4a179dc2014-10-17 17:17:01 -0700129
Thomas Vachuska33601602014-11-19 03:32:15 -0800130 private static final VlanId VLAN = vlanId();
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700131 private static final VlanId VLAN_100 = VlanId.vlanId("100");
Charles Chan5d5e0622015-09-25 13:00:06 -0700132
133 // IPv4 Host
alshabib4a179dc2014-10-17 17:17:01 -0700134 private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01");
135 private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff");
136 private static final byte[] IP = new byte[]{10, 0, 0, 1};
Thomas Vachuska33601602014-11-19 03:32:15 -0800137 private static final IpAddress IP_ADDRESS =
138 IpAddress.valueOf(IpAddress.Version.INET, IP);
139 private static final HostLocation LOCATION =
140 new HostLocation(deviceId(DEV1), portNumber(INPORT), 0L);
Thomas Vachuska33601602014-11-19 03:32:15 -0800141 private static final DefaultHost HOST =
Charles Chan8b0fdaa2016-02-23 18:35:27 -0800142 new DefaultHost(PROVIDER_ID, hostId(MAC), MAC,
Charles Chane6067892016-11-17 10:23:46 -0800143 VLAN, LOCATION,
144 ImmutableSet.of(IP_ADDRESS));
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700145 private static final DefaultHost HOST_VLAN_100 =
146 new DefaultHost(PROVIDER_ID, hostId(MAC, VLAN_100), MAC,
147 VLAN_100, LOCATION,
148 ImmutableSet.of(IP_ADDRESS));
Thomas Vachuska33601602014-11-19 03:32:15 -0800149
Charles Chan5d5e0622015-09-25 13:00:06 -0700150 // IPv6 Host
151 private static final MacAddress MAC2 = MacAddress.valueOf("00:00:22:00:00:02");
152 private static final MacAddress BCMAC2 = MacAddress.valueOf("33:33:00:00:00:01");
153 private static final byte[] IP2 = Ip6Address.valueOf("1000::1").toOctets();
Charles Chan178b0f52017-10-08 23:51:22 -0400154 private static final byte[] LLIP2 = IPv6.getLinkLocalAddress(MAC2.toBytes());
Charles Chan5d5e0622015-09-25 13:00:06 -0700155 private static final IpAddress IP_ADDRESS2 =
156 IpAddress.valueOf(IpAddress.Version.INET6, IP2);
Charles Chan178b0f52017-10-08 23:51:22 -0400157 private static final IpAddress LLIP_ADDRESS2 =
158 IpAddress.valueOf(IpAddress.Version.INET6, LLIP2);
Charles Chan5d5e0622015-09-25 13:00:06 -0700159 private static final HostLocation LOCATION2 =
160 new HostLocation(deviceId(DEV4), portNumber(INPORT), 0L);
161 private static final DefaultHost HOST2 =
Charles Chan8b0fdaa2016-02-23 18:35:27 -0800162 new DefaultHost(PROVIDER_ID, hostId(MAC2), MAC2,
Charles Chane6067892016-11-17 10:23:46 -0800163 VLAN, LOCATION2,
164 ImmutableSet.of(IP_ADDRESS2));
165
166 // DHCP Server
167 private static final MacAddress MAC3 = MacAddress.valueOf("00:00:33:00:00:03");
168 private static final byte[] IP3 = new byte[]{10, 0, 0, 2};
169 private static final IpAddress IP_ADDRESS3 =
170 IpAddress.valueOf(IpAddress.Version.INET, IP3);
Charles Chane6067892016-11-17 10:23:46 -0800171 private static final HostLocation LOCATION3 =
172 new HostLocation(deviceId(DEV1), portNumber(INPORT2), 0L);
173 private static final DefaultHost HOST3 =
174 new DefaultHost(PROVIDER_ID, hostId(MAC3), MAC3,
175 VLAN, LOCATION3,
176 ImmutableSet.of(IP_ADDRESS3));
Charles Chan5d5e0622015-09-25 13:00:06 -0700177
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700178 // DHCP6 Server
179 private static final MacAddress DHCP6_SERVER_MAC = MacAddress.valueOf("00:00:44:00:00:04");
180 private static final IpAddress DHCP6_SERVER_IP =
181 IpAddress.valueOf("2000::1:1000");
182
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700183 // Gateway information for relay agent
184 private static final InterfaceIpAddress GW_IFACE_ADDR = InterfaceIpAddress.valueOf("10.0.1.1/32");
185 private static final Interface GW_IFACE = new Interface("gateway",
186 LOCATION,
187 ImmutableList.of(GW_IFACE_ADDR),
188 null,
189 VLAN_100);
190
Thomas Vachuska33601602014-11-19 03:32:15 -0800191 private static final ComponentContextAdapter CTX_FOR_REMOVE =
192 new ComponentContextAdapter() {
193 @Override
194 public Dictionary getProperties() {
195 Hashtable<String, String> props = new Hashtable<>();
196 props.put("hostRemovalEnabled", "true");
197 return props;
198 }
199 };
200
201 public static final ComponentContextAdapter CTX_FOR_NO_REMOVE =
202 new ComponentContextAdapter() {
203 @Override
204 public Dictionary getProperties() {
205 return new Hashtable();
206 }
207 };
208
alshabib4a179dc2014-10-17 17:17:01 -0700209 private final HostLocationProvider provider = new HostLocationProvider();
Thomas Vachuska33601602014-11-19 03:32:15 -0800210 private final TestHostRegistry hostRegistry = new TestHostRegistry();
alshabib4a179dc2014-10-17 17:17:01 -0700211 private final TestTopologyService topoService = new TestTopologyService();
Thomas Vachuska33601602014-11-19 03:32:15 -0800212 private final TestDeviceService deviceService = new TestDeviceService();
213 private final TestHostService hostService = new TestHostService();
alshabib4a179dc2014-10-17 17:17:01 -0700214 private final TestPacketService packetService = new TestPacketService();
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700215 private final TestInterfaceService interfaceService = new TestInterfaceService();
Andreas Pantelopoulos19416412018-06-12 13:19:52 -0700216 private final TestNetworkConfigRegistryAdapter registryAdapter = new TestNetworkConfigRegistryAdapter();
217 private final TestNetworkConfigService netcfgService = new TestNetworkConfigService();
alshabib4a179dc2014-10-17 17:17:01 -0700218
219 private PacketProcessor testProcessor;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800220 private CoreService coreService;
alshabib4a179dc2014-10-17 17:17:01 -0700221 private TestHostProviderService providerService;
222
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800223 private ApplicationId appId =
224 new DefaultApplicationId(100, "org.onosproject.provider.host");
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800225
alshabib4a179dc2014-10-17 17:17:01 -0700226 @Before
227 public void setUp() {
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800228 coreService = createMock(CoreService.class);
229 expect(coreService.registerApplication(appId.name()))
Thomas Vachuska27bee092015-06-23 19:03:10 -0700230 .andReturn(appId).anyTimes();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800231 replay(coreService);
232
Thomas Vachuska6519e6f2015-03-11 02:29:31 -0700233 provider.cfgService = new ComponentConfigAdapter();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800234 provider.coreService = coreService;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800235
Thomas Vachuska33601602014-11-19 03:32:15 -0800236 provider.providerRegistry = hostRegistry;
alshabib4a179dc2014-10-17 17:17:01 -0700237 provider.topologyService = topoService;
Pavlin Radoslavovd6612f92015-02-23 13:53:32 -0800238 provider.packetService = packetService;
Thomas Vachuska33601602014-11-19 03:32:15 -0800239 provider.deviceService = deviceService;
240 provider.hostService = hostService;
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700241 provider.interfaceService = interfaceService;
Andreas Pantelopoulos19416412018-06-12 13:19:52 -0700242 provider.registry = registryAdapter;
243 provider.netcfgService = netcfgService;
Thomas Vachuska33601602014-11-19 03:32:15 -0800244 provider.activate(CTX_FOR_NO_REMOVE);
Madan Jampania3770c32015-12-11 12:07:41 -0800245
Charles Chanff79dd92018-06-01 16:33:48 -0700246 provider.deviceEventHandler = MoreExecutors.newDirectExecutorService();
alshabib4a179dc2014-10-17 17:17:01 -0700247 }
248
249 @Test
250 public void basics() {
251 assertNotNull("registration expected", providerService);
252 assertEquals("incorrect provider", provider, providerService.provider());
253 }
254
255 @Test
256 public void events() {
Charles Chan420e7372016-11-17 10:58:17 -0800257 // New host. Expect one additional host description.
Charles Chan5d5e0622015-09-25 13:00:06 -0700258 testProcessor.process(new TestArpPacketContext(DEV1));
Charles Chan07f15f22018-05-08 21:35:50 -0700259 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("New host expected",
260 providerService.descriptions.size(), is(1)));
alshabib4a179dc2014-10-17 17:17:01 -0700261
Charles Chan420e7372016-11-17 10:58:17 -0800262 // The host moved to new switch. Expect one additional host description.
263 // The second host description should have a different location.
Charles Chan5d5e0622015-09-25 13:00:06 -0700264 testProcessor.process(new TestArpPacketContext(DEV2));
Charles Chan07f15f22018-05-08 21:35:50 -0700265 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("Host motion expected",
266 providerService.descriptions.size(), is(2)));
267 final HostLocation loc11 = providerService.descriptions.get(0).location();
268 final HostLocation loc12 = providerService.descriptions.get(1).location();
269 TestTools.assertAfter(ASSERTION_DELAY, () -> assertNotEquals("Host location should be different",
270 loc11, loc12));
alshabib4a179dc2014-10-17 17:17:01 -0700271
Charles Chan420e7372016-11-17 10:58:17 -0800272 // The host was misheard on a spine. Expect no additional host description.
Charles Chan5d5e0622015-09-25 13:00:06 -0700273 testProcessor.process(new TestArpPacketContext(DEV3));
Charles Chan07f15f22018-05-08 21:35:50 -0700274 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("Host misheard on spine switch",
275 providerService.descriptions.size(), is(2)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700276
277 providerService.clear();
278
Charles Chan178b0f52017-10-08 23:51:22 -0400279 // New host. Expect two additional host descriptions. One for target IP. One for dest IP.
Jonathan Hartb35540a2015-11-17 09:30:56 -0800280 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan07f15f22018-05-08 21:35:50 -0700281 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("New host expected",
282 providerService.descriptions.size(), is(2)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700283
Charles Chan178b0f52017-10-08 23:51:22 -0400284 // The host moved to new switch. Expect two additional host descriptions.
285 // The 3rd and 4th host description should have a different location.
Jonathan Hartb35540a2015-11-17 09:30:56 -0800286 testProcessor.process(new TestNaPacketContext(DEV5));
Charles Chan07f15f22018-05-08 21:35:50 -0700287 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("Host motion expected",
288 providerService.descriptions.size(), is(4)));
289 final HostLocation loc21 = providerService.descriptions.get(0).location();
290 final HostLocation loc22 = providerService.descriptions.get(1).location();
291 final HostLocation loc23 = providerService.descriptions.get(2).location();
292 final HostLocation loc24 = providerService.descriptions.get(3).location();
293 TestTools.assertAfter(ASSERTION_DELAY, () -> assertEquals("1st and 2nd location should be equal",
294 loc21, loc22));
295 TestTools.assertAfter(ASSERTION_DELAY, () -> assertEquals("3rd and 4th location should be equal",
296 loc23, loc24));
297 TestTools.assertAfter(ASSERTION_DELAY, () -> assertNotEquals("1st and 3rd location should be different",
298 loc21, loc23));
Charles Chan5d5e0622015-09-25 13:00:06 -0700299
Charles Chan420e7372016-11-17 10:58:17 -0800300 // The host was misheard on a spine. Expect no additional host description.
Jonathan Hartb35540a2015-11-17 09:30:56 -0800301 testProcessor.process(new TestNaPacketContext(DEV6));
Charles Chan07f15f22018-05-08 21:35:50 -0700302 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("Host misheard on spine switch",
303 providerService.descriptions.size(), is(4)));
alshabib4a179dc2014-10-17 17:17:01 -0700304 }
305
Thomas Vachuska33601602014-11-19 03:32:15 -0800306 @Test
307 public void removeHostByDeviceRemove() {
308 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700309 testProcessor.process(new TestArpPacketContext(DEV1));
Jonathan Hartb35540a2015-11-17 09:30:56 -0800310 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan5d5e0622015-09-25 13:00:06 -0700311
Thomas Vachuska33601602014-11-19 03:32:15 -0800312 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
313 "m", "h", "s", "n", new ChassisId(0L));
314 deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
Charles Chan888e20a2017-05-01 15:44:23 -0700315 assertEquals("incorrect remove count", 2, providerService.locationRemoveCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700316
317 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
318 "m", "h", "s", "n", new ChassisId(0L));
319 deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
Charles Chan888e20a2017-05-01 15:44:23 -0700320 assertEquals("incorrect remove count", 3, providerService.locationRemoveCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800321 }
322
323 @Test
324 public void removeHostByDeviceOffline() {
325 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700326 testProcessor.process(new TestArpPacketContext(DEV1));
327 testProcessor.process(new TestArpPacketContext(DEV4));
328
Thomas Vachuska33601602014-11-19 03:32:15 -0800329 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
330 "m", "h", "s", "n", new ChassisId(0L));
331 deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
Charles Chan888e20a2017-05-01 15:44:23 -0700332 assertEquals("incorrect remove count", 2, providerService.locationRemoveCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700333
334 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
335 "m", "h", "s", "n", new ChassisId(0L));
336 deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
Charles Chan888e20a2017-05-01 15:44:23 -0700337 assertEquals("incorrect remove count", 3, providerService.locationRemoveCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800338 }
339
340 @Test
341 public void removeHostByDevicePortDown() {
342 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700343 testProcessor.process(new TestArpPacketContext(DEV1));
344 testProcessor.process(new TestArpPacketContext(DEV4));
345
Thomas Vachuska33601602014-11-19 03:32:15 -0800346 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
347 "m", "h", "s", "n", new ChassisId(0L));
348 deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
Charles Chan5d5e0622015-09-25 13:00:06 -0700349 new DefaultPort(device, portNumber(INPORT), false)));
Charles Chan888e20a2017-05-01 15:44:23 -0700350 assertEquals("incorrect remove count", 1, providerService.locationRemoveCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700351
352 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
353 "m", "h", "s", "n", new ChassisId(0L));
354 deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
355 new DefaultPort(device, portNumber(INPORT), false)));
Charles Chan888e20a2017-05-01 15:44:23 -0700356 assertEquals("incorrect remove count", 2, providerService.locationRemoveCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800357 }
358
Charles Chan5d5e0622015-09-25 13:00:06 -0700359 /**
360 * When receiving ARP, updates location and IP.
361 */
362 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300363 public void receiveArp() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700364 testProcessor.process(new TestArpPacketContext(DEV1));
Charles Chan07f15f22018-05-08 21:35:50 -0700365 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveArp. One host description expected",
366 providerService.descriptions.size(), is(1)));
Charles Chan420e7372016-11-17 10:58:17 -0800367 HostDescription descr = providerService.descriptions.get(0);
Charles Chan07f15f22018-05-08 21:35:50 -0700368 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.location(), is(LOCATION)));
369 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.hwAddress(), is(MAC)));
370 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS)));
371 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.vlan(), is(VLAN)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700372 }
373
374 /**
375 * When receiving IPv4, updates location only.
376 */
377 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300378 public void receiveIpv4() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700379 testProcessor.process(new TestIpv4PacketContext(DEV1));
Charles Chan07f15f22018-05-08 21:35:50 -0700380 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveIpv4. One host description expected",
381 providerService.descriptions.size(), is(1)));
Charles Chan420e7372016-11-17 10:58:17 -0800382 HostDescription descr = providerService.descriptions.get(0);
Charles Chan07f15f22018-05-08 21:35:50 -0700383 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.location(), is(LOCATION)));
384 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.hwAddress(), is(MAC)));
385 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.ipAddress().size(), is(0)));
386 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.vlan(), is(VLAN)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700387 }
388
389 /**
Charles Chane6067892016-11-17 10:23:46 -0800390 * When receiving DHCP REQUEST, update MAC, location of client.
391 * When receiving DHCP ACK, update MAC, location of server and IP of client.
392 */
393 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300394 public void receiveDhcp() {
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700395 TestUtils.setField(provider, "useDhcp", true);
Charles Chane6067892016-11-17 10:23:46 -0800396 // DHCP Request
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700397 testProcessor.process(new TestDhcpRequestPacketContext(DEV1, VLAN));
Charles Chan07f15f22018-05-08 21:35:50 -0700398 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveDhcpRequest. One host description expected",
399 providerService.descriptions.size(), is(1)));
Charles Chane6067892016-11-17 10:23:46 -0800400 // Should learn the MAC and location of DHCP client
401 HostDescription descr = providerService.descriptions.get(0);
Charles Chan07f15f22018-05-08 21:35:50 -0700402 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.location(), is(LOCATION)));
403 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.hwAddress(), is(MAC)));
404 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.ipAddress().size(), is(0)));
405 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.vlan(), is(VLAN)));
Charles Chane6067892016-11-17 10:23:46 -0800406
407 // DHCP Ack
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700408 testProcessor.process(new TestDhcpAckPacketContext(DEV1));
Charles Chan07f15f22018-05-08 21:35:50 -0700409 TestTools.assertAfter(ASSERTION_DELAY, () ->
410 assertThat("receiveDhcpAck. Two additional host descriptions expected",
411 providerService.descriptions.size(), is(3)));
Charles Chane6067892016-11-17 10:23:46 -0800412
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700413 // Should also learn the MAC, location of DHCP server
414 HostDescription descr2 = providerService.descriptions.get(1);
Charles Chan07f15f22018-05-08 21:35:50 -0700415 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr2.location(), is(LOCATION3)));
416 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr2.hwAddress(), is(MAC3)));
417 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr2.ipAddress().size(), is(0)));
418 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr2.vlan(), is(VLAN)));
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700419
Yi Tsengcfa637a2017-07-26 17:24:10 -0700420 // Should update the IP address of the client.
421 HostDescription descr3 = providerService.descriptions.get(2);
Charles Chan07f15f22018-05-08 21:35:50 -0700422 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr3.location(), is(LOCATION)));
423 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr3.hwAddress(), is(MAC)));
424 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr3.ipAddress().size(), is(1)));
Yi Tsengcfa637a2017-07-26 17:24:10 -0700425 IpAddress ip = descr3.ipAddress().iterator().next();
Charles Chan07f15f22018-05-08 21:35:50 -0700426 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(ip, is(IP_ADDRESS.getIp4Address())));
427 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr3.vlan(), is(VLAN)));
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700428 }
429
430 /**
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700431 * When receiving DHCPv6 REQUEST, update MAC, location of client.
432 * When receiving DHCPv6 ACK, update MAC, location of server and IP of client.
433 */
434 @Test
435 public void receiveDhcp6() {
436 TestUtils.setField(provider, "useDhcp6", true);
437 // DHCP Request
438 testProcessor.process(new TestDhcp6RequestPacketContext(DEV4, VLAN));
Charles Chan07f15f22018-05-08 21:35:50 -0700439 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveDhcpRequest. One host description expected",
440 providerService.descriptions.size(), is(1)));
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700441 // Should learn the MAC and location of DHCP client
442 HostDescription descr = providerService.descriptions.get(0);
Charles Chan07f15f22018-05-08 21:35:50 -0700443 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.location(), is(LOCATION2)));
444 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.hwAddress(), is(MAC2)));
445 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.ipAddress().size(), is(0)));
446 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.vlan(), is(VLAN)));
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700447
448 // DHCP Ack
449 testProcessor.process(new TestDhcp6AckPacketContext(DEV1));
Charles Chan07f15f22018-05-08 21:35:50 -0700450 TestTools.assertAfter(ASSERTION_DELAY, () ->
451 assertThat("receiveDhcpAck. Two additional host descriptions expected",
452 providerService.descriptions.size(), is(3)));
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700453
454 // Should also learn the MAC, location of DHCP server
455 HostDescription descr2 = providerService.descriptions.get(1);
Charles Chan07f15f22018-05-08 21:35:50 -0700456 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr2.location(), is(LOCATION3)));
457 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr2.hwAddress(), is(DHCP6_SERVER_MAC)));
458 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr2.ipAddress().size(), is(0)));
459 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr2.vlan(), is(VLAN)));
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700460
461 // Should update the IP address of the DHCP client.
462 HostDescription descr3 = providerService.descriptions.get(2);
Charles Chan07f15f22018-05-08 21:35:50 -0700463 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr3.location(), is(LOCATION2)));
464 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr3.hwAddress(), is(MAC2)));
465 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr3.ipAddress().size(), is(1)));
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700466 IpAddress ip = descr3.ipAddress().iterator().next();
Charles Chan07f15f22018-05-08 21:35:50 -0700467 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(ip, is(IP_ADDRESS2.getIp6Address())));
468 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr3.vlan(), is(VLAN)));
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700469 }
470
471 /**
Charles Chan5d5e0622015-09-25 13:00:06 -0700472 * When receiving NeighborAdvertisement, updates location and IP.
Charles Chan178b0f52017-10-08 23:51:22 -0400473 * We should also expect that target IP is learnt.
Charles Chan5d5e0622015-09-25 13:00:06 -0700474 */
475 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300476 public void receiveNa() {
Jonathan Hartb35540a2015-11-17 09:30:56 -0800477 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan07f15f22018-05-08 21:35:50 -0700478 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveNa. One host description expected",
479 providerService.descriptions.size(), is(2)));
480 final HostDescription descr0 = providerService.descriptions.get(0);
481 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr0.location(), is(LOCATION2)));
482 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr0.hwAddress(), is(MAC2)));
483 TestTools.assertAfter(ASSERTION_DELAY, () -> assertTrue(descr0.ipAddress().contains(LLIP_ADDRESS2)));
484 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr0.vlan(), is(VLAN)));
Charles Chan178b0f52017-10-08 23:51:22 -0400485
Charles Chan07f15f22018-05-08 21:35:50 -0700486 final HostDescription descr1 = providerService.descriptions.get(1);
487 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr1.location(), is(LOCATION2)));
488 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr1.hwAddress(), is(MAC2)));
489 TestTools.assertAfter(ASSERTION_DELAY, () -> assertTrue(descr1.ipAddress().contains(IP_ADDRESS2)));
490 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr1.vlan(), is(VLAN)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700491 }
492
493 /**
494 * When receiving NeighborSolicitation, updates location and IP.
495 */
496 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300497 public void receiveNs() {
Jonathan Hartb35540a2015-11-17 09:30:56 -0800498 testProcessor.process(new TestNsPacketContext(DEV4));
Charles Chan07f15f22018-05-08 21:35:50 -0700499 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveNs. One host description expected",
500 providerService.descriptions.size(), is(1)));
Charles Chan420e7372016-11-17 10:58:17 -0800501 HostDescription descr = providerService.descriptions.get(0);
Charles Chan07f15f22018-05-08 21:35:50 -0700502 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.location(), is(LOCATION2)));
503 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.hwAddress(), is(MAC2)));
504 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS2)));
505 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.vlan(), is(VLAN)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700506 }
507
508 /**
Yi Tseng11f95b52019-05-08 14:03:19 -0700509 * When receiving RouterAdvertisement, update location and IP.
Charles Chan5d5e0622015-09-25 13:00:06 -0700510 */
511 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300512 public void receivesRa() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700513 testProcessor.process(new TestRAPacketContext(DEV4));
Charles Chan07f15f22018-05-08 21:35:50 -0700514 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receivesRa. No host description expected",
Yi Tseng11f95b52019-05-08 14:03:19 -0700515 providerService.descriptions.size(), is(1)));
516
517 final HostDescription desc = providerService.descriptions.get(0);
518 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(desc.location(), is(LOCATION2)));
519 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(desc.hwAddress(), is(MAC2)));
520 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(desc.ipAddress().toArray()[0], is(IP_ADDRESS2)));
521 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(desc.vlan(), is(VLAN)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700522 }
523
524 /**
Yi Tseng11f95b52019-05-08 14:03:19 -0700525 * When receiving RouterSolicitation, update location and IP.
Charles Chan5d5e0622015-09-25 13:00:06 -0700526 */
527 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300528 public void receiveRs() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700529 testProcessor.process(new TestRSPacketContext(DEV4));
Charles Chan07f15f22018-05-08 21:35:50 -0700530 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveRs. No host description expected",
Yi Tseng11f95b52019-05-08 14:03:19 -0700531 providerService.descriptions.size(), is(1)));
532
533 final HostDescription desc = providerService.descriptions.get(0);
534 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(desc.location(), is(LOCATION2)));
535 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(desc.hwAddress(), is(MAC2)));
536 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(desc.ipAddress().toArray()[0], is(IP_ADDRESS2)));
537 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(desc.vlan(), is(VLAN)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700538 }
539
540 /**
541 * When receiving Duplicate Address Detection (DAD), ignores it.
542 */
543 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300544 public void receiveDad() {
Jonathan Hartb35540a2015-11-17 09:30:56 -0800545 testProcessor.process(new TestDadPacketContext(DEV4));
Charles Chan07f15f22018-05-08 21:35:50 -0700546 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveDad. No host description expected",
547 providerService.descriptions.size(), is(0)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700548 }
549
550 /**
551 * When receiving IPv6 multicast packet, ignores it.
552 */
553 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300554 public void receiveIpv6Multicast() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700555 testProcessor.process(new TestIpv6McastPacketContext(DEV4));
Charles Chan07f15f22018-05-08 21:35:50 -0700556 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveIpv6Multicast. No host description expected",
557 providerService.descriptions.size(), is(0)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700558 }
559
560 /**
561 * When receiving IPv6 unicast packet, updates location only.
562 */
563 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300564 public void receiveIpv6Unicast() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700565 testProcessor.process(new TestIpv6PacketContext(DEV4));
Charles Chan07f15f22018-05-08 21:35:50 -0700566 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveIpv6Unicast. One host description expected",
567 providerService.descriptions.size(), is(1)));
Charles Chan420e7372016-11-17 10:58:17 -0800568 HostDescription descr = providerService.descriptions.get(0);
Charles Chan07f15f22018-05-08 21:35:50 -0700569 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.location(), is(LOCATION2)));
570 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.hwAddress(), is(MAC2)));
571 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.ipAddress().size(), is(0)));
572 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.vlan(), is(VLAN)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700573 }
Thomas Vachuska33601602014-11-19 03:32:15 -0800574
alshabib4a179dc2014-10-17 17:17:01 -0700575 @After
576 public void tearDown() {
577 provider.deactivate();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800578 provider.coreService = null;
alshabib4a179dc2014-10-17 17:17:01 -0700579 provider.providerRegistry = null;
alshabib4a179dc2014-10-17 17:17:01 -0700580 }
581
582 private class TestHostRegistry implements HostProviderRegistry {
583
584 @Override
585 public HostProviderService register(HostProvider provider) {
586 providerService = new TestHostProviderService(provider);
587 return providerService;
588 }
589
590 @Override
591 public void unregister(HostProvider provider) {
592 }
593
594 @Override
595 public Set<ProviderId> getProviders() {
596 return null;
597 }
598
599 }
600
601 private class TestHostProviderService
602 extends AbstractProviderService<HostProvider>
603 implements HostProviderService {
604
Charles Chan420e7372016-11-17 10:58:17 -0800605 List<HostDescription> descriptions = Lists.newArrayList();
Charles Chan888e20a2017-05-01 15:44:23 -0700606 int hostRemoveCount;
607 int ipRemoveCount;
608 int locationRemoveCount;
alshabib4a179dc2014-10-17 17:17:01 -0700609
Charles Chan5d5e0622015-09-25 13:00:06 -0700610 public void clear() {
Charles Chan420e7372016-11-17 10:58:17 -0800611 descriptions.clear();
Charles Chan888e20a2017-05-01 15:44:23 -0700612 hostRemoveCount = 0;
613 ipRemoveCount = 0;
614 locationRemoveCount = 0;
Charles Chan5d5e0622015-09-25 13:00:06 -0700615 }
616
alshabib4a179dc2014-10-17 17:17:01 -0700617 protected TestHostProviderService(HostProvider provider) {
618 super(provider);
619 }
620
621 @Override
Brian O'Connorf107bd72015-09-21 15:31:03 -0700622 public void hostDetected(HostId hostId, HostDescription hostDescription, boolean replaceIps) {
Charles Chan420e7372016-11-17 10:58:17 -0800623 descriptions.add(hostDescription);
alshabib4a179dc2014-10-17 17:17:01 -0700624 }
625
626 @Override
627 public void hostVanished(HostId hostId) {
Charles Chan888e20a2017-05-01 15:44:23 -0700628 hostRemoveCount++;
alshabib4a179dc2014-10-17 17:17:01 -0700629 }
630
samanwita palc40e5ed2015-09-24 11:01:51 -0700631 @Override
632 public void removeIpFromHost(HostId hostId, IpAddress ipAddress) {
Charles Chan888e20a2017-05-01 15:44:23 -0700633 ipRemoveCount++;
634 }
635
636 @Override
637 public void removeLocationFromHost(HostId hostId, HostLocation location) {
638 locationRemoveCount++;
samanwita palc40e5ed2015-09-24 11:01:51 -0700639 }
640
alshabib4a179dc2014-10-17 17:17:01 -0700641 }
642
Thomas Vachuska27bee092015-06-23 19:03:10 -0700643 private class TestPacketService extends PacketServiceAdapter {
alshabib4a179dc2014-10-17 17:17:01 -0700644 @Override
645 public void addProcessor(PacketProcessor processor, int priority) {
646 testProcessor = processor;
647 }
alshabib4a179dc2014-10-17 17:17:01 -0700648 }
649
alshabib4a179dc2014-10-17 17:17:01 -0700650 private class TestTopologyService extends TopologyServiceAdapter {
651 @Override
652 public boolean isInfrastructure(Topology topology,
653 ConnectPoint connectPoint) {
654 //simulate DPID3 as an infrastructure switch
Charles Chan5d5e0622015-09-25 13:00:06 -0700655 if ((connectPoint.deviceId()).equals(deviceId(DEV3)) ||
656 connectPoint.deviceId().equals(deviceId(DEV6))) {
alshabib4a179dc2014-10-17 17:17:01 -0700657 return true;
658 }
659 return false;
660 }
661 }
662
Charles Chan5d5e0622015-09-25 13:00:06 -0700663 /**
664 * Generates ARP packet.
665 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300666 private class TestArpPacketContext extends PacketContextAdapter {
alshabib4a179dc2014-10-17 17:17:01 -0700667 private final String deviceId;
668
Charles Chan5d5e0622015-09-25 13:00:06 -0700669 public TestArpPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300670 super(0, null, null, false);
alshabib4a179dc2014-10-17 17:17:01 -0700671 this.deviceId = deviceId;
672 }
673
674 @Override
alshabib4a179dc2014-10-17 17:17:01 -0700675 public InboundPacket inPacket() {
676 ARP arp = new ARP();
677 arp.setSenderProtocolAddress(IP)
678 .setSenderHardwareAddress(MAC.toBytes())
679 .setTargetHardwareAddress(BCMAC.toBytes())
680 .setTargetProtocolAddress(IP);
681
682 Ethernet eth = new Ethernet();
683 eth.setEtherType(Ethernet.TYPE_ARP)
684 .setVlanID(VLAN.toShort())
685 .setSourceMACAddress(MAC.toBytes())
Yuta HIGUCHI3e848a82014-11-02 20:19:42 -0800686 .setDestinationMACAddress(BCMAC)
alshabib4a179dc2014-10-17 17:17:01 -0700687 .setPayload(arp);
Thomas Vachuska33601602014-11-19 03:32:15 -0800688 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
689 portNumber(INPORT));
alshabib4a179dc2014-10-17 17:17:01 -0700690 return new DefaultInboundPacket(receivedFrom, eth,
691 ByteBuffer.wrap(eth.serialize()));
692 }
alshabib4a179dc2014-10-17 17:17:01 -0700693 }
Thomas Vachuska33601602014-11-19 03:32:15 -0800694
Charles Chan5d5e0622015-09-25 13:00:06 -0700695 /**
Charles Chane6067892016-11-17 10:23:46 -0800696 * Generates IPv4 Unicast packet.
Charles Chan5d5e0622015-09-25 13:00:06 -0700697 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300698 private class TestIpv4PacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -0700699 private final String deviceId;
700
701 public TestIpv4PacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300702 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -0700703 this.deviceId = deviceId;
704 }
705
706 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -0700707 public InboundPacket inPacket() {
708 IPv4 ipv4 = new IPv4();
709 ipv4.setDestinationAddress("10.0.0.1");
710 ipv4.setSourceAddress(IP_ADDRESS.toString());
711 Ethernet eth = new Ethernet();
712 eth.setEtherType(Ethernet.TYPE_IPV4)
713 .setVlanID(VLAN.toShort())
714 .setSourceMACAddress(MAC)
715 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
716 .setPayload(ipv4);
717 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
718 portNumber(INPORT));
719 return new DefaultInboundPacket(receivedFrom, eth,
720 ByteBuffer.wrap(eth.serialize()));
721 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700722 }
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700723
Charles Chane6067892016-11-17 10:23:46 -0800724 /**
725 * Generates DHCP REQUEST packet.
726 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300727 private class TestDhcpRequestPacketContext extends PacketContextAdapter {
Charles Chane6067892016-11-17 10:23:46 -0800728 private final String deviceId;
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700729 private final VlanId vlanId;
Charles Chane6067892016-11-17 10:23:46 -0800730
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700731 public TestDhcpRequestPacketContext(String deviceId, VlanId vlanId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300732 super(0, null, null, false);
Charles Chane6067892016-11-17 10:23:46 -0800733 this.deviceId = deviceId;
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700734 this.vlanId = vlanId;
Charles Chane6067892016-11-17 10:23:46 -0800735 }
736
737 @Override
Charles Chane6067892016-11-17 10:23:46 -0800738 public InboundPacket inPacket() {
739 byte[] dhcpMsgType = new byte[1];
Yi Tsengc7403c22017-06-19 16:23:22 -0700740 dhcpMsgType[0] = (byte) DHCP.MsgType.DHCPREQUEST.getValue();
Charles Chane6067892016-11-17 10:23:46 -0800741
Yi Tsengc7403c22017-06-19 16:23:22 -0700742 DhcpOption dhcpOption = new DhcpOption();
Charles Chane6067892016-11-17 10:23:46 -0800743 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 UDP udp = new UDP();
750 udp.setPayload(dhcp);
751 udp.setSourcePort(UDP.DHCP_CLIENT_PORT);
752 udp.setDestinationPort(UDP.DHCP_SERVER_PORT);
753 IPv4 ipv4 = new IPv4();
754 ipv4.setPayload(udp);
755 ipv4.setDestinationAddress(IP_ADDRESS3.toString());
756 ipv4.setSourceAddress(IP_ADDRESS.toString());
757 Ethernet eth = new Ethernet();
758 eth.setEtherType(Ethernet.TYPE_IPV4)
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700759 .setVlanID(this.vlanId.toShort())
Charles Chane6067892016-11-17 10:23:46 -0800760 .setSourceMACAddress(MAC)
761 .setDestinationMACAddress(MAC3)
762 .setPayload(ipv4);
763 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
764 portNumber(INPORT));
765 return new DefaultInboundPacket(receivedFrom, eth,
766 ByteBuffer.wrap(eth.serialize()));
767 }
Charles Chane6067892016-11-17 10:23:46 -0800768 }
769
770 /**
771 * Generates DHCP ACK packet.
772 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300773 private class TestDhcpAckPacketContext extends PacketContextAdapter {
Charles Chane6067892016-11-17 10:23:46 -0800774 private final String deviceId;
775
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700776 public TestDhcpAckPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300777 super(0, null, null, false);
Charles Chane6067892016-11-17 10:23:46 -0800778 this.deviceId = deviceId;
779 }
780
781 @Override
Charles Chane6067892016-11-17 10:23:46 -0800782 public InboundPacket inPacket() {
783 byte[] dhcpMsgType = new byte[1];
Yi Tsengc7403c22017-06-19 16:23:22 -0700784 dhcpMsgType[0] = (byte) DHCP.MsgType.DHCPACK.getValue();
Charles Chane6067892016-11-17 10:23:46 -0800785
Yi Tsengc7403c22017-06-19 16:23:22 -0700786 DhcpOption dhcpOption = new DhcpOption();
Charles Chane6067892016-11-17 10:23:46 -0800787 dhcpOption.setCode(DHCP.DHCPOptionCode.OptionCode_MessageType.getValue());
788 dhcpOption.setData(dhcpMsgType);
789 dhcpOption.setLength((byte) 1);
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700790
Charles Chane6067892016-11-17 10:23:46 -0800791 DHCP dhcp = new DHCP();
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700792 dhcp.setOptions(ImmutableList.of(dhcpOption));
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700793
Charles Chane6067892016-11-17 10:23:46 -0800794 dhcp.setClientHardwareAddress(MAC.toBytes());
795 dhcp.setYourIPAddress(IP_ADDRESS.getIp4Address().toInt());
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700796
Charles Chane6067892016-11-17 10:23:46 -0800797 UDP udp = new UDP();
798 udp.setPayload(dhcp);
799 udp.setSourcePort(UDP.DHCP_SERVER_PORT);
800 udp.setDestinationPort(UDP.DHCP_CLIENT_PORT);
801 IPv4 ipv4 = new IPv4();
802 ipv4.setPayload(udp);
803 ipv4.setDestinationAddress(IP_ADDRESS.toString());
804 ipv4.setSourceAddress(IP_ADDRESS3.toString());
805 Ethernet eth = new Ethernet();
806 eth.setEtherType(Ethernet.TYPE_IPV4)
807 .setVlanID(VLAN.toShort())
808 .setSourceMACAddress(MAC3)
809 .setDestinationMACAddress(MAC)
810 .setPayload(ipv4);
811 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
812 portNumber(INPORT2));
813 return new DefaultInboundPacket(receivedFrom, eth,
814 ByteBuffer.wrap(eth.serialize()));
815 }
Charles Chane6067892016-11-17 10:23:46 -0800816 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700817
818 /**
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700819 * Generates DHCPv6 REQUEST packet.
820 */
821 private class TestDhcp6RequestPacketContext extends PacketContextAdapter {
822 private final String deviceId;
823 private final VlanId vlanId;
824
825 public TestDhcp6RequestPacketContext(String deviceId, VlanId vlanId) {
826 super(0, null, null, false);
827 this.deviceId = deviceId;
828 this.vlanId = vlanId;
829 }
830
831 @Override
832 public InboundPacket inPacket() {
833
834 DHCP6 dhcp6 = new DHCP6();
835 dhcp6.setMsgType(DHCP6.MsgType.REQUEST.value());
836 List<Dhcp6Option> options = Lists.newArrayList();
837
838 // IA address
839 Dhcp6IaAddressOption iaAddressOption = new Dhcp6IaAddressOption();
840 iaAddressOption.setIp6Address(IP_ADDRESS2.getIp6Address());
841
842 // IA NA
843 Dhcp6IaNaOption iaNaOption = new Dhcp6IaNaOption();
844 iaNaOption.setOptions(ImmutableList.of(iaAddressOption));
845 options.add(iaNaOption);
846
847 dhcp6.setOptions(options);
848
849 UDP udp = new UDP();
850 udp.setPayload(dhcp6);
851 udp.setSourcePort(UDP.DHCP_V6_CLIENT_PORT);
852 udp.setDestinationPort(UDP.DHCP_V6_SERVER_PORT);
853 IPv6 ipv6 = new IPv6();
854 ipv6.setPayload(udp);
855 ipv6.setDestinationAddress(Ip6Address.ZERO.toOctets());
856 ipv6.setSourceAddress(Ip6Address.ZERO.toOctets());
857 ipv6.setNextHeader(IPv6.PROTOCOL_UDP);
858 Ethernet eth = new Ethernet();
859 eth.setEtherType(Ethernet.TYPE_IPV6)
860 .setVlanID(this.vlanId.toShort())
861 .setSourceMACAddress(MAC2)
862 .setDestinationMACAddress(DHCP6_SERVER_MAC)
863 .setPayload(ipv6);
864 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
865 portNumber(INPORT));
866 return new DefaultInboundPacket(receivedFrom, eth,
867 ByteBuffer.wrap(eth.serialize()));
868 }
869 }
870
871 /**
872 * Generates DHCPv6 ACK packet.
873 */
874 private class TestDhcp6AckPacketContext extends PacketContextAdapter {
875 private final String deviceId;
876
877 public TestDhcp6AckPacketContext(String deviceId) {
878 super(0, null, null, false);
879 this.deviceId = deviceId;
880 }
881
882 @Override
883 public InboundPacket inPacket() {
884 DHCP6 dhcp6 = new DHCP6();
885 dhcp6.setMsgType(DHCP6.MsgType.REPLY.value());
886 List<Dhcp6Option> options = Lists.newArrayList();
887
888 // IA address
889 Dhcp6IaAddressOption iaAddressOption = new Dhcp6IaAddressOption();
890 iaAddressOption.setIp6Address(IP_ADDRESS2.getIp6Address());
891
892 // IA NA
893 Dhcp6IaNaOption iaNaOption = new Dhcp6IaNaOption();
894 iaNaOption.setOptions(ImmutableList.of(iaAddressOption));
895 options.add(iaNaOption);
896
897 // Client ID
898 Dhcp6Duid duid = new Dhcp6Duid();
899 duid.setDuidType(Dhcp6Duid.DuidType.DUID_LLT);
900 duid.setHardwareType((short) 1);
901 duid.setDuidTime(0);
902 duid.setLinkLayerAddress(MAC2.toBytes());
903 Dhcp6ClientIdOption clientIdOption = new Dhcp6ClientIdOption();
904 clientIdOption.setDuid(duid);
905 options.add(clientIdOption);
906 dhcp6.setOptions(options);
907
908 UDP udp = new UDP();
909 udp.setPayload(dhcp6);
910 udp.setSourcePort(UDP.DHCP_V6_CLIENT_PORT);
911 udp.setDestinationPort(UDP.DHCP_V6_SERVER_PORT);
912 IPv6 ipv6 = new IPv6();
913 ipv6.setPayload(udp);
914 ipv6.setDestinationAddress(Ip6Address.ZERO.toOctets());
915 ipv6.setSourceAddress(Ip6Address.ZERO.toOctets());
916 ipv6.setNextHeader(IPv6.PROTOCOL_UDP);
917 Ethernet eth = new Ethernet();
918 eth.setEtherType(Ethernet.TYPE_IPV6)
919 .setVlanID(VLAN.toShort())
920 .setSourceMACAddress(DHCP6_SERVER_MAC)
921 .setDestinationMACAddress(MAC2)
922 .setPayload(ipv6);
923 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
924 portNumber(INPORT2));
925 return new DefaultInboundPacket(receivedFrom, eth,
926 ByteBuffer.wrap(eth.serialize()));
927 }
928 }
929
930 /**
Charles Chan5d5e0622015-09-25 13:00:06 -0700931 * Generates NeighborAdvertisement packet.
932 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300933 private class TestNaPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -0700934 private final String deviceId;
935
Jonathan Hartb35540a2015-11-17 09:30:56 -0800936 public TestNaPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300937 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -0700938 this.deviceId = deviceId;
939 }
940
941 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -0700942 public InboundPacket inPacket() {
943 NeighborAdvertisement na = new NeighborAdvertisement();
Charles Chan178b0f52017-10-08 23:51:22 -0400944 na.setTargetAddress(IP2);
Charles Chan5d5e0622015-09-25 13:00:06 -0700945 ICMP6 icmp6 = new ICMP6();
946 icmp6.setPayload(na);
947 IPv6 ipv6 = new IPv6();
948 ipv6.setPayload(icmp6);
949 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
Charles Chan178b0f52017-10-08 23:51:22 -0400950 ipv6.setSourceAddress(LLIP2);
Charles Chan5d5e0622015-09-25 13:00:06 -0700951 Ethernet eth = new Ethernet();
952 eth.setEtherType(Ethernet.TYPE_IPV6)
953 .setVlanID(VLAN.toShort())
954 .setSourceMACAddress(MAC2.toBytes())
955 .setDestinationMACAddress(BCMAC2)
956 .setPayload(ipv6);
957 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
958 portNumber(INPORT));
959 return new DefaultInboundPacket(receivedFrom, eth,
960 ByteBuffer.wrap(eth.serialize()));
961 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700962 }
963
964 /**
965 * Generates NeighborSolicitation packet.
966 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300967 private class TestNsPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -0700968 private final String deviceId;
969
Jonathan Hartb35540a2015-11-17 09:30:56 -0800970 public TestNsPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300971 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -0700972 this.deviceId = deviceId;
973 }
974
975 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -0700976 public InboundPacket inPacket() {
977 NeighborSolicitation ns = new NeighborSolicitation();
978 ICMP6 icmp6 = new ICMP6();
979 icmp6.setPayload(ns);
980 IPv6 ipv6 = new IPv6();
981 ipv6.setPayload(icmp6);
982 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1:ff00:0000").toOctets());
983 ipv6.setSourceAddress(IP2);
984 Ethernet eth = new Ethernet();
985 eth.setEtherType(Ethernet.TYPE_IPV6)
986 .setVlanID(VLAN.toShort())
987 .setSourceMACAddress(MAC2.toBytes())
988 .setDestinationMACAddress(BCMAC2)
989 .setPayload(ipv6);
990 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
991 portNumber(INPORT));
992 return new DefaultInboundPacket(receivedFrom, eth,
993 ByteBuffer.wrap(eth.serialize()));
994 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700995 }
996
997 /**
998 * Generates Duplicate Address Detection packet.
999 */
Andrey Komarov2398d962016-09-26 15:11:23 +03001000 private class TestDadPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -07001001 private final String deviceId;
1002
Jonathan Hartb35540a2015-11-17 09:30:56 -08001003 public TestDadPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +03001004 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -07001005 this.deviceId = deviceId;
1006 }
1007
1008 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -07001009 public InboundPacket inPacket() {
1010 NeighborSolicitation ns = new NeighborSolicitation();
1011 ICMP6 icmp6 = new ICMP6();
1012 icmp6.setPayload(ns);
1013 IPv6 ipv6 = new IPv6();
1014 ipv6.setPayload(icmp6);
1015 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
1016 ipv6.setSourceAddress(Ip6Address.valueOf("::").toOctets());
1017 Ethernet eth = new Ethernet();
1018 eth.setEtherType(Ethernet.TYPE_IPV6)
1019 .setVlanID(VLAN.toShort())
1020 .setSourceMACAddress(MAC2.toBytes())
1021 .setDestinationMACAddress(BCMAC2)
1022 .setPayload(ipv6);
1023 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1024 portNumber(INPORT));
1025 return new DefaultInboundPacket(receivedFrom, eth,
1026 ByteBuffer.wrap(eth.serialize()));
1027 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001028 }
1029
1030 /**
1031 * Generates Router Solicitation packet.
1032 */
Andrey Komarov2398d962016-09-26 15:11:23 +03001033 private class TestRSPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -07001034 private final String deviceId;
1035
1036 public TestRSPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +03001037 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -07001038 this.deviceId = deviceId;
1039 }
1040
1041 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -07001042 public InboundPacket inPacket() {
1043 RouterSolicitation ns = new RouterSolicitation();
1044 ICMP6 icmp6 = new ICMP6();
1045 icmp6.setPayload(ns);
1046 IPv6 ipv6 = new IPv6();
1047 ipv6.setPayload(icmp6);
1048 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::2").toOctets());
Yi Tseng11f95b52019-05-08 14:03:19 -07001049 ipv6.setSourceAddress(IP2);
Charles Chan5d5e0622015-09-25 13:00:06 -07001050 Ethernet eth = new Ethernet();
1051 eth.setEtherType(Ethernet.TYPE_IPV6)
1052 .setVlanID(VLAN.toShort())
1053 .setSourceMACAddress(MAC2.toBytes())
1054 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:02"))
1055 .setPayload(ipv6);
1056 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1057 portNumber(INPORT));
1058 return new DefaultInboundPacket(receivedFrom, eth,
1059 ByteBuffer.wrap(eth.serialize()));
1060 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001061 }
1062
1063 /**
1064 * Generates Router Advertisement packet.
1065 */
Andrey Komarov2398d962016-09-26 15:11:23 +03001066 private class TestRAPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -07001067 private final String deviceId;
1068
1069 public TestRAPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +03001070 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -07001071 this.deviceId = deviceId;
1072 }
1073
1074 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -07001075 public InboundPacket inPacket() {
1076 RouterAdvertisement ns = new RouterAdvertisement();
1077 ICMP6 icmp6 = new ICMP6();
1078 icmp6.setPayload(ns);
1079 IPv6 ipv6 = new IPv6();
1080 ipv6.setPayload(icmp6);
1081 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
1082 ipv6.setSourceAddress(IP2);
1083 Ethernet eth = new Ethernet();
1084 eth.setEtherType(Ethernet.TYPE_IPV6)
1085 .setVlanID(VLAN.toShort())
1086 .setSourceMACAddress(MAC2.toBytes())
1087 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
1088 .setPayload(ipv6);
1089 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1090 portNumber(INPORT));
1091 return new DefaultInboundPacket(receivedFrom, eth,
1092 ByteBuffer.wrap(eth.serialize()));
1093 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001094 }
1095
1096 /**
1097 * Generates IPv6 Multicast packet.
1098 */
Andrey Komarov2398d962016-09-26 15:11:23 +03001099 private class TestIpv6McastPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -07001100 private final String deviceId;
1101
1102 public TestIpv6McastPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +03001103 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -07001104 this.deviceId = deviceId;
1105 }
1106
1107 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -07001108 public InboundPacket inPacket() {
1109 IPv6 ipv6 = new IPv6();
1110 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
1111 ipv6.setSourceAddress(IP2);
1112 Ethernet eth = new Ethernet();
1113 eth.setEtherType(Ethernet.TYPE_IPV6)
1114 .setVlanID(VLAN.toShort())
1115 .setSourceMACAddress(MAC2.toBytes())
1116 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
1117 .setPayload(ipv6);
1118 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1119 portNumber(INPORT));
1120 return new DefaultInboundPacket(receivedFrom, eth,
1121 ByteBuffer.wrap(eth.serialize()));
1122 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001123 }
1124
1125 /**
1126 * Generates IPv6 Unicast packet.
1127 */
Andrey Komarov2398d962016-09-26 15:11:23 +03001128 private class TestIpv6PacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -07001129 private final String deviceId;
1130
1131 public TestIpv6PacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +03001132 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -07001133 this.deviceId = deviceId;
1134 }
1135
1136 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -07001137 public InboundPacket inPacket() {
1138 IPv6 ipv6 = new IPv6();
1139 ipv6.setDestinationAddress(Ip6Address.valueOf("1000::1").toOctets());
1140 ipv6.setSourceAddress(IP2);
1141 Ethernet eth = new Ethernet();
1142 eth.setEtherType(Ethernet.TYPE_IPV6)
1143 .setVlanID(VLAN.toShort())
1144 .setSourceMACAddress(MAC2)
1145 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
1146 .setPayload(ipv6);
1147 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1148 portNumber(INPORT));
1149 return new DefaultInboundPacket(receivedFrom, eth,
1150 ByteBuffer.wrap(eth.serialize()));
1151 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001152 }
1153
Thomas Vachuska33601602014-11-19 03:32:15 -08001154 private class TestDeviceService extends DeviceServiceAdapter {
1155 private DeviceListener listener;
1156
1157 @Override
1158 public void addListener(DeviceListener listener) {
1159 this.listener = listener;
1160 }
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -08001161
1162 @Override
1163 public Iterable<Device> getDevices() {
1164 return Collections.emptyList();
1165 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001166 }
1167
1168 private class TestHostService extends HostServiceAdapter {
1169 @Override
1170 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
Charles Chan5d5e0622015-09-25 13:00:06 -07001171 ConnectPoint cp1 = new ConnectPoint(deviceId(DEV1), portNumber(INPORT));
1172 ConnectPoint cp2 = new ConnectPoint(deviceId(DEV4), portNumber(INPORT));
Charles Chane6067892016-11-17 10:23:46 -08001173 ConnectPoint cp3 = new ConnectPoint(deviceId(DEV1), portNumber(INPORT2));
Charles Chan5d5e0622015-09-25 13:00:06 -07001174 if (connectPoint.equals(cp1)) {
1175 return ImmutableSet.of(HOST);
1176 } else if (connectPoint.equals(cp2)) {
1177 return ImmutableSet.of(HOST2);
Charles Chane6067892016-11-17 10:23:46 -08001178 } else if (connectPoint.equals(cp3)) {
1179 return ImmutableSet.of(HOST3);
Charles Chan5d5e0622015-09-25 13:00:06 -07001180 } else {
1181 return ImmutableSet.of();
1182 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001183 }
1184
1185 @Override
1186 public Set<Host> getConnectedHosts(DeviceId deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -07001187 if (deviceId.equals(deviceId(DEV1))) {
Charles Chane6067892016-11-17 10:23:46 -08001188 return ImmutableSet.of(HOST, HOST3);
Charles Chan5d5e0622015-09-25 13:00:06 -07001189 } else if (deviceId.equals(deviceId(DEV4))) {
1190 return ImmutableSet.of(HOST2);
1191 } else {
1192 return ImmutableSet.of();
1193 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001194 }
1195
Charles Chane6067892016-11-17 10:23:46 -08001196 @Override
1197 public Host getHost(HostId hostId) {
1198 if (hostId.equals(HostId.hostId(MAC, VLAN))) {
1199 return HOST;
1200 } else if (hostId.equals(HostId.hostId(MAC2, VLAN))) {
1201 return HOST2;
1202 } else if (hostId.equals(HostId.hostId(MAC3, VLAN))) {
1203 return HOST3;
Yi Tseng7a38f9a2017-06-09 14:36:40 -07001204 } else if (hostId.equals(HostId.hostId(MAC, VLAN_100))) {
1205 return HOST_VLAN_100;
Charles Chane6067892016-11-17 10:23:46 -08001206 }
1207 return null;
1208 }
Yi Tseng7a38f9a2017-06-09 14:36:40 -07001209 }
Charles Chane6067892016-11-17 10:23:46 -08001210
Yi Tseng7a38f9a2017-06-09 14:36:40 -07001211 private class TestInterfaceService implements InterfaceService {
1212 @Override
1213 public Set<Interface> getInterfaces() {
1214 return null;
1215 }
1216
1217 @Override
1218 public Interface getInterfaceByName(ConnectPoint connectPoint, String name) {
1219 return null;
1220 }
1221
1222 @Override
1223 public Set<Interface> getInterfacesByPort(ConnectPoint port) {
1224 return null;
1225 }
1226
Saurav Das9a554292018-04-27 18:42:30 -07001227 @Override
Yi Tseng7a38f9a2017-06-09 14:36:40 -07001228 public Set<Interface> getInterfacesByIp(IpAddress ip) {
1229 if (ip.equals(GW_IFACE_ADDR.ipAddress())) {
1230 return ImmutableSet.of(GW_IFACE);
1231 } else {
1232 return ImmutableSet.of();
1233 }
1234 }
1235
1236 @Override
1237 public Set<Interface> getInterfacesByVlan(VlanId vlan) {
1238 return null;
1239 }
1240
1241 @Override
1242 public Interface getMatchingInterface(IpAddress ip) {
1243 return null;
1244 }
1245
1246 @Override
1247 public Set<Interface> getMatchingInterfaces(IpAddress ip) {
1248 return null;
1249 }
1250
1251 @Override
1252 public void addListener(InterfaceListener listener) {
1253
1254 }
1255
1256 @Override
1257 public void removeListener(InterfaceListener listener) {
1258
1259 }
Saurav Das9a554292018-04-27 18:42:30 -07001260
1261 @Override
1262 public boolean isConfigured(ConnectPoint connectPoint) {
1263 return false;
1264 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001265 }
Andreas Pantelopoulos19416412018-06-12 13:19:52 -07001266
1267 private class TestNetworkConfigRegistryAdapter extends NetworkConfigRegistryAdapter {
1268 private Set<Config> configs = Sets.newHashSet();
1269
1270 @Override
1271 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
1272 Config c = configs.stream()
1273 .filter(config -> subject.equals(config.subject()))
1274 .filter(config -> configClass.equals(config.getClass()))
1275 .findFirst().orElse(null);
1276 return (C) c;
1277 }
1278 }
1279
1280 private class TestNetworkConfigService extends NetworkConfigServiceAdapter {
1281 }
alshabib4a179dc2014-10-17 17:17:01 -07001282}