filter internet adjacencies

Edges between the incoming and outgoing internet nodes are typically
artifacts of imperfect connection tracking, e.g. when VIPs and NAT
traversal are in use.

So lets filter them out.
This commit is contained in:
Matthias Radestock
2017-11-28 08:21:06 +00:00
parent e73ba58740
commit 9fbc388f82

View File

@@ -144,6 +144,27 @@ func connected(nodes report.Nodes) map[string]struct{} {
return res
}
// filterInternetAdjacencies filters out edges between the incoming
// and outgoing internet node. These are typically artifacts of
// imperfect connection tracking, e.g. when VIPs and NAT traversal are
// in use.
func filterInternetAdjacencies(nodes report.Nodes) report.Nodes {
incomingInternet, ok := nodes[IncomingInternetID]
if !ok {
return nodes
}
newAdjacency := report.MakeIDList()
for _, dstID := range incomingInternet.Adjacency {
if dstID != OutgoingInternetID {
newAdjacency = newAdjacency.Add(dstID)
}
}
incomingInternet.Adjacency = newAdjacency
output := nodes.Copy()
output[IncomingInternetID] = incomingInternet
return output
}
// ColorConnected colors nodes with the IsConnectedMark key if they
// have edges to or from them. Edges to/from yourself are not counted
// here (see #656).
@@ -166,13 +187,14 @@ type filterUnconnected struct {
// Transform implements Transformer
func (f filterUnconnected) Transform(input Nodes) Nodes {
connected := connected(input.Nodes)
output := filterInternetAdjacencies(input.Nodes)
connected := connected(output)
return FilterFunc(func(node report.Node) bool {
if _, ok := connected[node.ID]; ok || (f.onlyPseudo && !IsPseudoTopology(node)) {
return true
}
return false
}).Transform(input)
}).Transform(Nodes{Nodes: output, Filtered: input.Filtered})
}
// FilterUnconnected is a transformer that filters unconnected nodes