diff --git a/protocols/bgp/server/fsm_address_family.go b/protocols/bgp/server/fsm_address_family.go index faf2ff3639505b5425cdb7499960f03c059c1f4d..3b77f4f43cc189d5f92d128ce7f967cfa729ad6f 100644 --- a/protocols/bgp/server/fsm_address_family.go +++ b/protocols/bgp/server/fsm_address_family.go @@ -56,7 +56,7 @@ func (f *fsmAddressFamily) init(n *routingtable.Neighbor) { contributingASNs.Add(f.fsm.peer.localASN) f.adjRIBIn.Register(f.rib) - f.adjRIBOut = adjRIBOut.New(n, f.exportFilter) + f.adjRIBOut = adjRIBOut.New(n, f.exportFilter, f.addPathRX) f.updateSender = newUpdateSender(f.fsm, f.afi, f.safi) f.updateSender.Start(time.Millisecond * 5) diff --git a/routingtable/adjRIBOut/adj_rib_out.go b/routingtable/adjRIBOut/adj_rib_out.go index b4271ea3c82734d6dd8f5e8dae7f2fb48db34c4b..50c717d04512c084eac04bfd953d6e9b9341c98f 100644 --- a/routingtable/adjRIBOut/adj_rib_out.go +++ b/routingtable/adjRIBOut/adj_rib_out.go @@ -17,18 +17,20 @@ type AdjRIBOut struct { routingtable.ClientManager rt *routingtable.RoutingTable neighbor *routingtable.Neighbor + addPathRX bool pathIDManager *pathIDManager - mu sync.RWMutex exportFilter *filter.Filter + mu sync.RWMutex } // New creates a new Adjacency RIB Out with BGP add path -func New(neighbor *routingtable.Neighbor, exportFilter *filter.Filter) *AdjRIBOut { +func New(neighbor *routingtable.Neighbor, exportFilter *filter.Filter, addPathRX bool) *AdjRIBOut { a := &AdjRIBOut{ rt: routingtable.NewRoutingTable(), neighbor: neighbor, pathIDManager: newPathIDManager(), exportFilter: exportFilter, + addPathRX: addPathRX, } a.ClientManager = routingtable.NewClientManager(a) return a @@ -47,7 +49,7 @@ func (a *AdjRIBOut) RouteCount() int64 { // AddPath adds path p to prefix `pfx` func (a *AdjRIBOut) AddPath(pfx bnet.Prefix, p *route.Path) error { if !routingtable.ShouldPropagateUpdate(pfx, p, a.neighbor) { - if a.neighbor.CapAddPathRX { + if a.addPathRX { a.removePathsForPrefix(pfx) } return nil @@ -94,8 +96,7 @@ func (a *AdjRIBOut) AddPath(pfx bnet.Prefix, p *route.Path) error { a.mu.Lock() defer a.mu.Unlock() - // AddPathRX capable neighbor - if a.neighbor.CapAddPathRX { + if a.addPathRX { pathID, err := a.pathIDManager.addPath(p) if err != nil { return fmt.Errorf("Unable to get path ID: %v", err) @@ -140,7 +141,7 @@ func (a *AdjRIBOut) RemovePath(pfx bnet.Prefix, p *route.Path) bool { a.rt.RemovePath(pfx, p) // If the neighbar has AddPath capabilities, try to find the PathID - if a.neighbor.CapAddPathRX { + if a.addPathRX { pathID, err := a.pathIDManager.releasePath(p) if err != nil { log.Warningf("Unable to release path for prefix %s: %v", pfx.String(), err) diff --git a/routingtable/adjRIBOut/adj_rib_out_test.go b/routingtable/adjRIBOut/adj_rib_out_test.go index 26eceeeed34b37d62303a9156f9074ba28411129..51465849d2e14bfb17086cbff14561c4f8b7eefe 100644 --- a/routingtable/adjRIBOut/adj_rib_out_test.go +++ b/routingtable/adjRIBOut/adj_rib_out_test.go @@ -22,10 +22,9 @@ func TestBestPathOnlyEBGP(t *testing.T) { IBGP: false, LocalASN: 41981, RouteServerClient: false, - CapAddPathRX: false, } - adjRIBOut := New(neighborBestOnlyEBGP, filter.NewAcceptAllFilter()) + adjRIBOut := New(neighborBestOnlyEBGP, filter.NewAcceptAllFilter(), false) tests := []struct { name string @@ -329,10 +328,9 @@ func TestBestPathOnlyIBGP(t *testing.T) { IBGP: true, LocalASN: 41981, RouteServerClient: false, - CapAddPathRX: false, } - adjRIBOut := New(neighborBestOnlyEBGP, filter.NewAcceptAllFilter()) + adjRIBOut := New(neighborBestOnlyEBGP, filter.NewAcceptAllFilter(), false) tests := []struct { name string @@ -544,12 +542,11 @@ func TestBestPathOnlyRRClient(t *testing.T) { IBGP: true, LocalASN: 41981, RouteServerClient: false, - CapAddPathRX: false, RouteReflectorClient: true, ClusterID: net.IPv4FromOctets(2, 2, 2, 2).ToUint32(), } - adjRIBOut := New(neighborBestOnlyRR, filter.NewAcceptAllFilter()) + adjRIBOut := New(neighborBestOnlyRR, filter.NewAcceptAllFilter(), false) tests := []struct { name string @@ -875,10 +872,9 @@ func TestAddPathIBGP(t *testing.T) { IBGP: true, LocalASN: 41981, RouteServerClient: false, - CapAddPathRX: true, } - adjRIBOut := New(neighborBestOnlyEBGP, filter.NewAcceptAllFilter()) + adjRIBOut := New(neighborBestOnlyEBGP, filter.NewAcceptAllFilter(), true) tests := []struct { name string diff --git a/routingtable/neighbor.go b/routingtable/neighbor.go index 8b320636806792a2091cdc3cb4556c1b55a842bc..b72c7a193bbf5f0867ea573aa0e0d0f94e319aab 100644 --- a/routingtable/neighbor.go +++ b/routingtable/neighbor.go @@ -27,7 +27,4 @@ type Neighbor struct { // ClusterID is our route reflectors clusterID ClusterID uint32 - - // CapAddPathRX indicates if the peer supports receiving multiple BGP paths - CapAddPathRX bool }