2 * Copyright 2014-2015 Open Networking Laboratory
4 * 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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org.onosproject.provider.host.impl;
18 import com.google.common.collect.ImmutableSet;
19 import org.junit.After;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.onlab.osgi.ComponentContextAdapter;
23 import org.onlab.packet.ARP;
24 import org.onlab.packet.ChassisId;
25 import org.onlab.packet.Ethernet;
26 import org.onlab.packet.ICMP6;
27 import org.onlab.packet.IPv4;
28 import org.onlab.packet.IPv6;
29 import org.onlab.packet.Ip6Address;
30 import org.onlab.packet.IpAddress;
31 import org.onlab.packet.MacAddress;
32 import org.onlab.packet.VlanId;
33 import org.onlab.packet.ndp.NeighborAdvertisement;
34 import org.onlab.packet.ndp.NeighborSolicitation;
35 import org.onlab.packet.ndp.RouterAdvertisement;
36 import org.onlab.packet.ndp.RouterSolicitation;
37 import org.onosproject.cfg.ComponentConfigAdapter;
38 import org.onosproject.core.ApplicationId;
39 import org.onosproject.core.CoreService;
40 import org.onosproject.core.DefaultApplicationId;
41 import org.onosproject.net.ConnectPoint;
42 import org.onosproject.net.DefaultDevice;
43 import org.onosproject.net.DefaultHost;
44 import org.onosproject.net.DefaultPort;
45 import org.onosproject.net.Device;
46 import org.onosproject.net.DeviceId;
47 import org.onosproject.net.Host;
48 import org.onosproject.net.HostId;
49 import org.onosproject.net.HostLocation;
50 import org.onosproject.net.device.DeviceEvent;
51 import org.onosproject.net.device.DeviceListener;
52 import org.onosproject.net.device.DeviceServiceAdapter;
53 import org.onosproject.net.flow.TrafficTreatment;
54 import org.onosproject.net.host.HostDescription;
55 import org.onosproject.net.host.HostProvider;
56 import org.onosproject.net.host.HostProviderRegistry;
57 import org.onosproject.net.host.HostProviderService;
58 import org.onosproject.net.host.HostServiceAdapter;
59 import org.onosproject.net.packet.DefaultInboundPacket;
60 import org.onosproject.net.packet.InboundPacket;
61 import org.onosproject.net.packet.OutboundPacket;
62 import org.onosproject.net.packet.PacketContext;
63 import org.onosproject.net.packet.PacketProcessor;
64 import org.onosproject.net.packet.PacketServiceAdapter;
65 import org.onosproject.net.provider.AbstractProviderService;
66 import org.onosproject.net.provider.ProviderId;
67 import org.onosproject.net.topology.Topology;
68 import org.onosproject.net.topology.TopologyServiceAdapter;
70 import java.nio.ByteBuffer;
71 import java.util.Collections;
72 import java.util.Dictionary;
73 import java.util.Hashtable;
76 import static org.easymock.EasyMock.*;
77 import static org.hamcrest.Matchers.is;
78 import static org.junit.Assert.*;
79 import static org.onlab.packet.VlanId.vlanId;
80 import static org.onosproject.net.Device.Type.SWITCH;
81 import static org.onosproject.net.DeviceId.deviceId;
82 import static org.onosproject.net.HostId.hostId;
83 import static org.onosproject.net.PortNumber.portNumber;
84 import static org.onosproject.net.device.DeviceEvent.Type.*;
86 public class HostLocationProviderTest {
87 private static final Integer INPORT = 10;
88 private static final String DEV1 = "of:1";
89 private static final String DEV2 = "of:2";
90 private static final String DEV3 = "of:3";
91 private static final String DEV4 = "of:4";
92 private static final String DEV5 = "of:5";
93 private static final String DEV6 = "of:6";
95 private static final VlanId VLAN = vlanId();
98 private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01");
99 private static final MacAddress BCMAC = MacAddress.valueOf("ff:ff:ff:ff:ff:ff");
100 private static final byte[] IP = new byte[]{10, 0, 0, 1};
101 private static final IpAddress IP_ADDRESS =
102 IpAddress.valueOf(IpAddress.Version.INET, IP);
103 private static final HostLocation LOCATION =
104 new HostLocation(deviceId(DEV1), portNumber(INPORT), 0L);
105 private static final DefaultHost HOST =
106 new DefaultHost(ProviderId.NONE, hostId(MAC), MAC,
107 vlanId(VlanId.UNTAGGED), LOCATION,
108 ImmutableSet.of(IP_ADDRESS));
111 private static final MacAddress MAC2 = MacAddress.valueOf("00:00:22:00:00:02");
112 private static final MacAddress BCMAC2 = MacAddress.valueOf("33:33:00:00:00:01");
113 private static final byte[] IP2 = Ip6Address.valueOf("1000::1").toOctets();
114 private static final IpAddress IP_ADDRESS2 =
115 IpAddress.valueOf(IpAddress.Version.INET6, IP2);
116 private static final HostLocation LOCATION2 =
117 new HostLocation(deviceId(DEV4), portNumber(INPORT), 0L);
118 private static final DefaultHost HOST2 =
119 new DefaultHost(ProviderId.NONE, hostId(MAC2), MAC2,
120 vlanId(VlanId.UNTAGGED), LOCATION2,
121 ImmutableSet.of(IP_ADDRESS2));
123 private static final ComponentContextAdapter CTX_FOR_REMOVE =
124 new ComponentContextAdapter() {
126 public Dictionary getProperties() {
127 Hashtable<String, String> props = new Hashtable<>();
128 props.put("hostRemovalEnabled", "true");
133 public static final ComponentContextAdapter CTX_FOR_NO_REMOVE =
134 new ComponentContextAdapter() {
136 public Dictionary getProperties() {
137 return new Hashtable();
141 private final HostLocationProvider provider = new HostLocationProvider();
142 private final TestHostRegistry hostRegistry = new TestHostRegistry();
143 private final TestTopologyService topoService = new TestTopologyService();
144 private final TestDeviceService deviceService = new TestDeviceService();
145 private final TestHostService hostService = new TestHostService();
146 private final TestPacketService packetService = new TestPacketService();
148 private PacketProcessor testProcessor;
149 private CoreService coreService;
150 private TestHostProviderService providerService;
152 private ApplicationId appId =
153 new DefaultApplicationId(100, "org.onosproject.provider.host");
156 public void setUp() {
158 coreService = createMock(CoreService.class);
159 expect(coreService.registerApplication(appId.name()))
160 .andReturn(appId).anyTimes();
163 provider.cfgService = new ComponentConfigAdapter();
164 provider.coreService = coreService;
166 provider.providerRegistry = hostRegistry;
167 provider.topologyService = topoService;
168 provider.packetService = packetService;
169 provider.deviceService = deviceService;
170 provider.hostService = hostService;
172 provider.activate(CTX_FOR_NO_REMOVE);
176 public void basics() {
177 assertNotNull("registration expected", providerService);
178 assertEquals("incorrect provider", provider, providerService.provider());
182 public void events() {
184 testProcessor.process(new TestArpPacketContext(DEV1));
185 assertNotNull("new host expected", providerService.added);
186 assertNull("host motion unexpected", providerService.moved);
188 // the host moved to new switch
189 testProcessor.process(new TestArpPacketContext(DEV2));
190 assertNotNull("host motion expected", providerService.moved);
192 // the host was misheard on a spine
193 testProcessor.process(new TestArpPacketContext(DEV3));
194 assertNull("host misheard on spine switch", providerService.spine);
196 providerService.clear();
199 testProcessor.process(new TestNAPacketContext(DEV4));
200 assertNotNull("new host expected", providerService.added);
201 assertNull("host motion unexpected", providerService.moved);
203 // the host moved to new switch
204 testProcessor.process(new TestNAPacketContext(DEV5));
205 assertNotNull("host motion expected", providerService.moved);
207 // the host was misheard on a spine
208 testProcessor.process(new TestNAPacketContext(DEV6));
209 assertNull("host misheard on spine switch", providerService.spine);
213 public void removeHostByDeviceRemove() {
214 provider.modified(CTX_FOR_REMOVE);
215 testProcessor.process(new TestArpPacketContext(DEV1));
216 testProcessor.process(new TestNAPacketContext(DEV4));
218 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
219 "m", "h", "s", "n", new ChassisId(0L));
220 deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
221 assertEquals("incorrect remove count", 1, providerService.removeCount);
223 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
224 "m", "h", "s", "n", new ChassisId(0L));
225 deviceService.listener.event(new DeviceEvent(DEVICE_REMOVED, device));
226 assertEquals("incorrect remove count", 2, providerService.removeCount);
230 public void removeHostByDeviceOffline() {
231 provider.modified(CTX_FOR_REMOVE);
232 testProcessor.process(new TestArpPacketContext(DEV1));
233 testProcessor.process(new TestArpPacketContext(DEV4));
235 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
236 "m", "h", "s", "n", new ChassisId(0L));
237 deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
238 assertEquals("incorrect remove count", 1, providerService.removeCount);
240 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
241 "m", "h", "s", "n", new ChassisId(0L));
242 deviceService.listener.event(new DeviceEvent(DEVICE_AVAILABILITY_CHANGED, device));
243 assertEquals("incorrect remove count", 2, providerService.removeCount);
247 public void removeHostByDevicePortDown() {
248 provider.modified(CTX_FOR_REMOVE);
249 testProcessor.process(new TestArpPacketContext(DEV1));
250 testProcessor.process(new TestArpPacketContext(DEV4));
252 Device device = new DefaultDevice(ProviderId.NONE, deviceId(DEV1), SWITCH,
253 "m", "h", "s", "n", new ChassisId(0L));
254 deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
255 new DefaultPort(device, portNumber(INPORT), false)));
256 assertEquals("incorrect remove count", 1, providerService.removeCount);
258 device = new DefaultDevice(ProviderId.NONE, deviceId(DEV4), SWITCH,
259 "m", "h", "s", "n", new ChassisId(0L));
260 deviceService.listener.event(new DeviceEvent(PORT_UPDATED, device,
261 new DefaultPort(device, portNumber(INPORT), false)));
262 assertEquals("incorrect remove count", 2, providerService.removeCount);
266 * When receiving ARP, updates location and IP.
269 public void testReceiveArp() {
270 testProcessor.process(new TestArpPacketContext(DEV1));
271 HostDescription descr = providerService.added;
272 assertThat(descr.location(), is(LOCATION));
273 assertThat(descr.hwAddress(), is(MAC));
274 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS));
275 assertThat(descr.vlan(), is(VLAN));
279 * When receiving IPv4, updates location only.
282 public void testReceiveIpv4() {
283 testProcessor.process(new TestIpv4PacketContext(DEV1));
284 HostDescription descr = providerService.added;
285 assertThat(descr.location(), is(LOCATION));
286 assertThat(descr.hwAddress(), is(MAC));
287 assertThat(descr.ipAddress().size(), is(0));
288 assertThat(descr.vlan(), is(VLAN));
292 * When receiving NeighborAdvertisement, updates location and IP.
295 public void testReceiveNA() {
296 testProcessor.process(new TestNAPacketContext(DEV4));
297 assertNotNull(providerService.added);
298 HostDescription descr = providerService.added;
299 assertThat(descr.location(), is(LOCATION2));
300 assertThat(descr.hwAddress(), is(MAC2));
301 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS2));
302 assertThat(descr.vlan(), is(VLAN));
306 * When receiving NeighborSolicitation, updates location and IP.
309 public void testReceiveNS() {
310 testProcessor.process(new TestNSPacketContext(DEV4));
311 HostDescription descr = providerService.added;
312 assertThat(descr.location(), is(LOCATION2));
313 assertThat(descr.hwAddress(), is(MAC2));
314 assertThat(descr.ipAddress().toArray()[0], is(IP_ADDRESS2));
315 assertThat(descr.vlan(), is(VLAN));
319 * When receiving RouterAdvertisement, ignores it.
322 public void testReceivesRA() {
323 testProcessor.process(new TestRAPacketContext(DEV4));
324 assertNull(providerService.added);
328 * When receiving RouterSolicitation, ignores it.
331 public void testReceiveRS() {
332 testProcessor.process(new TestRSPacketContext(DEV4));
333 assertNull(providerService.added);
337 * When receiving Duplicate Address Detection (DAD), ignores it.
340 public void testReceiveDAD() {
341 testProcessor.process(new TestDADPacketContext(DEV4));
342 assertNull(providerService.added);
346 * When receiving IPv6 multicast packet, ignores it.
349 public void testReceiveIpv6Multicast() {
350 testProcessor.process(new TestIpv6McastPacketContext(DEV4));
351 assertNull(providerService.added);
355 * When receiving IPv6 unicast packet, updates location only.
358 public void testReceiveIpv6Unicast() {
359 testProcessor.process(new TestIpv6PacketContext(DEV4));
360 assertNotNull(providerService.added);
361 HostDescription descr = providerService.added;
362 assertThat(descr.location(), is(LOCATION2));
363 assertThat(descr.hwAddress(), is(MAC2));
364 assertThat(descr.ipAddress().size(), is(0));
365 assertThat(descr.vlan(), is(VLAN));
369 public void tearDown() {
370 provider.deactivate();
371 provider.coreService = null;
372 provider.providerRegistry = null;
375 private class TestHostRegistry implements HostProviderRegistry {
378 public HostProviderService register(HostProvider provider) {
379 providerService = new TestHostProviderService(provider);
380 return providerService;
384 public void unregister(HostProvider provider) {
388 public Set<ProviderId> getProviders() {
394 private class TestHostProviderService
395 extends AbstractProviderService<HostProvider>
396 implements HostProviderService {
398 HostDescription added = null;
399 HostDescription moved = null;
400 HostDescription spine = null;
401 public int removeCount;
403 public void clear() {
410 protected TestHostProviderService(HostProvider provider) {
415 public void hostDetected(HostId hostId, HostDescription hostDescription, boolean replaceIps) {
417 added = hostDescription;
418 } else if ((moved == null) && !hostDescription.equals(added)) {
419 moved = hostDescription;
421 spine = hostDescription;
426 public void hostVanished(HostId hostId) {
431 public void removeIpFromHost(HostId hostId, IpAddress ipAddress) {
436 private class TestPacketService extends PacketServiceAdapter {
438 public void addProcessor(PacketProcessor processor, int priority) {
439 testProcessor = processor;
443 private class TestTopologyService extends TopologyServiceAdapter {
445 public boolean isInfrastructure(Topology topology,
446 ConnectPoint connectPoint) {
447 //simulate DPID3 as an infrastructure switch
448 if ((connectPoint.deviceId()).equals(deviceId(DEV3)) ||
449 connectPoint.deviceId().equals(deviceId(DEV6))) {
457 * Generates ARP packet.
459 private class TestArpPacketContext implements PacketContext {
460 private final String deviceId;
462 public TestArpPacketContext(String deviceId) {
463 this.deviceId = deviceId;
472 public InboundPacket inPacket() {
474 arp.setSenderProtocolAddress(IP)
475 .setSenderHardwareAddress(MAC.toBytes())
476 .setTargetHardwareAddress(BCMAC.toBytes())
477 .setTargetProtocolAddress(IP);
479 Ethernet eth = new Ethernet();
480 eth.setEtherType(Ethernet.TYPE_ARP)
481 .setVlanID(VLAN.toShort())
482 .setSourceMACAddress(MAC.toBytes())
483 .setDestinationMACAddress(BCMAC)
485 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
487 return new DefaultInboundPacket(receivedFrom, eth,
488 ByteBuffer.wrap(eth.serialize()));
492 public OutboundPacket outPacket() {
497 public TrafficTreatment.Builder treatmentBuilder() {
507 public boolean block() {
512 public boolean isHandled() {
518 * Generates IPv6 Unicast packet.
520 private class TestIpv4PacketContext implements PacketContext {
521 private final String deviceId;
523 public TestIpv4PacketContext(String deviceId) {
524 this.deviceId = deviceId;
533 public InboundPacket inPacket() {
534 IPv4 ipv4 = new IPv4();
535 ipv4.setDestinationAddress("10.0.0.1");
536 ipv4.setSourceAddress(IP_ADDRESS.toString());
537 Ethernet eth = new Ethernet();
538 eth.setEtherType(Ethernet.TYPE_IPV4)
539 .setVlanID(VLAN.toShort())
540 .setSourceMACAddress(MAC)
541 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
543 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
545 return new DefaultInboundPacket(receivedFrom, eth,
546 ByteBuffer.wrap(eth.serialize()));
550 public OutboundPacket outPacket() {
555 public TrafficTreatment.Builder treatmentBuilder() {
565 public boolean block() {
570 public boolean isHandled() {
576 * Generates NeighborAdvertisement packet.
578 private class TestNAPacketContext implements PacketContext {
579 private final String deviceId;
581 public TestNAPacketContext(String deviceId) {
582 this.deviceId = deviceId;
591 public InboundPacket inPacket() {
592 NeighborAdvertisement na = new NeighborAdvertisement();
593 ICMP6 icmp6 = new ICMP6();
594 icmp6.setPayload(na);
595 IPv6 ipv6 = new IPv6();
596 ipv6.setPayload(icmp6);
597 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
598 ipv6.setSourceAddress(IP2);
599 Ethernet eth = new Ethernet();
600 eth.setEtherType(Ethernet.TYPE_IPV6)
601 .setVlanID(VLAN.toShort())
602 .setSourceMACAddress(MAC2.toBytes())
603 .setDestinationMACAddress(BCMAC2)
605 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
607 return new DefaultInboundPacket(receivedFrom, eth,
608 ByteBuffer.wrap(eth.serialize()));
612 public OutboundPacket outPacket() {
617 public TrafficTreatment.Builder treatmentBuilder() {
627 public boolean block() {
632 public boolean isHandled() {
638 * Generates NeighborSolicitation packet.
640 private class TestNSPacketContext implements PacketContext {
641 private final String deviceId;
643 public TestNSPacketContext(String deviceId) {
644 this.deviceId = deviceId;
653 public InboundPacket inPacket() {
654 NeighborSolicitation ns = new NeighborSolicitation();
655 ICMP6 icmp6 = new ICMP6();
656 icmp6.setPayload(ns);
657 IPv6 ipv6 = new IPv6();
658 ipv6.setPayload(icmp6);
659 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1:ff00:0000").toOctets());
660 ipv6.setSourceAddress(IP2);
661 Ethernet eth = new Ethernet();
662 eth.setEtherType(Ethernet.TYPE_IPV6)
663 .setVlanID(VLAN.toShort())
664 .setSourceMACAddress(MAC2.toBytes())
665 .setDestinationMACAddress(BCMAC2)
667 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
669 return new DefaultInboundPacket(receivedFrom, eth,
670 ByteBuffer.wrap(eth.serialize()));
674 public OutboundPacket outPacket() {
679 public TrafficTreatment.Builder treatmentBuilder() {
689 public boolean block() {
694 public boolean isHandled() {
700 * Generates Duplicate Address Detection packet.
702 private class TestDADPacketContext implements PacketContext {
703 private final String deviceId;
705 public TestDADPacketContext(String deviceId) {
706 this.deviceId = deviceId;
715 public InboundPacket inPacket() {
716 NeighborSolicitation ns = new NeighborSolicitation();
717 ICMP6 icmp6 = new ICMP6();
718 icmp6.setPayload(ns);
719 IPv6 ipv6 = new IPv6();
720 ipv6.setPayload(icmp6);
721 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
722 ipv6.setSourceAddress(Ip6Address.valueOf("::").toOctets());
723 Ethernet eth = new Ethernet();
724 eth.setEtherType(Ethernet.TYPE_IPV6)
725 .setVlanID(VLAN.toShort())
726 .setSourceMACAddress(MAC2.toBytes())
727 .setDestinationMACAddress(BCMAC2)
729 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
731 return new DefaultInboundPacket(receivedFrom, eth,
732 ByteBuffer.wrap(eth.serialize()));
736 public OutboundPacket outPacket() {
741 public TrafficTreatment.Builder treatmentBuilder() {
751 public boolean block() {
756 public boolean isHandled() {
762 * Generates Router Solicitation packet.
764 private class TestRSPacketContext implements PacketContext {
765 private final String deviceId;
767 public TestRSPacketContext(String deviceId) {
768 this.deviceId = deviceId;
777 public InboundPacket inPacket() {
778 RouterSolicitation ns = new RouterSolicitation();
779 ICMP6 icmp6 = new ICMP6();
780 icmp6.setPayload(ns);
781 IPv6 ipv6 = new IPv6();
782 ipv6.setPayload(icmp6);
783 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::2").toOctets());
784 ipv6.setSourceAddress(Ip6Address.valueOf("::").toOctets());
785 Ethernet eth = new Ethernet();
786 eth.setEtherType(Ethernet.TYPE_IPV6)
787 .setVlanID(VLAN.toShort())
788 .setSourceMACAddress(MAC2.toBytes())
789 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:02"))
791 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
793 return new DefaultInboundPacket(receivedFrom, eth,
794 ByteBuffer.wrap(eth.serialize()));
798 public OutboundPacket outPacket() {
803 public TrafficTreatment.Builder treatmentBuilder() {
813 public boolean block() {
818 public boolean isHandled() {
824 * Generates Router Advertisement packet.
826 private class TestRAPacketContext implements PacketContext {
827 private final String deviceId;
829 public TestRAPacketContext(String deviceId) {
830 this.deviceId = deviceId;
839 public InboundPacket inPacket() {
840 RouterAdvertisement ns = new RouterAdvertisement();
841 ICMP6 icmp6 = new ICMP6();
842 icmp6.setPayload(ns);
843 IPv6 ipv6 = new IPv6();
844 ipv6.setPayload(icmp6);
845 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
846 ipv6.setSourceAddress(IP2);
847 Ethernet eth = new Ethernet();
848 eth.setEtherType(Ethernet.TYPE_IPV6)
849 .setVlanID(VLAN.toShort())
850 .setSourceMACAddress(MAC2.toBytes())
851 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
853 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
855 return new DefaultInboundPacket(receivedFrom, eth,
856 ByteBuffer.wrap(eth.serialize()));
860 public OutboundPacket outPacket() {
865 public TrafficTreatment.Builder treatmentBuilder() {
875 public boolean block() {
880 public boolean isHandled() {
886 * Generates IPv6 Multicast packet.
888 private class TestIpv6McastPacketContext implements PacketContext {
889 private final String deviceId;
891 public TestIpv6McastPacketContext(String deviceId) {
892 this.deviceId = deviceId;
901 public InboundPacket inPacket() {
902 IPv6 ipv6 = new IPv6();
903 ipv6.setDestinationAddress(Ip6Address.valueOf("ff02::1").toOctets());
904 ipv6.setSourceAddress(IP2);
905 Ethernet eth = new Ethernet();
906 eth.setEtherType(Ethernet.TYPE_IPV6)
907 .setVlanID(VLAN.toShort())
908 .setSourceMACAddress(MAC2.toBytes())
909 .setDestinationMACAddress(MacAddress.valueOf("33:33:00:00:00:01"))
911 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
913 return new DefaultInboundPacket(receivedFrom, eth,
914 ByteBuffer.wrap(eth.serialize()));
918 public OutboundPacket outPacket() {
923 public TrafficTreatment.Builder treatmentBuilder() {
933 public boolean block() {
938 public boolean isHandled() {
944 * Generates IPv6 Unicast packet.
946 private class TestIpv6PacketContext implements PacketContext {
947 private final String deviceId;
949 public TestIpv6PacketContext(String deviceId) {
950 this.deviceId = deviceId;
959 public InboundPacket inPacket() {
960 IPv6 ipv6 = new IPv6();
961 ipv6.setDestinationAddress(Ip6Address.valueOf("1000::1").toOctets());
962 ipv6.setSourceAddress(IP2);
963 Ethernet eth = new Ethernet();
964 eth.setEtherType(Ethernet.TYPE_IPV6)
965 .setVlanID(VLAN.toShort())
966 .setSourceMACAddress(MAC2)
967 .setDestinationMACAddress(MacAddress.valueOf("00:00:00:00:00:01"))
969 ConnectPoint receivedFrom = new ConnectPoint(deviceId(deviceId),
971 return new DefaultInboundPacket(receivedFrom, eth,
972 ByteBuffer.wrap(eth.serialize()));
976 public OutboundPacket outPacket() {
981 public TrafficTreatment.Builder treatmentBuilder() {
991 public boolean block() {
996 public boolean isHandled() {
1001 private class TestDeviceService extends DeviceServiceAdapter {
1002 private DeviceListener listener;
1005 public void addListener(DeviceListener listener) {
1006 this.listener = listener;
1010 public Iterable<Device> getDevices() {
1011 return Collections.emptyList();
1015 private class TestHostService extends HostServiceAdapter {
1017 public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
1018 ConnectPoint cp1 = new ConnectPoint(deviceId(DEV1), portNumber(INPORT));
1019 ConnectPoint cp2 = new ConnectPoint(deviceId(DEV4), portNumber(INPORT));
1020 if (connectPoint.equals(cp1)) {
1021 return ImmutableSet.of(HOST);
1022 } else if (connectPoint.equals(cp2)) {
1023 return ImmutableSet.of(HOST2);
1025 return ImmutableSet.of();
1030 public Set<Host> getConnectedHosts(DeviceId deviceId) {
1031 if (deviceId.equals(deviceId(DEV1))) {
1032 return ImmutableSet.of(HOST);
1033 } else if (deviceId.equals(deviceId(DEV4))) {
1034 return ImmutableSet.of(HOST2);
1036 return ImmutableSet.of();