feat: add device diagnostics for missing voice replies
Track microphone levels, short reads and PCM buffer drops. Report audio queue admission separately from TLS writes, expose server replies and ACKs before filtering, and capture per-round counters before timeouts. Add diagnostic regression coverage and support POSIX hosts in WSS tests.
This commit is contained in:
@@ -96,6 +96,9 @@ typedef struct _rws_socket_struct
|
||||
int command;
|
||||
|
||||
unsigned int next_message_id;
|
||||
/* Worker-owned transport counters; socket creation zero-initializes these. */
|
||||
unsigned int diag_tx_calls, diag_tx_bytes, diag_tx_failed;
|
||||
unsigned int diag_rx_calls, diag_rx_bytes;
|
||||
|
||||
rws_bool is_connected; // sock connected + handshake done
|
||||
|
||||
|
||||
@@ -193,17 +193,30 @@ static int rws_tls_send_all(_rws_socket *s, const unsigned char *data, size_t si
|
||||
{
|
||||
size_t sent = 0;
|
||||
unsigned int started = ql_rtos_get_systicks();
|
||||
if (!s->ssl) return -1;
|
||||
unsigned int retries = 0;
|
||||
if (!s->ssl) {
|
||||
printf("[WSS-IO] tls_write_no_context requested=%u\n", (unsigned int)size);
|
||||
return -1;
|
||||
}
|
||||
while (sent < size) {
|
||||
int ret = mbedtls_ssl_write(&s->ssl->ssl_ctx, data + sent, size - sent);
|
||||
if (ret > 0) {
|
||||
sent += (size_t)ret;
|
||||
} else if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
|
||||
printf("[WSS-IO] tls_write_failed ret=%d sent=%u requested=%u retries=%u elapsed_ticks=%u\n",
|
||||
ret, (unsigned int)sent, (unsigned int)size, retries,
|
||||
(unsigned int)(ql_rtos_get_systicks() - started));
|
||||
return -1;
|
||||
} else {
|
||||
retries++;
|
||||
rws_thread_sleep(5);
|
||||
}
|
||||
if (sent < size && (unsigned int)(ql_rtos_get_systicks() - started) >= 1000) return -1;
|
||||
if (sent < size && (unsigned int)(ql_rtos_get_systicks() - started) >= 1000) {
|
||||
printf("[WSS-IO] tls_write_timeout last_ret=%d sent=%u requested=%u retries=%u elapsed_ticks=%u\n",
|
||||
ret, (unsigned int)sent, (unsigned int)size, retries,
|
||||
(unsigned int)(ql_rtos_get_systicks() - started));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return (int)sent;
|
||||
}
|
||||
@@ -218,7 +231,6 @@ rws_bool rws_socket_send(_rws_socket *s, const void *data, const size_t data_siz
|
||||
#ifdef LIBRWS_USING_MBED_TLS
|
||||
if (s->scheme && strcmp(s->scheme, "wss") == 0)
|
||||
{
|
||||
LOG_D("[T:%.8d, L:%.5d, %*.*s] try send data with tls", ql_rtos_get_systicks(), __LINE__, DBG_FUNCTION_NUM, DBG_FUNCTION_NUM, __FUNCTION__);
|
||||
sended = rws_tls_send_all(s, (const unsigned char *)data, data_size);
|
||||
}
|
||||
else
|
||||
@@ -243,6 +255,14 @@ rws_bool rws_socket_send(_rws_socket *s, const void *data, const size_t data_siz
|
||||
}
|
||||
#endif
|
||||
|
||||
s->diag_tx_calls++;
|
||||
if (sended > 0) s->diag_tx_bytes += (unsigned int)sended;
|
||||
if (sended != (int)data_size) s->diag_tx_failed++;
|
||||
if (s->diag_tx_calls == 1 || s->diag_tx_calls % 50 == 0 || sended != (int)data_size) {
|
||||
printf("[WSS-IO] write tick=%u requested=%u ret=%d calls=%u bytes=%u failed=%u\n",
|
||||
ql_rtos_get_systicks(), (unsigned int)data_size, sended,
|
||||
s->diag_tx_calls, s->diag_tx_bytes, s->diag_tx_failed);
|
||||
}
|
||||
if (sended == (int)data_size)
|
||||
{
|
||||
rws_socket_error_cnt = 0;
|
||||
@@ -283,7 +303,6 @@ rws_bool rws_socket_recv(_rws_socket *s)
|
||||
rws_bool result = rws_true;
|
||||
int is_reading = 1, error_number = -1, len = -1;
|
||||
char *received = NULL;
|
||||
size_t total_len = 0;
|
||||
// char *buff = 0;
|
||||
|
||||
// LOG_D("[T:%.8d, L:%.5d, %*.*s] receive data", ql_rtos_get_systicks(), __LINE__, DBG_FUNCTION_NUM, DBG_FUNCTION_NUM, __FUNCTION__);
|
||||
@@ -365,7 +384,12 @@ rws_bool rws_socket_recv(_rws_socket *s)
|
||||
|
||||
if (len > 0)
|
||||
{
|
||||
total_len += len;
|
||||
s->diag_rx_calls++;
|
||||
s->diag_rx_bytes += (unsigned int)len;
|
||||
if (s->diag_rx_calls <= 20 || s->diag_rx_calls % 50 == 0)
|
||||
printf("[WSS-IO] read tick=%u bytes=%d calls=%u total=%u buffered=%u command=%d\n",
|
||||
ql_rtos_get_systicks(), len, s->diag_rx_calls, s->diag_rx_bytes,
|
||||
(unsigned int)s->received_len, s->command);
|
||||
if (s->command == COMMAND_WAIT_HANDSHAKE_RESPONCE &&
|
||||
s->received_len + (size_t)len > RWS_HANDSHAKE_MAX + RWS_RECEIVE_BUFF_SIZE) {
|
||||
s->error = rws_error_new_code_descr(rws_error_code_parse_handshake, "WebSocket headers too large");
|
||||
@@ -1650,9 +1674,12 @@ void rws_socket_resize_received(_rws_socket *s, const size_t size)
|
||||
|
||||
void rws_socket_close(_rws_socket *s)
|
||||
{
|
||||
s->received_len = 0;
|
||||
if (s->socket != RWS_INVALID_SOCKET)
|
||||
{
|
||||
printf("[WSS-IO] close tick=%u tx_calls=%u tx_bytes=%u tx_failed=%u rx_calls=%u rx_bytes=%u buffered=%u command=%d\n",
|
||||
ql_rtos_get_systicks(), s->diag_tx_calls, s->diag_tx_bytes,
|
||||
s->diag_tx_failed, s->diag_rx_calls, s->diag_rx_bytes,
|
||||
(unsigned int)s->received_len, s->command);
|
||||
#ifdef LIBRWS_USING_MBED_TLS
|
||||
if (s->scheme && strcmp(s->scheme, "wss") == 0)
|
||||
{
|
||||
@@ -1669,6 +1696,7 @@ void rws_socket_close(_rws_socket *s)
|
||||
WSACleanup();
|
||||
#endif
|
||||
}
|
||||
s->received_len = 0;
|
||||
s->is_connected = rws_false;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user