diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2016-02-06 14:19:43 -0800 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2016-02-06 15:07:36 -0800 |
commit | d280168106c9ef9ed68ad117b913f52e6bae1827 (patch) | |
tree | 37d67be13c26c19a366e2c1d5621eff74a8984b4 /server | |
parent | fa6c8fe58b7ef9aca401262be8677bb4526c3fcd (diff) |
add route collector feature support
like openbgp's route collector, sends all updates (not only best).
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Diffstat (limited to 'server')
-rw-r--r-- | server/peer.go | 10 | ||||
-rw-r--r-- | server/server.go | 47 |
2 files changed, 35 insertions, 22 deletions
diff --git a/server/peer.go b/server/peer.go index bf4f2928..967a0e5d 100644 --- a/server/peer.go +++ b/server/peer.go @@ -108,13 +108,19 @@ func (peer *Peer) getBestFromLocal(rfList []bgp.RouteFamily) ([]*table.Path, []* options := &table.PolicyOptions{ Neighbor: peer.fsm.peerInfo.Address, } - for _, path := range peer.localRib.GetBestPathList(peer.TableID(), rfList) { + var source []*table.Path + if peer.gConf.Collector.Enabled { + source = peer.localRib.GetPathList(peer.TableID(), rfList) + } else { + source = peer.localRib.GetBestPathList(peer.TableID(), rfList) + } + for _, path := range source { p := peer.policy.ApplyPolicy(peer.TableID(), table.POLICY_DIRECTION_EXPORT, filterpath(peer, path), options) if p == nil { filtered = append(filtered, path) continue } - if !peer.isRouteServerClient() { + if !peer.gConf.Collector.Enabled && !peer.isRouteServerClient() { p = p.Clone(p.IsWithdraw) p.UpdatePathAttrs(&peer.gConf, &peer.conf) } diff --git a/server/server.go b/server/server.go index c8aba0d9..4dfb2ba2 100644 --- a/server/server.go +++ b/server/server.go @@ -896,18 +896,21 @@ func (server *BgpServer) propagateUpdate(peer *Peer, pathList []*table.Path) ([] dsts := rib.ProcessPaths(pathList) server.validatePaths(dsts, false) sendPathList := make([]*table.Path, 0, len(dsts)) - for _, dst := range dsts { - path := dst.NewFeed(table.GLOBAL_RIB_NAME) - if path != nil { - sendPathList = append(sendPathList, path) + if server.bgpConfig.Global.Collector.Enabled { + sendPathList = pathList + } else { + for _, dst := range dsts { + path := dst.NewFeed(table.GLOBAL_RIB_NAME) + if path != nil { + sendPathList = append(sendPathList, path) + } } - } - if len(sendPathList) == 0 { - return msgs, alteredPathList + if len(sendPathList) == 0 { + return msgs, alteredPathList + } + server.broadcastBests(sendPathList) } - server.broadcastBests(sendPathList) - for _, targetPeer := range server.neighborMap { if targetPeer.isRouteServerClient() || targetPeer.fsm.state != bgp.BGP_FSM_ESTABLISHED { continue @@ -917,7 +920,7 @@ func (server *BgpServer) propagateUpdate(peer *Peer, pathList []*table.Path) ([] options.Neighbor = targetPeer.fsm.peerInfo.Address for idx, path := range pathList { path = server.policy.ApplyPolicy(table.GLOBAL_RIB_NAME, table.POLICY_DIRECTION_EXPORT, filterpath(targetPeer, path), options) - if path != nil { + if path != nil && !server.bgpConfig.Global.Collector.Enabled { path = path.Clone(path.IsWithdraw) path.UpdatePathAttrs(&server.bgpConfig.Global, &targetPeer.conf) } @@ -1357,11 +1360,9 @@ func (server *BgpServer) handleModPathRequest(grpcReq *GrpcRequest) []*table.Pat case api.Operation_DEL: if len(arg.Uuid) > 0 { path := func() *table.Path { - for _, rf := range server.globalRib.GetRFlist() { - for _, path := range server.globalRib.GetPathList(table.GLOBAL_RIB_NAME, rf) { - if len(path.UUID()) > 0 && bytes.Equal(path.UUID(), arg.Uuid) { - return path - } + for _, path := range server.globalRib.GetPathList(table.GLOBAL_RIB_NAME, server.globalRib.GetRFlist()) { + if len(path.UUID()) > 0 && bytes.Equal(path.UUID(), arg.Uuid) { + return path } } return nil @@ -1488,7 +1489,7 @@ func (server *BgpServer) handleVrfRequest(req *GrpcRequest) []*table.Path { result.ResponseErr = fmt.Errorf("unsupported route family: %s", bgp.RouteFamily(arg.Family)) break } - paths := rib.GetPathList(table.GLOBAL_RIB_NAME, rf) + paths := rib.GetPathList(table.GLOBAL_RIB_NAME, []bgp.RouteFamily{rf}) dsts := make([]*api.Destination, 0, len(paths)) for _, path := range paths { ok := table.CanImportToVrf(vrfs[name], path) @@ -1828,10 +1829,16 @@ func (server *BgpServer) handleGrpc(grpcReq *GrpcRequest) []*SenderMsg { } if found { - r.Insert(table.CidrToRadixkey(key), &api.Destination{ - Prefix: key, - Paths: []*api.Path{p.ToApiStruct(peer.TableID())}, - }) + b, _ := r.Get(table.CidrToRadixkey(key)) + if b == nil { + r.Insert(table.CidrToRadixkey(key), &api.Destination{ + Prefix: key, + Paths: []*api.Path{p.ToApiStruct(peer.TableID())}, + }) + } else { + d := b.(*api.Destination) + d.Paths = append(d.Paths, p.ToApiStruct(peer.TableID())) + } } } r.Walk(func(s string, v interface{}) bool { |