refactor: simplify tracker

This commit is contained in:
lohhiiccc 2026-03-18 21:08:01 +01:00
parent 07588298cd
commit 896aa30726
5 changed files with 28 additions and 26 deletions

View file

@ -3,15 +3,15 @@
#include <stdint.h> #include <stdint.h>
#include <stddef.h> #include <stddef.h>
#include <stdbool.h>
#include <time.h> #include <time.h>
#include "internal/ping/tracker_flags.h"
#define PING_TRACKER_SLOTS 128 #define PING_TRACKER_SLOTS 128
struct ping_tracker_slot { struct ping_tracker_slot {
struct timespec ts; struct timespec ts;
bool used; uint8_t flags;
bool acked;
}; };
struct ping_tracker { struct ping_tracker {
@ -26,8 +26,5 @@ void ping_tracker_record_send(struct ping_tracker *t, uint16_t seq, const
int64_t ping_tracker_record_recv(struct ping_tracker *t, uint16_t seq, int64_t ping_tracker_record_recv(struct ping_tracker *t, uint16_t seq,
const struct timespec *ts); const struct timespec *ts);
#define ping_tracker_sent(t) ((t)->nb_sent)
#define ping_tracker_recv(t) ((t)->nb_recv)
#define ping_tracker_lost(t) ((t)->nb_sent - (t)->nb_recv)
#endif #endif

View file

@ -0,0 +1,7 @@
#ifndef PING_TRACKER_FLAGS_H
#define PING_TRACKER_FLAGS_H
#define TRACKER_SLOT_USED (1 << 0)
#define TRACKER_SLOT_ACKED (1 << 1)
#endif

View file

@ -8,9 +8,10 @@ ping_tracker_record_recv(struct ping_tracker *t, uint16_t seq,
struct ping_tracker_slot *slot; struct ping_tracker_slot *slot;
slot = &t->slots[seq % PING_TRACKER_SLOTS]; slot = &t->slots[seq % PING_TRACKER_SLOTS];
if (false == slot->used || true == slot->acked) if ((slot->flags & (TRACKER_SLOT_USED | TRACKER_SLOT_ACKED))
!= TRACKER_SLOT_USED)
return (-1); return (-1);
slot->acked = true; slot->flags |= TRACKER_SLOT_ACKED;
t->nb_recv++; t->nb_recv++;
return (icmp_time_diff_ns(&slot->ts, ts)); return (icmp_time_diff_ns(&slot->ts, ts));
} }

View file

@ -8,7 +8,6 @@ ping_tracker_record_send(struct ping_tracker *t, uint16_t seq,
slot = &t->slots[seq % PING_TRACKER_SLOTS]; slot = &t->slots[seq % PING_TRACKER_SLOTS];
slot->ts = *ts; slot->ts = *ts;
slot->used = true; slot->flags = TRACKER_SLOT_USED;
slot->acked = false;
t->nb_sent++; t->nb_sent++;
} }

View file

@ -17,9 +17,8 @@ Test(ping_tracker, init)
struct ping_tracker t; struct ping_tracker t;
ping_tracker_init(&t); ping_tracker_init(&t);
cr_assert_eq(ping_tracker_sent(&t), (size_t)0); cr_assert_eq(t.nb_sent, (size_t)0);
cr_assert_eq(ping_tracker_recv(&t), (size_t)0); cr_assert_eq(t.nb_recv, (size_t)0);
cr_assert_eq(ping_tracker_lost(&t), (size_t)0);
} }
Test(ping_tracker, basic_send_recv) Test(ping_tracker, basic_send_recv)
@ -35,9 +34,8 @@ Test(ping_tracker, basic_send_recv)
ping_tracker_record_send(&t, 1, &ts_send); ping_tracker_record_send(&t, 1, &ts_send);
rtt = ping_tracker_record_recv(&t, 1, &ts_recv); rtt = ping_tracker_record_recv(&t, 1, &ts_recv);
cr_assert_eq(rtt, (int64_t)10000000, "Expected RTT of 10ms in ns"); cr_assert_eq(rtt, (int64_t)10000000, "Expected RTT of 10ms in ns");
cr_assert_eq(ping_tracker_sent(&t), (size_t)1); cr_assert_eq(t.nb_sent, (size_t)1);
cr_assert_eq(ping_tracker_recv(&t), (size_t)1); cr_assert_eq(t.nb_recv, (size_t)1);
cr_assert_eq(ping_tracker_lost(&t), (size_t)0);
} }
Test(ping_tracker, double_recv_ignored) Test(ping_tracker, double_recv_ignored)
@ -55,7 +53,7 @@ Test(ping_tracker, double_recv_ignored)
cr_assert(rtt >= 0, "First recv should succeed"); cr_assert(rtt >= 0, "First recv should succeed");
rtt = ping_tracker_record_recv(&t, 5, &ts_recv); rtt = ping_tracker_record_recv(&t, 5, &ts_recv);
cr_assert_eq(rtt, (int64_t)-1, "Duplicate recv should return -1"); cr_assert_eq(rtt, (int64_t)-1, "Duplicate recv should return -1");
cr_assert_eq(ping_tracker_recv(&t), (size_t)1); cr_assert_eq(t.nb_recv, (size_t)1);
} }
Test(ping_tracker, unknown_seq_returns_minus_one) Test(ping_tracker, unknown_seq_returns_minus_one)
@ -97,9 +95,9 @@ Test(ping_tracker, lost_count)
ping_tracker_record_send(&t, 2, &ts); ping_tracker_record_send(&t, 2, &ts);
ping_tracker_record_send(&t, 3, &ts); ping_tracker_record_send(&t, 3, &ts);
ping_tracker_record_recv(&t, 2, &ts); ping_tracker_record_recv(&t, 2, &ts);
cr_assert_eq(ping_tracker_sent(&t), (size_t)3); cr_assert_eq(t.nb_sent, (size_t)3);
cr_assert_eq(ping_tracker_recv(&t), (size_t)1); cr_assert_eq(t.nb_recv, (size_t)1);
cr_assert_eq(ping_tracker_lost(&t), (size_t)2); cr_assert_eq(t.nb_sent - t.nb_recv, (size_t)2);
} }
Test(ping_tracker, sent_count_increments) Test(ping_tracker, sent_count_increments)
@ -112,7 +110,7 @@ Test(ping_tracker, sent_count_increments)
ping_tracker_record_send(&t, 1, &ts); ping_tracker_record_send(&t, 1, &ts);
ping_tracker_record_send(&t, 2, &ts); ping_tracker_record_send(&t, 2, &ts);
ping_tracker_record_send(&t, 3, &ts); ping_tracker_record_send(&t, 3, &ts);
cr_assert_eq(ping_tracker_sent(&t), (size_t)3); cr_assert_eq(t.nb_sent, (size_t)3);
} }
Test(ping_tracker, recv_rtt_positive) Test(ping_tracker, recv_rtt_positive)
@ -148,8 +146,8 @@ Test(ping_tracker, slot_reuse_after_wraparound)
ping_tracker_record_send(&t, 129, &ts_send); ping_tracker_record_send(&t, 129, &ts_send);
rtt = ping_tracker_record_recv(&t, 129, &ts_recv); rtt = ping_tracker_record_recv(&t, 129, &ts_recv);
cr_assert(rtt >= 0, "Second round RTT should be >= 0"); cr_assert(rtt >= 0, "Second round RTT should be >= 0");
cr_assert_eq(ping_tracker_sent(&t), (size_t)2); cr_assert_eq(t.nb_sent, (size_t)2);
cr_assert_eq(ping_tracker_recv(&t), (size_t)2); cr_assert_eq(t.nb_recv, (size_t)2);
} }
Test(ping_tracker, full_buffer) Test(ping_tracker, full_buffer)
@ -162,6 +160,6 @@ Test(ping_tracker, full_buffer)
ts = make_ts(0, 0); ts = make_ts(0, 0);
for (seq = 1; seq <= 128; seq++) for (seq = 1; seq <= 128; seq++)
ping_tracker_record_send(&t, seq, &ts); ping_tracker_record_send(&t, seq, &ts);
cr_assert_eq(ping_tracker_sent(&t), (size_t)128); cr_assert_eq(t.nb_sent, (size_t)128);
cr_assert_eq(ping_tracker_recv(&t), (size_t)0); cr_assert_eq(t.nb_recv, (size_t)0);
} }