summaryrefslogtreecommitdiffhomepage
path: root/server/fsm.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/fsm.go')
-rw-r--r--server/fsm.go24
1 files changed, 24 insertions, 0 deletions
diff --git a/server/fsm.go b/server/fsm.go
index 6107f749..3817bd23 100644
--- a/server/fsm.go
+++ b/server/fsm.go
@@ -20,6 +20,7 @@ import (
"github.com/eapache/channels"
"github.com/osrg/gobgp/config"
"github.com/osrg/gobgp/packet/bgp"
+ "github.com/osrg/gobgp/packet/bmp"
"github.com/osrg/gobgp/table"
log "github.com/sirupsen/logrus"
"gopkg.in/tomb.v2"
@@ -182,6 +183,18 @@ func (fsm *FSM) bgpMessageStateUpdate(MessageType uint8, isIn bool) {
}
}
+func (fsm *FSM) bmpStatsUpdate(statType uint16, increment int) {
+ stats := &fsm.pConf.State.Messages.Received
+ switch statType {
+ // TODO
+ // Support other stat types.
+ case bmp.BMP_STAT_TYPE_WITHDRAW_UPDATE:
+ stats.WithdrawUpdate += uint32(increment)
+ case bmp.BMP_STAT_TYPE_WITHDRAW_PREFIX:
+ stats.WithdrawPrefix += uint32(increment)
+ }
+}
+
func NewFSM(gConf *config.Global, pConf *config.Neighbor, policy *table.RoutingPolicy) *FSM {
adminState := ADMIN_STATE_UP
if pConf.Config.AdminDown {
@@ -712,6 +725,17 @@ func (h *FSMHandler) recvMessageWithError() (*FsmMsg, error) {
return fmsg, err
}
+ if routes := len(body.WithdrawnRoutes); routes > 0 {
+ h.fsm.bmpStatsUpdate(bmp.BMP_STAT_TYPE_WITHDRAW_UPDATE, 1)
+ h.fsm.bmpStatsUpdate(bmp.BMP_STAT_TYPE_WITHDRAW_PREFIX, routes)
+ } else if attr := getPathAttrFromBGPUpdate(body, bgp.BGP_ATTR_TYPE_MP_UNREACH_NLRI); attr != nil {
+ mpUnreach := attr.(*bgp.PathAttributeMpUnreachNLRI)
+ if routes = len(mpUnreach.Value); routes > 0 {
+ h.fsm.bmpStatsUpdate(bmp.BMP_STAT_TYPE_WITHDRAW_UPDATE, 1)
+ h.fsm.bmpStatsUpdate(bmp.BMP_STAT_TYPE_WITHDRAW_PREFIX, routes)
+ }
+ }
+
table.UpdatePathAttrs4ByteAs(body)
if err = table.UpdatePathAggregator4ByteAs(body); err != nil {
fmsg.MsgData = err