cwist
Modern C web framework with libttak runtime
Loading...
Searching...
No Matches
seq.h
Go to the documentation of this file.
1
17#ifndef __CWIST_CORE_SEQ_SEQ_H__
18#define __CWIST_CORE_SEQ_SEQ_H__
19
20#include <stdbool.h>
21#include <stddef.h>
22#include <stdint.h>
23
24#ifdef __cplusplus
25extern "C" {
26#endif
27
29#define CWIST_SEQ_HEADER_SIZE 8
30
32#define CWIST_SEQ_DEFAULT_CHUNK_PAYLOAD 1024
33
36#define CWIST_SEQ_MAX_CHUNKS 8192
37#define CWIST_SEQ_MAX_REASSEMBLED_SIZE (64U * 1024U * 1024U)
38
45typedef struct cwist_seq_chunk {
46 uint16_t seq;
47 uint16_t total;
48 uint16_t payload_len;
49 uint16_t chunk_size;
50 const uint8_t *payload;
52
60typedef struct cwist_seq_message {
61 uint8_t **chunks;
62 size_t *chunk_lens;
63 size_t count;
65
69typedef struct cwist_seq_assembler cwist_seq_assembler_t;
70
78bool cwist_seq_chunk_parse(const uint8_t *data, size_t len, cwist_seq_chunk_t *out);
79
88void cwist_seq_chunk_build_header(uint8_t out[CWIST_SEQ_HEADER_SIZE], uint16_t seq, uint16_t total,
89 uint16_t payload_len, uint16_t chunk_size);
90
101bool cwist_seq_split(const uint8_t *data, size_t len, uint16_t chunk_payload_size,
103
108
113
122
127
139
144
160 size_t out_cap);
161
172bool cwist_seq_assembler_get_data(cwist_seq_assembler_t *a, const uint8_t **out_data,
173 size_t *out_len);
174
179
180#ifdef __cplusplus
181}
182#endif
183
184#endif /* __CWIST_CORE_SEQ_SEQ_H__ */
cwist_seq_assembler_t * cwist_seq_assembler_create_limited(size_t max_data_len)
Create an assembler with a maximum possible reassembled size.
Definition seq.c:211
bool cwist_seq_assembler_is_complete(const cwist_seq_assembler_t *a)
Return true when every expected chunk has been received.
Definition seq.c:343
struct cwist_seq_message cwist_seq_message_t
Split a message into sequenced chunks.
bool cwist_seq_chunk_parse(const uint8_t *data, size_t len, cwist_seq_chunk_t *out)
Parse a sequence chunk from raw bytes.
Definition seq.c:63
struct cwist_seq_chunk cwist_seq_chunk_t
Parsed view of one sequenced chunk.
void cwist_seq_assembler_reset(cwist_seq_assembler_t *a)
Reset an assembler so it can receive a new message.
Definition seq.c:240
cwist_seq_assembler_t * cwist_seq_assembler_create(void)
Create an empty assembler.
Definition seq.c:196
void cwist_seq_assembler_destroy(cwist_seq_assembler_t *a)
Destroy an assembler and its internal buffer.
Definition seq.c:223
size_t cwist_seq_assembler_recovery_targets(const cwist_seq_assembler_t *a, uint16_t *out, size_t out_cap)
Return the sequence numbers still required to complete a message.
Definition seq.c:362
void cwist_seq_message_free(cwist_seq_message_t *msg)
Free all buffers allocated by cwist_seq_split().
Definition seq.c:178
bool cwist_seq_assembler_get_data(cwist_seq_assembler_t *a, const uint8_t **out_data, size_t *out_len)
Borrow the assembled message when complete.
Definition seq.c:390
bool cwist_seq_assembler_feed(cwist_seq_assembler_t *a, const cwist_seq_chunk_t *chunk)
Feed one parsed chunk into the assembler.
Definition seq.c:268
struct cwist_seq_assembler cwist_seq_assembler_t
Opaque stateful assembler that reorders chunks and detects duplicates.
Definition seq.h:69
void cwist_seq_chunk_build_header(uint8_t out[CWIST_SEQ_HEADER_SIZE], uint16_t seq, uint16_t total, uint16_t payload_len, uint16_t chunk_size)
Write an 8-byte sequence header.
Definition seq.c:97
#define CWIST_SEQ_HEADER_SIZE
Definition seq.h:29
bool cwist_seq_split(const uint8_t *data, size_t len, uint16_t chunk_payload_size, cwist_seq_message_t *out)
Split data into sequenced chunks.
Definition seq.c:125
Parsed view of one sequenced chunk.
Definition seq.h:45
uint16_t payload_len
Payload length in this chunk.
Definition seq.h:48
uint16_t total
Total chunks in the message.
Definition seq.h:47
uint16_t chunk_size
Payload length of a full chunk.
Definition seq.h:49
const uint8_t * payload
Pointer to payload bytes.
Definition seq.h:50
uint16_t seq
1-based sequence number.
Definition seq.h:46
Split a message into sequenced chunks.
Definition seq.h:60
size_t count
Number of chunks.
Definition seq.h:63
size_t * chunk_lens
Length of each chunk buffer.
Definition seq.h:62
uint8_t ** chunks
Array of chunk buffers.
Definition seq.h:61