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)