summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPancakeTAS <pancake@mgnet.work>2026-06-13 15:24:12 +0200
committerPancakeTAS <pancake@mgnet.work>2026-06-14 16:27:22 +0200
commit83d421507cbec4dad613e501c998408a72745452 (patch)
treeb12575473492e6bf91992542694a2ed5a811595b /src
parentfix(mpu): Purge dropped packets from reorder heap (diff)
fix(mpu): Convert sequence number on wire into le64
Diffstat (limited to 'src')
-rw-r--r--src/mpu.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/src/mpu.c b/src/mpu.c
index f25f1d8..ec976a2 100644
--- a/src/mpu.c
+++ b/src/mpu.c
@@ -3,6 +3,7 @@
#include "mpu.h"
#include "heap.h"
+#include <endian.h>
#include <errno.h>
#include <stddef.h>
#include <stdint.h>
@@ -59,8 +60,6 @@ static inline uint64_t get_time_now(void) {
+ ((uint64_t) ts.tv_nsec / 1000000ULL);
}
-// FIXME: seq_num is never converted to network byte order
-
// TODO: Zero-copy send() requiring the user to reserve space for the header.
// Perhaps consider MSG_MORE for sending header & payload separately or sendmsg()
@@ -79,7 +78,7 @@ int mpu_send(mpu_ctx_t* ctx, const uint8_t* data, size_t len) {
memcpy(packet.buf + sizeof(mpu_hdr_t), data, len);
packet.hdr = (mpu_hdr_t) {
- .seq_num = ctx->send_seq_num++
+ .seq_num = htole64(ctx->send_seq_num++)
};
// Select path using weighted round-robin scheduler
@@ -135,7 +134,7 @@ ssize_t mpu_recv(mpu_ctx_t* ctx, uint8_t* data, size_t len) {
}
mpu_slot_t* slot = (mpu_slot_t*) node->user;
- if (slot->packet.hdr.seq_num < ctx->recv_seq_num) {
+ if (le64toh(slot->packet.hdr.seq_num) < ctx->recv_seq_num) {
heap_extract(&ctx->reorder_heap);
continue;
}
@@ -146,7 +145,7 @@ ssize_t mpu_recv(mpu_ctx_t* ctx, uint8_t* data, size_t len) {
break;
}
- ctx->recv_seq_num = slot->packet.hdr.seq_num + 1;
+ ctx->recv_seq_num = le64toh(slot->packet.hdr.seq_num) + 1;
heap_extract(&ctx->reorder_heap);
}
@@ -193,7 +192,7 @@ ssize_t mpu_recv(mpu_ctx_t* ctx, uint8_t* data, size_t len) {
slot->timestamp = get_time_now();
slot->packet_len = (uint16_t) packet_len;
- heap_insert(&ctx->reorder_heap, slot->packet.hdr.seq_num);
+ heap_insert(&ctx->reorder_heap, le64toh(slot->packet.hdr.seq_num));
}
}
}