85 lines
3.5 KiB
C
85 lines
3.5 KiB
C
/* Части RS имеют непроверенный внешний заголовок; подписанная пачка находится внутри RS.
|
|
* Данные ETCP-выдачи (handle/сессия/путь) добавляются снаружи и в подпись не входят.
|
|
* seq/subblock берутся из заголовка RS; seq повторяется в подписанной пачке и сверяется после decode. */
|
|
#ifndef STREAM_PROTO_H
|
|
#define STREAM_PROTO_H
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#include "../../lib/reed_solomon.h"
|
|
#include "../transport_layer/secure_channel.h"
|
|
|
|
#define STREAM_BLOCK_DOMAIN "stream_part1"
|
|
#define STREAM_BLOCK_DOMAIN_SIZE 12
|
|
#define STREAM_BLOCK_GROUP_OFF 12
|
|
#define STREAM_BLOCK_SOURCE_OFF 20
|
|
#define STREAM_BLOCK_EPOCH_OFF 28
|
|
#define STREAM_BLOCK_N_OFF 36
|
|
#define STREAM_BLOCK_R_OFF 37
|
|
#define STREAM_BLOCK_SIZE_OFF 38
|
|
#define STREAM_BLOCK_TIMESTAMP_OFF 40
|
|
#define STREAM_BLOCK_LENGTH_OFF 42
|
|
#define STREAM_BLOCK_FLAGS_OFF 46
|
|
#define STREAM_BLOCK_RS_OFF 47
|
|
#define STREAM_BLOCK_SEQ_OFF STREAM_BLOCK_RS_OFF
|
|
#define STREAM_BLOCK_SUB_OFF (STREAM_BLOCK_RS_OFF + 8)
|
|
#define STREAM_BLOCK_OVERHEAD STREAM_BLOCK_RS_OFF
|
|
#define STREAM_BATCH_DOMAIN "stream_batch"
|
|
#define STREAM_BATCH_SEQ_OFF STREAM_BLOCK_RS_OFF
|
|
#define STREAM_BATCH_HEADER (STREAM_BATCH_SEQ_OFF + 8)
|
|
#define STREAM_BATCH_OVERHEAD (STREAM_BATCH_HEADER + SC_SIGN_SIZE)
|
|
#define STREAM_BLOCK_DEFAULT_SIZE 1300
|
|
#define STREAM_RS_DEFAULT_SIZE (STREAM_BLOCK_DEFAULT_SIZE - STREAM_BLOCK_OVERHEAD)
|
|
#define STREAM_DEFAULT_N 8
|
|
#define STREAM_DEFAULT_R 0
|
|
#define STREAM_DEFAULT_INPUT_CAPACITY \
|
|
((STREAM_DEFAULT_N - STREAM_DEFAULT_R) * (STREAM_RS_DEFAULT_SIZE - RS_HEADER_SIZE) - STREAM_BATCH_OVERHEAD)
|
|
#define STREAM_BLOCK_MAX_SIZE (RS_MAX_BLOCK_SIZE + STREAM_BLOCK_OVERHEAD)
|
|
#define STREAM_BLOCK_TIME_RESET 0x01
|
|
#define STREAM_BUFFER_BYTES (32u * 1024u * 1024u)
|
|
#define STREAM_SOURCE_FLUSH_TB 1000 /* 100 мс, timebase 0.1 мс */
|
|
#define STREAM_LATE_MS 500
|
|
#define STREAM_TIMESTAMP_PERIOD_MS 65536u
|
|
|
|
struct stream_descriptor {
|
|
uint64_t group_id;
|
|
uint64_t source_node_id;
|
|
uint64_t source_epoch;
|
|
uint16_t block_size; /* Максимальный размер RS-кодограммы; фактический размер задан в каждой пачке. */
|
|
uint8_t n;
|
|
uint8_t r;
|
|
};
|
|
|
|
enum stream_result {
|
|
STREAM_OK = 0,
|
|
STREAM_DUPLICATE = 1,
|
|
STREAM_WAIT = 2,
|
|
STREAM_GAP = 3,
|
|
STREAM_EXPIRED = 4,
|
|
STREAM_REJECTED = 5, /* Пачка восстановлена, но подпись/подписанные метаданные не прошли проверку. */
|
|
STREAM_MORE = 6, /* Бюджет работы исчерпан; можно продолжить отложенным callback без новых данных. */
|
|
STREAM_ERR_ARGUMENT = -1,
|
|
STREAM_ERR_MEMORY = -2,
|
|
STREAM_ERR_FORMAT = -3,
|
|
STREAM_ERR_SIGNATURE = -4,
|
|
STREAM_ERR_CONFLICT = -5,
|
|
STREAM_ERR_STATE = -6,
|
|
STREAM_ERR_CRYPTO = -7,
|
|
STREAM_ERR_FEC = -8,
|
|
STREAM_ERR_NOT_MEMBER = -9
|
|
};
|
|
|
|
/* Короткие примитивы без доступа за границы: размер проверяет вызывающий parser. */
|
|
static inline uint64_t stream_read_be(const uint8_t *data, unsigned bytes) {
|
|
uint64_t result = 0;
|
|
for (unsigned i = 0; i < bytes; i++) result = (result << 8) | data[i];
|
|
return result;
|
|
}
|
|
|
|
static inline void stream_write_be(uint8_t *data, uint64_t value, unsigned bytes) {
|
|
for (unsigned i = 0; i < bytes; i++) data[bytes - i - 1] = (uint8_t)(value >> (8 * i));
|
|
}
|
|
|
|
#endif
|