blob: 9971921dc2dff1b2842e49ebab2f36d7aec6169b [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 /**
509 * When receiving RouterAdvertisement, ignores it.
510 */
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",
515 providerService.descriptions.size(), is(0)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700516 }
517
518 /**
519 * When receiving RouterSolicitation, ignores it.
520 */
521 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300522 public void receiveRs() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700523 testProcessor.process(new TestRSPacketContext(DEV4));
Charles Chan07f15f22018-05-08 21:35:50 -0700524 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveRs. No host description expected",
525 providerService.descriptions.size(), is(0)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700526 }
527
528 /**
529 * When receiving Duplicate Address Detection (DAD), ignores it.
530 */
531 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300532 public void receiveDad() {
Jonathan Hartb35540a2015-11-17 09:30:56 -0800533 testProcessor.process(new TestDadPacketContext(DEV4));
Charles Chan07f15f22018-05-08 21:35:50 -0700534 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveDad. No host description expected",
535 providerService.descriptions.size(), is(0)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700536 }
537
538 /**
539 * When receiving IPv6 multicast packet, ignores it.
540 */
541 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300542 public void receiveIpv6Multicast() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700543 testProcessor.process(new TestIpv6McastPacketContext(DEV4));
Charles Chan07f15f22018-05-08 21:35:50 -0700544 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveIpv6Multicast. No host description expected",
545 providerService.descriptions.size(), is(0)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700546 }
547
548 /**
549 * When receiving IPv6 unicast packet, updates location only.
550 */
551 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300552 public void receiveIpv6Unicast() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700553 testProcessor.process(new TestIpv6PacketContext(DEV4));
Charles Chan07f15f22018-05-08 21:35:50 -0700554 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat("receiveIpv6Unicast. One host description expected",
555 providerService.descriptions.size(), is(1)));
Charles Chan420e7372016-11-17 10:58:17 -0800556 HostDescription descr = providerService.descriptions.get(0);
Charles Chan07f15f22018-05-08 21:35:50 -0700557 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.location(), is(LOCATION2)));
558 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.hwAddress(), is(MAC2)));
559 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.ipAddress().size(), is(0)));
560 TestTools.assertAfter(ASSERTION_DELAY, () -> assertThat(descr.vlan(), is(VLAN)));
Charles Chan5d5e0622015-09-25 13:00:06 -0700561 }
Thomas Vachuska33601602014-11-19 03:32:15 -0800562
alshabib4a179dc2014-10-17 17:17:01 -0700563 @After
564 public void tearDown() {
565 provider.deactivate();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800566 provider.coreService = null;
alshabib4a179dc2014-10-17 17:17:01 -0700567 provider.providerRegistry = null;
alshabib4a179dc2014-10-17 17:17:01 -0700568 }
569
570 private class TestHostRegistry implements HostProviderRegistry {
571
572 @Override
573 public HostProviderService register(HostProvider provider) {
574 providerService = new TestHostProviderService(provider);
575 return providerService;
576 }
577
578 @Override
579 public void unregister(HostProvider provider) {
580 }
581
582 @Override
583 public Set<ProviderId> getProviders() {
584 return null;
585 }
586
587 }
588
589 private class TestHostProviderService
590 extends AbstractProviderService<HostProvider>
591 implements HostProviderService {
592
Charles Chan420e7372016-11-17 10:58:17 -0800593 List<HostDescription> descriptions = Lists.newArrayList();
Charles Chan888e20a2017-05-01 15:44:23 -0700594 int hostRemoveCount;
595 int ipRemoveCount;
596 int locationRemoveCount;
alshabib4a179dc2014-10-17 17:17:01 -0700597
Charles Chan5d5e0622015-09-25 13:00:06 -0700598 public void clear() {
Charles Chan420e7372016-11-17 10:58:17 -0800599 descriptions.clear();
Charles Chan888e20a2017-05-01 15:44:23 -0700600 hostRemoveCount = 0;
601 ipRemoveCount = 0;
602 locationRemoveCount = 0;
Charles Chan5d5e0622015-09-25 13:00:06 -0700603 }
604
alshabib4a179dc2014-10-17 17:17:01 -0700605 protected TestHostProviderService(HostProvider provider) {
606 super(provider);
607 }
608
609 @Override
Brian O'Connorf107bd72015-09-21 15:31:03 -0700610 public void hostDetected(HostId hostId, HostDescription hostDescription, boolean replaceIps) {
Charles Chan420e7372016-11-17 10:58:17 -0800611 descriptions.add(hostDescription);
alshabib4a179dc2014-10-17 17:17:01 -0700612 }
613
614 @Override
615 public void hostVanished(HostId hostId) {
Charles Chan888e20a2017-05-01 15:44:23 -0700616 hostRemoveCount++;
alshabib4a179dc2014-10-17 17:17:01 -0700617 }
618
samanwita palc40e5ed2015-09-24 11:01:51 -0700619 @Override
620 public void removeIpFromHost(HostId hostId, IpAddress ipAddress) {
Charles Chan888e20a2017-05-01 15:44:23 -0700621 ipRemoveCount++;
622 }
623
624 @Override
625 public void removeLocationFromHost(HostId hostId, HostLocation location) {
626 locationRemoveCount++;
samanwita palc40e5ed2015-09-24 11:01:51 -0700627 }
628
alshabib4a179dc2014-10-17 17:17:01 -0700629 }
630
Thomas Vachuska27bee092015-06-23 19:03:10 -0700631 private class TestPacketService extends PacketServiceAdapter {
alshabib4a179dc2014-10-17 17:17:01 -0700632 @Override
633 public void addProcessor(PacketProcessor processor, int priority) {
634 testProcessor = processor;
635 }
alshabib4a179dc2014-10-17 17:17:01 -0700636 }
637
alshabib4a179dc2014-10-17 17:17:01 -0700638 private class TestTopologyService extends TopologyServiceAdapter {
639 @Override
640 public boolean isInfrastructure(Topology topology,
641 ConnectPoint connectPoint) {
642 //simulate DPID3 as an infrastructure switch
Charles Chan5d5e0622015-09-25 13:00:06 -0700643 if ((connectPoint.deviceId()).equals(deviceId(DEV3)) ||
644 connectPoint.deviceId().equals(deviceId(DEV6))) {
alshabib4a179dc2014-10-17 17:17:01 -0700645 return true;
646 }
647 return false;
648 }
649 }
650
Charles Chan5d5e0622015-09-25 13:00:06 -0700651 /**
652 * Generates ARP packet.
653 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300654 private class TestArpPacketContext extends PacketContextAdapter {
alshabib4a179dc2014-10-17 17:17:01 -0700655 private final String deviceId;
656
Charles Chan5d5e0622015-09-25 13:00:06 -0700657 public TestArpPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300658 super(0, null, null, false);
alshabib4a179dc2014-10-17 17:17:01 -0700659 this.deviceId = deviceId;
660 }
661
662 @Override
alshabib4a179dc2014-10-17 17:17:01 -0700663 public InboundPacket inPacket() {
664 ARP arp = new ARP();
665 arp.setSenderProtocolAddress(IP)
666 .setSenderHardwareAddress(MAC.toBytes())
667 .setTargetHardwareAddress(BCMAC.toBytes())
668 .setTargetProtocolAddress(IP);
669
670 Ethernet eth = new Ethernet();
671 eth.setEtherType(Ethernet.TYPE_ARP)
672 .setVlanID(VLAN.toShort())
673 .setSourceMACAddress(MAC.toBytes())
Yuta HIGUCHI3e848a82014-11-02 20:19:42 -0800674 .setDestinationMACAddress(BCMAC)
alshabib4a179dc2014-10-17 17:17:01 -0700675 .setPayload(arp);
Thomas Vachuska33601602014-11-19 03:32:15 -0800676 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
677 portNumber(INPORT));
alshabib4a179dc2014-10-17 17:17:01 -0700678 return new DefaultInboundPacket(receivedFrom, eth,
679 ByteBuffer.wrap(eth.serialize()));
680 }
alshabib4a179dc2014-10-17 17:17:01 -0700681 }
Thomas Vachuska33601602014-11-19 03:32:15 -0800682
Charles Chan5d5e0622015-09-25 13:00:06 -0700683 /**
Charles Chane6067892016-11-17 10:23:46 -0800684 * Generates IPv4 Unicast packet.
Charles Chan5d5e0622015-09-25 13:00:06 -0700685 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300686 private class TestIpv4PacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -0700687 private final String deviceId;
688
689 public TestIpv4PacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300690 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -0700691 this.deviceId = deviceId;
692 }
693
694 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -0700695 public InboundPacket inPacket() {
696 IPv4 ipv4 = new IPv4();
697 ipv4.setDestinationAddress("10.0.0.1");
698 ipv4.setSourceAddress(IP_ADDRESS.toString());
699 Ethernet eth = new Ethernet();
700 eth.setEtherType(Ethernet.TYPE_IPV4)
701 .setVlanID(VLAN.toShort())
702 .setSourceMACAddress(MAC)
703 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
704 .setPayload(ipv4);
705 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
706 portNumber(INPORT));
707 return new DefaultInboundPacket(receivedFrom, eth,
708 ByteBuffer.wrap(eth.serialize()));
709 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700710 }
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700711
Charles Chane6067892016-11-17 10:23:46 -0800712 /**
713 * Generates DHCP REQUEST packet.
714 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300715 private class TestDhcpRequestPacketContext extends PacketContextAdapter {
Charles Chane6067892016-11-17 10:23:46 -0800716 private final String deviceId;
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700717 private final VlanId vlanId;
Charles Chane6067892016-11-17 10:23:46 -0800718
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700719 public TestDhcpRequestPacketContext(String deviceId, VlanId vlanId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300720 super(0, null, null, false);
Charles Chane6067892016-11-17 10:23:46 -0800721 this.deviceId = deviceId;
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700722 this.vlanId = vlanId;
Charles Chane6067892016-11-17 10:23:46 -0800723 }
724
725 @Override
Charles Chane6067892016-11-17 10:23:46 -0800726 public InboundPacket inPacket() {
727 byte[] dhcpMsgType = new byte[1];
Yi Tsengc7403c22017-06-19 16:23:22 -0700728 dhcpMsgType[0] = (byte) DHCP.MsgType.DHCPREQUEST.getValue();
Charles Chane6067892016-11-17 10:23:46 -0800729
Yi Tsengc7403c22017-06-19 16:23:22 -0700730 DhcpOption dhcpOption = new DhcpOption();
Charles Chane6067892016-11-17 10:23:46 -0800731 dhcpOption.setCode(DHCP.DHCPOptionCode.OptionCode_MessageType.getValue());
732 dhcpOption.setData(dhcpMsgType);
733 dhcpOption.setLength((byte) 1);
734 DHCP dhcp = new DHCP();
735 dhcp.setOptions(Collections.singletonList(dhcpOption));
736 dhcp.setClientHardwareAddress(MAC.toBytes());
737 UDP udp = new UDP();
738 udp.setPayload(dhcp);
739 udp.setSourcePort(UDP.DHCP_CLIENT_PORT);
740 udp.setDestinationPort(UDP.DHCP_SERVER_PORT);
741 IPv4 ipv4 = new IPv4();
742 ipv4.setPayload(udp);
743 ipv4.setDestinationAddress(IP_ADDRESS3.toString());
744 ipv4.setSourceAddress(IP_ADDRESS.toString());
745 Ethernet eth = new Ethernet();
746 eth.setEtherType(Ethernet.TYPE_IPV4)
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700747 .setVlanID(this.vlanId.toShort())
Charles Chane6067892016-11-17 10:23:46 -0800748 .setSourceMACAddress(MAC)
749 .setDestinationMACAddress(MAC3)
750 .setPayload(ipv4);
751 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
752 portNumber(INPORT));
753 return new DefaultInboundPacket(receivedFrom, eth,
754 ByteBuffer.wrap(eth.serialize()));
755 }
Charles Chane6067892016-11-17 10:23:46 -0800756 }
757
758 /**
759 * Generates DHCP ACK packet.
760 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300761 private class TestDhcpAckPacketContext extends PacketContextAdapter {
Charles Chane6067892016-11-17 10:23:46 -0800762 private final String deviceId;
763
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700764 public TestDhcpAckPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300765 super(0, null, null, false);
Charles Chane6067892016-11-17 10:23:46 -0800766 this.deviceId = deviceId;
767 }
768
769 @Override
Charles Chane6067892016-11-17 10:23:46 -0800770 public InboundPacket inPacket() {
771 byte[] dhcpMsgType = new byte[1];
Yi Tsengc7403c22017-06-19 16:23:22 -0700772 dhcpMsgType[0] = (byte) DHCP.MsgType.DHCPACK.getValue();
Charles Chane6067892016-11-17 10:23:46 -0800773
Yi Tsengc7403c22017-06-19 16:23:22 -0700774 DhcpOption dhcpOption = new DhcpOption();
Charles Chane6067892016-11-17 10:23:46 -0800775 dhcpOption.setCode(DHCP.DHCPOptionCode.OptionCode_MessageType.getValue());
776 dhcpOption.setData(dhcpMsgType);
777 dhcpOption.setLength((byte) 1);
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700778
Charles Chane6067892016-11-17 10:23:46 -0800779 DHCP dhcp = new DHCP();
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700780 dhcp.setOptions(ImmutableList.of(dhcpOption));
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700781
Charles Chane6067892016-11-17 10:23:46 -0800782 dhcp.setClientHardwareAddress(MAC.toBytes());
783 dhcp.setYourIPAddress(IP_ADDRESS.getIp4Address().toInt());
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700784
Charles Chane6067892016-11-17 10:23:46 -0800785 UDP udp = new UDP();
786 udp.setPayload(dhcp);
787 udp.setSourcePort(UDP.DHCP_SERVER_PORT);
788 udp.setDestinationPort(UDP.DHCP_CLIENT_PORT);
789 IPv4 ipv4 = new IPv4();
790 ipv4.setPayload(udp);
791 ipv4.setDestinationAddress(IP_ADDRESS.toString());
792 ipv4.setSourceAddress(IP_ADDRESS3.toString());
793 Ethernet eth = new Ethernet();
794 eth.setEtherType(Ethernet.TYPE_IPV4)
795 .setVlanID(VLAN.toShort())
796 .setSourceMACAddress(MAC3)
797 .setDestinationMACAddress(MAC)
798 .setPayload(ipv4);
799 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
800 portNumber(INPORT2));
801 return new DefaultInboundPacket(receivedFrom, eth,
802 ByteBuffer.wrap(eth.serialize()));
803 }
Charles Chane6067892016-11-17 10:23:46 -0800804 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700805
806 /**
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700807 * Generates DHCPv6 REQUEST packet.
808 */
809 private class TestDhcp6RequestPacketContext extends PacketContextAdapter {
810 private final String deviceId;
811 private final VlanId vlanId;
812
813 public TestDhcp6RequestPacketContext(String deviceId, VlanId vlanId) {
814 super(0, null, null, false);
815 this.deviceId = deviceId;
816 this.vlanId = vlanId;
817 }
818
819 @Override
820 public InboundPacket inPacket() {
821
822 DHCP6 dhcp6 = new DHCP6();
823 dhcp6.setMsgType(DHCP6.MsgType.REQUEST.value());
824 List<Dhcp6Option> options = Lists.newArrayList();
825
826 // IA address
827 Dhcp6IaAddressOption iaAddressOption = new Dhcp6IaAddressOption();
828 iaAddressOption.setIp6Address(IP_ADDRESS2.getIp6Address());
829
830 // IA NA
831 Dhcp6IaNaOption iaNaOption = new Dhcp6IaNaOption();
832 iaNaOption.setOptions(ImmutableList.of(iaAddressOption));
833 options.add(iaNaOption);
834
835 dhcp6.setOptions(options);
836
837 UDP udp = new UDP();
838 udp.setPayload(dhcp6);
839 udp.setSourcePort(UDP.DHCP_V6_CLIENT_PORT);
840 udp.setDestinationPort(UDP.DHCP_V6_SERVER_PORT);
841 IPv6 ipv6 = new IPv6();
842 ipv6.setPayload(udp);
843 ipv6.setDestinationAddress(Ip6Address.ZERO.toOctets());
844 ipv6.setSourceAddress(Ip6Address.ZERO.toOctets());
845 ipv6.setNextHeader(IPv6.PROTOCOL_UDP);
846 Ethernet eth = new Ethernet();
847 eth.setEtherType(Ethernet.TYPE_IPV6)
848 .setVlanID(this.vlanId.toShort())
849 .setSourceMACAddress(MAC2)
850 .setDestinationMACAddress(DHCP6_SERVER_MAC)
851 .setPayload(ipv6);
852 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
853 portNumber(INPORT));
854 return new DefaultInboundPacket(receivedFrom, eth,
855 ByteBuffer.wrap(eth.serialize()));
856 }
857 }
858
859 /**
860 * Generates DHCPv6 ACK packet.
861 */
862 private class TestDhcp6AckPacketContext extends PacketContextAdapter {
863 private final String deviceId;
864
865 public TestDhcp6AckPacketContext(String deviceId) {
866 super(0, null, null, false);
867 this.deviceId = deviceId;
868 }
869
870 @Override
871 public InboundPacket inPacket() {
872 DHCP6 dhcp6 = new DHCP6();
873 dhcp6.setMsgType(DHCP6.MsgType.REPLY.value());
874 List<Dhcp6Option> options = Lists.newArrayList();
875
876 // IA address
877 Dhcp6IaAddressOption iaAddressOption = new Dhcp6IaAddressOption();
878 iaAddressOption.setIp6Address(IP_ADDRESS2.getIp6Address());
879
880 // IA NA
881 Dhcp6IaNaOption iaNaOption = new Dhcp6IaNaOption();
882 iaNaOption.setOptions(ImmutableList.of(iaAddressOption));
883 options.add(iaNaOption);
884
885 // Client ID
886 Dhcp6Duid duid = new Dhcp6Duid();
887 duid.setDuidType(Dhcp6Duid.DuidType.DUID_LLT);
888 duid.setHardwareType((short) 1);
889 duid.setDuidTime(0);
890 duid.setLinkLayerAddress(MAC2.toBytes());
891 Dhcp6ClientIdOption clientIdOption = new Dhcp6ClientIdOption();
892 clientIdOption.setDuid(duid);
893 options.add(clientIdOption);
894 dhcp6.setOptions(options);
895
896 UDP udp = new UDP();
897 udp.setPayload(dhcp6);
898 udp.setSourcePort(UDP.DHCP_V6_CLIENT_PORT);
899 udp.setDestinationPort(UDP.DHCP_V6_SERVER_PORT);
900 IPv6 ipv6 = new IPv6();
901 ipv6.setPayload(udp);
902 ipv6.setDestinationAddress(Ip6Address.ZERO.toOctets());
903 ipv6.setSourceAddress(Ip6Address.ZERO.toOctets());
904 ipv6.setNextHeader(IPv6.PROTOCOL_UDP);
905 Ethernet eth = new Ethernet();
906 eth.setEtherType(Ethernet.TYPE_IPV6)
907 .setVlanID(VLAN.toShort())
908 .setSourceMACAddress(DHCP6_SERVER_MAC)
909 .setDestinationMACAddress(MAC2)
910 .setPayload(ipv6);
911 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
912 portNumber(INPORT2));
913 return new DefaultInboundPacket(receivedFrom, eth,
914 ByteBuffer.wrap(eth.serialize()));
915 }
916 }
917
918 /**
Charles Chan5d5e0622015-09-25 13:00:06 -0700919 * Generates NeighborAdvertisement packet.
920 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300921 private class TestNaPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -0700922 private final String deviceId;
923
Jonathan Hartb35540a2015-11-17 09:30:56 -0800924 public TestNaPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300925 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -0700926 this.deviceId = deviceId;
927 }
928
929 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -0700930 public InboundPacket inPacket() {
931 NeighborAdvertisement na = new NeighborAdvertisement();
Charles Chan178b0f52017-10-08 23:51:22 -0400932 na.setTargetAddress(IP2);
Charles Chan5d5e0622015-09-25 13:00:06 -0700933 ICMP6 icmp6 = new ICMP6();
934 icmp6.setPayload(na);
935 IPv6 ipv6 = new IPv6();
936 ipv6.setPayload(icmp6);
937 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
Charles Chan178b0f52017-10-08 23:51:22 -0400938 ipv6.setSourceAddress(LLIP2);
Charles Chan5d5e0622015-09-25 13:00:06 -0700939 Ethernet eth = new Ethernet();
940 eth.setEtherType(Ethernet.TYPE_IPV6)
941 .setVlanID(VLAN.toShort())
942 .setSourceMACAddress(MAC2.toBytes())
943 .setDestinationMACAddress(BCMAC2)
944 .setPayload(ipv6);
945 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
946 portNumber(INPORT));
947 return new DefaultInboundPacket(receivedFrom, eth,
948 ByteBuffer.wrap(eth.serialize()));
949 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700950 }
951
952 /**
953 * Generates NeighborSolicitation packet.
954 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300955 private class TestNsPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -0700956 private final String deviceId;
957
Jonathan Hartb35540a2015-11-17 09:30:56 -0800958 public TestNsPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300959 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -0700960 this.deviceId = deviceId;
961 }
962
963 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -0700964 public InboundPacket inPacket() {
965 NeighborSolicitation ns = new NeighborSolicitation();
966 ICMP6 icmp6 = new ICMP6();
967 icmp6.setPayload(ns);
968 IPv6 ipv6 = new IPv6();
969 ipv6.setPayload(icmp6);
970 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1:ff00:0000").toOctets());
971 ipv6.setSourceAddress(IP2);
972 Ethernet eth = new Ethernet();
973 eth.setEtherType(Ethernet.TYPE_IPV6)
974 .setVlanID(VLAN.toShort())
975 .setSourceMACAddress(MAC2.toBytes())
976 .setDestinationMACAddress(BCMAC2)
977 .setPayload(ipv6);
978 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
979 portNumber(INPORT));
980 return new DefaultInboundPacket(receivedFrom, eth,
981 ByteBuffer.wrap(eth.serialize()));
982 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700983 }
984
985 /**
986 * Generates Duplicate Address Detection packet.
987 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300988 private class TestDadPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -0700989 private final String deviceId;
990
Jonathan Hartb35540a2015-11-17 09:30:56 -0800991 public TestDadPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300992 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -0700993 this.deviceId = deviceId;
994 }
995
996 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -0700997 public InboundPacket inPacket() {
998 NeighborSolicitation ns = new NeighborSolicitation();
999 ICMP6 icmp6 = new ICMP6();
1000 icmp6.setPayload(ns);
1001 IPv6 ipv6 = new IPv6();
1002 ipv6.setPayload(icmp6);
1003 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
1004 ipv6.setSourceAddress(Ip6Address.valueOf("::").toOctets());
1005 Ethernet eth = new Ethernet();
1006 eth.setEtherType(Ethernet.TYPE_IPV6)
1007 .setVlanID(VLAN.toShort())
1008 .setSourceMACAddress(MAC2.toBytes())
1009 .setDestinationMACAddress(BCMAC2)
1010 .setPayload(ipv6);
1011 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1012 portNumber(INPORT));
1013 return new DefaultInboundPacket(receivedFrom, eth,
1014 ByteBuffer.wrap(eth.serialize()));
1015 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001016 }
1017
1018 /**
1019 * Generates Router Solicitation packet.
1020 */
Andrey Komarov2398d962016-09-26 15:11:23 +03001021 private class TestRSPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -07001022 private final String deviceId;
1023
1024 public TestRSPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +03001025 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -07001026 this.deviceId = deviceId;
1027 }
1028
1029 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -07001030 public InboundPacket inPacket() {
1031 RouterSolicitation ns = new RouterSolicitation();
1032 ICMP6 icmp6 = new ICMP6();
1033 icmp6.setPayload(ns);
1034 IPv6 ipv6 = new IPv6();
1035 ipv6.setPayload(icmp6);
1036 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::2").toOctets());
1037 ipv6.setSourceAddress(Ip6Address.valueOf("::").toOctets());
1038 Ethernet eth = new Ethernet();
1039 eth.setEtherType(Ethernet.TYPE_IPV6)
1040 .setVlanID(VLAN.toShort())
1041 .setSourceMACAddress(MAC2.toBytes())
1042 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:02"))
1043 .setPayload(ipv6);
1044 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1045 portNumber(INPORT));
1046 return new DefaultInboundPacket(receivedFrom, eth,
1047 ByteBuffer.wrap(eth.serialize()));
1048 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001049 }
1050
1051 /**
1052 * Generates Router Advertisement packet.
1053 */
Andrey Komarov2398d962016-09-26 15:11:23 +03001054 private class TestRAPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -07001055 private final String deviceId;
1056
1057 public TestRAPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +03001058 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -07001059 this.deviceId = deviceId;
1060 }
1061
1062 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -07001063 public InboundPacket inPacket() {
1064 RouterAdvertisement ns = new RouterAdvertisement();
1065 ICMP6 icmp6 = new ICMP6();
1066 icmp6.setPayload(ns);
1067 IPv6 ipv6 = new IPv6();
1068 ipv6.setPayload(icmp6);
1069 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
1070 ipv6.setSourceAddress(IP2);
1071 Ethernet eth = new Ethernet();
1072 eth.setEtherType(Ethernet.TYPE_IPV6)
1073 .setVlanID(VLAN.toShort())
1074 .setSourceMACAddress(MAC2.toBytes())
1075 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
1076 .setPayload(ipv6);
1077 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1078 portNumber(INPORT));
1079 return new DefaultInboundPacket(receivedFrom, eth,
1080 ByteBuffer.wrap(eth.serialize()));
1081 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001082 }
1083
1084 /**
1085 * Generates IPv6 Multicast packet.
1086 */
Andrey Komarov2398d962016-09-26 15:11:23 +03001087 private class TestIpv6McastPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -07001088 private final String deviceId;
1089
1090 public TestIpv6McastPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +03001091 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -07001092 this.deviceId = deviceId;
1093 }
1094
1095 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -07001096 public InboundPacket inPacket() {
1097 IPv6 ipv6 = new IPv6();
1098 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
1099 ipv6.setSourceAddress(IP2);
1100 Ethernet eth = new Ethernet();
1101 eth.setEtherType(Ethernet.TYPE_IPV6)
1102 .setVlanID(VLAN.toShort())
1103 .setSourceMACAddress(MAC2.toBytes())
1104 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
1105 .setPayload(ipv6);
1106 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1107 portNumber(INPORT));
1108 return new DefaultInboundPacket(receivedFrom, eth,
1109 ByteBuffer.wrap(eth.serialize()));
1110 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001111 }
1112
1113 /**
1114 * Generates IPv6 Unicast packet.
1115 */
Andrey Komarov2398d962016-09-26 15:11:23 +03001116 private class TestIpv6PacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -07001117 private final String deviceId;
1118
1119 public TestIpv6PacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +03001120 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -07001121 this.deviceId = deviceId;
1122 }
1123
1124 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -07001125 public InboundPacket inPacket() {
1126 IPv6 ipv6 = new IPv6();
1127 ipv6.setDestinationAddress(Ip6Address.valueOf("1000::1").toOctets());
1128 ipv6.setSourceAddress(IP2);
1129 Ethernet eth = new Ethernet();
1130 eth.setEtherType(Ethernet.TYPE_IPV6)
1131 .setVlanID(VLAN.toShort())
1132 .setSourceMACAddress(MAC2)
1133 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
1134 .setPayload(ipv6);
1135 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1136 portNumber(INPORT));
1137 return new DefaultInboundPacket(receivedFrom, eth,
1138 ByteBuffer.wrap(eth.serialize()));
1139 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001140 }
1141
Thomas Vachuska33601602014-11-19 03:32:15 -08001142 private class TestDeviceService extends DeviceServiceAdapter {
1143 private DeviceListener listener;
1144
1145 @Override
1146 public void addListener(DeviceListener listener) {
1147 this.listener = listener;
1148 }
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -08001149
1150 @Override
1151 public Iterable<Device> getDevices() {
1152 return Collections.emptyList();
1153 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001154 }
1155
1156 private class TestHostService extends HostServiceAdapter {
1157 @Override
1158 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
Charles Chan5d5e0622015-09-25 13:00:06 -07001159 ConnectPoint cp1 = new ConnectPoint(deviceId(DEV1), portNumber(INPORT));
1160 ConnectPoint cp2 = new ConnectPoint(deviceId(DEV4), portNumber(INPORT));
Charles Chane6067892016-11-17 10:23:46 -08001161 ConnectPoint cp3 = new ConnectPoint(deviceId(DEV1), portNumber(INPORT2));
Charles Chan5d5e0622015-09-25 13:00:06 -07001162 if (connectPoint.equals(cp1)) {
1163 return ImmutableSet.of(HOST);
1164 } else if (connectPoint.equals(cp2)) {
1165 return ImmutableSet.of(HOST2);
Charles Chane6067892016-11-17 10:23:46 -08001166 } else if (connectPoint.equals(cp3)) {
1167 return ImmutableSet.of(HOST3);
Charles Chan5d5e0622015-09-25 13:00:06 -07001168 } else {
1169 return ImmutableSet.of();
1170 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001171 }
1172
1173 @Override
1174 public Set<Host> getConnectedHosts(DeviceId deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -07001175 if (deviceId.equals(deviceId(DEV1))) {
Charles Chane6067892016-11-17 10:23:46 -08001176 return ImmutableSet.of(HOST, HOST3);
Charles Chan5d5e0622015-09-25 13:00:06 -07001177 } else if (deviceId.equals(deviceId(DEV4))) {
1178 return ImmutableSet.of(HOST2);
1179 } else {
1180 return ImmutableSet.of();
1181 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001182 }
1183
Charles Chane6067892016-11-17 10:23:46 -08001184 @Override
1185 public Host getHost(HostId hostId) {
1186 if (hostId.equals(HostId.hostId(MAC, VLAN))) {
1187 return HOST;
1188 } else if (hostId.equals(HostId.hostId(MAC2, VLAN))) {
1189 return HOST2;
1190 } else if (hostId.equals(HostId.hostId(MAC3, VLAN))) {
1191 return HOST3;
Yi Tseng7a38f9a2017-06-09 14:36:40 -07001192 } else if (hostId.equals(HostId.hostId(MAC, VLAN_100))) {
1193 return HOST_VLAN_100;
Charles Chane6067892016-11-17 10:23:46 -08001194 }
1195 return null;
1196 }
Yi Tseng7a38f9a2017-06-09 14:36:40 -07001197 }
Charles Chane6067892016-11-17 10:23:46 -08001198
Yi Tseng7a38f9a2017-06-09 14:36:40 -07001199 private class TestInterfaceService implements InterfaceService {
1200 @Override
1201 public Set<Interface> getInterfaces() {
1202 return null;
1203 }
1204
1205 @Override
1206 public Interface getInterfaceByName(ConnectPoint connectPoint, String name) {
1207 return null;
1208 }
1209
1210 @Override
1211 public Set<Interface> getInterfacesByPort(ConnectPoint port) {
1212 return null;
1213 }
1214
Saurav Das9a554292018-04-27 18:42:30 -07001215 @Override
Yi Tseng7a38f9a2017-06-09 14:36:40 -07001216 public Set<Interface> getInterfacesByIp(IpAddress ip) {
1217 if (ip.equals(GW_IFACE_ADDR.ipAddress())) {
1218 return ImmutableSet.of(GW_IFACE);
1219 } else {
1220 return ImmutableSet.of();
1221 }
1222 }
1223
1224 @Override
1225 public Set<Interface> getInterfacesByVlan(VlanId vlan) {
1226 return null;
1227 }
1228
1229 @Override
1230 public Interface getMatchingInterface(IpAddress ip) {
1231 return null;
1232 }
1233
1234 @Override
1235 public Set<Interface> getMatchingInterfaces(IpAddress ip) {
1236 return null;
1237 }
1238
1239 @Override
1240 public void addListener(InterfaceListener listener) {
1241
1242 }
1243
1244 @Override
1245 public void removeListener(InterfaceListener listener) {
1246
1247 }
Saurav Das9a554292018-04-27 18:42:30 -07001248
1249 @Override
1250 public boolean isConfigured(ConnectPoint connectPoint) {
1251 return false;
1252 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001253 }
Andreas Pantelopoulos19416412018-06-12 13:19:52 -07001254
1255 private class TestNetworkConfigRegistryAdapter extends NetworkConfigRegistryAdapter {
1256 private Set<Config> configs = Sets.newHashSet();
1257
1258 @Override
1259 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
1260 Config c = configs.stream()
1261 .filter(config -> subject.equals(config.subject()))
1262 .filter(config -> configClass.equals(config.getClass()))
1263 .findFirst().orElse(null);
1264 return (C) c;
1265 }
1266 }
1267
1268 private class TestNetworkConfigService extends NetworkConfigServiceAdapter {
1269 }
alshabib4a179dc2014-10-17 17:17:01 -07001270}