[Falcon] link discovery -
- safety checks against fingerprint being null - checks for foreign fingerprint and probe message origin Change-Id: I2f3e491802afc2091335bd25fcf24865293bde10
Showing
4 changed files
with
46 additions
and
1 deletions
... | @@ -38,6 +38,9 @@ import com.google.common.collect.Sets; | ... | @@ -38,6 +38,9 @@ import com.google.common.collect.Sets; |
38 | */ | 38 | */ |
39 | public final class ClusterMetadata { | 39 | public final class ClusterMetadata { |
40 | 40 | ||
41 | + // Name to use when the ClusterMetadataService is in transient state | ||
42 | + public static final String NO_NAME = ""; | ||
43 | + | ||
41 | private String name; | 44 | private String name; |
42 | private Set<ControllerNode> nodes; | 45 | private Set<ControllerNode> nodes; |
43 | private Set<Partition> partitions; | 46 | private Set<Partition> partitions; | ... | ... |
... | @@ -17,6 +17,7 @@ package org.onosproject.provider.lldp.impl; | ... | @@ -17,6 +17,7 @@ package org.onosproject.provider.lldp.impl; |
17 | 17 | ||
18 | import org.onosproject.mastership.MastershipService; | 18 | import org.onosproject.mastership.MastershipService; |
19 | import org.onosproject.net.LinkKey; | 19 | import org.onosproject.net.LinkKey; |
20 | +import org.onosproject.net.device.DeviceService; | ||
20 | import org.onosproject.net.link.LinkProviderService; | 21 | import org.onosproject.net.link.LinkProviderService; |
21 | import org.onosproject.net.packet.PacketService; | 22 | import org.onosproject.net.packet.PacketService; |
22 | 23 | ||
... | @@ -47,6 +48,13 @@ interface DiscoveryContext { | ... | @@ -47,6 +48,13 @@ interface DiscoveryContext { |
47 | PacketService packetService(); | 48 | PacketService packetService(); |
48 | 49 | ||
49 | /** | 50 | /** |
51 | + * Returns the DeviceService reference. | ||
52 | + * | ||
53 | + * @return the device service interface | ||
54 | + */ | ||
55 | + DeviceService deviceService(); | ||
56 | + | ||
57 | + /** | ||
50 | * Returns the probe rate in millis. | 58 | * Returns the probe rate in millis. |
51 | * | 59 | * |
52 | * @return probe rate | 60 | * @return probe rate | ... | ... |
... | @@ -43,6 +43,7 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; | ... | @@ -43,6 +43,7 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; |
43 | import static org.onosproject.net.PortNumber.portNumber; | 43 | import static org.onosproject.net.PortNumber.portNumber; |
44 | import static org.onosproject.net.flow.DefaultTrafficTreatment.builder; | 44 | import static org.onosproject.net.flow.DefaultTrafficTreatment.builder; |
45 | import static org.slf4j.LoggerFactory.getLogger; | 45 | import static org.slf4j.LoggerFactory.getLogger; |
46 | +import static org.onosproject.cluster.ClusterMetadata.NO_NAME; | ||
46 | 47 | ||
47 | /** | 48 | /** |
48 | * Run discovery process from a physical switch. Ports are initially labeled as | 49 | * Run discovery process from a physical switch. Ports are initially labeled as |
... | @@ -159,6 +160,10 @@ class LinkDiscovery implements TimerTask { | ... | @@ -159,6 +160,10 @@ class LinkDiscovery implements TimerTask { |
159 | 160 | ||
160 | ONOSLLDP onoslldp = ONOSLLDP.parseONOSLLDP(eth); | 161 | ONOSLLDP onoslldp = ONOSLLDP.parseONOSLLDP(eth); |
161 | if (onoslldp != null) { | 162 | if (onoslldp != null) { |
163 | + if (notMy(onoslldp)) { | ||
164 | + return true; | ||
165 | + } | ||
166 | + | ||
162 | PortNumber srcPort = portNumber(onoslldp.getPort()); | 167 | PortNumber srcPort = portNumber(onoslldp.getPort()); |
163 | PortNumber dstPort = packetContext.inPacket().receivedFrom().port(); | 168 | PortNumber dstPort = packetContext.inPacket().receivedFrom().port(); |
164 | DeviceId srcDeviceId = DeviceId.deviceId(onoslldp.getDeviceString()); | 169 | DeviceId srcDeviceId = DeviceId.deviceId(onoslldp.getDeviceString()); |
... | @@ -182,6 +187,26 @@ class LinkDiscovery implements TimerTask { | ... | @@ -182,6 +187,26 @@ class LinkDiscovery implements TimerTask { |
182 | return false; | 187 | return false; |
183 | } | 188 | } |
184 | 189 | ||
190 | + // true if *NOT* this cluster's own probe. | ||
191 | + private boolean notMy(ONOSLLDP onoslldp) { | ||
192 | + if (onoslldp.getDomainTLV() == null) { | ||
193 | + // not finger-printed - but we can check the source | ||
194 | + DeviceId src = DeviceId.deviceId(onoslldp.getDeviceString()); | ||
195 | + if (context.deviceService().getDevice(src) == null) { | ||
196 | + return true; | ||
197 | + } | ||
198 | + return false; | ||
199 | + } | ||
200 | + | ||
201 | + String us = context.fingerprint(); | ||
202 | + String them = onoslldp.getDomainString(); | ||
203 | + // if: Our and/or their MetadataService in poorly state, conservative 'yes' | ||
204 | + if (NO_NAME.equals(us) || NO_NAME.equals(them)) { | ||
205 | + return true; | ||
206 | + } else { | ||
207 | + return !us.equals(them); | ||
208 | + } | ||
209 | + } | ||
185 | 210 | ||
186 | /** | 211 | /** |
187 | * Execute this method every t milliseconds. Loops over all ports | 212 | * Execute this method every t milliseconds. Loops over all ports | ... | ... |
... | @@ -27,6 +27,7 @@ import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FAC | ... | @@ -27,6 +27,7 @@ import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FAC |
27 | import static org.onosproject.net.config.basics.SubjectFactories.CONNECT_POINT_SUBJECT_FACTORY; | 27 | import static org.onosproject.net.config.basics.SubjectFactories.CONNECT_POINT_SUBJECT_FACTORY; |
28 | import static org.onosproject.net.config.basics.SubjectFactories.DEVICE_SUBJECT_FACTORY; | 28 | import static org.onosproject.net.config.basics.SubjectFactories.DEVICE_SUBJECT_FACTORY; |
29 | import static org.slf4j.LoggerFactory.getLogger; | 29 | import static org.slf4j.LoggerFactory.getLogger; |
30 | +import static org.onosproject.cluster.ClusterMetadata.NO_NAME; | ||
30 | 31 | ||
31 | import java.util.Dictionary; | 32 | import java.util.Dictionary; |
32 | import java.util.EnumSet; | 33 | import java.util.EnumSet; |
... | @@ -47,6 +48,7 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; | ... | @@ -47,6 +48,7 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; |
47 | import org.onlab.packet.Ethernet; | 48 | import org.onlab.packet.Ethernet; |
48 | import org.onlab.util.Tools; | 49 | import org.onlab.util.Tools; |
49 | import org.onosproject.cfg.ComponentConfigService; | 50 | import org.onosproject.cfg.ComponentConfigService; |
51 | +import org.onosproject.cluster.ClusterMetadata; | ||
50 | import org.onosproject.cluster.ClusterMetadataService; | 52 | import org.onosproject.cluster.ClusterMetadataService; |
51 | import org.onosproject.cluster.ClusterService; | 53 | import org.onosproject.cluster.ClusterService; |
52 | import org.onosproject.core.ApplicationId; | 54 | import org.onosproject.core.ApplicationId; |
... | @@ -426,6 +428,7 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -426,6 +428,7 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider { |
426 | removeDevice(device.id()); | 428 | removeDevice(device.id()); |
427 | return Optional.empty(); | 429 | return Optional.empty(); |
428 | } | 430 | } |
431 | + | ||
429 | LinkDiscovery ld = discoverers.computeIfAbsent(device.id(), | 432 | LinkDiscovery ld = discoverers.computeIfAbsent(device.id(), |
430 | did -> new LinkDiscovery(device, context)); | 433 | did -> new LinkDiscovery(device, context)); |
431 | if (isFingerprinted(device.id())) { | 434 | if (isFingerprinted(device.id())) { |
... | @@ -749,7 +752,13 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -749,7 +752,13 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider { |
749 | 752 | ||
750 | @Override | 753 | @Override |
751 | public String fingerprint() { | 754 | public String fingerprint() { |
752 | - return clusterMetadataService.getClusterMetadata().getName(); | 755 | + ClusterMetadata mdata = clusterMetadataService.getClusterMetadata(); |
756 | + return mdata == null ? NO_NAME : mdata.getName(); | ||
757 | + } | ||
758 | + | ||
759 | + @Override | ||
760 | + public DeviceService deviceService() { | ||
761 | + return deviceService; | ||
753 | } | 762 | } |
754 | } | 763 | } |
755 | 764 | ... | ... |
-
Please register or login to post a comment