IRCaBot 2.1.0
GPLv3 © acetone, 2021-2022
#dev
/2025/12/13
~R4SAS
~acetone
~orignal
~villain
@onon
&N00B
+Xeha
AreEnn_
GFW
Guest68262
Most
Nobody
Opax
WebClient16
anon
asap
b3t4f4c3
deserving-stegosaur
duanin2
fidoid
g1
grimreaper
halloy1341
mareki2p
n1
negative_rock127
osoznayka
poriori
qend
rc13
shaye
slfd
teeth
test02
un
onon Вопрос почему у тебя в функции void I2PUDPClientTunnel::HandleRecvFromLocal две проверки repliableDatagramInterval
onon if (ts > m_LastSession->second + repliableDatagramInterval) и if (!m_RTT || !m_AckTimerSeqn || (!m_UnackedDatagrams.empty () &&
onon ts > m_UnackedDatagrams.back ().second + repliableDatagramInterval)) // last ack request
onon И в функции void UDPSession::HandleReceived тоже
orignal счас
onon Дальше. Почему у тебя так странно сделано что LastActivity = ts; и m_LastSession->second = ts; прямо под этой проверкой
onon Они же будут обновлять время при каждом вызове
onon Мне неясна логика
orignal это ж разные места
onon Я имею в виду у тебя логика:
onon auto ts = i2p::util::GetMillisecondsSinceEpoch();
onon if (ts > LastActivity + repliableDatagramInterval)
onon LastActivity = ts;
onon Это зачем такое
orignal погоди это вообще не мой код я думаю
orignal ну как зачем?
orignal проверяем давно ли слали repliable
onon А второй раз зачем ты это делаешь if (!m_RTT || !m_AckTimerSeqn || (!m_UnackedDatagrams.empty () &&
onon ts > m_UnackedDatagrams.back ().second + repliableDatagramInterval)) // last ack request
onon Я просто не понимаю что ты хочешь отправлять кроме repliableDatagram
onon m_LocalDest->GetDatagramDestination ()->SendDatagram (session, m_RecvBuff, transferred, remotePort, RemotePort);
onon Или
onon m_LocalDest->GetDatagramDestination ()->SendRawDatagram (session, m_RecvBuff, transferred, remotePort, RemotePort);
onon Потому что проверка стоит if (m_DatagramVersion == i2p::datagram::eDatagramV3)
orignal итак
orignal первая проверка мы решаем какой тип датаграммы слать
orignal во второй мы решаем слать ли ack reques
orignal там разные вещи проверяются
onon А зачем там проверка времени
onon if (ts > m_LastSession->second + repliableDatagramInterval)
onon Может я чего не догоняю, но мне кажется он из-за этого просто шлёт SendRawDatagram постоянно
onon Потому что время обновляет и проверка не проходит
orignal давай подумаем
orignal да ты прав
orignal оно шлет repliable только если не было активности
onon Ну у тебя изначально какая логика была?
onon Что шлём поток raw
onon и иногда встадляем repliable
onon Так?
onon Или поток должен быть SendDatagram?
onon А вставки SendDatagram+options
orignal была логика что в начале шлем repliable а потом raw
onon Ага
orignal ну короче явный косяк
orignal как часто предлагаешь слать repliable?
onon Ну у тебя же там код готовый
onon 1/10 RTT или 100 мс
orignal договорились счас поправим
orignal это явный баг
onon Я у себя сделал вот так drop.i2p/paste/4535dd6ea9224683a37e4770f4e59640
onon Добавил еще переменную m_LastACKRequestTime
onon Хотя правильно конечно так if (!m_LastACKRequestTime || ts > m_LastACKRequestTime + repliableDatagramInterval)
onon Чтоб от нуля не считать
onon И в датаграммы без опций тоже присваивание бы добавить...
orignal ну так мне чинить или твое взять?
onon Чини конечно
orignal тогда счас
onon А я посмотрю
onon Я просто накидал чтоб работало
onon Чтоб проверить
orignal залил
onon Щас посмотрим...
onon // 10 - 100 ms
onon У нас же в теории может быть RTT меньше чем 10мс
onon Тогда не будет работать
onon Был же 1 мс минимум
onon Почему переделал?
orignal слищком часто слалось
orignal давай попавлю
onon Не спеши
orignal 10 мс в i2p сильно сомнительно
onon Два роутера локально
onon Иди пока дрозду объясни в чём он не прав
orignal влом
onon Я пока буду пересобирать/тестировать а ты может поищи почему 0 отвечает
onon seqn = 0 в акке
onon Если слать запрос на смену маршрута
orignal не должно отвечать 0
orignal только при смене маршрута?
onon Хочешь сказать, мне показалось?
onon Ну когда таймер срабатывает
orignal может потому что не приходили repliable?
onon Приходили
orignal тогда буду думать
orignal кто отвечал seqn=0? сервер?
onon Да
onon Я клиентом подключился, шлю поток елси срабатывает таймер я шлю запрос мне в ответ ack seq = 0
onon А вот эта проверка для чего? if (!m_RTT || !m_AckTimerSeqn || (!m_UnackedDatagrams.empty () &&
onon ts > m_UnackedDatagrams.back ().second + repliableDatagramInterval)) // last ack request
orignal чтобы добалять ack reques
onon Ну так а есть варианты когда мы не должны его добавлять?
onon Это ты алгоритм придумывал, рассказывай как он должен работать
onon У меня вроде был вариант при двусторонней передаче, но там у всех датаграмм опции вставлялись
onon А у тебя raw
orignal есть. когда поток идет в обе стороны
orignal и мы аки и так получаем
onon Мне что-то кажется что у тебя вместо датаграммы с опциями и без запроса акка отправится просто raw
orignal не должно
onon Значит это какое-то сильное колдунство
onon Мне нужно время
onon Да я перепроверил после того как шлём GetDatagramDestination ()->SendDatagram (session, nullptr, 0, 0, 0, &options);
onon Потом получаем ack seqn = 0
onon Ну по крайне мере в логе void UDPConnection::Acked (uint32_t seqn) он получается как 0
orignal понял
orignal гляну
onon Мне кажется ты перепутал запрос акка и его отправку
orignal возможнео
orignal options.Put (UDP_SESSION_FLAGS, UDP_SESSION_FLAG_RESET_PATH | UDP_SESSION_FLAG_ACK_REQUESTED);
orignal что здесь не так?
onon Не знаю
onon Я не программист
orignal ладно буду думать
onon Я кстати эту строчку поменял
onon Щас покажу
onon Хотел спросить, можно ли так делать
orignal а смысл?
onon Там нужно что если первый раз таймер сработал то не менять маршрут и не запрашивать смену
onon А когда во второй тогда уже да
onon Потому что если поток обрывается то на последние пакеты акк не доходит
onon И нужно его перезапрашивать
orignal да так можно сделать
orignal поменять и закоммитить?
onon Ненене
onon Это ж только часть кода
onon У меня там много чего переделано
orignal а ну тогда потом
onon Чтобы заставить это работать
onon Единственное что не исправил это ack seqn 0
orignal погляжу счас
onon Чтоб оно заработало я его принудительно переназначаю pastethis.i2p/show/bn1RswgUGE0ryc6rTJLa
orignal погляжу
onon Знаешь чего? Ты когда запрос отправляешь ты туда не вставляешь UDP_SESSION_SEQN. А на второй стороне код uint32_t seqn = 0;
onon if (options->Get (UDP_SESSION_SEQN, seqn) && seqn > m_LastReceivedPacketNum)
onon m_LastReceivedPacketNum = seqn;
onon Он сначала делает seqn = 0; а потом проверяет if (options->Get (UDP_SESSION_SEQN, seqn) а там нету UDP_SESSION_SEQN...
onon Вот он и оставляет его 0
onon Так?
orignal так Get должен вернуть false
orignal ну отсавил 0 а дальше то что с ним?
onon Ну там дальше if (options->Get (UDP_SESSION_ACKED, seqn))
onon Acked (seqn);
onon Хотя там тоже проверка
orignal он возьмер его из UDP_SESSION_ACKED
onon Что то я туплю
orignal это уже другое поле
onon Ну откуда-то же он берётся
orignal так ты проще логи напечатай и смотри
onon Знать бы где логировать
orignal перед добавление USD_SESSION_ACKED
orignal то туда пишется
orignal и когда найдет место где туда идет 0 смотреть откуда он взялся
onon USD? =)
orignal ой ))
onon Попробую
orignal оговорка по фрейду
onon Угу
onon Логи говорят что 0 вставляется здесь replyOptions.Put (UDP_SESSION_ACKED, m_LastSession->m_LastReceivedPacketNum);
onon На 52 строке
onon На сервере
onon Идёт поток последовательных номеров потом 0 потом дальше
onon Очевидно он применяется здесь m_LastSession->m_LastReceivedPacketNum = seqn; но почему не срабатывает && seqn > m_LastSession->m_LastReceivedPacketNum не понятно
onon А ну понятно, он сначала присваивается в 0 а потом проверяет больше ли 0 чем например 10, получается что нет, и он так и оставляет uint32_t seqn = 0;
onon Как и присвоил по умолчанию
onon Бля чет опять туплю
onon Нет он там неприменяется
onon Он берёт m_LastSession->m_LastReceivedPacketNum как будто из другого места
onon Может m_LastSession какая-то другая
onon Может здесь как-то замешано что он перед этим делает m_LastSession->GetDatagramSession ()->DropSharedRoutingPath ();
onon И у него m_LastSession что-то сбрасывается
orignal так понял 52 ая строка
orignal счас буду тоже глядеть
orignal там точно была ненулевой а стала нулевой?
onon да
onon Ну я в лог все вывожу когда он отправляет
orignal может например сессия пересоздалась?
orignal m_LastSession = ObtainUDPSession(from, toPort, fromPort);
onon И шифрование постоянно ломается
onon По непонятным причинам
orignal впору хоть заново не переписать чем бесконечно чинить код психа
onon Вот щас шифрование сломалось со стороны клиента
onon Хотя это он соединение инициировал
onon И входящих пакетов не могло быть много
onon error - Garlic: Can't handle ECIES-X25519-AEAD-Ratchet message
onon А теперь на сервере
onon Хотя отправил туда только чуть больше 300 пакетов
onon Нездоровая херня