master
go 106 lines 2.79 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package l2topology
4
5 import "strings"
6
7 func buildDeterministicDiscoveryDevicePairSet(adjacencies []Adjacency) map[string]struct{} {
8 if len(adjacencies) == 0 {
9 return nil
10 }
11
12 out := make(map[string]struct{}, len(adjacencies))
13 for _, adj := range adjacencies {
14 protocol := strings.ToLower(strings.TrimSpace(adj.Protocol))
15 if protocol != "lldp" && protocol != "cdp" {
16 continue
17 }
18
19 left := strings.TrimSpace(adj.SourceID)
20 right := strings.TrimSpace(adj.TargetID)
21 if left == "" || right == "" {
22 continue
23 }
24 if pair := topologyUndirectedPairKey(left, right); pair != "" {
25 out[pair] = struct{}{}
26 }
27 }
28 if len(out) == 0 {
29 return nil
30 }
31 return out
32 }
33
34 func suppressInferredBridgeLinksOnDeterministicDiscovery(
35 bridgeLinks []bridgeBridgeLinkRecord,
36 deterministicTransitPortKeys map[string]struct{},
37 discoveryDevicePairs map[string]struct{},
38 ) []bridgeBridgeLinkRecord {
39 if len(bridgeLinks) == 0 {
40 return bridgeLinks
41 }
42
43 filtered := make([]bridgeBridgeLinkRecord, 0, len(bridgeLinks))
44 for _, link := range bridgeLinks {
45 method := strings.ToLower(strings.TrimSpace(link.method))
46 if method == "lldp" || method == "cdp" {
47 filtered = append(filtered, link)
48 continue
49 }
50
51 if len(deterministicTransitPortKeys) > 0 {
52 if _, blocked := deterministicTransitPortKeys[bridgePortObservationKey(link.designatedPort)]; blocked {
53 continue
54 }
55 if _, blocked := deterministicTransitPortKeys[bridgePortObservationVLANKey(link.designatedPort)]; blocked {
56 continue
57 }
58 if _, blocked := deterministicTransitPortKeys[bridgePortObservationKey(link.port)]; blocked {
59 continue
60 }
61 if _, blocked := deterministicTransitPortKeys[bridgePortObservationVLANKey(link.port)]; blocked {
62 continue
63 }
64 }
65
66 if len(discoveryDevicePairs) > 0 {
67 left := strings.TrimSpace(link.designatedPort.deviceID)
68 right := strings.TrimSpace(link.port.deviceID)
69 if pair := topologyUndirectedPairKey(left, right); pair != "" {
70 if _, blocked := discoveryDevicePairs[pair]; blocked {
71 continue
72 }
73 }
74 }
75
76 filtered = append(filtered, link)
77 }
78 return filtered
79 }
80
81 func buildDeterministicTransitPortKeySet(
82 adjacencies []Adjacency,
83 ifIndexByDeviceName map[string]int,
84 ) map[string]struct{} {
85 if len(adjacencies) == 0 {
86 return nil
87 }
88
89 out := make(map[string]struct{}, len(adjacencies)*4)
90 for _, adj := range adjacencies {
91 protocol := strings.ToLower(strings.TrimSpace(adj.Protocol))
92 if protocol != "lldp" && protocol != "cdp" {
93 continue
94 }
95
96 src := bridgePortFromAdjacencySide(adj.SourceID, adj.SourcePort, ifIndexByDeviceName)
97 dst := bridgePortFromAdjacencySide(adj.TargetID, adj.TargetPort, ifIndexByDeviceName)
98 addBridgePortObservationKeys(out, src)
99 addBridgePortObservationKeys(out, dst)
100 }
101
102 if len(out) == 0 {
103 return nil
104 }
105 return out
106 }