HERMES Modem
Hermes ARQ/Broadcast modem
Loading...
Searching...
No Matches
arq_timing.h
Go to the documentation of this file.
1/* HERMES Modem — ARQ Timing: instrumentation context and record API
2 *
3 * Copyright (C) 2025 Rhizomatica
4 * Author: Rafael Diniz <rafael@riseup.net>
5 *
6 * SPDX-License-Identifier: GPL-3.0-or-later
7 */
8
9#ifndef ARQ_TIMING_H_
10#define ARQ_TIMING_H_
11
12#include <stdbool.h>
13#include <stdint.h>
14
15/* ======================================================================
16 * Timing context
17 *
18 * Timestamps are uint64_t monotonic milliseconds (from hermes_log startup).
19 * Counters are unsigned and accumulate over the session lifetime.
20 * SNR values are stored as integer * 10 to avoid float in the critical path.
21 * ====================================================================== */
22
23typedef struct
24{
25 /* Per-frame timestamps (reset at each new TX sequence) */
26 uint64_t tx_queue_ms; /* when frame was submitted to action queue */
27 uint64_t tx_start_ms; /* when PTT went ON (frame on air) */
28 uint64_t tx_end_ms; /* when PTT went OFF */
29 uint64_t ack_rx_ms; /* when ACK for this seq was decoded */
30 uint64_t data_rx_ms; /* when last data frame was decoded (IRS side) */
31 uint64_t ack_tx_start_ms; /* when ACK TX started (IRS side) */
32
33 /* Derived measurements */
34 uint32_t rtt_ms; /* OTA RTT for last ACKed frame */
35 uint32_t ack_delay_ms; /* peer-reported delay between data-rx/ack-tx */
36
37 /* Per-frame retry state */
38 uint32_t retry_count; /* retries for current tx_seq */
39
40 /* SNR (integer * 10, e.g. -23 = -2.3 dB) */
43
44 /* Session cumulative counters */
45 uint64_t tx_bytes;
46 uint64_t rx_bytes;
47 uint64_t retries_total;
48 uint64_t frames_tx;
49 uint64_t frames_rx;
51
52/* ======================================================================
53 * API
54 * ====================================================================== */
55
58
65void arq_timing_record_tx_queue(arq_timing_ctx_t *ctx, int seq, int mode,
66 int backlog_bytes, int payload_bytes);
67
69void arq_timing_record_tx_start(arq_timing_ctx_t *ctx, int seq, int mode,
70 int backlog_bytes);
71
74
83 uint8_t ack_delay_raw, int peer_snr_x10);
84
87 int bytes, int snr_x10);
88
91
100 int attempt, const char *reason);
101
108void arq_timing_record_turn(arq_timing_ctx_t *ctx, bool to_iss,
109 const char *reason);
110
113
115void arq_timing_record_disconnect(arq_timing_ctx_t *ctx, const char *reason);
116
117#endif /* ARQ_TIMING_H_ */
void arq_timing_init(arq_timing_ctx_t *ctx)
Zero-initialise a timing context at session start.
Definition arq_timing.c:31
void arq_timing_record_connect(arq_timing_ctx_t *ctx, int mode)
Record session connected; logs [TMG] connect.
Definition arq_timing.c:117
void arq_timing_record_tx_queue(arq_timing_ctx_t *ctx, int seq, int mode, int backlog_bytes, int payload_bytes)
Record frame queued for TX; logs [TMG] tx_queue.
Definition arq_timing.c:36
void arq_timing_record_ack_rx(arq_timing_ctx_t *ctx, int seq, uint8_t ack_delay_raw, int peer_snr_x10)
Record ACK received; computes and logs OTA RTT.
Definition arq_timing.c:63
void arq_timing_record_turn(arq_timing_ctx_t *ctx, bool to_iss, const char *reason)
Record turn direction change; logs [TMG] turn.
Definition arq_timing.c:110
void arq_timing_record_tx_end(arq_timing_ctx_t *ctx, int seq)
Record PTT OFF; logs [TMG] tx_end with duration.
Definition arq_timing.c:56
void arq_timing_record_retry(arq_timing_ctx_t *ctx, int seq, int attempt, const char *reason)
Record a retry event; logs [TMG] retry.
Definition arq_timing.c:102
void arq_timing_record_ack_tx(arq_timing_ctx_t *ctx, int seq)
Record ACK TX started (IRS side); logs [TMG] ack_tx.
Definition arq_timing.c:93
void arq_timing_record_data_rx(arq_timing_ctx_t *ctx, int seq, int bytes, int snr_x10)
Record data frame decoded (IRS side); logs [TMG] data_rx.
Definition arq_timing.c:82
void arq_timing_record_disconnect(arq_timing_ctx_t *ctx, const char *reason)
Record session disconnected; logs [TMG] disconnect and session totals.
Definition arq_timing.c:123
void arq_timing_record_tx_start(arq_timing_ctx_t *ctx, int seq, int mode, int backlog_bytes)
Record PTT ON; logs [TMG] tx_start.
Definition arq_timing.c:47
Definition arq_timing.h:24
uint64_t tx_queue_ms
Definition arq_timing.h:26
uint64_t frames_tx
Definition arq_timing.h:48
uint64_t frames_rx
Definition arq_timing.h:49
uint32_t retry_count
Definition arq_timing.h:38
uint64_t ack_rx_ms
Definition arq_timing.h:29
uint64_t tx_bytes
Definition arq_timing.h:45
uint64_t data_rx_ms
Definition arq_timing.h:30
uint32_t ack_delay_ms
Definition arq_timing.h:35
int last_snr_local_x10
Definition arq_timing.h:41
int last_snr_peer_x10
Definition arq_timing.h:42
uint64_t ack_tx_start_ms
Definition arq_timing.h:31
uint64_t retries_total
Definition arq_timing.h:47
uint32_t rtt_ms
Definition arq_timing.h:34
uint64_t tx_start_ms
Definition arq_timing.h:27
uint64_t tx_end_ms
Definition arq_timing.h:28
uint64_t rx_bytes
Definition arq_timing.h:46