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

Go to the source code of this file.

Data Structures

struct  received_packet
struct  quic_transport_t

Macros

#define QUIC_RECEIVE_BUDGET   (16U * 1024U * 1024U)

Typedefs

typedef struct received_packet received_packet_t

Functions

asciichat_error_t quic_transport_peer_address (acip_transport_t *transport, struct sockaddr_storage *address, socklen_t *length)
void quic_transport_set_close_on_lane (acip_transport_t *transport, void(*close)(quic_connection_t *, void *), void *context)
asciichat_error_t quic_transport_fail (acip_transport_t *transport, asciichat_error_t reason)
asciichat_error_t quic_transport_fail_on_lane (acip_transport_t *transport, asciichat_error_t reason)
asciichat_error_t quic_transport_destroy_unclaimed_on_lane (acip_transport_t **transport, asciichat_error_t reason)
asciichat_error_t quic_transport_set_waker_on_lane (acip_transport_t *transport, void(*wake)(void *), void *context)
asciichat_error_t quic_transport_set_waker (acip_transport_t *transport, void(*wake)(void *), void *context)
asciichat_error_t quic_transport_begin_security (acip_transport_t *transport, crypto_context_t *crypto)
bool quic_transport_security_ready (acip_transport_t *transport)
asciichat_error_t quic_transport_wait_security (acip_transport_t *transport, uint64_t timeout_ns)
asciichat_error_t quic_transport_allow_media (acip_transport_t *transport)
asciichat_error_t quic_transport_attach (quic_connection_t *connection, crypto_context_t *crypto, acip_transport_t **out)
asciichat_error_t quic_transport_attach_serialized (quic_connection_t *connection, crypto_context_t *crypto, mutex_t *lane, acip_transport_t **out)
asciichat_error_t quic_transport_attach_on_lane (quic_connection_t *connection, crypto_context_t *crypto, mutex_t *lane, acip_transport_t **out)
asciichat_error_t quic_transport_attach_on_lane_with_waker (quic_connection_t *connection, mutex_t *lane, void(*wake)(void *), void *context, void(*on_destroy)(acip_transport_t *, void *), void *destroy_context, acip_transport_t **out)

Macro Definition Documentation

◆ QUIC_RECEIVE_BUDGET

#define QUIC_RECEIVE_BUDGET   (16U * 1024U * 1024U)

Definition at line 14 of file quic/transport.c.

Typedef Documentation

◆ received_packet_t

Function Documentation

◆ quic_transport_allow_media()

asciichat_error_t quic_transport_allow_media ( acip_transport_t * transport)

Definition at line 378 of file quic/transport.c.

378 {
379 if (!transport || transport->methods != &quic_methods)
380 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid QUIC transport");
381 quic_transport_t *quic = transport->impl_data;
382 lane_lock(quic);
384 : SET_ERRNO(quic->failure, "QUIC transport is closed");
385 lane_unlock(quic);
386 return result;
387}
#define SET_ERRNO(code,...)
asciichat_error_t
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44
@ ERROR_INVALID_PARAM
asciichat_error_t quic_connection_allow_media(quic_connection_t *connection)
void * impl_data
Transport-specific state.
const acip_transport_methods_t * methods
Method table (virtual functions).
quic_connection_t * connection

References quic_transport_t::connected, quic_transport_t::connection, ERROR_INVALID_PARAM, quic_transport_t::failure, acip_transport::impl_data, acip_transport::methods, quic_connection_allow_media(), and SET_ERRNO.

◆ quic_transport_attach()

asciichat_error_t quic_transport_attach ( quic_connection_t * connection,
crypto_context_t * crypto,
acip_transport_t ** out )

Definition at line 538 of file quic/transport.c.

539 {
540 return attach_transport(connection, crypto, NULL, false, NULL, NULL, NULL, NULL, out);
541}
static bool size_t gotel_query_t * out
Definition queries.h:8

References out.

◆ quic_transport_attach_on_lane()

asciichat_error_t quic_transport_attach_on_lane ( quic_connection_t * connection,
crypto_context_t * crypto,
mutex_t * lane,
acip_transport_t ** out )

Definition at line 553 of file quic/transport.c.

