Вопрос по архитектуре проекта + ctrl\pptp

Any topics
Post Reply
sdy_moscow
Posts: 2
Joined: 04 Nov 2016, 13:52

Вопрос по архитектуре проекта + ctrl\pptp

Post by sdy_moscow »

Здравствуйте, Дмитрий.

Пришло время мигрировать с 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;
		}
мы реально наблюдаем разрыв сессии (как раз после запаздывания эхо реплая от клиента) по этому событию.
Как я понимаю, вы исходите из того, что если был вызов реад и в сокете нет данных - то сессия разорвалась - вопрос из чего это вытекает? Я быстро разобраться не смог, так как не нашел, как уже сказал, описание архитектуры и взаимодействия сокетов и потоков, поэтому пока не уверен что баг именно в этом. Предполагаю, что вызов происходит или после того как пакет уже обработан или по какому-то иному событию (какому не могу пока предположить) Может что-то подскажете?

Заранее спасибо, ваш тезка, Дмитрий.
sdy_moscow
Posts: 2
Joined: 04 Nov 2016, 13:52

Re: Вопрос по архитектуре проекта + ctrl\pptp

Post by sdy_moscow »

В продолжение...
покурил, manы tcp(7), socket(7), read(2) исходники kernel
и так и не понял из за чего возврат read(..) ==0

if (n == 0) {
if (conf_verbose)
log_ppp_info2("pptp: disconnect by peer\n");
goto drop;
}

для ассинхронного чтения стало поводом к решению о дисконнекте пиром?
Нашел только примеры на "хау ту сайтах" в которых утверждается сей факт, но причин без проверки errno == EPIPE считаю недостаточными - буду пытаться править.
С рандомом вроде тоже всё понятно - придется структуру conn дополнить счетчиком пакетов - попробуем.
Dmitry
Администратор
Posts: 954
Joined: 09 Oct 2014, 10:06

Re: Вопрос по архитектуре проекта + ctrl\pptp

Post by Dmitry »

привет!
если read сокета возвращает 0, то это однозначно закрытие коннекта по инициативе клиента
themiron
Posts: 4
Joined: 02 Feb 2017, 13:40
Contact:

Re: Вопрос по архитектуре проекта + ctrl\pptp

Post by themiron »

sdy_moscow wrote: 04 Nov 2016, 14:37 Пришло время мигрировать с 0.8 на 1.11. (может вспомните как подпиливали его до релиза), но лирику в сторону.

2.1. В pptp_send_echo, pptp_echo_rply странное использование conn->echo_sent
видимо код не был допилен... сравнение ++conn->echo_sent с random(),а такое у нас происходит (судя в т.ч. по логам) при запаздывании ответа от клиента или его потери может привести к "неожиданным последствиям".
вопрос - скажите верны ли мои опасения?
да, верны.
патч с исправлением https://github.com/themiron/accel-ppp/c ... cde79a8a66
Post Reply