32static asciichat_error_t handle_acds_session_create(
const void *payload,
size_t payload_len,
int client_socket,
34static asciichat_error_t handle_acds_session_lookup(
const void *payload,
size_t payload_len,
int client_socket,
36static asciichat_error_t handle_acds_session_join(
const void *payload,
size_t payload_len,
int client_socket,
38static asciichat_error_t handle_acds_session_leave(
const void *payload,
size_t payload_len,
int client_socket,
40static asciichat_error_t handle_acds_webrtc_sdp(
const void *payload,
size_t payload_len,
int client_socket,
42static asciichat_error_t handle_acds_webrtc_ice(
const void *payload,
size_t payload_len,
int client_socket,
44static asciichat_error_t handle_acds_discovery_ping(
const void *payload,
size_t payload_len,
int client_socket,
46static asciichat_error_t handle_acds_ping(
const void *payload,
size_t payload_len,
int client_socket,
48static asciichat_error_t handle_acds_pong(
const void *payload,
size_t payload_len,
int client_socket,
72 size_t payload_len,
int client_socket,
const char *client_ip,
83 log_warn(
"Invalid ACDS packet type: %d (out of range)", type);
90 log_warn(
"Unhandled ACDS packet type: %d from %s", type, client_ip);
95 return handler(payload, payload_len, client_socket, client_ip, callbacks);
102static asciichat_error_t handle_acds_session_create(
const void *payload,
size_t payload_len,
int client_socket,
115 if (req->max_participants == 0 || req->max_participants > 32) {
117 req->max_participants, client_ip);
120 if (req->session_type > 1) {
122 req->session_type, client_ip);
127 if (req->session_type == 0 && req->server_port == 0) {
135static asciichat_error_t handle_acds_session_lookup(
const void *payload,
size_t payload_len,
int client_socket,
150static asciichat_error_t handle_acds_session_join(
const void *payload,
size_t payload_len,
int client_socket,
165static asciichat_error_t handle_acds_session_leave(
const void *payload,
size_t payload_len,
int client_socket,
180static asciichat_error_t handle_acds_webrtc_sdp(
const void *payload,
size_t payload_len,
int client_socket,
195static asciichat_error_t handle_acds_webrtc_ice(
const void *payload,
size_t payload_len,
int client_socket,
210static asciichat_error_t handle_acds_discovery_ping(
const void *payload,
size_t payload_len,
int client_socket,
221static asciichat_error_t handle_acds_ping(
const void *payload,
size_t payload_len,
int client_socket,
227 log_debug(
"ACDS keepalive: Received PING from %s, responding with PONG", client_ip);
232 log_warn(
"ACDS keepalive: Failed to send PONG to %s: %s", client_ip, asciichat_error_string(result));
236 log_debug(
"ACDS keepalive: Sent PONG to %s", client_ip);
240static asciichat_error_t handle_acds_pong(
const void *payload,
size_t payload_len,
int client_socket,
247 log_debug(
"ACDS keepalive: Received PONG from %s", client_ip);
asciichat_error_t(* acip_acds_handler_func_t)(const void *payload, size_t payload_len, int client_socket, const char *client_ip, const acip_acds_callbacks_t *callbacks)
asciichat_error_t acip_handle_acds_packet(acip_transport_t *transport, packet_type_t type, const void *payload, size_t payload_len, int client_socket, const char *client_ip, const acip_acds_callbacks_t *callbacks)
Handle incoming ACDS packet with O(1) dispatch.
ACIP Discovery Server (ACDS) packet handlers.
⚠️‼️ Error and/or exit() when things go bad.
#define SET_ERRNO(code, context_msg,...)
Set error code with custom context message and log it.
asciichat_error_t
Error and exit codes - unified status values (0-255)
#define log_warn(...)
Log a WARN message.
#define log_debug(...)
Log a DEBUG message.
asciichat_error_t packet_send(socket_t sockfd, packet_type_t type, const void *data, size_t len)
Send a packet with proper header and CRC32.
packet_type_t
Network protocol packet type enumeration.
@ PACKET_TYPE_ACIP_WEBRTC_ICE
WebRTC ICE candidate (bidirectional)
@ PACKET_TYPE_PONG
Keepalive pong response.
@ PACKET_TYPE_ACIP_SESSION_CREATE
Create new session (Client -> Discovery Server)
@ PACKET_TYPE_ACIP_DISCOVERY_PING
Discovery server ping (keepalive)
@ PACKET_TYPE_ACIP_SESSION_LOOKUP
Lookup session by string (Client -> Discovery Server)
@ PACKET_TYPE_ACIP_SESSION_LEAVE
Leave session (Client -> Discovery Server)
@ PACKET_TYPE_ACIP_WEBRTC_SDP
WebRTC SDP offer/answer (bidirectional)
@ PACKET_TYPE_ACIP_SESSION_JOIN
Join existing session (Client -> Discovery Server)
@ PACKET_TYPE_PING
Keepalive ping packet.
📝 Logging API with multiple log levels and terminal output control
ACIP protocol message structures and helpers.
Packet protocol implementation with encryption and compression support.
ACDS packet handler callbacks.
void(* on_discovery_ping)(const void *payload, size_t payload_len, int client_socket, const char *client_ip, void *app_ctx)
Called when client sends discovery ping.
void(* on_session_join)(const acip_session_join_t *req, int client_socket, const char *client_ip, void *app_ctx)
Called when client joins a session.
void(* on_webrtc_ice)(const acip_webrtc_ice_t *ice, int client_socket, const char *client_ip, void *app_ctx)
Called when client sends WebRTC ICE candidate.
void(* on_session_lookup)(const acip_session_lookup_t *req, int client_socket, const char *client_ip, void *app_ctx)
Called when client looks up session info.
void * app_ctx
Application context (passed to all callbacks)
void(* on_webrtc_sdp)(const acip_webrtc_sdp_t *sdp, int client_socket, const char *client_ip, void *app_ctx)
Called when client sends WebRTC SDP offer/answer.
void(* on_session_leave)(const acip_session_leave_t *req, int client_socket, const char *client_ip, void *app_ctx)
Called when client leaves a session.
void(* on_session_create)(const acip_session_create_t *req, int client_socket, const char *client_ip, void *app_ctx)
Called when client requests session creation.
Transport instance structure.