48#define VALIDATE_NOTNULL_DATA(client, data, packet_name) \
51 disconnect_client_for_bad_data((client), "%s payload missing", (packet_name)); \
60#define VALIDATE_MIN_SIZE(client, len, min_size, packet_name) \
62 if ((len) < (min_size)) { \
63 disconnect_client_for_bad_data((client), "%s payload too small (len=%zu, min=%zu)", (packet_name), (len), \
73#define VALIDATE_EXACT_SIZE(client, len, expected_size, packet_name) \
75 if ((len) != (expected_size)) { \
76 disconnect_client_for_bad_data((client), "%s payload size mismatch (len=%zu, expected=%zu)", (packet_name), \
77 (len), (expected_size)); \
86#define VALIDATE_AUDIO_STREAM_ENABLED(client, packet_name) \
88 if (!atomic_load(&(client)->is_sending_audio)) { \
89 disconnect_client_for_bad_data((client), "%s received before audio stream enabled", (packet_name)); \
98#define VALIDATE_AUDIO_SAMPLE_COUNT(client, num_samples, max_samples, packet_name) \
100 if ((num_samples) <= 0 || (num_samples) > (max_samples)) { \
101 disconnect_client_for_bad_data((client), "%s invalid sample count: %d (max %d)", (packet_name), (num_samples), \
111#define VALIDATE_AUDIO_ALIGNMENT(client, len, sample_size, packet_name) \
113 if ((len) % (sample_size) != 0) { \
114 disconnect_client_for_bad_data((client), "%s payload not aligned (len=%zu, sample_size=%zu)", (packet_name), \
115 (len), (sample_size)); \
124#define VALIDATE_RESOURCE_INITIALIZED(client, resource, resource_name) \
127 disconnect_client_for_bad_data((client), "%s not initialized", (resource_name)); \
136#define VALIDATE_PACKET_SIZE(client, data, len, expected_size, packet_name) \
139 disconnect_client_for_bad_data((client), packet_name " payload missing"); \
142 if ((len) != (expected_size)) { \
143 disconnect_client_for_bad_data((client), packet_name " payload size %zu (expected %zu)", (len), \
153#define VALIDATE_NONZERO(client, value, value_name, packet_name) \
155 if ((value) == 0) { \
156 disconnect_client_for_bad_data((client), "%s %s cannot be zero", (packet_name), (value_name)); \
165#define VALIDATE_RANGE(client, value, min_val, max_val, value_name, packet_name) \
167 if ((value) < (min_val) || (value) > (max_val)) { \
168 disconnect_client_for_bad_data((client), "%s %s out of range: %u (valid: %u-%u)", (packet_name), (value_name), \
169 (unsigned)(value), (unsigned)(min_val), (unsigned)(max_val)); \
178#define VALIDATE_CAPABILITY_FLAGS(client, flags, valid_mask, packet_name) \
180 if (((flags) & (valid_mask)) == 0) { \
181 disconnect_client_for_bad_data((client), "%s no valid capability flags set (flags=0x%x, valid=0x%x)", \
182 (packet_name), (unsigned)(flags), (unsigned)(valid_mask)); \
191#define VALIDATE_FLAGS_MASK(client, flags, valid_mask, packet_name) \
193 if (((flags) & ~(valid_mask)) != 0) { \
194 disconnect_client_for_bad_data((client), "%s unknown flags set (flags=0x%x, valid=0x%x)", (packet_name), \
195 (unsigned)(flags), (unsigned)(valid_mask)); \
204#define VALIDATE_PACKET_NOT_NULL(client, data, packet_name) \
206 int _validation_failed = 0; \
208 disconnect_client_for_bad_data((client), packet_name " payload missing"); \
209 _validation_failed = 1; \
211 _validation_failed; \
void disconnect_client_for_bad_data(client_info_t *client, const char *format,...)
Per-client state structure for server-side client management.