554 {
555 if (!lane) {
556 if (out)
557 *out = NULL;
558 return SET_ERRNO(ERROR_INVALID_PARAM, "Missing QUIC lane mutex");
559 }
560 return attach_transport(connection, crypto, lane, true, NULL, NULL, NULL, NULL, out);
561}

References ERROR_INVALID_PARAM, out, and SET_ERRNO.

◆ quic_transport_attach_on_lane_with_waker()

asciichat_error_t quic_transport_attach_on_lane_with_waker ( quic_connection_t * connection,
mutex_t * lane,
void(* wake )(void *),
void * context,
void(* on_destroy )(acip_transport_t *, void *),
void * destroy_context,
acip_transport_t ** out )

Definition at line 563 of file quic/transport.c.

566 {
567 if (!lane) {
568 if (out)
569 *out = NULL;
570 return SET_ERRNO(ERROR_INVALID_PARAM, "Missing QUIC lane mutex");
571 }
572 return attach_transport(connection, NULL, lane, true, wake, context, on_destroy, destroy_context, out);
573}

References ERROR_INVALID_PARAM, out, and SET_ERRNO.

◆ quic_transport_attach_serialized()

asciichat_error_t quic_transport_attach_serialized ( quic_connection_t * connection,
crypto_context_t * crypto,
mutex_t * lane,
acip_transport_t ** out )

Definition at line 543 of file quic/transport.c.

544 {
545 if (!lane) {
546 if (out)
547 *out = NULL;
548 return SET_ERRNO(ERROR_INVALID_PARAM, "Missing QUIC lane mutex");
549 }
550 return attach_transport(connection, crypto, lane, false, NULL, NULL, NULL, NULL, out);
551}

References ERROR_INVALID_PARAM, out, and SET_ERRNO.

◆ quic_transport_begin_security()

asciichat_error_t quic_transport_begin_security ( acip_transport_t * transport,
crypto_context_t * crypto )

Start the authenticated transition after the existing ACIP handshake. crypto is borrowed and must outlive the transport. After this call the caller must not access or rekey it until the transport has been released.

Definition at line 324 of file quic/transport.c.

324 {
325 if (!transport || transport->methods != &quic_methods || !crypto)
326 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid QUIC transport security context");
327 quic_transport_t *quic = transport->impl_data;
328 lane_lock(quic);
330 : SET_ERRNO(quic->failure, "QUIC transport is closed");
331 if (result == ASCIICHAT_OK) {
332 transport->crypto_ctx = crypto;
333 result = acip_security_activate(transport);
334 if (quic->wake)
335 quic->wake(quic->wake_context);
336 }
337 lane_unlock(quic);
338 if (result == ASCIICHAT_OK && quic->lane)
339 result = acip_outbound_create(transport);
340 return result;
341}
asciichat_error_t acip_outbound_create(acip_transport_t *transport)
@ ASCIICHAT_OK
Definition error_codes.h:46
asciichat_error_t acip_security_activate(acip_transport_t *transport)
asciichat_error_t quic_connection_enable_security(quic_connection_t *connection, crypto_context_t *crypto)
crypto_context_t * crypto_ctx
Optional encryption context.
void(* wake)(void *)

References acip_outbound_create(), acip_security_activate(), ASCIICHAT_OK, quic_transport_t::connected, quic_transport_t::connection, acip_transport::crypto_ctx, ERROR_INVALID_PARAM, quic_transport_t::failure, acip_transport::impl_data, quic_transport_t::lane, acip_transport::methods, quic_connection_enable_security(), SET_ERRNO, quic_transport_t::wake, and quic_transport_t::wake_context.

◆ quic_transport_destroy_unclaimed_on_lane()

asciichat_error_t quic_transport_destroy_unclaimed_on_lane ( acip_transport_t ** transport,
asciichat_error_t reason )

Definition at line 285 of file quic/transport.c.

