diff --git a/src/net_packet.c b/src/net_packet.c
index 3c3397cd..c0be8c4d 100644
--- a/src/net_packet.c
+++ b/src/net_packet.c
@@ -365,6 +365,8 @@ static void receive_udppacket(node_t *n, vpn_packet_t *inpkt) {
 	if(inpkt->seqno > n->received_seqno)
 		n->received_seqno = inpkt->seqno;
 
+	n->received++;
+
 	if(n->received_seqno > MAX_SEQNO)
 		regenerate_key();
 
diff --git a/src/node.h b/src/node.h
index c567ad92..662ad683 100644
--- a/src/node.h
+++ b/src/node.h
@@ -77,6 +77,7 @@ typedef struct node_t {
 
 	uint32_t sent_seqno;                    /* Sequence number last sent to this node */
 	uint32_t received_seqno;                /* Sequence number last received from this node */
+	uint32_t received;                      /* Total valid packets received from this node */
 	uint32_t farfuture;                     /* Packets in a row that have arrived from the far future */
 	unsigned char* late;                    /* Bitfield marking late packets */
 
diff --git a/src/protocol_key.c b/src/protocol_key.c
index b54df3c8..f96c24e8 100644
--- a/src/protocol_key.c
+++ b/src/protocol_key.c
@@ -278,6 +278,7 @@ bool send_ans_key(node_t *to) {
 	// Reset sequence number and late packet window
 	mykeyused = true;
 	to->received_seqno = 0;
+	to->received = 0;
 	if(replaywin) memset(to->late, 0, replaywin);
 
 	return send_request(to->nexthop->connection, "%d %s %s %s %d %d %d %d", ANS_KEY,
diff --git a/src/sptps.c b/src/sptps.c
index 386b6fd2..c22926a8 100644
--- a/src/sptps.c
+++ b/src/sptps.c
@@ -486,6 +486,10 @@ static bool sptps_receive_data_datagram(sptps_t *s, const char *data, size_t len
 	if(seqno > s->inseqno)
 		s->inseqno = seqno + 1;
 
+	if(!s->inseqno)
+		s->received = 0;
+	else
+		s->received++;
 
 	// Decrypt.
 	cipher_set_counter(&s->incipher, &seqno, sizeof seqno);
diff --git a/src/sptps.h b/src/sptps.h
index a19be979..bf3a3b96 100644
--- a/src/sptps.h
+++ b/src/sptps.h
@@ -56,6 +56,7 @@ typedef struct sptps {
 	cipher_t incipher;
 	digest_t indigest;
 	uint32_t inseqno;
+	uint32_t received;
 	unsigned int replaywin;
 	unsigned int farfuture;
 	char *late;