summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>2015-04-27 11:03:53 +0000
committerISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>2015-04-27 15:20:53 +0000
commite735b2b1cfdc7dd3ea9f1f324ab9158fc7f19802 (patch)
tree6c8d1aa4177ef367ee061b22fe0254a44a7a81ff
parent87a951546c43cb70ad3a03ec42de7cead8d25d72 (diff)
table: add AS loop detection
Signed-off-by: ISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>
-rw-r--r--server/peer.go9
-rw-r--r--table/path.go17
2 files changed, 26 insertions, 0 deletions
diff --git a/server/peer.go b/server/peer.go
index d56e3e34..d7c3ac07 100644
--- a/server/peer.go
+++ b/server/peer.go
@@ -551,6 +551,15 @@ func (peer *Peer) sendUpdateMsgFromPaths(pList []table.Path) {
continue
}
+ if peer.peerConfig.PeerAs == path.GetSourceAs() {
+ log.WithFields(log.Fields{
+ "Topic": "Peer",
+ "Key": peer.peerConfig.NeighborAddress,
+ "Data": path,
+ }).Debug("AS PATH loop, ignore.")
+ continue
+ }
+
if !path.IsWithdraw() {
applied, path := peer.applyPolicies(peer.exportPolicies, path)
if applied && path == nil {
diff --git a/table/path.go b/table/path.go
index 62a98aab..29d8a92d 100644
--- a/table/path.go
+++ b/table/path.go
@@ -35,6 +35,7 @@ type Path interface {
GetRouteFamily() bgp.RouteFamily
setSource(source *PeerInfo)
GetSource() *PeerInfo
+ GetSourceAs() uint32
GetNexthop() net.IP
SetNexthop(net.IP)
setWithdraw(withdraw bool)
@@ -224,6 +225,22 @@ func (pd *PathDefault) GetSource() *PeerInfo {
return pd.source
}
+func (pd *PathDefault) GetSourceAs() uint32 {
+ _, attr := pd.getPathAttr(bgp.BGP_ATTR_TYPE_AS_PATH)
+ if attr != nil {
+ asPathParam := attr.(*bgp.PathAttributeAsPath).Value
+ if len(asPathParam) == 0 {
+ return 0
+ }
+ asPath := asPathParam[len(asPathParam)-1].(*bgp.As4PathParam)
+ if asPath.Num == 0 {
+ return 0
+ }
+ return asPath.AS[asPath.Num-1]
+ }
+ return 0
+}
+
func (pd *PathDefault) GetNexthop() net.IP {
_, attr := pd.getPathAttr(bgp.BGP_ATTR_TYPE_NEXT_HOP)
if attr != nil {