diff --git a/src/stream/stream_proto.h b/src/stream/stream_proto.h index cd8510ce..549a58a5 100644 --- a/src/stream/stream_proto.h +++ b/src/stream/stream_proto.h @@ -1,6 +1,6 @@ /* Части RS имеют непроверенный внешний заголовок; подписанная пачка находится внутри RS. * Данные ETCP-выдачи (handle/сессия/путь) добавляются снаружи и в подпись не входят. - * seq/subblock берутся из заголовка RS; второго независимого номера блока нет. */ + * seq/subblock берутся из заголовка RS; seq повторяется в подписанной пачке и сверяется после decode. */ #ifndef STREAM_PROTO_H #define STREAM_PROTO_H diff --git a/tests/test_stream_service.c b/tests/test_stream_service.c index c3494e89..56c9e8b1 100644 --- a/tests/test_stream_service.c +++ b/tests/test_stream_service.c @@ -1096,9 +1096,11 @@ static void relay_test_status(struct ETCP_CONN *conn, struct ll_entry *entry) { && entry->dgram[ROUTER_SVC_PAYLOAD_OFF + 2] == STREAM_CMD_RELAY_STATUS) { relay_statuses_seen++; size_t payload = ROUTER_SVC_PAYLOAD_OFF + STREAM_WIRE_HEADER; - if (relay_race.hold_ready && entry->len > payload && entry->dgram[payload] == STREAM_RELAY_READY) { + if (relay_race.hold_ready && entry->len > payload + && (entry->dgram[payload] == STREAM_RELAY_READY || entry->dgram[payload] == STREAM_RELAY_BOUND)) { relay_race.ready_held++; - DEBUG_DEBUG(DEBUG_CATEGORY_STREAM, "bootstrap test holds READY ordinal=%u", relay_race.ready_held); + DEBUG_DEBUG(DEBUG_CATEGORY_STREAM, "bootstrap test holds availability status=%u ordinal=%u", + entry->dgram[payload], relay_race.ready_held); queue_dgram_free(entry); queue_entry_free(entry); return; } } @@ -1206,7 +1208,7 @@ static void test_supernode_relay(void) { CHECK(stream_subscribe_open(nodes[2], GROUP2, nodes[3]->node_id, &viewers[2]) == STREAM_OK); test_clock_run_for(ua, 500); stream_close(viewers[2]); viewers[2] = NULL; test_clock_run_for(ua, 2000); CHECK(relay_requests_seen == requests_before); - /* Merkle объявляет буфер помощника раньше STATUS READY: выбранная выдача должна удержать STARTING-запрос. */ + /* Merkle объявляет буфер до STATUS READY/BOUND: выбранная выдача должна удержать STARTING-запрос. */ memset(&relay_race, 0, sizeof(relay_race)); relay_race.hold_ready = relay_race.watch_provider = 1; relay_race.epoch = origin.descriptor.source_epoch; relay_drop_source = 1; @@ -1222,7 +1224,7 @@ static void test_supernode_relay(void) { CHECK(relay_race.provider_info_tb - relay_race.provider_tb < 2000); DEBUG_INFO(DEBUG_CATEGORY_STREAM, "[PASS] provider callback starts INFO without 1s roster wait: elapsed_ms=%llu", (unsigned long long)((relay_race.provider_info_tb - relay_race.provider_tb) / 10)); - DEBUG_INFO(DEBUG_CATEGORY_STREAM, "[PASS] helper INFO before delayed READY keeps selected pending issuance; no premature CANCEL"); + DEBUG_INFO(DEBUG_CATEGORY_STREAM, "[PASS] helper INFO before delayed READY/BOUND keeps selected pending issuance; no premature CANCEL"); test_clock_run_for(ua, 2000); struct stream_selection_info stable_before, stable_after; CHECK(stream_selection_get_info(viewers[2], &stable_before) == STREAM_OK);