From c915fc9b77ac1401748f4b829b14e53eb4fb2213 Mon Sep 17 00:00:00 2001 From: Maximilian Wilhelm <max@sdn.clinic> Date: Wed, 27 Jun 2018 01:42:46 +0200 Subject: [PATCH] AdjRIBOut: Don't add PathIdentifier without AddPath capabilities and don't add path twice. Signed-off-by: Maximilian Wilhelm <max@sdn.clinic> --- routingtable/adjRIBOut/adj_rib_out.go | 34 ++++++++++++++++++++------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/routingtable/adjRIBOut/adj_rib_out.go b/routingtable/adjRIBOut/adj_rib_out.go index e211479b..a2179fc0 100644 --- a/routingtable/adjRIBOut/adj_rib_out.go +++ b/routingtable/adjRIBOut/adj_rib_out.go @@ -69,19 +69,21 @@ func (a *AdjRIBOut) AddPath(pfx bnet.Prefix, p *route.Path) error { a.mu.Lock() defer a.mu.Unlock() - if !a.neighbor.CapAddPathRX { + // AddPathRX capable neighbor + if a.neighbor.CapAddPathRX { + pathID, err := a.pathIDManager.addPath(p) + if err != nil { + return fmt.Errorf("Unable to get path ID: %v", err) + } + + p.BGPPath.PathIdentifier = pathID + a.rt.AddPath(pfx, p) + } else { + // rt.ReplacePath will add this path to the rt in any case, so no rt.AddPath here! oldPaths := a.rt.ReplacePath(pfx, p) a.removePathsFromClients(pfx, oldPaths) } - pathID, err := a.pathIDManager.addPath(p) - if err != nil { - return fmt.Errorf("Unable to get path ID: %v", err) - } - - p.BGPPath.PathIdentifier = pathID - a.rt.AddPath(pfx, p) - for _, client := range a.ClientManager.Clients() { err := client.AddPath(pfx, p) if err != nil { @@ -166,3 +168,17 @@ func (a *AdjRIBOut) Print() string { return ret } + +// Dump all routes present in this AdjRIBOut +func (a *AdjRIBOut) Dump() string { + a.mu.RLock() + defer a.mu.RUnlock() + + ret := fmt.Sprintf("DUMPING ADJ-RIB-OUT:\n") + routes := a.rt.Dump() + for _, r := range routes { + ret += fmt.Sprintf("%s\n", r.Print()) + } + + return ret +} -- GitLab