aboutsummaryrefslogtreecommitdiff
path: root/src/openvpn/packet_id.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/openvpn/packet_id.c')
-rw-r--r--src/openvpn/packet_id.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/openvpn/packet_id.c b/src/openvpn/packet_id.c
index 5175fb0..10fe402 100644
--- a/src/openvpn/packet_id.c
+++ b/src/openvpn/packet_id.c
@@ -325,27 +325,37 @@ packet_id_read(struct packet_id_net *pin, struct buffer *buf, bool long_form)
return true;
}
-static void
+static bool
packet_id_send_update(struct packet_id_send *p, bool long_form)
{
if (!p->time)
{
p->time = now;
}
- p->id++;
- if (!p->id)
+ if (p->id == PACKET_ID_MAX)
{
- ASSERT(long_form);
+ /* Packet ID only allowed to roll over if using long form and time has
+ * moved forward since last roll over.
+ */
+ if (!long_form || now <= p->time)
+ {
+ return false;
+ }
p->time = now;
- p->id = 1;
+ p->id = 0;
}
+ p->id++;
+ return true;
}
bool
packet_id_write(struct packet_id_send *p, struct buffer *buf, bool long_form,
bool prepend)
{
- packet_id_send_update(p, long_form);
+ if (!packet_id_send_update(p, long_form))
+ {
+ return false;
+ }
const packet_id_type net_id = htonpid(p->id);
const net_time_t net_time = htontime(p->time);