diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/peer.go | 45 | ||||
-rw-r--r-- | server/server.go | 34 |
2 files changed, 49 insertions, 30 deletions
diff --git a/server/peer.go b/server/peer.go index 9bc79be8..dde83b6c 100644 --- a/server/peer.go +++ b/server/peer.go @@ -116,6 +116,23 @@ func (peer *Peer) configuredRFlist() []bgp.RouteFamily { return rfList } +func (peer *Peer) updateAccepted(accepted uint32) { + peer.accepted = accepted + peer.staleAccepted = false +} + +func (peer *Peer) getAccepted(rfList []bgp.RouteFamily) []*table.Path { + var pathList []*table.Path + for _, rf := range rfList { + for _, path := range peer.adjRib.GetInPathList(rf) { + if path.Filtered == false { + pathList = append(pathList, path) + } + } + } + return pathList +} + func (peer *Peer) handleBGPmessage(m *bgp.BGPMessage) ([]*table.Path, bool, []*bgp.BGPMessage) { bgpMsgList := []*bgp.BGPMessage{} pathList := []*table.Path{} @@ -214,7 +231,11 @@ func (peer *Peer) handleBGPmessage(m *bgp.BGPMessage) ([]*table.Path, bool, []*b } table.UpdatePathAttrs4ByteAs(body) pathList = table.ProcessMessage(m, peer.peerInfo) - peer.adjRib.UpdateIn(pathList) + if len(pathList) > 0 { + peer.staleAccepted = true + peer.ApplyPolicy(table.POLICY_DIRECTION_IN, pathList) + peer.adjRib.UpdateIn(pathList) + } case bgp.BGP_MSG_NOTIFICATION: body := m.Body.(*bgp.BGPNotification) log.WithFields(log.Fields{ @@ -307,17 +328,10 @@ func (peer *Peer) ToApiStruct() *api.Peer { for _, rf := range peer.configuredRFlist() { advertized += uint32(peer.adjRib.GetOutCount(rf)) received += uint32(peer.adjRib.GetInCount(rf)) - if peer.staleAccepted { - for _, path := range peer.adjRib.GetInPathList(rf) { - if path.Filtered == false { - accepted++ - } - } - } } if peer.staleAccepted { - peer.staleAccepted = false - peer.accepted = accepted + accepted = uint32(len(peer.getAccepted(peer.configuredRFlist()))) + peer.updateAccepted(accepted) } else { accepted = peer.accepted } @@ -412,9 +426,6 @@ func (peer *Peer) GetDefaultPolicy(d table.PolicyDirection) table.RouteType { } func (peer *Peer) ApplyPolicy(d table.PolicyDirection, paths []*table.Path) ([]*table.Path, []*table.Path) { - if d == table.POLICY_DIRECTION_IN { - peer.staleAccepted = true - } newpaths := make([]*table.Path, 0, len(paths)) filteredPaths := make([]*table.Path, 0) for _, path := range paths { @@ -433,10 +444,14 @@ func (peer *Peer) ApplyPolicy(d table.PolicyDirection, paths []*table.Path) ([]* switch result { case table.ROUTE_TYPE_ACCEPT: - path.Filtered = false + if d == table.POLICY_DIRECTION_IN { + path.Filtered = false + } newpaths = append(newpaths, newpath) case table.ROUTE_TYPE_REJECT: - path.Filtered = true + if d == table.POLICY_DIRECTION_IN { + path.Filtered = true + } filteredPaths = append(filteredPaths, path) log.WithFields(log.Fields{ "Topic": "Peer", diff --git a/server/server.go b/server/server.go index 9b684afc..50e562b2 100644 --- a/server/server.go +++ b/server/server.go @@ -356,16 +356,10 @@ func (server *BgpServer) Serve() { if peer.isRouteServerClient() { peer.setPolicy(server.policyMap) pathList := make([]*table.Path, 0) + rfList := peer.configuredRFlist() for _, p := range server.neighborMap { - if p.isRouteServerClient() == false { - continue - } - for _, rf := range peer.configuredRFlist() { - for _, path := range p.adjRib.GetInPathList(rf) { - if path.Filtered == false { - pathList = append(pathList, path) - } - } + if p.isRouteServerClient() == true { + pathList = append(pathList, p.getAccepted(rfList)...) } } pathList, _ = peer.ApplyPolicy(table.POLICY_DIRECTION_IMPORT, pathList) @@ -651,7 +645,6 @@ func (server *BgpServer) broadcastPeerState(peer *Peer) { func (server *BgpServer) propagateUpdate(peer *Peer, pathList []*table.Path) []*SenderMsg { msgs := make([]*SenderMsg, 0) if peer != nil && peer.isRouteServerClient() { - pathList, _ = peer.ApplyPolicy(table.POLICY_DIRECTION_IN, pathList) for _, targetPeer := range server.neighborMap { rib := targetPeer.localRib if !targetPeer.isRouteServerClient() || rib.OwnerName() == peer.conf.NeighborConfig.NeighborAddress.String() { @@ -814,7 +807,18 @@ func (server *BgpServer) handleFSMMessage(peer *Peer, e *fsmMsg, incoming chan * server.broadcastMsgs = append(server.broadcastMsgs, bm) } } - msgs = append(msgs, server.propagateUpdate(peer, pathList)...) + // FIXME: refactor peer.handleBGPmessage and this func + if peer.isRouteServerClient() { + var accepted []*table.Path + for _, p := range pathList { + if p.Filtered == false { + accepted = append(accepted, p) + } + } + msgs = append(msgs, server.propagateUpdate(peer, accepted)...) + } else { + msgs = append(msgs, server.propagateUpdate(peer, pathList)...) + } default: log.WithFields(log.Fields{ "Topic": "Peer", @@ -1454,10 +1458,6 @@ func (server *BgpServer) handleGrpc(grpcReq *GrpcRequest) []*SenderMsg { if err != nil { break } - for _, peer := range peers { - peer.staleAccepted = false - peer.accepted = 0 - } if grpcReq.RequestType == REQ_NEIGHBOR_SOFT_RESET { logOp(grpcReq.Name, "Neighbor soft reset") } else { @@ -1466,6 +1466,10 @@ func (server *BgpServer) handleGrpc(grpcReq *GrpcRequest) []*SenderMsg { for _, peer := range peers { pathList := peer.adjRib.GetInPathList(grpcReq.RouteFamily) + if peer.isRouteServerClient() { + pathList, _ = peer.ApplyPolicy(table.POLICY_DIRECTION_IN, pathList) + peer.updateAccepted(uint32(len(pathList))) + } msgs = append(msgs, server.propagateUpdate(peer, pathList)...) } |