summaryrefslogtreecommitdiffhomepage
path: root/pkg/server/peer.go
diff options
context:
space:
mode:
authorYichen Wang <yicwang@cisco.com>2018-08-16 15:48:57 -0700
committerYichen Wang <yicwang@cisco.com>2018-08-16 19:58:00 -0700
commit540ee758f07696cfc5f35127dd11dfcd103ebd50 (patch)
tree2b881b43606f962a1f9d8467e833d1338114faeb /pkg/server/peer.go
parentf0b724878360618dd0a950364709b048486771b6 (diff)
pkg/server: handleUpdate() should not inject echo route from RR
Diffstat (limited to 'pkg/server/peer.go')
-rw-r--r--pkg/server/peer.go18
1 files changed, 18 insertions, 0 deletions
diff --git a/pkg/server/peer.go b/pkg/server/peer.go
index c125a5ba..1f67fd48 100644
--- a/pkg/server/peer.go
+++ b/pkg/server/peer.go
@@ -491,6 +491,24 @@ func (peer *Peer) handleUpdate(e *FsmMsg) ([]*table.Path, []bgp.RouteFamily, *bg
continue
}
}
+ // RFC4456 8. Avoiding Routing Information Loops
+ // A router that recognizes the ORIGINATOR_ID attribute SHOULD
+ // ignore a route received with its BGP Identifier as the ORIGINATOR_ID.
+ peer.fsm.lock.RLock()
+ isIBGPPeer := peer.isIBGPPeer()
+ routerId := peer.fsm.gConf.Config.RouterId
+ peer.fsm.lock.RUnlock()
+ if isIBGPPeer {
+ if id := path.GetOriginatorID(); routerId == id.String() {
+ log.WithFields(log.Fields{
+ "Topic": "Peer",
+ "Key": peer.ID(),
+ "OriginatorID": id,
+ "Data": path,
+ }).Debug("Originator ID is mine, ignore")
+ continue
+ }
+ }
paths = append(paths, path)
}
peer.adjRibIn.Update(e.PathList)