This adds a new Broadcast Receiver test, for a Broadcast Sink synchronizing to 2 Broadcasters, using defer setup. ISO Broadcaster Receiver2 Defer - Success --- tools/iso-tester.c | 80 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 61 insertions(+), 19 deletions(-) diff --git a/tools/iso-tester.c b/tools/iso-tester.c index 6215fd456..5ec8634ac 100644 --- a/tools/iso-tester.c +++ b/tools/iso-tester.c @@ -518,7 +518,8 @@ struct iso_client_data { bool no_poll_errqueue; }; -typedef bool (*iso_defer_accept_t)(struct test_data *data, GIOChannel *io); +typedef bool (*iso_defer_accept_t)(struct test_data *data, GIOChannel *io, + uint8_t num, GIOFunc func); static void mgmt_debug(const char *str, void *user_data) { @@ -1446,6 +1447,16 @@ static const struct iso_client_data bcast_16_2_1_recv_defer = { .big = true, }; +static const struct iso_client_data bcast_16_2_1_recv2_defer = { + .qos = QOS_IN_16_2_1, + .expect_err = 0, + .defer = true, + .bcast = true, + .server = true, + .listen_bind = true, + .big = true, +}; + static const struct iso_client_data bcast_16_2_1_recv_defer_no_bis = { .qos = QOS_IN_16_2_1, .expect_err = 0, @@ -2923,7 +2934,8 @@ static void setup_listen(struct test_data *data, uint8_t num, GIOFunc func) return setup_listen_many(data, 1, &num, &func); } -static bool iso_defer_accept_bcast(struct test_data *data, GIOChannel *io) +static bool iso_defer_accept_bcast(struct test_data *data, GIOChannel *io, + uint8_t num, GIOFunc func) { int sk; char c; @@ -2957,17 +2969,20 @@ static bool iso_defer_accept_bcast(struct test_data *data, GIOChannel *io) tester_print("Accept deferred setup"); - data->io_queue = queue_new(); + if (!data->io_queue) + data->io_queue = queue_new(); + if (data->io_queue) queue_push_tail(data->io_queue, io); - data->io_id[0] = g_io_add_watch(io, G_IO_IN, - iso_accept_cb, NULL); + data->io_id[num] = g_io_add_watch(io, G_IO_IN, + func, NULL); return true; } -static bool iso_defer_accept_ucast(struct test_data *data, GIOChannel *io) +static bool iso_defer_accept_ucast(struct test_data *data, GIOChannel *io, + uint8_t num, GIOFunc func) { int sk; char c; @@ -2997,19 +3012,20 @@ static bool iso_defer_accept_ucast(struct test_data *data, GIOChannel *io) if (data->io_queue) queue_push_tail(data->io_queue, io); - data->io_id[0] = g_io_add_watch(io, G_IO_OUT, - iso_connect_cb, NULL); + data->io_id[num] = g_io_add_watch(io, G_IO_OUT, + func, NULL); return true; } static gboolean iso_accept(GIOChannel *io, GIOCondition cond, - gpointer user_data) + gpointer user_data, uint8_t num, GIOFunc func) { struct test_data *data = tester_get_data(); const struct iso_client_data *isodata = data->test_data; int sk, new_sk; gboolean ret; + GIOChannel *new_io; iso_defer_accept_t iso_defer_accept = isodata->bcast ? iso_defer_accept_bcast : iso_defer_accept_ucast; @@ -3022,26 +3038,32 @@ static gboolean iso_accept(GIOChannel *io, GIOCondition cond, return false; } - io = g_io_channel_unix_new(new_sk); - g_io_channel_set_close_on_unref(io, TRUE); + new_io = g_io_channel_unix_new(new_sk); + g_io_channel_set_close_on_unref(new_io, TRUE); if (isodata->defer) { if (isodata->expect_err < 0) { - g_io_channel_unref(io); + g_io_channel_unref(new_io); tester_test_passed(); return false; } if (isodata->bcast) { - iso_connect(io, cond, user_data); + iso_connect(new_io, cond, user_data); if (!data->step) { - g_io_channel_unref(io); + g_io_channel_unref(new_io); + return false; + } + + /* Return if connection has already been accepted */ + if (queue_find(data->io_queue, NULL, io)) { + g_io_channel_unref(new_io); return false; } } - if (!iso_defer_accept(data, io)) { + if (!iso_defer_accept(data, new_io, num, func)) { tester_warn("Unable to accept deferred setup"); tester_test_failed(); } @@ -3060,9 +3082,9 @@ static gboolean iso_accept(GIOChannel *io, GIOCondition cond, } } - ret = iso_connect(io, cond, user_data); + ret = iso_connect(new_io, cond, user_data); - g_io_channel_unref(io); + g_io_channel_unref(new_io); return ret; } @@ -3070,10 +3092,14 @@ static gboolean iso_accept_cb(GIOChannel *io, GIOCondition cond, gpointer user_data) { struct test_data *data = tester_get_data(); + const struct iso_client_data *isodata = data->test_data; data->io_id[0] = 0; - return iso_accept(io, cond, user_data); + if (isodata->bcast) + return iso_accept(io, cond, user_data, 0, iso_accept_cb); + else + return iso_accept(io, cond, user_data, 0, iso_connect_cb); } static gboolean iso_accept2_cb(GIOChannel *io, GIOCondition cond, @@ -3083,7 +3109,7 @@ static gboolean iso_accept2_cb(GIOChannel *io, GIOCondition cond, data->io_id[1] = 0; - return iso_accept(io, cond, user_data); + return iso_accept(io, cond, user_data, 1, iso_accept2_cb); } static void test_listen(const void *test_data) @@ -3379,6 +3405,17 @@ static void test_bcast_recv_defer(const void *test_data) setup_listen(data, 0, iso_accept_cb); } +static void test_bcast_recv2_defer(const void *test_data) +{ + struct test_data *data = tester_get_data(); + uint8_t num[2] = {0, 1}; + GIOFunc funcs[2] = {iso_accept_cb, iso_accept2_cb}; + + data->step = 2; + + setup_listen_many(data, 2, num, funcs); +} + static void test_connect2_suspend(const void *test_data) { test_connect2(test_data); @@ -3770,6 +3807,11 @@ int main(int argc, char *argv[]) &bcast_16_2_1_recv_defer, setup_powered, test_bcast_recv_defer); + test_iso2("ISO Broadcaster Receiver2 Defer - Success", + &bcast_16_2_1_recv2_defer, + setup_powered, + test_bcast_recv2_defer); + test_iso("ISO Broadcaster Receiver Defer No BIS - Success", &bcast_16_2_1_recv_defer_no_bis, setup_powered, -- 2.43.0