From eef25266cb862b5e2c24450d158d99e3cb43e511 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Tue, 15 Jan 2013 13:33:16 +0100 Subject: [PATCH] Count the number of correctly received UDP packets. Keep track of the number of correct, non-replayed UDP packets that have been received, regardless of their content. This can be compared to the sequence number to determine the real packet loss. --- src/net_packet.c | 2 ++ src/node.h | 1 + src/protocol_key.c | 1 + src/sptps.c | 4 ++++ src/sptps.h | 1 + 5 files changed, 9 insertions(+) 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;