soft_uart: demonstrate a problem with osmo_soft_uart_tx_ubits()

As can be seen, pulling a small number of bits at a time (smaller
than a single UART frame would fit into) results in calling the
.tx_cb() with a msgb having no room at all, and thus pulling the
stop bits instead of the actual data.

Change-Id: Icfee378f0fdc5e32fe9ce0afab5f75bc278653a9
Related: OS#4396
This commit is contained in:
Vadim Yanitskiy 2023-11-20 23:47:18 +07:00
parent 0d78a00b9f
commit dab6629f1c
2 changed files with 108 additions and 0 deletions

View File

@ -305,10 +305,46 @@ static void test_tx_rx(void)
osmo_soft_uart_free(suart);
}
static void test_tx_rx_pull_n(unsigned int n)
{
struct osmo_soft_uart *suart;
ubit_t tx_buf[32];
int rc;
suart = osmo_soft_uart_alloc(NULL, __func__, &suart_test_default_cfg);
OSMO_ASSERT(suart != NULL);
osmo_soft_uart_set_tx(suart, true);
osmo_soft_uart_set_rx(suart, true);
g_tx_cb_cfg.data = (void *)"\x55";
g_tx_cb_cfg.data_len = 1;
printf("======== %s(): pulling %lu bits (%u at a time)\n", __func__, sizeof(tx_buf), n);
for (unsigned int i = 0; i < sizeof(tx_buf); i += n) {
rc = osmo_soft_uart_tx_ubits(suart, &tx_buf[i], n);
OSMO_ASSERT(rc == 0);
}
printf("%s\n", osmo_ubit_dump(&tx_buf[0], sizeof(tx_buf)));
printf("======== %s(): feeding %lu bits into the receiver\n", __func__, sizeof(tx_buf));
rc = osmo_soft_uart_rx_ubits(suart, &tx_buf[0], sizeof(tx_buf));
OSMO_ASSERT(rc == 0);
osmo_soft_uart_flush_rx(suart);
osmo_soft_uart_free(suart);
}
int main(int argc, char **argv)
{
test_rx();
test_tx_rx();
/* test pulling small number of bits at a time */
test_tx_rx_pull_n(1);
test_tx_rx_pull_n(2);
test_tx_rx_pull_n(4);
test_tx_rx_pull_n(8);
return 0;
}

View File

@ -171,3 +171,75 @@ suart_rx_cb(flags=00): 10 20 00 00
test_tx_rx_exec_one(n_bits_total=32): 00000101 00000011 00000001 00000001
suart_tx_cb(len=0/4):
test_tx_rx_exec_one(n_bits_total=32): 11111111 11111111 11111111 11111111
======== test_tx_rx_pull_n(): pulling 32 bits (1 at a time)
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
11111111111111111111111111111111
======== test_tx_rx_pull_n(): feeding 32 bits into the receiver
======== test_tx_rx_pull_n(): pulling 32 bits (2 at a time)
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
11111111111111111111111111111111
======== test_tx_rx_pull_n(): feeding 32 bits into the receiver
======== test_tx_rx_pull_n(): pulling 32 bits (4 at a time)
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
11111111111111111111111111111111
======== test_tx_rx_pull_n(): feeding 32 bits into the receiver
======== test_tx_rx_pull_n(): pulling 32 bits (8 at a time)
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
suart_tx_cb(len=0/0):
11111111111111111111111111111111
======== test_tx_rx_pull_n(): feeding 32 bits into the receiver