ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
stream.c File Reference

Go to the source code of this file.

Data Structures

struct  emit_context_t

Functions

asciichat_error_t quic_stream_preamble (acip_traffic_class_t traffic_class, uint8_t output[8])
asciichat_error_t quic_stream_read (quic_stream_reader_t *reader, const void *bytes, size_t length, quic_stream_emit_fn emit, void *context)
asciichat_error_t quic_stream_finish (quic_stream_reader_t *reader)
void quic_stream_reset (quic_stream_reader_t *reader)

Function Documentation

◆ quic_stream_finish()

asciichat_error_t quic_stream_finish ( quic_stream_reader_t * reader)

Accept a clean FIN only at a packet boundary after a complete preamble.

Definition at line 74 of file lib/network/quic/stream.c.

74 {
75 if (!reader || reader->failed || reader->finished)
76 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid QUIC stream finish");
77 if (reader->preamble_used != sizeof(reader->preamble) || packet_decoder_pending(&reader->packets)) {
78 reader->failed = true;
79 return SET_ERRNO(ERROR_NETWORK_PROTOCOL, "Truncated QUIC stream");
80 }
81 reader->finished = true;
82 return ASCIICHAT_OK;
83}
#define SET_ERRNO(code,...)
@ ERROR_NETWORK_PROTOCOL
Definition error_codes.h:76
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_INVALID_PARAM
bool packet_decoder_pending(const packet_decoder_t *decoder)

References ASCIICHAT_OK, ERROR_INVALID_PARAM, ERROR_NETWORK_PROTOCOL, quic_stream_reader_t::failed, quic_stream_reader_t::finished, packet_decoder_pending(), quic_stream_reader_t::packets, quic_stream_reader_t::preamble, quic_stream_reader_t::preamble_used, and SET_ERRNO.

◆ quic_stream_preamble()

asciichat_error_t quic_stream_preamble ( acip_traffic_class_t traffic_class,
uint8_t output[8] )

Definition at line 9 of file lib/network/quic/stream.c.

10 {
11 if (!output || (unsigned)traffic_class > ACIP_TRAFFIC_VISUAL)
12 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid QUIC stream traffic class");
13 memcpy(output, stream_magic, sizeof(stream_magic));
14 output[4] = 1;
15 output[5] = (uint8_t)traffic_class;
16 output[6] = output[7] = 0;
17 return ASCIICHAT_OK;
18}
unsigned char uint8_t
Definition common.h:60
@ ACIP_TRAFFIC_VISUAL
Definition traffic.h:8

References ACIP_QUIC_STREAM_PREAMBLE_SIZE, ACIP_TRAFFIC_VISUAL, ASCIICHAT_OK, ERROR_INVALID_PARAM, and SET_ERRNO.

◆ quic_stream_read()

asciichat_error_t quic_stream_read ( quic_stream_reader_t * reader,
const void * bytes,
size_t length,
quic_stream_emit_fn emit,
void * context )

Feed on the connection's serialized receive lane. The callback borrows each complete packet until it returns. Errors are terminal until reset.

Definition at line 43 of file lib/network/quic/stream.c.

44 {
45 if (!reader || (!bytes && length) || !emit || reader->failed || reader->finished)
46 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid QUIC stream input");
47 const uint8_t *input = bytes;
48 if (reader->preamble_used < sizeof(reader->preamble)) {
49 size_t take = sizeof(reader->preamble) - reader->preamble_used;
50 if (take > length)
51 take = length;
52 if (take) {
53 memcpy(reader->preamble + reader->preamble_used, input, take);
54 reader->preamble_used += take;
55 input += take;
56 length -= take;
57 }
58 if (reader->preamble_used < sizeof(reader->preamble))
59 return ASCIICHAT_OK;
60 if (memcmp(reader->preamble, stream_magic, sizeof(stream_magic)) != 0 || reader->preamble[4] != 1 ||
61 reader->preamble[5] > ACIP_TRAFFIC_VISUAL || reader->preamble[6] || reader->preamble[7]) {
62 reader->failed = true;
63 return SET_ERRNO(ERROR_NETWORK_PROTOCOL, "Invalid QUIC stream preamble");
64 }
65 reader->traffic_class = (acip_traffic_class_t)reader->preamble[5];
66 }
67 emit_context_t emit_context = {.reader = reader, .emit = emit, .context = context};
68 asciichat_error_t result = packet_decoder_feed(&reader->packets, input, length, emit_packet, &emit_context);
69 if (result != ASCIICHAT_OK)
70 reader->failed = true;
71 return result;
72}
asciichat_error_t
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44
asciichat_error_t packet_decoder_feed(packet_decoder_t *decoder, const void *data, size_t length, packet_decoder_fn emit, void *arg)
acip_traffic_class_t traffic_class
acip_traffic_class_t
Definition traffic.h:5

References ACIP_TRAFFIC_VISUAL, ASCIICHAT_OK, ERROR_INVALID_PARAM, ERROR_NETWORK_PROTOCOL, quic_stream_reader_t::failed, quic_stream_reader_t::finished, packet_decoder_feed(), quic_stream_reader_t::packets, quic_stream_reader_t::preamble, quic_stream_reader_t::preamble_used, SET_ERRNO, and quic_stream_reader_t::traffic_class.

◆ quic_stream_reset()

void quic_stream_reset ( quic_stream_reader_t * reader)

Definition at line 85 of file lib/network/quic/stream.c.

85 {
86 if (reader) {
88 memset(reader, 0, sizeof(*reader));
89 }
90}
void packet_decoder_reset(packet_decoder_t *decoder)

References packet_decoder_reset(), and quic_stream_reader_t::packets.

Referenced by quic_connection_destroy().