diff --git a/protocols/bgp/server/peer.go b/protocols/bgp/server/peer.go
index 4402bb7024537bb329e5fae92eab198ecea85a8c..c7cbe4d940e37570badb9c39f00db81950ae80f7 100644
--- a/protocols/bgp/server/peer.go
+++ b/protocols/bgp/server/peer.go
@@ -16,6 +16,7 @@ type PeerInfo struct {
 	PeerAddr bnet.IP
 	PeerASN  uint32
 	LocalASN uint32
+	States   []string
 }
 
 type peer struct {
@@ -52,10 +53,19 @@ type familyParameters struct {
 }
 
 func (p *peer) snapshot() PeerInfo {
+	p.fsmsMu.Lock()
+	defer p.fsmsMu.Unlock()
+	states := make([]string, 0, len(p.fsms))
+	for _, fsm := range p.fsms {
+		fsm.stateMu.RLock()
+		states = append(states, stateName(fsm.state))
+		fsm.stateMu.RUnlock()
+	}
 	return PeerInfo{
 		PeerAddr: p.addr,
 		PeerASN:  p.peerASN,
 		LocalASN: p.localASN,
+		States:   states,
 	}
 }
 
diff --git a/protocols/bgp/server/server_test.go b/protocols/bgp/server/server_test.go
index 10c1266cf65e557e1df27c02808e30d4bd74f310..9d9248c4d8e1f574e3cc3f519d412de3bbf5140a 100644
--- a/protocols/bgp/server/server_test.go
+++ b/protocols/bgp/server/server_test.go
@@ -10,6 +10,7 @@ import (
 	"github.com/bio-routing/bio-rd/routingtable/locRIB"
 
 	bnet "github.com/bio-routing/bio-rd/net"
+	"github.com/stretchr/testify/assert"
 )
 
 func TestBgpServerPeerSnapshot(t *testing.T) {
@@ -60,13 +61,12 @@ func TestBgpServerPeerSnapshot(t *testing.T) {
 		break
 	}
 
-	if want, got := bnet.IPv4FromOctets(169, 254, 200, 1), peer.PeerAddr; !want.Equal(got) {
-		t.Errorf("PeerAddr: got %v, want %v", got, want)
-	}
-	if want, got := uint32(65300), peer.PeerASN; want != got {
-		t.Errorf("PeerASN: got %v, want %v", got, want)
-	}
-	if want, got := uint32(204880), peer.LocalASN; want != got {
-		t.Errorf("PeerASN: got %v, want %v", got, want)
+	want := PeerInfo{
+		PeerAddr: bnet.IPv4FromOctets(169, 254, 200, 1),
+		PeerASN:  uint32(65300),
+		LocalASN: uint32(204880),
+		States:   []string{"idle"},
 	}
+
+	assert.Equal(t, want, peer)
 }