blob: f7b2f77490259cac1de692ae08f853370957e570 [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;
Madan Jampania3770c32015-12-11 12:07:41 -080021import com.google.common.util.concurrent.MoreExecutors;
alshabib4a179dc2014-10-17 17:17:01 -070022import org.junit.After;
23import org.junit.Before;
24import org.junit.Test;
Yi Tseng7a38f9a2017-06-09 14:36:40 -070025import org.onlab.junit.TestUtils;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080026import org.onlab.osgi.ComponentContextAdapter;
27import org.onlab.packet.ARP;
28import org.onlab.packet.ChassisId;
Charles Chane6067892016-11-17 10:23:46 -080029import org.onlab.packet.DHCP;
Yi Tsengfcf5dce2017-07-26 14:30:41 -070030import org.onlab.packet.DHCP6;
31import org.onlab.packet.dhcp.Dhcp6ClientIdOption;
32import org.onlab.packet.dhcp.Dhcp6Duid;
33import org.onlab.packet.dhcp.Dhcp6IaAddressOption;
34import org.onlab.packet.dhcp.Dhcp6IaNaOption;
35import org.onlab.packet.dhcp.Dhcp6Option;
Yi Tsengc7403c22017-06-19 16:23:22 -070036import org.onlab.packet.dhcp.DhcpOption;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080037import org.onlab.packet.Ethernet;
Charles Chan5d5e0622015-09-25 13:00:06 -070038import org.onlab.packet.ICMP6;
39import org.onlab.packet.IPv4;
40import org.onlab.packet.IPv6;
41import org.onlab.packet.Ip6Address;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080042import org.onlab.packet.IpAddress;
43import org.onlab.packet.MacAddress;
Charles Chane6067892016-11-17 10:23:46 -080044import org.onlab.packet.UDP;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080045import org.onlab.packet.VlanId;
Charles Chan5d5e0622015-09-25 13:00:06 -070046import org.onlab.packet.ndp.NeighborAdvertisement;
47import org.onlab.packet.ndp.NeighborSolicitation;
48import org.onlab.packet.ndp.RouterAdvertisement;
49import org.onlab.packet.ndp.RouterSolicitation;
Thomas Vachuska6519e6f2015-03-11 02:29:31 -070050import org.onosproject.cfg.ComponentConfigAdapter;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -080051import org.onosproject.core.ApplicationId;
52import org.onosproject.core.CoreService;
53import org.onosproject.core.DefaultApplicationId;
Ray Milkeyfacf2862017-08-03 11:58:29 -070054import org.onosproject.net.intf.Interface;
55import org.onosproject.net.intf.InterfaceListener;
56import org.onosproject.net.intf.InterfaceService;
Brian O'Connorabafb502014-12-02 22:26:20 -080057import org.onosproject.net.ConnectPoint;
58import org.onosproject.net.DefaultDevice;
59import org.onosproject.net.DefaultHost;
60import org.onosproject.net.DefaultPort;
61import org.onosproject.net.Device;
62import org.onosproject.net.DeviceId;
63import org.onosproject.net.Host;
64import org.onosproject.net.HostId;
65import org.onosproject.net.HostLocation;
66import org.onosproject.net.device.DeviceEvent;
67import org.onosproject.net.device.DeviceListener;
68import org.onosproject.net.device.DeviceServiceAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080069import org.onosproject.net.host.HostDescription;
70import org.onosproject.net.host.HostProvider;
71import org.onosproject.net.host.HostProviderRegistry;
72import org.onosproject.net.host.HostProviderService;
73import org.onosproject.net.host.HostServiceAdapter;
Yi Tseng7a38f9a2017-06-09 14:36:40 -070074import org.onosproject.net.host.InterfaceIpAddress;
Brian O'Connorabafb502014-12-02 22:26:20 -080075import org.onosproject.net.packet.DefaultInboundPacket;
76import org.onosproject.net.packet.InboundPacket;
Andrey Komarov2398d962016-09-26 15:11:23 +030077import org.onosproject.net.packet.PacketContextAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080078import org.onosproject.net.packet.PacketProcessor;
Thomas Vachuska27bee092015-06-23 19:03:10 -070079import org.onosproject.net.packet.PacketServiceAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080080import org.onosproject.net.provider.AbstractProviderService;
81import org.onosproject.net.provider.ProviderId;
82import org.onosproject.net.topology.Topology;
83import org.onosproject.net.topology.TopologyServiceAdapter;
alshabib4a179dc2014-10-17 17:17:01 -070084
Thomas Vachuska27bee092015-06-23 19:03:10 -070085import java.nio.ByteBuffer;
86import java.util.Collections;
87import java.util.Dictionary;
88import java.util.Hashtable;
Charles Chan420e7372016-11-17 10:58:17 -080089import java.util.List;
Thomas Vachuska27bee092015-06-23 19:03:10 -070090import java.util.Set;
91
Michele Santuari72f6bee2016-11-18 12:56:30 +010092import static org.easymock.EasyMock.createMock;
93import static org.easymock.EasyMock.expect;
94import static org.easymock.EasyMock.replay;
Charles Chan5d5e0622015-09-25 13:00:06 -070095import static org.hamcrest.Matchers.is;
Michele Santuari72f6bee2016-11-18 12:56:30 +010096import static org.junit.Assert.assertEquals;
97import static org.junit.Assert.assertNotEquals;
98import static org.junit.Assert.assertNotNull;
99import static org.junit.Assert.assertThat;
Charles Chan178b0f52017-10-08 23:51:22 -0400100import static org.junit.Assert.assertTrue;
Thomas Vachuska27bee092015-06-23 19:03:10 -0700101import static org.onlab.packet.VlanId.vlanId;
102import static org.onosproject.net.Device.Type.SWITCH;
103import static org.onosproject.net.DeviceId.deviceId;
104import static org.onosproject.net.HostId.hostId;
105import static org.onosproject.net.PortNumber.portNumber;
Michele Santuari72f6bee2016-11-18 12:56:30 +0100106import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
107import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_REMOVED;
108import static org.onosproject.net.device.DeviceEvent.Type.PORT_UPDATED;
Thomas Vachuska33601602014-11-19 03:32:15 -0800109
alshabib4a179dc2014-10-17 17:17:01 -0700110public class HostLocationProviderTest {
Charles Chan8b0fdaa2016-02-23 18:35:27 -0800111 private static final ProviderId PROVIDER_ID =
112 new ProviderId("of", "org.onosproject.provider.host");
113
alshabib4a179dc2014-10-17 17:17:01 -0700114 private static final Integer INPORT = 10;
Charles Chane6067892016-11-17 10:23:46 -0800115 private static final Integer INPORT2 = 11;
alshabib4a179dc2014-10-17 17:17:01 -0700116 private static final String DEV1 = "of:1";
117 private static final String DEV2 = "of:2";
118 private static final String DEV3 = "of:3";
Charles Chan5d5e0622015-09-25 13:00:06 -0700119 private static final String DEV4 = "of:4";
120 private static final String DEV5 = "of:5";
121 private static final String DEV6 = "of:6";
alshabib4a179dc2014-10-17 17:17:01 -0700122
Thomas Vachuska33601602014-11-19 03:32:15 -0800123 private static final VlanId VLAN = vlanId();
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700124 private static final VlanId VLAN_100 = VlanId.vlanId("100");
Charles Chan5d5e0622015-09-25 13:00:06 -0700125
126 // IPv4 Host
alshabib4a179dc2014-10-17 17:17:01 -0700127 private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01");
128 private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff");
129 private static final byte[] IP = new byte[]{10, 0, 0, 1};
Thomas Vachuska33601602014-11-19 03:32:15 -0800130 private static final IpAddress IP_ADDRESS =
131 IpAddress.valueOf(IpAddress.Version.INET, IP);
132 private static final HostLocation LOCATION =
133 new HostLocation(deviceId(DEV1), portNumber(INPORT), 0L);
Thomas Vachuska33601602014-11-19 03:32:15 -0800134 private static final DefaultHost HOST =
Charles Chan8b0fdaa2016-02-23 18:35:27 -0800135 new DefaultHost(PROVIDER_ID, hostId(MAC), MAC,
Charles Chane6067892016-11-17 10:23:46 -0800136 VLAN, LOCATION,
137 ImmutableSet.of(IP_ADDRESS));
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700138 private static final DefaultHost HOST_VLAN_100 =
139 new DefaultHost(PROVIDER_ID, hostId(MAC, VLAN_100), MAC,
140 VLAN_100, LOCATION,
141 ImmutableSet.of(IP_ADDRESS));
Thomas Vachuska33601602014-11-19 03:32:15 -0800142
Charles Chan5d5e0622015-09-25 13:00:06 -0700143 // IPv6 Host
144 private static final MacAddress MAC2 = MacAddress.valueOf("00:00:22:00:00:02");
145 private static final MacAddress BCMAC2 = MacAddress.valueOf("33:33:00:00:00:01");
146 private static final byte[] IP2 = Ip6Address.valueOf("1000::1").toOctets();
Charles Chan178b0f52017-10-08 23:51:22 -0400147 private static final byte[] LLIP2 = IPv6.getLinkLocalAddress(MAC2.toBytes());
Charles Chan5d5e0622015-09-25 13:00:06 -0700148 private static final IpAddress IP_ADDRESS2 =
149 IpAddress.valueOf(IpAddress.Version.INET6, IP2);
Charles Chan178b0f52017-10-08 23:51:22 -0400150 private static final IpAddress LLIP_ADDRESS2 =
151 IpAddress.valueOf(IpAddress.Version.INET6, LLIP2);
Charles Chan5d5e0622015-09-25 13:00:06 -0700152 private static final HostLocation LOCATION2 =
153 new HostLocation(deviceId(DEV4), portNumber(INPORT), 0L);
154 private static final DefaultHost HOST2 =
Charles Chan8b0fdaa2016-02-23 18:35:27 -0800155 new DefaultHost(PROVIDER_ID, hostId(MAC2), MAC2,
Charles Chane6067892016-11-17 10:23:46 -0800156 VLAN, LOCATION2,
157 ImmutableSet.of(IP_ADDRESS2));
158
159 // DHCP Server
160 private static final MacAddress MAC3 = MacAddress.valueOf("00:00:33:00:00:03");
161 private static final byte[] IP3 = new byte[]{10, 0, 0, 2};
162 private static final IpAddress IP_ADDRESS3 =
163 IpAddress.valueOf(IpAddress.Version.INET, IP3);
Charles Chane6067892016-11-17 10:23:46 -0800164 private static final HostLocation LOCATION3 =
165 new HostLocation(deviceId(DEV1), portNumber(INPORT2), 0L);
166 private static final DefaultHost HOST3 =
167 new DefaultHost(PROVIDER_ID, hostId(MAC3), MAC3,
168 VLAN, LOCATION3,
169 ImmutableSet.of(IP_ADDRESS3));
Charles Chan5d5e0622015-09-25 13:00:06 -0700170
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700171 // DHCP6 Server
172 private static final MacAddress DHCP6_SERVER_MAC = MacAddress.valueOf("00:00:44:00:00:04");
173 private static final IpAddress DHCP6_SERVER_IP =
174 IpAddress.valueOf("2000::1:1000");
175
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700176 // Gateway information for relay agent
177 private static final InterfaceIpAddress GW_IFACE_ADDR = InterfaceIpAddress.valueOf("10.0.1.1/32");
178 private static final Interface GW_IFACE = new Interface("gateway",
179 LOCATION,
180 ImmutableList.of(GW_IFACE_ADDR),
181 null,
182 VLAN_100);
183
Thomas Vachuska33601602014-11-19 03:32:15 -0800184 private static final ComponentContextAdapter CTX_FOR_REMOVE =
185 new ComponentContextAdapter() {
186 @Override
187 public Dictionary getProperties() {
188 Hashtable<String, String> props = new Hashtable<>();
189 props.put("hostRemovalEnabled", "true");
190 return props;
191 }
192 };
193
194 public static final ComponentContextAdapter CTX_FOR_NO_REMOVE =
195 new ComponentContextAdapter() {
196 @Override
197 public Dictionary getProperties() {
198 return new Hashtable();
199 }
200 };
201
alshabib4a179dc2014-10-17 17:17:01 -0700202 private final HostLocationProvider provider = new HostLocationProvider();
Thomas Vachuska33601602014-11-19 03:32:15 -0800203 private final TestHostRegistry hostRegistry = new TestHostRegistry();
alshabib4a179dc2014-10-17 17:17:01 -0700204 private final TestTopologyService topoService = new TestTopologyService();
Thomas Vachuska33601602014-11-19 03:32:15 -0800205 private final TestDeviceService deviceService = new TestDeviceService();
206 private final TestHostService hostService = new TestHostService();
alshabib4a179dc2014-10-17 17:17:01 -0700207 private final TestPacketService packetService = new TestPacketService();
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700208 private final TestInterfaceService interfaceService = new TestInterfaceService();
alshabib4a179dc2014-10-17 17:17:01 -0700209
210 private PacketProcessor testProcessor;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800211 private CoreService coreService;
alshabib4a179dc2014-10-17 17:17:01 -0700212 private TestHostProviderService providerService;
213
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800214 private ApplicationId appId =
215 new DefaultApplicationId(100, "org.onosproject.provider.host");
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800216
alshabib4a179dc2014-10-17 17:17:01 -0700217 @Before
218 public void setUp() {
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800219 coreService = createMock(CoreService.class);
220 expect(coreService.registerApplication(appId.name()))
Thomas Vachuska27bee092015-06-23 19:03:10 -0700221 .andReturn(appId).anyTimes();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800222 replay(coreService);
223
Thomas Vachuska6519e6f2015-03-11 02:29:31 -0700224 provider.cfgService = new ComponentConfigAdapter();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800225 provider.coreService = coreService;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800226
Thomas Vachuska33601602014-11-19 03:32:15 -0800227 provider.providerRegistry = hostRegistry;
alshabib4a179dc2014-10-17 17:17:01 -0700228 provider.topologyService = topoService;
Pavlin Radoslavovd6612f92015-02-23 13:53:32 -0800229 provider.packetService = packetService;
Thomas Vachuska33601602014-11-19 03:32:15 -0800230 provider.deviceService = deviceService;
231 provider.hostService = hostService;
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700232 provider.interfaceService = interfaceService;
alshabib4a179dc2014-10-17 17:17:01 -0700233
Thomas Vachuska33601602014-11-19 03:32:15 -0800234 provider.activate(CTX_FOR_NO_REMOVE);
Madan Jampania3770c32015-12-11 12:07:41 -0800235
236 provider.eventHandler = MoreExecutors.newDirectExecutorService();
alshabib4a179dc2014-10-17 17:17:01 -0700237 }
238
239 @Test
240 public void basics() {
241 assertNotNull("registration expected", providerService);
242 assertEquals("incorrect provider", provider, providerService.provider());
243 }
244
245 @Test
246 public void events() {
Charles Chan420e7372016-11-17 10:58:17 -0800247 // New host. Expect one additional host description.
Charles Chan5d5e0622015-09-25 13:00:06 -0700248 testProcessor.process(new TestArpPacketContext(DEV1));
Charles Chan420e7372016-11-17 10:58:17 -0800249 assertThat("New host expected", providerService.descriptions.size(), is(1));
alshabib4a179dc2014-10-17 17:17:01 -0700250
Charles Chan420e7372016-11-17 10:58:17 -0800251 // The host moved to new switch. Expect one additional host description.
252 // The second host description should have a different location.
Charles Chan5d5e0622015-09-25 13:00:06 -0700253 testProcessor.process(new TestArpPacketContext(DEV2));
Charles Chan420e7372016-11-17 10:58:17 -0800254 assertThat("Host motion expected", providerService.descriptions.size(), is(2));
255 HostLocation loc1 = providerService.descriptions.get(0).location();
256 HostLocation loc2 = providerService.descriptions.get(1).location();
257 assertNotEquals("Host location should be different", loc1, loc2);
alshabib4a179dc2014-10-17 17:17:01 -0700258
Charles Chan420e7372016-11-17 10:58:17 -0800259 // The host was misheard on a spine. Expect no additional host description.
Charles Chan5d5e0622015-09-25 13:00:06 -0700260 testProcessor.process(new TestArpPacketContext(DEV3));
Charles Chan420e7372016-11-17 10:58:17 -0800261 assertThat("Host misheard on spine switch", providerService.descriptions.size(), is(2));
Charles Chan5d5e0622015-09-25 13:00:06 -0700262
263 providerService.clear();
264
Charles Chan178b0f52017-10-08 23:51:22 -0400265 // New host. Expect two additional host descriptions. One for target IP. One for dest IP.
Jonathan Hartb35540a2015-11-17 09:30:56 -0800266 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan178b0f52017-10-08 23:51:22 -0400267 assertThat("New host expected", providerService.descriptions.size(), is(2));
Charles Chan5d5e0622015-09-25 13:00:06 -0700268
Charles Chan178b0f52017-10-08 23:51:22 -0400269 // The host moved to new switch. Expect two additional host descriptions.
270 // The 3rd and 4th host description should have a different location.
Jonathan Hartb35540a2015-11-17 09:30:56 -0800271 testProcessor.process(new TestNaPacketContext(DEV5));
Charles Chan178b0f52017-10-08 23:51:22 -0400272 assertThat("Host motion expected", providerService.descriptions.size(), is(4));
Charles Chan420e7372016-11-17 10:58:17 -0800273 loc1 = providerService.descriptions.get(0).location();
274 loc2 = providerService.descriptions.get(1).location();
Charles Chan178b0f52017-10-08 23:51:22 -0400275 HostLocation loc3 = providerService.descriptions.get(2).location();
276 HostLocation loc4 = providerService.descriptions.get(3).location();
277 assertEquals("1st and 2nd location should be equal", loc1, loc2);
278 assertEquals("3rd and 4th location should be equal", loc3, loc4);
279 assertNotEquals("1st and 3rd location should be different", loc1, loc3);
Charles Chan5d5e0622015-09-25 13:00:06 -0700280
Charles Chan420e7372016-11-17 10:58:17 -0800281 // The host was misheard on a spine. Expect no additional host description.
Jonathan Hartb35540a2015-11-17 09:30:56 -0800282 testProcessor.process(new TestNaPacketContext(DEV6));
Charles Chan178b0f52017-10-08 23:51:22 -0400283 assertThat("Host misheard on spine switch", providerService.descriptions.size(), is(4));
alshabib4a179dc2014-10-17 17:17:01 -0700284 }
285
Thomas Vachuska33601602014-11-19 03:32:15 -0800286 @Test
287 public void removeHostByDeviceRemove() {
288 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700289 testProcessor.process(new TestArpPacketContext(DEV1));
Jonathan Hartb35540a2015-11-17 09:30:56 -0800290 testProcessor.process(new TestNaPacketContext(DEV4));
Charles Chan5d5e0622015-09-25 13:00:06 -0700291
Thomas Vachuska33601602014-11-19 03:32:15 -0800292 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
293 "m", "h", "s", "n", new ChassisId(0L));
294 deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
Charles Chan888e20a2017-05-01 15:44:23 -0700295 assertEquals("incorrect remove count", 2, providerService.locationRemoveCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700296
297 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
298 "m", "h", "s", "n", new ChassisId(0L));
299 deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
Charles Chan888e20a2017-05-01 15:44:23 -0700300 assertEquals("incorrect remove count", 3, providerService.locationRemoveCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800301 }
302
303 @Test
304 public void removeHostByDeviceOffline() {
305 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700306 testProcessor.process(new TestArpPacketContext(DEV1));
307 testProcessor.process(new TestArpPacketContext(DEV4));
308
Thomas Vachuska33601602014-11-19 03:32:15 -0800309 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
310 "m", "h", "s", "n", new ChassisId(0L));
311 deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
Charles Chan888e20a2017-05-01 15:44:23 -0700312 assertEquals("incorrect remove count", 2, providerService.locationRemoveCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700313
314 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
315 "m", "h", "s", "n", new ChassisId(0L));
316 deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
Charles Chan888e20a2017-05-01 15:44:23 -0700317 assertEquals("incorrect remove count", 3, providerService.locationRemoveCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800318 }
319
320 @Test
321 public void removeHostByDevicePortDown() {
322 provider.modified(CTX_FOR_REMOVE);
Charles Chan5d5e0622015-09-25 13:00:06 -0700323 testProcessor.process(new TestArpPacketContext(DEV1));
324 testProcessor.process(new TestArpPacketContext(DEV4));
325
Thomas Vachuska33601602014-11-19 03:32:15 -0800326 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
327 "m", "h", "s", "n", new ChassisId(0L));
328 deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
Charles Chan5d5e0622015-09-25 13:00:06 -0700329 new DefaultPort(device, portNumber(INPORT), false)));
Charles Chan888e20a2017-05-01 15:44:23 -0700330 assertEquals("incorrect remove count", 1, providerService.locationRemoveCount);
Charles Chan5d5e0622015-09-25 13:00:06 -0700331
332 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
333 "m", "h", "s", "n", new ChassisId(0L));
334 deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
335 new DefaultPort(device, portNumber(INPORT), false)));
Charles Chan888e20a2017-05-01 15:44:23 -0700336 assertEquals("incorrect remove count", 2, providerService.locationRemoveCount);
Thomas Vachuska33601602014-11-19 03:32:15 -0800337 }
338
Charles Chan5d5e0622015-09-25 13:00:06 -0700339 /**
340 * When receiving ARP, updates location and IP.
341 */
342 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300343 public void receiveArp() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700344 testProcessor.process(new TestArpPacketContext(DEV1));
Andrey Komarov2398d962016-09-26 15:11:23 +0300345 assertThat("receiveArp. One host description expected",
Charles Chan420e7372016-11-17 10:58:17 -0800346 providerService.descriptions.size(), is(1));
347 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700348 assertThat(descr.location(), is(LOCATION));
349 assertThat(descr.hwAddress(), is(MAC));
350 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS));
351 assertThat(descr.vlan(), is(VLAN));
352 }
353
354 /**
355 * When receiving IPv4, updates location only.
356 */
357 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300358 public void receiveIpv4() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700359 testProcessor.process(new TestIpv4PacketContext(DEV1));
Andrey Komarov2398d962016-09-26 15:11:23 +0300360 assertThat("receiveIpv4. One host description expected",
Charles Chan420e7372016-11-17 10:58:17 -0800361 providerService.descriptions.size(), is(1));
362 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700363 assertThat(descr.location(), is(LOCATION));
364 assertThat(descr.hwAddress(), is(MAC));
365 assertThat(descr.ipAddress().size(), is(0));
366 assertThat(descr.vlan(), is(VLAN));
367 }
368
369 /**
Charles Chane6067892016-11-17 10:23:46 -0800370 * When receiving DHCP REQUEST, update MAC, location of client.
371 * When receiving DHCP ACK, update MAC, location of server and IP of client.
372 */
373 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300374 public void receiveDhcp() {
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700375 TestUtils.setField(provider, "useDhcp", true);
Charles Chane6067892016-11-17 10:23:46 -0800376 // DHCP Request
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700377 testProcessor.process(new TestDhcpRequestPacketContext(DEV1, VLAN));
Andrey Komarov2398d962016-09-26 15:11:23 +0300378 assertThat("receiveDhcpRequest. One host description expected",
Charles Chane6067892016-11-17 10:23:46 -0800379 providerService.descriptions.size(), is(1));
380 // Should learn the MAC and location of DHCP client
381 HostDescription descr = providerService.descriptions.get(0);
382 assertThat(descr.location(), is(LOCATION));
383 assertThat(descr.hwAddress(), is(MAC));
384 assertThat(descr.ipAddress().size(), is(0));
385 assertThat(descr.vlan(), is(VLAN));
386
387 // DHCP Ack
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700388 testProcessor.process(new TestDhcpAckPacketContext(DEV1));
Andrey Komarov2398d962016-09-26 15:11:23 +0300389 assertThat("receiveDhcpAck. Two additional host descriptions expected",
Yi Tsengcfa637a2017-07-26 17:24:10 -0700390 providerService.descriptions.size(), is(3));
Charles Chane6067892016-11-17 10:23:46 -0800391
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700392 // Should also learn the MAC, location of DHCP server
393 HostDescription descr2 = providerService.descriptions.get(1);
394 assertThat(descr2.location(), is(LOCATION3));
395 assertThat(descr2.hwAddress(), is(MAC3));
396 assertThat(descr2.ipAddress().size(), is(0));
397 assertThat(descr2.vlan(), is(VLAN));
398
Yi Tsengcfa637a2017-07-26 17:24:10 -0700399 // Should update the IP address of the client.
400 HostDescription descr3 = providerService.descriptions.get(2);
401 assertThat(descr3.location(), is(LOCATION));
402 assertThat(descr3.hwAddress(), is(MAC));
403 assertThat(descr3.ipAddress().size(), is(1));
404 IpAddress ip = descr3.ipAddress().iterator().next();
405 assertThat(ip, is(IP_ADDRESS.getIp4Address()));
406 assertThat(descr3.vlan(), is(VLAN));
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700407 }
408
409 /**
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700410 * When receiving DHCPv6 REQUEST, update MAC, location of client.
411 * When receiving DHCPv6 ACK, update MAC, location of server and IP of client.
412 */
413 @Test
414 public void receiveDhcp6() {
415 TestUtils.setField(provider, "useDhcp6", true);
416 // DHCP Request
417 testProcessor.process(new TestDhcp6RequestPacketContext(DEV4, VLAN));
418 assertThat("receiveDhcpRequest. One host description expected",
419 providerService.descriptions.size(), is(1));
420 // Should learn the MAC and location of DHCP client
421 HostDescription descr = providerService.descriptions.get(0);
422 assertThat(descr.location(), is(LOCATION2));
423 assertThat(descr.hwAddress(), is(MAC2));
424 assertThat(descr.ipAddress().size(), is(0));
425 assertThat(descr.vlan(), is(VLAN));
426
427 // DHCP Ack
428 testProcessor.process(new TestDhcp6AckPacketContext(DEV1));
429 assertThat("receiveDhcpAck. Two additional host descriptions expected",
430 providerService.descriptions.size(), is(3));
431
432 // Should also learn the MAC, location of DHCP server
433 HostDescription descr2 = providerService.descriptions.get(1);
434 assertThat(descr2.location(), is(LOCATION3));
435 assertThat(descr2.hwAddress(), is(DHCP6_SERVER_MAC));
436 assertThat(descr2.ipAddress().size(), is(0));
437 assertThat(descr2.vlan(), is(VLAN));
438
439 // Should update the IP address of the DHCP client.
440 HostDescription descr3 = providerService.descriptions.get(2);
441 assertThat(descr3.location(), is(LOCATION2));
442 assertThat(descr3.hwAddress(), is(MAC2));
443 assertThat(descr3.ipAddress().size(), is(1));
444 IpAddress ip = descr3.ipAddress().iterator().next();
445 assertThat(ip, is(IP_ADDRESS2.getIp6Address()));
446 assertThat(descr3.vlan(), is(VLAN));
447 }
448
449 /**
Charles Chan5d5e0622015-09-25 13:00:06 -0700450 * When receiving NeighborAdvertisement, updates location and IP.
Charles Chan178b0f52017-10-08 23:51:22 -0400451 * We should also expect that target IP is learnt.
Charles Chan5d5e0622015-09-25 13:00:06 -0700452 */
453 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300454 public void receiveNa() {
Jonathan Hartb35540a2015-11-17 09:30:56 -0800455 testProcessor.process(new TestNaPacketContext(DEV4));
Andrey Komarov2398d962016-09-26 15:11:23 +0300456 assertThat("receiveNa. One host description expected",
Charles Chan178b0f52017-10-08 23:51:22 -0400457 providerService.descriptions.size(), is(2));
Charles Chan420e7372016-11-17 10:58:17 -0800458 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700459 assertThat(descr.location(), is(LOCATION2));
460 assertThat(descr.hwAddress(), is(MAC2));
Charles Chan178b0f52017-10-08 23:51:22 -0400461 assertTrue(descr.ipAddress().contains(LLIP_ADDRESS2));
462 assertThat(descr.vlan(), is(VLAN));
463
464 descr = providerService.descriptions.get(1);
465 assertThat(descr.location(), is(LOCATION2));
466 assertThat(descr.hwAddress(), is(MAC2));
467 assertTrue(descr.ipAddress().contains(IP_ADDRESS2));
Charles Chan5d5e0622015-09-25 13:00:06 -0700468 assertThat(descr.vlan(), is(VLAN));
469 }
470
471 /**
472 * When receiving NeighborSolicitation, updates location and IP.
473 */
474 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300475 public void receiveNs() {
Jonathan Hartb35540a2015-11-17 09:30:56 -0800476 testProcessor.process(new TestNsPacketContext(DEV4));
Andrey Komarov2398d962016-09-26 15:11:23 +0300477 assertThat("receiveNs. One host description expected",
Charles Chan420e7372016-11-17 10:58:17 -0800478 providerService.descriptions.size(), is(1));
479 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700480 assertThat(descr.location(), is(LOCATION2));
481 assertThat(descr.hwAddress(), is(MAC2));
482 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS2));
483 assertThat(descr.vlan(), is(VLAN));
484 }
485
486 /**
487 * When receiving RouterAdvertisement, ignores it.
488 */
489 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300490 public void receivesRa() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700491 testProcessor.process(new TestRAPacketContext(DEV4));
Andrey Komarov2398d962016-09-26 15:11:23 +0300492 assertThat("receivesRa. No host description expected",
Charles Chan420e7372016-11-17 10:58:17 -0800493 providerService.descriptions.size(), is(0));
Charles Chan5d5e0622015-09-25 13:00:06 -0700494 }
495
496 /**
497 * When receiving RouterSolicitation, ignores it.
498 */
499 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300500 public void receiveRs() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700501 testProcessor.process(new TestRSPacketContext(DEV4));
Andrey Komarov2398d962016-09-26 15:11:23 +0300502 assertThat("receiveRs. No host description expected",
Charles Chan420e7372016-11-17 10:58:17 -0800503 providerService.descriptions.size(), is(0));
Charles Chan5d5e0622015-09-25 13:00:06 -0700504 }
505
506 /**
507 * When receiving Duplicate Address Detection (DAD), ignores it.
508 */
509 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300510 public void receiveDad() {
Jonathan Hartb35540a2015-11-17 09:30:56 -0800511 testProcessor.process(new TestDadPacketContext(DEV4));
Andrey Komarov2398d962016-09-26 15:11:23 +0300512 assertThat("receiveDad. No host description expected",
Charles Chan420e7372016-11-17 10:58:17 -0800513 providerService.descriptions.size(), is(0));
Charles Chan5d5e0622015-09-25 13:00:06 -0700514 }
515
516 /**
517 * When receiving IPv6 multicast packet, ignores it.
518 */
519 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300520 public void receiveIpv6Multicast() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700521 testProcessor.process(new TestIpv6McastPacketContext(DEV4));
Andrey Komarov2398d962016-09-26 15:11:23 +0300522 assertThat("receiveIpv6Multicast. No host description expected",
Charles Chan420e7372016-11-17 10:58:17 -0800523 providerService.descriptions.size(), is(0));
Charles Chan5d5e0622015-09-25 13:00:06 -0700524 }
525
526 /**
527 * When receiving IPv6 unicast packet, updates location only.
528 */
529 @Test
Andrey Komarov2398d962016-09-26 15:11:23 +0300530 public void receiveIpv6Unicast() {
Charles Chan5d5e0622015-09-25 13:00:06 -0700531 testProcessor.process(new TestIpv6PacketContext(DEV4));
Andrey Komarov2398d962016-09-26 15:11:23 +0300532 assertThat("receiveIpv6Unicast. One host description expected",
Charles Chan420e7372016-11-17 10:58:17 -0800533 providerService.descriptions.size(), is(1));
534 HostDescription descr = providerService.descriptions.get(0);
Charles Chan5d5e0622015-09-25 13:00:06 -0700535 assertThat(descr.location(), is(LOCATION2));
536 assertThat(descr.hwAddress(), is(MAC2));
537 assertThat(descr.ipAddress().size(), is(0));
538 assertThat(descr.vlan(), is(VLAN));
539 }
Thomas Vachuska33601602014-11-19 03:32:15 -0800540
alshabib4a179dc2014-10-17 17:17:01 -0700541 @After
542 public void tearDown() {
543 provider.deactivate();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800544 provider.coreService = null;
alshabib4a179dc2014-10-17 17:17:01 -0700545 provider.providerRegistry = null;
alshabib4a179dc2014-10-17 17:17:01 -0700546 }
547
548 private class TestHostRegistry implements HostProviderRegistry {
549
550 @Override
551 public HostProviderService register(HostProvider provider) {
552 providerService = new TestHostProviderService(provider);
553 return providerService;
554 }
555
556 @Override
557 public void unregister(HostProvider provider) {
558 }
559
560 @Override
561 public Set<ProviderId> getProviders() {
562 return null;
563 }
564
565 }
566
567 private class TestHostProviderService
568 extends AbstractProviderService<HostProvider>
569 implements HostProviderService {
570
Charles Chan420e7372016-11-17 10:58:17 -0800571 List<HostDescription> descriptions = Lists.newArrayList();
Charles Chan888e20a2017-05-01 15:44:23 -0700572 int hostRemoveCount;
573 int ipRemoveCount;
574 int locationRemoveCount;
alshabib4a179dc2014-10-17 17:17:01 -0700575
Charles Chan5d5e0622015-09-25 13:00:06 -0700576 public void clear() {
Charles Chan420e7372016-11-17 10:58:17 -0800577 descriptions.clear();
Charles Chan888e20a2017-05-01 15:44:23 -0700578 hostRemoveCount = 0;
579 ipRemoveCount = 0;
580 locationRemoveCount = 0;
Charles Chan5d5e0622015-09-25 13:00:06 -0700581 }
582
alshabib4a179dc2014-10-17 17:17:01 -0700583 protected TestHostProviderService(HostProvider provider) {
584 super(provider);
585 }
586
587 @Override
Brian O'Connorf107bd72015-09-21 15:31:03 -0700588 public void hostDetected(HostId hostId, HostDescription hostDescription, boolean replaceIps) {
Charles Chan420e7372016-11-17 10:58:17 -0800589 descriptions.add(hostDescription);
alshabib4a179dc2014-10-17 17:17:01 -0700590 }
591
592 @Override
593 public void hostVanished(HostId hostId) {
Charles Chan888e20a2017-05-01 15:44:23 -0700594 hostRemoveCount++;
alshabib4a179dc2014-10-17 17:17:01 -0700595 }
596
samanwita palc40e5ed2015-09-24 11:01:51 -0700597 @Override
598 public void removeIpFromHost(HostId hostId, IpAddress ipAddress) {
Charles Chan888e20a2017-05-01 15:44:23 -0700599 ipRemoveCount++;
600 }
601
602 @Override
603 public void removeLocationFromHost(HostId hostId, HostLocation location) {
604 locationRemoveCount++;
samanwita palc40e5ed2015-09-24 11:01:51 -0700605 }
606
alshabib4a179dc2014-10-17 17:17:01 -0700607 }
608
Thomas Vachuska27bee092015-06-23 19:03:10 -0700609 private class TestPacketService extends PacketServiceAdapter {
alshabib4a179dc2014-10-17 17:17:01 -0700610 @Override
611 public void addProcessor(PacketProcessor processor, int priority) {
612 testProcessor = processor;
613 }
alshabib4a179dc2014-10-17 17:17:01 -0700614 }
615
alshabib4a179dc2014-10-17 17:17:01 -0700616 private class TestTopologyService extends TopologyServiceAdapter {
617 @Override
618 public boolean isInfrastructure(Topology topology,
619 ConnectPoint connectPoint) {
620 //simulate DPID3 as an infrastructure switch
Charles Chan5d5e0622015-09-25 13:00:06 -0700621 if ((connectPoint.deviceId()).equals(deviceId(DEV3)) ||
622 connectPoint.deviceId().equals(deviceId(DEV6))) {
alshabib4a179dc2014-10-17 17:17:01 -0700623 return true;
624 }
625 return false;
626 }
627 }
628
Charles Chan5d5e0622015-09-25 13:00:06 -0700629 /**
630 * Generates ARP packet.
631 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300632 private class TestArpPacketContext extends PacketContextAdapter {
alshabib4a179dc2014-10-17 17:17:01 -0700633 private final String deviceId;
634
Charles Chan5d5e0622015-09-25 13:00:06 -0700635 public TestArpPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300636 super(0, null, null, false);
alshabib4a179dc2014-10-17 17:17:01 -0700637 this.deviceId = deviceId;
638 }
639
640 @Override
alshabib4a179dc2014-10-17 17:17:01 -0700641 public InboundPacket inPacket() {
642 ARP arp = new ARP();
643 arp.setSenderProtocolAddress(IP)
644 .setSenderHardwareAddress(MAC.toBytes())
645 .setTargetHardwareAddress(BCMAC.toBytes())
646 .setTargetProtocolAddress(IP);
647
648 Ethernet eth = new Ethernet();
649 eth.setEtherType(Ethernet.TYPE_ARP)
650 .setVlanID(VLAN.toShort())
651 .setSourceMACAddress(MAC.toBytes())
Yuta HIGUCHI3e848a82014-11-02 20:19:42 -0800652 .setDestinationMACAddress(BCMAC)
alshabib4a179dc2014-10-17 17:17:01 -0700653 .setPayload(arp);
Thomas Vachuska33601602014-11-19 03:32:15 -0800654 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
655 portNumber(INPORT));
alshabib4a179dc2014-10-17 17:17:01 -0700656 return new DefaultInboundPacket(receivedFrom, eth,
657 ByteBuffer.wrap(eth.serialize()));
658 }
alshabib4a179dc2014-10-17 17:17:01 -0700659 }
Thomas Vachuska33601602014-11-19 03:32:15 -0800660
Charles Chan5d5e0622015-09-25 13:00:06 -0700661 /**
Charles Chane6067892016-11-17 10:23:46 -0800662 * Generates IPv4 Unicast packet.
Charles Chan5d5e0622015-09-25 13:00:06 -0700663 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300664 private class TestIpv4PacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -0700665 private final String deviceId;
666
667 public TestIpv4PacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300668 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -0700669 this.deviceId = deviceId;
670 }
671
672 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -0700673 public InboundPacket inPacket() {
674 IPv4 ipv4 = new IPv4();
675 ipv4.setDestinationAddress("10.0.0.1");
676 ipv4.setSourceAddress(IP_ADDRESS.toString());
677 Ethernet eth = new Ethernet();
678 eth.setEtherType(Ethernet.TYPE_IPV4)
679 .setVlanID(VLAN.toShort())
680 .setSourceMACAddress(MAC)
681 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
682 .setPayload(ipv4);
683 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
684 portNumber(INPORT));
685 return new DefaultInboundPacket(receivedFrom, eth,
686 ByteBuffer.wrap(eth.serialize()));
687 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700688 }
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700689
Charles Chane6067892016-11-17 10:23:46 -0800690 /**
691 * Generates DHCP REQUEST packet.
692 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300693 private class TestDhcpRequestPacketContext extends PacketContextAdapter {
Charles Chane6067892016-11-17 10:23:46 -0800694 private final String deviceId;
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700695 private final VlanId vlanId;
Charles Chane6067892016-11-17 10:23:46 -0800696
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700697 public TestDhcpRequestPacketContext(String deviceId, VlanId vlanId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300698 super(0, null, null, false);
Charles Chane6067892016-11-17 10:23:46 -0800699 this.deviceId = deviceId;
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700700 this.vlanId = vlanId;
Charles Chane6067892016-11-17 10:23:46 -0800701 }
702
703 @Override
Charles Chane6067892016-11-17 10:23:46 -0800704 public InboundPacket inPacket() {
705 byte[] dhcpMsgType = new byte[1];
Yi Tsengc7403c22017-06-19 16:23:22 -0700706 dhcpMsgType[0] = (byte) DHCP.MsgType.DHCPREQUEST.getValue();
Charles Chane6067892016-11-17 10:23:46 -0800707
Yi Tsengc7403c22017-06-19 16:23:22 -0700708 DhcpOption dhcpOption = new DhcpOption();
Charles Chane6067892016-11-17 10:23:46 -0800709 dhcpOption.setCode(DHCP.DHCPOptionCode.OptionCode_MessageType.getValue());
710 dhcpOption.setData(dhcpMsgType);
711 dhcpOption.setLength((byte) 1);
712 DHCP dhcp = new DHCP();
713 dhcp.setOptions(Collections.singletonList(dhcpOption));
714 dhcp.setClientHardwareAddress(MAC.toBytes());
715 UDP udp = new UDP();
716 udp.setPayload(dhcp);
717 udp.setSourcePort(UDP.DHCP_CLIENT_PORT);
718 udp.setDestinationPort(UDP.DHCP_SERVER_PORT);
719 IPv4 ipv4 = new IPv4();
720 ipv4.setPayload(udp);
721 ipv4.setDestinationAddress(IP_ADDRESS3.toString());
722 ipv4.setSourceAddress(IP_ADDRESS.toString());
723 Ethernet eth = new Ethernet();
724 eth.setEtherType(Ethernet.TYPE_IPV4)
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700725 .setVlanID(this.vlanId.toShort())
Charles Chane6067892016-11-17 10:23:46 -0800726 .setSourceMACAddress(MAC)
727 .setDestinationMACAddress(MAC3)
728 .setPayload(ipv4);
729 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
730 portNumber(INPORT));
731 return new DefaultInboundPacket(receivedFrom, eth,
732 ByteBuffer.wrap(eth.serialize()));
733 }
Charles Chane6067892016-11-17 10:23:46 -0800734 }
735
736 /**
737 * Generates DHCP ACK packet.
738 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300739 private class TestDhcpAckPacketContext extends PacketContextAdapter {
Charles Chane6067892016-11-17 10:23:46 -0800740 private final String deviceId;
741
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700742 public TestDhcpAckPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300743 super(0, null, null, false);
Charles Chane6067892016-11-17 10:23:46 -0800744 this.deviceId = deviceId;
745 }
746
747 @Override
Charles Chane6067892016-11-17 10:23:46 -0800748 public InboundPacket inPacket() {
749 byte[] dhcpMsgType = new byte[1];
Yi Tsengc7403c22017-06-19 16:23:22 -0700750 dhcpMsgType[0] = (byte) DHCP.MsgType.DHCPACK.getValue();
Charles Chane6067892016-11-17 10:23:46 -0800751
Yi Tsengc7403c22017-06-19 16:23:22 -0700752 DhcpOption dhcpOption = new DhcpOption();
Charles Chane6067892016-11-17 10:23:46 -0800753 dhcpOption.setCode(DHCP.DHCPOptionCode.OptionCode_MessageType.getValue());
754 dhcpOption.setData(dhcpMsgType);
755 dhcpOption.setLength((byte) 1);
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700756
Charles Chane6067892016-11-17 10:23:46 -0800757 DHCP dhcp = new DHCP();
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700758 dhcp.setOptions(ImmutableList.of(dhcpOption));
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700759
Charles Chane6067892016-11-17 10:23:46 -0800760 dhcp.setClientHardwareAddress(MAC.toBytes());
761 dhcp.setYourIPAddress(IP_ADDRESS.getIp4Address().toInt());
Yi Tseng7a38f9a2017-06-09 14:36:40 -0700762
Charles Chane6067892016-11-17 10:23:46 -0800763 UDP udp = new UDP();
764 udp.setPayload(dhcp);
765 udp.setSourcePort(UDP.DHCP_SERVER_PORT);
766 udp.setDestinationPort(UDP.DHCP_CLIENT_PORT);
767 IPv4 ipv4 = new IPv4();
768 ipv4.setPayload(udp);
769 ipv4.setDestinationAddress(IP_ADDRESS.toString());
770 ipv4.setSourceAddress(IP_ADDRESS3.toString());
771 Ethernet eth = new Ethernet();
772 eth.setEtherType(Ethernet.TYPE_IPV4)
773 .setVlanID(VLAN.toShort())
774 .setSourceMACAddress(MAC3)
775 .setDestinationMACAddress(MAC)
776 .setPayload(ipv4);
777 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
778 portNumber(INPORT2));
779 return new DefaultInboundPacket(receivedFrom, eth,
780 ByteBuffer.wrap(eth.serialize()));
781 }
Charles Chane6067892016-11-17 10:23:46 -0800782 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700783
784 /**
Yi Tsengfcf5dce2017-07-26 14:30:41 -0700785 * Generates DHCPv6 REQUEST packet.
786 */
787 private class TestDhcp6RequestPacketContext extends PacketContextAdapter {
788 private final String deviceId;
789 private final VlanId vlanId;
790
791 public TestDhcp6RequestPacketContext(String deviceId, VlanId vlanId) {
792 super(0, null, null, false);
793 this.deviceId = deviceId;
794 this.vlanId = vlanId;
795 }
796
797 @Override
798 public InboundPacket inPacket() {
799
800 DHCP6 dhcp6 = new DHCP6();
801 dhcp6.setMsgType(DHCP6.MsgType.REQUEST.value());
802 List<Dhcp6Option> options = Lists.newArrayList();
803
804 // IA address
805 Dhcp6IaAddressOption iaAddressOption = new Dhcp6IaAddressOption();
806 iaAddressOption.setIp6Address(IP_ADDRESS2.getIp6Address());
807
808 // IA NA
809 Dhcp6IaNaOption iaNaOption = new Dhcp6IaNaOption();
810 iaNaOption.setOptions(ImmutableList.of(iaAddressOption));
811 options.add(iaNaOption);
812
813 dhcp6.setOptions(options);
814
815 UDP udp = new UDP();
816 udp.setPayload(dhcp6);
817 udp.setSourcePort(UDP.DHCP_V6_CLIENT_PORT);
818 udp.setDestinationPort(UDP.DHCP_V6_SERVER_PORT);
819 IPv6 ipv6 = new IPv6();
820 ipv6.setPayload(udp);
821 ipv6.setDestinationAddress(Ip6Address.ZERO.toOctets());
822 ipv6.setSourceAddress(Ip6Address.ZERO.toOctets());
823 ipv6.setNextHeader(IPv6.PROTOCOL_UDP);
824 Ethernet eth = new Ethernet();
825 eth.setEtherType(Ethernet.TYPE_IPV6)
826 .setVlanID(this.vlanId.toShort())
827 .setSourceMACAddress(MAC2)
828 .setDestinationMACAddress(DHCP6_SERVER_MAC)
829 .setPayload(ipv6);
830 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
831 portNumber(INPORT));
832 return new DefaultInboundPacket(receivedFrom, eth,
833 ByteBuffer.wrap(eth.serialize()));
834 }
835 }
836
837 /**
838 * Generates DHCPv6 ACK packet.
839 */
840 private class TestDhcp6AckPacketContext extends PacketContextAdapter {
841 private final String deviceId;
842
843 public TestDhcp6AckPacketContext(String deviceId) {
844 super(0, null, null, false);
845 this.deviceId = deviceId;
846 }
847
848 @Override
849 public InboundPacket inPacket() {
850 DHCP6 dhcp6 = new DHCP6();
851 dhcp6.setMsgType(DHCP6.MsgType.REPLY.value());
852 List<Dhcp6Option> options = Lists.newArrayList();
853
854 // IA address
855 Dhcp6IaAddressOption iaAddressOption = new Dhcp6IaAddressOption();
856 iaAddressOption.setIp6Address(IP_ADDRESS2.getIp6Address());
857
858 // IA NA
859 Dhcp6IaNaOption iaNaOption = new Dhcp6IaNaOption();
860 iaNaOption.setOptions(ImmutableList.of(iaAddressOption));
861 options.add(iaNaOption);
862
863 // Client ID
864 Dhcp6Duid duid = new Dhcp6Duid();
865 duid.setDuidType(Dhcp6Duid.DuidType.DUID_LLT);
866 duid.setHardwareType((short) 1);
867 duid.setDuidTime(0);
868 duid.setLinkLayerAddress(MAC2.toBytes());
869 Dhcp6ClientIdOption clientIdOption = new Dhcp6ClientIdOption();
870 clientIdOption.setDuid(duid);
871 options.add(clientIdOption);
872 dhcp6.setOptions(options);
873
874 UDP udp = new UDP();
875 udp.setPayload(dhcp6);
876 udp.setSourcePort(UDP.DHCP_V6_CLIENT_PORT);
877 udp.setDestinationPort(UDP.DHCP_V6_SERVER_PORT);
878 IPv6 ipv6 = new IPv6();
879 ipv6.setPayload(udp);
880 ipv6.setDestinationAddress(Ip6Address.ZERO.toOctets());
881 ipv6.setSourceAddress(Ip6Address.ZERO.toOctets());
882 ipv6.setNextHeader(IPv6.PROTOCOL_UDP);
883 Ethernet eth = new Ethernet();
884 eth.setEtherType(Ethernet.TYPE_IPV6)
885 .setVlanID(VLAN.toShort())
886 .setSourceMACAddress(DHCP6_SERVER_MAC)
887 .setDestinationMACAddress(MAC2)
888 .setPayload(ipv6);
889 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
890 portNumber(INPORT2));
891 return new DefaultInboundPacket(receivedFrom, eth,
892 ByteBuffer.wrap(eth.serialize()));
893 }
894 }
895
896 /**
Charles Chan5d5e0622015-09-25 13:00:06 -0700897 * Generates NeighborAdvertisement packet.
898 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300899 private class TestNaPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -0700900 private final String deviceId;
901
Jonathan Hartb35540a2015-11-17 09:30:56 -0800902 public TestNaPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300903 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -0700904 this.deviceId = deviceId;
905 }
906
907 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -0700908 public InboundPacket inPacket() {
909 NeighborAdvertisement na = new NeighborAdvertisement();
Charles Chan178b0f52017-10-08 23:51:22 -0400910 na.setTargetAddress(IP2);
Charles Chan5d5e0622015-09-25 13:00:06 -0700911 ICMP6 icmp6 = new ICMP6();
912 icmp6.setPayload(na);
913 IPv6 ipv6 = new IPv6();
914 ipv6.setPayload(icmp6);
915 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
Charles Chan178b0f52017-10-08 23:51:22 -0400916 ipv6.setSourceAddress(LLIP2);
Charles Chan5d5e0622015-09-25 13:00:06 -0700917 Ethernet eth = new Ethernet();
918 eth.setEtherType(Ethernet.TYPE_IPV6)
919 .setVlanID(VLAN.toShort())
920 .setSourceMACAddress(MAC2.toBytes())
921 .setDestinationMACAddress(BCMAC2)
922 .setPayload(ipv6);
923 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
924 portNumber(INPORT));
925 return new DefaultInboundPacket(receivedFrom, eth,
926 ByteBuffer.wrap(eth.serialize()));
927 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700928 }
929
930 /**
931 * Generates NeighborSolicitation packet.
932 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300933 private class TestNsPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -0700934 private final String deviceId;
935
Jonathan Hartb35540a2015-11-17 09:30:56 -0800936 public TestNsPacketContext(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 NeighborSolicitation ns = new NeighborSolicitation();
944 ICMP6 icmp6 = new ICMP6();
945 icmp6.setPayload(ns);
946 IPv6 ipv6 = new IPv6();
947 ipv6.setPayload(icmp6);
948 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1:ff00:0000").toOctets());
949 ipv6.setSourceAddress(IP2);
950 Ethernet eth = new Ethernet();
951 eth.setEtherType(Ethernet.TYPE_IPV6)
952 .setVlanID(VLAN.toShort())
953 .setSourceMACAddress(MAC2.toBytes())
954 .setDestinationMACAddress(BCMAC2)
955 .setPayload(ipv6);
956 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
957 portNumber(INPORT));
958 return new DefaultInboundPacket(receivedFrom, eth,
959 ByteBuffer.wrap(eth.serialize()));
960 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700961 }
962
963 /**
964 * Generates Duplicate Address Detection packet.
965 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300966 private class TestDadPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -0700967 private final String deviceId;
968
Jonathan Hartb35540a2015-11-17 09:30:56 -0800969 public TestDadPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +0300970 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -0700971 this.deviceId = deviceId;
972 }
973
974 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -0700975 public InboundPacket inPacket() {
976 NeighborSolicitation ns = new NeighborSolicitation();
977 ICMP6 icmp6 = new ICMP6();
978 icmp6.setPayload(ns);
979 IPv6 ipv6 = new IPv6();
980 ipv6.setPayload(icmp6);
981 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
982 ipv6.setSourceAddress(Ip6Address.valueOf("::").toOctets());
983 Ethernet eth = new Ethernet();
984 eth.setEtherType(Ethernet.TYPE_IPV6)
985 .setVlanID(VLAN.toShort())
986 .setSourceMACAddress(MAC2.toBytes())
987 .setDestinationMACAddress(BCMAC2)
988 .setPayload(ipv6);
989 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
990 portNumber(INPORT));
991 return new DefaultInboundPacket(receivedFrom, eth,
992 ByteBuffer.wrap(eth.serialize()));
993 }
Charles Chan5d5e0622015-09-25 13:00:06 -0700994 }
995
996 /**
997 * Generates Router Solicitation packet.
998 */
Andrey Komarov2398d962016-09-26 15:11:23 +0300999 private class TestRSPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -07001000 private final String deviceId;
1001
1002 public TestRSPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +03001003 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -07001004 this.deviceId = deviceId;
1005 }
1006
1007 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -07001008 public InboundPacket inPacket() {
1009 RouterSolicitation ns = new RouterSolicitation();
1010 ICMP6 icmp6 = new ICMP6();
1011 icmp6.setPayload(ns);
1012 IPv6 ipv6 = new IPv6();
1013 ipv6.setPayload(icmp6);
1014 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::2").toOctets());
1015 ipv6.setSourceAddress(Ip6Address.valueOf("::").toOctets());
1016 Ethernet eth = new Ethernet();
1017 eth.setEtherType(Ethernet.TYPE_IPV6)
1018 .setVlanID(VLAN.toShort())
1019 .setSourceMACAddress(MAC2.toBytes())
1020 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:02"))
1021 .setPayload(ipv6);
1022 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1023 portNumber(INPORT));
1024 return new DefaultInboundPacket(receivedFrom, eth,
1025 ByteBuffer.wrap(eth.serialize()));
1026 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001027 }
1028
1029 /**
1030 * Generates Router Advertisement packet.
1031 */
Andrey Komarov2398d962016-09-26 15:11:23 +03001032 private class TestRAPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -07001033 private final String deviceId;
1034
1035 public TestRAPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +03001036 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -07001037 this.deviceId = deviceId;
1038 }
1039
1040 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -07001041 public InboundPacket inPacket() {
1042 RouterAdvertisement ns = new RouterAdvertisement();
1043 ICMP6 icmp6 = new ICMP6();
1044 icmp6.setPayload(ns);
1045 IPv6 ipv6 = new IPv6();
1046 ipv6.setPayload(icmp6);
1047 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
1048 ipv6.setSourceAddress(IP2);
1049 Ethernet eth = new Ethernet();
1050 eth.setEtherType(Ethernet.TYPE_IPV6)
1051 .setVlanID(VLAN.toShort())
1052 .setSourceMACAddress(MAC2.toBytes())
1053 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
1054 .setPayload(ipv6);
1055 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1056 portNumber(INPORT));
1057 return new DefaultInboundPacket(receivedFrom, eth,
1058 ByteBuffer.wrap(eth.serialize()));
1059 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001060 }
1061
1062 /**
1063 * Generates IPv6 Multicast packet.
1064 */
Andrey Komarov2398d962016-09-26 15:11:23 +03001065 private class TestIpv6McastPacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -07001066 private final String deviceId;
1067
1068 public TestIpv6McastPacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +03001069 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -07001070 this.deviceId = deviceId;
1071 }
1072
1073 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -07001074 public InboundPacket inPacket() {
1075 IPv6 ipv6 = new IPv6();
1076 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
1077 ipv6.setSourceAddress(IP2);
1078 Ethernet eth = new Ethernet();
1079 eth.setEtherType(Ethernet.TYPE_IPV6)
1080 .setVlanID(VLAN.toShort())
1081 .setSourceMACAddress(MAC2.toBytes())
1082 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
1083 .setPayload(ipv6);
1084 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1085 portNumber(INPORT));
1086 return new DefaultInboundPacket(receivedFrom, eth,
1087 ByteBuffer.wrap(eth.serialize()));
1088 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001089 }
1090
1091 /**
1092 * Generates IPv6 Unicast packet.
1093 */
Andrey Komarov2398d962016-09-26 15:11:23 +03001094 private class TestIpv6PacketContext extends PacketContextAdapter {
Charles Chan5d5e0622015-09-25 13:00:06 -07001095 private final String deviceId;
1096
1097 public TestIpv6PacketContext(String deviceId) {
Andrey Komarov2398d962016-09-26 15:11:23 +03001098 super(0, null, null, false);
Charles Chan5d5e0622015-09-25 13:00:06 -07001099 this.deviceId = deviceId;
1100 }
1101
1102 @Override
Charles Chan5d5e0622015-09-25 13:00:06 -07001103 public InboundPacket inPacket() {
1104 IPv6 ipv6 = new IPv6();
1105 ipv6.setDestinationAddress(Ip6Address.valueOf("1000::1").toOctets());
1106 ipv6.setSourceAddress(IP2);
1107 Ethernet eth = new Ethernet();
1108 eth.setEtherType(Ethernet.TYPE_IPV6)
1109 .setVlanID(VLAN.toShort())
1110 .setSourceMACAddress(MAC2)
1111 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
1112 .setPayload(ipv6);
1113 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
1114 portNumber(INPORT));
1115 return new DefaultInboundPacket(receivedFrom, eth,
1116 ByteBuffer.wrap(eth.serialize()));
1117 }
Charles Chan5d5e0622015-09-25 13:00:06 -07001118 }
1119
Thomas Vachuska33601602014-11-19 03:32:15 -08001120 private class TestDeviceService extends DeviceServiceAdapter {
1121 private DeviceListener listener;
1122
1123 @Override
1124 public void addListener(DeviceListener listener) {
1125 this.listener = listener;
1126 }
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -08001127
1128 @Override
1129 public Iterable<Device> getDevices() {
1130 return Collections.emptyList();
1131 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001132 }
1133
1134 private class TestHostService extends HostServiceAdapter {
1135 @Override
1136 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
Charles Chan5d5e0622015-09-25 13:00:06 -07001137 ConnectPoint cp1 = new ConnectPoint(deviceId(DEV1), portNumber(INPORT));
1138 ConnectPoint cp2 = new ConnectPoint(deviceId(DEV4), portNumber(INPORT));
Charles Chane6067892016-11-17 10:23:46 -08001139 ConnectPoint cp3 = new ConnectPoint(deviceId(DEV1), portNumber(INPORT2));
Charles Chan5d5e0622015-09-25 13:00:06 -07001140 if (connectPoint.equals(cp1)) {
1141 return ImmutableSet.of(HOST);
1142 } else if (connectPoint.equals(cp2)) {
1143 return ImmutableSet.of(HOST2);
Charles Chane6067892016-11-17 10:23:46 -08001144 } else if (connectPoint.equals(cp3)) {
1145 return ImmutableSet.of(HOST3);
Charles Chan5d5e0622015-09-25 13:00:06 -07001146 } else {
1147 return ImmutableSet.of();
1148 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001149 }
1150
1151 @Override
1152 public Set<Host> getConnectedHosts(DeviceId deviceId) {
Charles Chan5d5e0622015-09-25 13:00:06 -07001153 if (deviceId.equals(deviceId(DEV1))) {
Charles Chane6067892016-11-17 10:23:46 -08001154 return ImmutableSet.of(HOST, HOST3);
Charles Chan5d5e0622015-09-25 13:00:06 -07001155 } else if (deviceId.equals(deviceId(DEV4))) {
1156 return ImmutableSet.of(HOST2);
1157 } else {
1158 return ImmutableSet.of();
1159 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001160 }
1161
Charles Chane6067892016-11-17 10:23:46 -08001162 @Override
1163 public Host getHost(HostId hostId) {
1164 if (hostId.equals(HostId.hostId(MAC, VLAN))) {
1165 return HOST;
1166 } else if (hostId.equals(HostId.hostId(MAC2, VLAN))) {
1167 return HOST2;
1168 } else if (hostId.equals(HostId.hostId(MAC3, VLAN))) {
1169 return HOST3;
Yi Tseng7a38f9a2017-06-09 14:36:40 -07001170 } else if (hostId.equals(HostId.hostId(MAC, VLAN_100))) {
1171 return HOST_VLAN_100;
Charles Chane6067892016-11-17 10:23:46 -08001172 }
1173 return null;
1174 }
Yi Tseng7a38f9a2017-06-09 14:36:40 -07001175 }
Charles Chane6067892016-11-17 10:23:46 -08001176
Yi Tseng7a38f9a2017-06-09 14:36:40 -07001177 private class TestInterfaceService implements InterfaceService {
1178 @Override
1179 public Set<Interface> getInterfaces() {
1180 return null;
1181 }
1182
1183 @Override
1184 public Interface getInterfaceByName(ConnectPoint connectPoint, String name) {
1185 return null;
1186 }
1187
1188 @Override
1189 public Set<Interface> getInterfacesByPort(ConnectPoint port) {
1190 return null;
1191 }
1192
Saurav Das9a554292018-04-27 18:42:30 -07001193 @Override
Yi Tseng7a38f9a2017-06-09 14:36:40 -07001194 public Set<Interface> getInterfacesByIp(IpAddress ip) {
1195 if (ip.equals(GW_IFACE_ADDR.ipAddress())) {
1196 return ImmutableSet.of(GW_IFACE);
1197 } else {
1198 return ImmutableSet.of();
1199 }
1200 }
1201
1202 @Override
1203 public Set<Interface> getInterfacesByVlan(VlanId vlan) {
1204 return null;
1205 }
1206
1207 @Override
1208 public Interface getMatchingInterface(IpAddress ip) {
1209 return null;
1210 }
1211
1212 @Override
1213 public Set<Interface> getMatchingInterfaces(IpAddress ip) {
1214 return null;
1215 }
1216
1217 @Override
1218 public void addListener(InterfaceListener listener) {
1219
1220 }
1221
1222 @Override
1223 public void removeListener(InterfaceListener listener) {
1224
1225 }
Saurav Das9a554292018-04-27 18:42:30 -07001226
1227 @Override
1228 public boolean isConfigured(ConnectPoint connectPoint) {
1229 return false;
1230 }
Thomas Vachuska33601602014-11-19 03:32:15 -08001231 }
alshabib4a179dc2014-10-17 17:17:01 -07001232}