Пришло время мигрировать с 0.8 на 1.11. (может вспомните как подпиливали его до релиза), но лирику в сторону.
Ввиду некоторых глюков связанных с работой ППТП в 1.11 (о них позже), возникло желание (да и есть необходимость) поковыряться в исходниках. С сожалением отметил, что комментариев в коде стало меньше, хотя объем и архитектура существенно изменились и усложнились (по сравнению с 0.8). В связи с этим возник вопрос, на который с ходу ответа на сайтах проекта не нашел:
1. Можно ли где-то найти информацию по архитектуре проекта? А именно как связаны между собой модули, потоки, сокеты? Понимаю что возможно такой информации "в тексте" нет вовсе, но всё-же, может опишите хотя бы на страничку где-то в вики или на этом форуме.
2. Тестируя pptp (т.к. исторически уже давно и МНОГО работаем на нем) обнаружили проблему неожиданных разрывов сессий, поковыряв немного (буду ковырять и дальше, но хотелось бы посоветоваться) сделал предположение о некоторых "исторических багах-недоделках" в ctrl\pptp\pptp.c , а именно функции pptp_send_echo, pptp_echo_rply и pptp_read
функции небольшие - думаю если быстро глянете поймете, поэтому полный код приводить не буду.
Но вот, что вызвало предположение:
2.1. В pptp_send_echo, pptp_echo_rply странное использование conn->echo_sent
Code: Select all
/*if (msg->identifier != conn->echo_sent) {
log_ppp_warn("pptp:echo: identifier mismatch\n");
//return -1;
}*/
conn->echo_sent = 0;
....
if (++conn->echo_sent == conf_echo_failure) {
log_ppp_warn("pptp: no echo reply\n");
disconnect(conn);
return;
}
conn->echo_sent = random();
msg.identifier = conn->echo_sent;
видимо код не был допилен... сравнение ++conn->echo_sent с random(),а такое у нас происходит (судя в т.ч. по логам) при запаздывании ответа от клиента или его потери может привести к "неожиданным последствиям".
вопрос - скажите верны ли мои опасения?
2.2. В pptp_read сравнение длины с 0 пришедшего (как я понимаю) в сокет пакета ( проще глянуть код, чем написать

Code: Select all
if (n == 0) {
if (conf_verbose)
log_ppp_info2("pptp: disconnect by peer\n");
goto drop;
}
Как я понимаю, вы исходите из того, что если был вызов реад и в сокете нет данных - то сессия разорвалась - вопрос из чего это вытекает? Я быстро разобраться не смог, так как не нашел, как уже сказал, описание архитектуры и взаимодействия сокетов и потоков, поэтому пока не уверен что баг именно в этом. Предполагаю, что вызов происходит или после того как пакет уже обработан или по какому-то иному событию (какому не могу пока предположить) Может что-то подскажете?
Заранее спасибо, ваш тезка, Дмитрий.