~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
=)
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
?
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
Нездоровая херня