fixeria has submitted this change. ( https://gerrit.osmocom.org/c/libosmocore/+/35074?usp=email )
Change subject: soft_uart: demonstrate a problem with osmo_soft_uart_tx_ubits() ......................................................................
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 --- M tests/soft_uart/soft_uart_test.c M tests/soft_uart/soft_uart_test.ok 2 files changed, 123 insertions(+), 0 deletions(-)
Approvals: osmith: Looks good to me, approved Jenkins Builder: Verified
diff --git a/tests/soft_uart/soft_uart_test.c b/tests/soft_uart/soft_uart_test.c index ad876bd..522739a 100644 --- a/tests/soft_uart/soft_uart_test.c +++ b/tests/soft_uart/soft_uart_test.c @@ -305,10 +305,46 @@ 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; } diff --git a/tests/soft_uart/soft_uart_test.ok b/tests/soft_uart/soft_uart_test.ok index e041104..a160ad3 100644 --- a/tests/soft_uart/soft_uart_test.ok +++ b/tests/soft_uart/soft_uart_test.ok @@ -171,3 +171,75 @@ 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