diff --git a/protocols/bmp/packet/peer_down.go b/protocols/bmp/packet/peer_down.go index 27f75c4be59822816e4f714e07920fc6935ee630..cdb72ffe33f72dc77e4c7373b6041a467bbbf836 100644 --- a/protocols/bmp/packet/peer_down.go +++ b/protocols/bmp/packet/peer_down.go @@ -7,6 +7,11 @@ import ( "github.com/bio-routing/bio-rd/util/decoder" ) +const ( + reasonMin = 1 + reasonMax = 3 +) + // PeerDownNotification represents a peer down notification type PeerDownNotification struct { CommonHeader *CommonHeader @@ -41,7 +46,7 @@ func decodePeerDownNotification(buf *bytes.Buffer, ch *CommonHeader) (*PeerDownN return nil, err } - if p.Reason < 1 || p.Reason > 3 { + if p.Reason < reasonMin || p.Reason > reasonMax { return p, nil } diff --git a/protocols/bmp/server/router.go b/protocols/bmp/server/router.go index 8e12f604e16fe21b51e170e20c887b511141f05b..3e54e25c6c750933a07e2a1899c4e57e2405104b 100644 --- a/protocols/bmp/server/router.go +++ b/protocols/bmp/server/router.go @@ -11,13 +11,15 @@ import ( ) type router struct { - address net.IP - port uint16 - con net.Conn - reconnectTime int - reconnectTimer *time.Timer - rib4 *locRIB.LocRIB - rib6 *locRIB.LocRIB + address net.IP + port uint16 + con net.Conn + reconnectTimeMin int + reconnectTimeMax int + reconnectTime int + reconnectTimer *time.Timer + rib4 *locRIB.LocRIB + rib6 *locRIB.LocRIB } func (r *router) serve() { diff --git a/protocols/bmp/server/server.go b/protocols/bmp/server/server.go index 7116d0cab5a747f544c6f5301d3e61a1debb2474..8694ccc804dbefcf080f77f4c9a2da678ff65e41 100644 --- a/protocols/bmp/server/server.go +++ b/protocols/bmp/server/server.go @@ -9,6 +9,7 @@ import ( "github.com/bio-routing/bio-rd/protocols/bgp/packet" "github.com/bio-routing/bio-rd/routingtable/locRIB" + "github.com/bio-routing/tflow2/convert" log "github.com/sirupsen/logrus" ) @@ -17,8 +18,9 @@ const ( ) type BMPServer struct { - routers map[string]*router - routersMu sync.RWMutex + routers map[string]*router + routersMu sync.RWMutex + reconnectTime uint } func NewServer() *BMPServer { @@ -29,12 +31,13 @@ func NewServer() *BMPServer { func (b *BMPServer) AddRouter(addr net.IP, port uint16, rib4 *locRIB.LocRIB, rib6 *locRIB.LocRIB) { r := &router{ - address: addr, - port: port, - reconnectTime: 0, - reconnectTimer: time.NewTimer(time.Duration(0)), - rib4: rib4, - rib6: rib6, + address: addr, + port: port, + reconnectTimeMin: 30, // Suggested by RFC 7854 + reconnectTimeMax: 720, // Suggested by RFC 7854 + reconnectTimer: time.NewTimer(time.Duration(0)), + rib4: rib4, + rib6: rib6, } b.routersMu.Lock() @@ -48,8 +51,8 @@ func (b *BMPServer) AddRouter(addr net.IP, port uint16, rib4 *locRIB.LocRIB, rib if err != nil { log.Infof("Unable to connect to BMP router: %v", err) if r.reconnectTime == 0 { - r.reconnectTime = 30 - } else if r.reconnectTime < 720 { + r.reconnectTime = r.reconnectTimeMin + } else if r.reconnectTime < r.reconnectTimeMax { r.reconnectTime *= 2 } r.reconnectTimer = time.NewTimer(time.Second * time.Duration(r.reconnectTime)) @@ -70,7 +73,7 @@ func recvMsg(c net.Conn) (msg []byte, err error) { return nil, fmt.Errorf("Read failed: %v", err) } - l := int(buffer[1])*256*256*256 + int(buffer[2])*256*256 + int(buffer[3])*256 + int(buffer[4]) + l := convert.Uint32b(buffer[1:3]) if l > defaultBufferLen { tmp := buffer buffer = make([]byte, l)