285 {
286 if (!transport || !*transport || (*transport)->methods != &quic_methods || (*transport)->outbound ||
287 (*transport)->stats_peer || reason == ASCIICHAT_OK)
288 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid unclaimed QUIC transport");
289 quic_transport_t *quic = (*transport)->impl_data;
290 asciichat_error_t result = quic_close_locked(quic, reason);
291 if (result != ASCIICHAT_OK)
292 return result;
293 if (quic->lane)
294 cond_destroy(&quic->received);
295 if (quic->lane)
296 cond_destroy(&quic->security_changed);
297 SAFE_FREE((*transport)->impl_data);
298 SAFE_FREE(*transport);
299 *transport = NULL;
300 return ASCIICHAT_OK;
301}
#define SAFE_FREE(ptr)
Definition common.h:377

References ASCIICHAT_OK, ERROR_INVALID_PARAM, quic_transport_t::lane, acip_transport::methods, quic_transport_t::received, SAFE_FREE, quic_transport_t::security_changed, and SET_ERRNO.

◆ quic_transport_fail()

asciichat_error_t quic_transport_fail ( acip_transport_t * transport,
asciichat_error_t reason )

Definition at line 269 of file quic/transport.c.

269 {
270 if (!transport || transport->methods != &quic_methods || reason == ASCIICHAT_OK)
271 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid QUIC transport failure");
272 quic_transport_t *quic = transport->impl_data;
273 lane_lock(quic);
274 asciichat_error_t result = quic_close_locked(quic, reason);
275 lane_unlock(quic);
276 return result;
277}

References ASCIICHAT_OK, ERROR_INVALID_PARAM, acip_transport::impl_data, acip_transport::methods, and SET_ERRNO.

◆ quic_transport_fail_on_lane()

asciichat_error_t quic_transport_fail_on_lane ( acip_transport_t * transport,
asciichat_error_t reason )

Definition at line 279 of file quic/transport.c.

279 {
280 if (!transport || transport->methods != &quic_methods || reason == ASCIICHAT_OK)
281 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid QUIC transport failure");
282 return quic_close_locked(transport->impl_data, reason);
283}

References ASCIICHAT_OK, ERROR_INVALID_PARAM, acip_transport::impl_data, acip_transport::methods, and SET_ERRNO.

Referenced by quic_endpoint_stop(), and quic_release().

◆ quic_transport_peer_address()

asciichat_error_t quic_transport_peer_address ( acip_transport_t * transport,
struct sockaddr_storage * address,
socklen_t * length )

Copy the current peer address. It may change after a validated migration.

Definition at line 52 of file quic/transport.c.

53 {
54 if (!transport || transport->methods != &quic_methods || !address || !length)
55 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid QUIC peer address query");
56 quic_transport_t *quic = transport->impl_data;
57 if (quic->lane)
58 mutex_lock(quic->lane);
59 asciichat_error_t result = quic->connected ? quic_connection_peer_address(quic->connection, address, length)
60 : SET_ERRNO(quic->failure, "QUIC transport is closed");
61 if (quic->lane)
62 mutex_unlock(quic->lane);
63 return result;
64}
asciichat_error_t quic_connection_peer_address(const quic_connection_t *connection, struct sockaddr_storage *address, socklen_t *length)

References quic_transport_t::connected, quic_transport_t::connection, ERROR_INVALID_PARAM, quic_transport_t::failure, acip_transport::impl_data, quic_transport_t::lane, acip_transport::methods, quic_connection_peer_address(), and SET_ERRNO.

◆ quic_transport_security_ready()

bool quic_transport_security_ready ( acip_transport_t * transport)

Definition at line 343 of file quic/transport.c.

343 {
344 if (!transport || transport->methods != &quic_methods)
345 return false;
346 quic_transport_t *quic = transport->impl_data;
347 lane_lock(quic);
348 bool ready = quic->connected && quic_connection_security_ready(quic->connection);
349 lane_unlock(quic);
350 return ready;
351}
bool quic_connection_security_ready(const quic_connection_t *connection)

References quic_transport_t::connected, quic_transport_t::connection, acip_transport::impl_data, acip_transport::methods, and quic_connection_security_ready().

◆ quic_transport_set_close_on_lane()

void quic_transport_set_close_on_lane ( acip_transport_t * transport,
void(* close )(quic_connection_t *, void *),
void * context )

Definition at line 262 of file quic/transport.c.

263 {
264 quic_transport_t *quic = transport->impl_data;
265 quic->on_close = close;
266 quic->close_context = context;
267}
void(* on_close)(quic_connection_t *, void *)

