Files
utun2/src/stream/stream_proto.h
T

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