diff --git a/scripts/test_udp_tunnel.sh b/scripts/test_udp_tunnel.sh index 36ad9a4..6d38b2a 100644 --- a/scripts/test_udp_tunnel.sh +++ b/scripts/test_udp_tunnel.sh @@ -82,7 +82,14 @@ GWP=\$! /tmp/transmitter -f $FREQ -r $RATE -b $BW -g $TXGAIN -p $PAUSE \ -c $FEC $GFLAG -u local: < /tmp/gw.fifo 2>/tmp/tx.log & TXP=\$! -sleep 1 +# Ждём готовности транзмиттера, а не спим вслепую: инициализация iio (LO, буферы) +# занимает секунды, а из пайпа он до неё не читает. Пайп 64 КБ ≈ весь тестовый +# файл → шлюз штатно дропает хвост по бэкпрешеру, если начать лить раньше. +i=0 +while [ \$i -lt 20 ]; do + grep -q "Ожидание данных" /tmp/tx.log 2>/dev/null && break + i=\$((i+1)); sleep 1 +done /tmp/udp_probe send 127.0.0.1:$PORT_A $CHUNK $PACE_MS \ < /tmp/probe_in.bin 2>/tmp/probe_tx.log sleep 2 @@ -93,9 +100,14 @@ EOF echo "=== [5/6] Гашение цепочки B ===" sleep 3 # дохлебать хвост эфира -# udp_probe по SIGTERM печатает статистику и закрывает файл — гасим активно, -# не дожидаясь IDLE (тот же паттерн sleep+kill, что в test_file_link.sh). -"${SSH[@]}" -n "root@$B" "killall udp_probe receiver udp_gw 2>/dev/null || true" || true +# ПОРЯДОК ГАШЕНИЯ КРИТИЧЕН. receiver.c:798 — group_flush()+rb_flush_all() стоят +# ПОСЛЕ основного цикла: хвост незавершённой группы (до 16 кадров) уходит в +# stdout только в момент смерти приёмника. Поэтому гасим строго по течению: +# receiver (флашит хвост) → пауза на прохождение через udp_gw -d → udp_probe. +# Убить их разом = потерять последнюю группу (было: доставлено 64, принято 48). +"${SSH[@]}" -n "root@$B" "killall receiver 2>/dev/null || true" || true +sleep 3 # хвост: receiver → пайп → udp_gw -d (выйдет сам по EOF) → UDP → probe +"${SSH[@]}" -n "root@$B" "killall udp_probe udp_gw 2>/dev/null || true" || true wait "$B_PID" 2>/dev/null || true echo "=== [6/6] Сверка ===" @@ -123,6 +135,10 @@ else echo " Меры: TXGAIN ближе к −20, антенны разнести/переориентировать." echo " - 'дропов' > 0 у 'udp_gw -l (вход)' → вход быстрее линка (~107 КБ/с" echo " на -G -p 3000): подними PACE_MS. Это контрактный дроп, семантика UDP." + echo " Если дропов ровно 1-2 в конце — транзмиттер ещё не читал пайп на" + echo " старте (см. ожидание 'Ожидание данных' в шаге [4])." + echo " - 'доставлено' > принятых probe → гашение обогнало хвост приёмника" + echo " (receiver.c:798 флашит последнюю группу только при выходе)." echo " - размер 0 и в rx.log 0 кадров → приёмник не работал во время передачи:" echo " частота/усиление/антенны, либо цепочка B умерла по IDLE (=$IDLE с)." echo " - размер совпал, md5 нет → искажение полезной нагрузки: техдолг #1/#3."