Jonathan Hart
Committed by Gerrit Code Review

ONOS-2309: Add check in HostMonitor to make sure we only send out edge ports

Change-Id: Id128319163786487c5b545fbc51e47097edfe0ab
...@@ -25,6 +25,7 @@ import org.onlab.packet.IpAddress; ...@@ -25,6 +25,7 @@ import org.onlab.packet.IpAddress;
25 import org.onlab.packet.MacAddress; 25 import org.onlab.packet.MacAddress;
26 import org.onlab.packet.VlanId; 26 import org.onlab.packet.VlanId;
27 import org.onosproject.incubator.net.intf.InterfaceService; 27 import org.onosproject.incubator.net.intf.InterfaceService;
28 +import org.onosproject.net.edge.EdgePortService;
28 import org.onosproject.net.provider.AbstractListenerProviderRegistry; 29 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
29 import org.onosproject.net.config.NetworkConfigEvent; 30 import org.onosproject.net.config.NetworkConfigEvent;
30 import org.onosproject.net.config.NetworkConfigListener; 31 import org.onosproject.net.config.NetworkConfigListener;
...@@ -90,6 +91,9 @@ public class HostManager ...@@ -90,6 +91,9 @@ public class HostManager
90 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 91 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
91 protected InterfaceService interfaceService; 92 protected InterfaceService interfaceService;
92 93
94 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
95 + protected EdgePortService edgePortService;
96 +
93 private HostMonitor monitor; 97 private HostMonitor monitor;
94 98
95 @Activate 99 @Activate
...@@ -97,7 +101,7 @@ public class HostManager ...@@ -97,7 +101,7 @@ public class HostManager
97 store.setDelegate(delegate); 101 store.setDelegate(delegate);
98 eventDispatcher.addSink(HostEvent.class, listenerRegistry); 102 eventDispatcher.addSink(HostEvent.class, listenerRegistry);
99 networkConfigService.addListener(networkConfigListener); 103 networkConfigService.addListener(networkConfigListener);
100 - monitor = new HostMonitor(packetService, this, interfaceService); 104 + monitor = new HostMonitor(packetService, this, interfaceService, edgePortService);
101 monitor.start(); 105 monitor.start();
102 log.info("Started"); 106 log.info("Started");
103 } 107 }
......
...@@ -31,6 +31,7 @@ import org.onosproject.incubator.net.intf.Interface; ...@@ -31,6 +31,7 @@ import org.onosproject.incubator.net.intf.Interface;
31 import org.onosproject.incubator.net.intf.InterfaceService; 31 import org.onosproject.incubator.net.intf.InterfaceService;
32 import org.onosproject.net.ConnectPoint; 32 import org.onosproject.net.ConnectPoint;
33 import org.onosproject.net.Host; 33 import org.onosproject.net.Host;
34 +import org.onosproject.net.edge.EdgePortService;
34 import org.onosproject.net.flow.DefaultTrafficTreatment; 35 import org.onosproject.net.flow.DefaultTrafficTreatment;
35 import org.onosproject.net.flow.TrafficTreatment; 36 import org.onosproject.net.flow.TrafficTreatment;
36 import org.onosproject.net.host.HostProvider; 37 import org.onosproject.net.host.HostProvider;
...@@ -39,6 +40,8 @@ import org.onosproject.net.packet.DefaultOutboundPacket; ...@@ -39,6 +40,8 @@ import org.onosproject.net.packet.DefaultOutboundPacket;
39 import org.onosproject.net.packet.OutboundPacket; 40 import org.onosproject.net.packet.OutboundPacket;
40 import org.onosproject.net.packet.PacketService; 41 import org.onosproject.net.packet.PacketService;
41 import org.onosproject.net.provider.ProviderId; 42 import org.onosproject.net.provider.ProviderId;
43 +import org.slf4j.Logger;
44 +import org.slf4j.LoggerFactory;
42 45
43 import java.nio.ByteBuffer; 46 import java.nio.ByteBuffer;
44 import java.util.Collections; 47 import java.util.Collections;
...@@ -56,9 +59,13 @@ import java.util.concurrent.TimeUnit; ...@@ -56,9 +59,13 @@ import java.util.concurrent.TimeUnit;
56 * </p> 59 * </p>
57 */ 60 */
58 public class HostMonitor implements TimerTask { 61 public class HostMonitor implements TimerTask {
62 +
63 + private Logger log = LoggerFactory.getLogger(getClass());
64 +
59 private PacketService packetService; 65 private PacketService packetService;
60 private HostManager hostManager; 66 private HostManager hostManager;
61 private InterfaceService interfaceService; 67 private InterfaceService interfaceService;
68 + private EdgePortService edgePortService;
62 69
63 private final Set<IpAddress> monitoredAddresses; 70 private final Set<IpAddress> monitoredAddresses;
64 71
...@@ -79,11 +86,13 @@ public class HostMonitor implements TimerTask { ...@@ -79,11 +86,13 @@ public class HostMonitor implements TimerTask {
79 * @param interfaceService interface service for interface information 86 * @param interfaceService interface service for interface information
80 */ 87 */
81 public HostMonitor(PacketService packetService, HostManager hostManager, 88 public HostMonitor(PacketService packetService, HostManager hostManager,
82 - InterfaceService interfaceService) { 89 + InterfaceService interfaceService,
90 + EdgePortService edgePortService) {
83 91
84 this.packetService = packetService; 92 this.packetService = packetService;
85 this.hostManager = hostManager; 93 this.hostManager = hostManager;
86 this.interfaceService = interfaceService; 94 this.interfaceService = interfaceService;
95 + this.edgePortService = edgePortService;
87 96
88 monitoredAddresses = Collections.newSetFromMap(new ConcurrentHashMap<>()); 97 monitoredAddresses = Collections.newSetFromMap(new ConcurrentHashMap<>());
89 hostProviders = new ConcurrentHashMap<>(); 98 hostProviders = new ConcurrentHashMap<>();
...@@ -173,6 +182,11 @@ public class HostMonitor implements TimerTask { ...@@ -173,6 +182,11 @@ public class HostMonitor implements TimerTask {
173 return; 182 return;
174 } 183 }
175 184
185 + if (!edgePortService.isEdgePoint(intf.connectPoint())) {
186 + log.warn("Attempt to send probe out non-edge port: {}", intf);
187 + return;
188 + }
189 +
176 for (InterfaceIpAddress ia : intf.ipAddresses()) { 190 for (InterfaceIpAddress ia : intf.ipAddresses()) {
177 if (ia.subnetAddress().contains(targetIp)) { 191 if (ia.subnetAddress().contains(targetIp)) {
178 sendProbe(intf.connectPoint(), targetIp, ia.ipAddress(), 192 sendProbe(intf.connectPoint(), targetIp, ia.ipAddress(),
......
...@@ -19,6 +19,7 @@ import com.google.common.collect.HashMultimap; ...@@ -19,6 +19,7 @@ import com.google.common.collect.HashMultimap;
19 import com.google.common.collect.Lists; 19 import com.google.common.collect.Lists;
20 import com.google.common.collect.Multimap; 20 import com.google.common.collect.Multimap;
21 import org.junit.After; 21 import org.junit.After;
22 +import org.junit.Before;
22 import org.junit.Test; 23 import org.junit.Test;
23 import org.onlab.packet.ARP; 24 import org.onlab.packet.ARP;
24 import org.onlab.packet.Ethernet; 25 import org.onlab.packet.Ethernet;
...@@ -37,6 +38,7 @@ import org.onosproject.net.Port; ...@@ -37,6 +38,7 @@ import org.onosproject.net.Port;
37 import org.onosproject.net.PortNumber; 38 import org.onosproject.net.PortNumber;
38 import org.onosproject.net.device.DeviceListener; 39 import org.onosproject.net.device.DeviceListener;
39 import org.onosproject.net.device.DeviceServiceAdapter; 40 import org.onosproject.net.device.DeviceServiceAdapter;
41 +import org.onosproject.net.edge.EdgePortService;
40 import org.onosproject.net.flow.instructions.Instruction; 42 import org.onosproject.net.flow.instructions.Instruction;
41 import org.onosproject.net.flow.instructions.Instructions.OutputInstruction; 43 import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
42 import org.onosproject.net.host.HostProvider; 44 import org.onosproject.net.host.HostProvider;
...@@ -51,6 +53,7 @@ import java.util.Collections; ...@@ -51,6 +53,7 @@ import java.util.Collections;
51 import java.util.List; 53 import java.util.List;
52 import java.util.Set; 54 import java.util.Set;
53 55
56 +import static org.easymock.EasyMock.anyObject;
54 import static org.easymock.EasyMock.createMock; 57 import static org.easymock.EasyMock.createMock;
55 import static org.easymock.EasyMock.expect; 58 import static org.easymock.EasyMock.expect;
56 import static org.easymock.EasyMock.expectLastCall; 59 import static org.easymock.EasyMock.expectLastCall;
...@@ -70,8 +73,18 @@ public class HostMonitorTest { ...@@ -70,8 +73,18 @@ public class HostMonitorTest {
70 new InterfaceIpAddress(SOURCE_ADDR, IpPrefix.valueOf("10.0.0.0/24")); 73 new InterfaceIpAddress(SOURCE_ADDR, IpPrefix.valueOf("10.0.0.0/24"));
71 private MacAddress sourceMac = MacAddress.valueOf(1L); 74 private MacAddress sourceMac = MacAddress.valueOf(1L);
72 75
76 + private EdgePortService edgePortService;
77 +
73 private HostMonitor hostMonitor; 78 private HostMonitor hostMonitor;
74 79
80 + @Before
81 + public void setUp() {
82 + edgePortService = createMock(EdgePortService.class);
83 + expect(edgePortService.isEdgePoint(anyObject(ConnectPoint.class)))
84 + .andReturn(true).anyTimes();
85 + replay(edgePortService);
86 + }
87 +
75 @After 88 @After
76 public void shutdown() { 89 public void shutdown() {
77 hostMonitor.shutdown(); 90 hostMonitor.shutdown();
...@@ -96,7 +109,7 @@ public class HostMonitorTest { ...@@ -96,7 +109,7 @@ public class HostMonitorTest {
96 expectLastCall().once(); 109 expectLastCall().once();
97 replay(hostProvider); 110 replay(hostProvider);
98 111
99 - hostMonitor = new HostMonitor(null, hostManager, null); 112 + hostMonitor = new HostMonitor(null, hostManager, null, edgePortService);
100 113
101 hostMonitor.registerHostProvider(hostProvider); 114 hostMonitor.registerHostProvider(hostProvider);
102 hostMonitor.addMonitoringFor(TARGET_IP_ADDR); 115 hostMonitor.addMonitoringFor(TARGET_IP_ADDR);
...@@ -144,7 +157,7 @@ public class HostMonitorTest { ...@@ -144,7 +157,7 @@ public class HostMonitorTest {
144 157
145 158
146 // Run the test 159 // Run the test
147 - hostMonitor = new HostMonitor(packetService, hostManager, interfaceService); 160 + hostMonitor = new HostMonitor(packetService, hostManager, interfaceService, edgePortService);
148 161
149 hostMonitor.addMonitoringFor(TARGET_IP_ADDR); 162 hostMonitor.addMonitoringFor(TARGET_IP_ADDR);
150 hostMonitor.run(null); 163 hostMonitor.run(null);
...@@ -216,7 +229,7 @@ public class HostMonitorTest { ...@@ -216,7 +229,7 @@ public class HostMonitorTest {
216 229
217 230
218 // Run the test 231 // Run the test
219 - hostMonitor = new HostMonitor(packetService, hostManager, interfaceService); 232 + hostMonitor = new HostMonitor(packetService, hostManager, interfaceService, edgePortService);
220 233
221 hostMonitor.addMonitoringFor(TARGET_IP_ADDR); 234 hostMonitor.addMonitoringFor(TARGET_IP_ADDR);
222 hostMonitor.run(null); 235 hostMonitor.run(null);
......