34 lines
1.3 KiB
C
34 lines
1.3 KiB
C
/* Учёт первой доставки payload логического канала. Один uasync-поток.
|
|
* Десять завершённых интервалов по 50мс и текущий интервал; reset начинает новую историю.
|
|
* Повторы учитывает вызывающий: add вызывается только при снятии подтверждённого inflight. */
|
|
#ifndef ROUTE_TX_STATS_H
|
|
#define ROUTE_TX_STATS_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define ROUTE_TX_SAMPLE_US 50000u
|
|
#define ROUTE_TX_WINDOW_US 500000u
|
|
#define ROUTE_TX_BUCKETS 11
|
|
|
|
struct route_tx_bucket { uint64_t tick_plus_one, bytes, packets; };
|
|
struct route_tx_meter {
|
|
struct route_tx_bucket buckets[ROUTE_TX_BUCKETS];
|
|
uint64_t started_us, last_us, bytes, packets;
|
|
};
|
|
struct route_tx_window { uint64_t end_us, bytes, packets; int valid; };
|
|
|
|
void route_tx_meter_reset(struct route_tx_meter *meter, uint64_t now_us);
|
|
int route_tx_meter_ack(struct route_tx_meter *meter, uint64_t now_us, uint64_t bytes);
|
|
/* Неполное окно после reset возвращает valid=0; текущая незавершённая ячейка исключается. */
|
|
int route_tx_meter_window(const struct route_tx_meter *meter, uint64_t now_us, struct route_tx_window *out);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|