summaryrefslogtreecommitdiffhomepage
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/peer.go45
-rw-r--r--server/server.go34
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)...)
}