References quic_transport_t::close_context, acip_transport::impl_data, and quic_transport_t::on_close.

◆ quic_transport_set_waker()

asciichat_error_t quic_transport_set_waker ( acip_transport_t * transport,
void(* wake )(void *),
void * context )

Definition at line 314 of file quic/transport.c.

314 {
315 if (!transport || transport->methods != &quic_methods)
316 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid QUIC transport waker");
317 quic_transport_t *quic = transport->impl_data;
318 lane_lock(quic);
319 asciichat_error_t result = quic_transport_set_waker_on_lane(transport, wake, context);
320 lane_unlock(quic);
321 return result;
322}
asciichat_error_t quic_transport_set_waker_on_lane(acip_transport_t *transport, void(*wake)(void *), void *context)

References ERROR_INVALID_PARAM, acip_transport::impl_data, acip_transport::methods, quic_transport_set_waker_on_lane(), and SET_ERRNO.

◆ quic_transport_set_waker_on_lane()

asciichat_error_t quic_transport_set_waker_on_lane ( acip_transport_t * transport,
void(* wake )(void *),
void * context )

Definition at line 303 of file quic/transport.c.

303 {
304 if (!transport || transport->methods != &quic_methods)
305 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid QUIC transport waker");
306 quic_transport_t *quic = transport->impl_data;
307 if (!quic->connected)
308 return SET_ERRNO(ERROR_INVALID_STATE, "QUIC transport is closed");
309 quic->wake = wake;
310 quic->wake_context = wake ? context : NULL;
311 return ASCIICHAT_OK;
312}
@ ERROR_INVALID_STATE

References ASCIICHAT_OK, quic_transport_t::connected, ERROR_INVALID_PARAM, ERROR_INVALID_STATE, acip_transport::impl_data, acip_transport::methods, SET_ERRNO, quic_transport_t::wake, and quic_transport_t::wake_context.

Referenced by quic_transport_set_waker().

◆ quic_transport_wait_security()

asciichat_error_t quic_transport_wait_security ( acip_transport_t * transport,
uint64_t timeout_ns )

Wait at most timeout_ns for the authenticated readiness exchange.

Definition at line 353 of file quic/transport.c.

353 {
354 if (!transport || transport->methods != &quic_methods)
355 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid QUIC transport");
356 quic_transport_t *quic = transport->impl_data;
357 if (!quic->lane)
358 return SET_ERRNO(ERROR_NOT_SUPPORTED, "QUIC security wait requires a serialized endpoint");
359 uint64_t start = time_get_ns();
360 lane_lock(quic);
361 while (quic->connected && !quic_connection_security_ready(quic->connection)) {
362 uint64_t elapsed = time_get_ns() - start;
363 if (elapsed >= timeout_ns) {
364 lane_unlock(quic);
365 return SET_ERRNO(ERROR_NETWORK_TIMEOUT, "QUIC security readiness timed out");
366 }
367 int rc = cond_timedwait(&quic->security_changed, quic->lane, timeout_ns - elapsed);
368 if (rc != 0 && rc != ETIMEDOUT) {
369 lane_unlock(quic);
370 return SET_ERRNO(ERROR_THREAD, "QUIC security readiness wait failed");
371 }
372 }
373 asciichat_error_t result = quic->connected ? ASCIICHAT_OK : SET_ERRNO(quic->failure, "QUIC transport is closed");
374 lane_unlock(quic);
375 return result;
376}
unsigned long long uint64_t
Definition common.h:63
@ ERROR_NETWORK_TIMEOUT
Definition error_codes.h:75
@ ERROR_THREAD
@ ERROR_NOT_SUPPORTED
Definition error_codes.h:69
#define ETIMEDOUT
asciichat_error_t failure

References ASCIICHAT_OK, quic_transport_t::connected, quic_transport_t::connection, ERROR_INVALID_PARAM, ERROR_NETWORK_TIMEOUT, ERROR_NOT_SUPPORTED, ERROR_THREAD, ETIMEDOUT, quic_transport_t::failure, acip_transport::impl_data, quic_transport_t::lane, acip_transport::methods, quic_connection_security_ready(), quic_transport_t::security_changed, and SET_ERRNO.