Я не нашел примеров, как реализовать L2TPv3 поверх IP
Я нашел только пару реализаций L2TP с открытым исходным кодом:
L2TPv3 rfc ничего не говорит о том, как это реализовано в linux, что очевидно
документация по ядру:
https://github.com/torvalds/linux/blob/master/Documentation/networking/l2tp.txt говорит, что мы должны использовать netlink + стандартные сокеты, что нам что-то говорит. Но я не понимаю, почему мы должны использовать netlink вместе со стандартными сокетами?
файл заголовка ядра:
https://github.com/torvalds/linux/blob/master/include/uapi/linux/l2tp.h он имеет тонны перечислений и команд для структуры netlink + l2tpip для. Я не понимаю, как правильно их использовать.
И заключительная часть установления контрольного обмена L2TPv3 (SCCRQ, SCCRP, SCCCN). Прочитав документацию по ядру, у меня есть только собственное понимание, которое может быть неверным, но вот оно.
сторона сервера:
- Подготовить туннель 0, розетка
- Создание гнезда genl для l2tp
- Создать стандартную структуру сокета, заполняющую l2tpip (socket create + bind), где tunnel_id равно 0
- Использование гнезда genl создать туннель 0
Ожидание SCCRQ (насколько я понимаю, заголовок будет иметь контрольный идентификатор соединения, равный нулю)
На полученном SCCRQ в туннеле 0, сокет
- Из полученного SCCRQ захватить идентификатор назначенного контрольного соединения AVL, который получен_туннелем_идей на другой стороне
- Создать local_tunnel_id для нашей стороны
- Создать стандартную структуру сокетов, заполняющую l2tpip (socket create + bind), где tunnel_id - local_tunnel_id
- Используя сокет genl, создайте туннель с помощью local_tunnel_id
- Отправка SCCRP с идентификатором контрольного соединения заголовка, равным Receive_tunnel_id, и идентификатором назначенного контрольного соединения AVL, равным local_tunnel_id
- Подождите, пока SCCN на этом сокете
на стороне клиента
- Я не знаю, как это делается на этой стороне
Как я понимаю, дальнейшая связь будет осуществляться через второй стандартный сокет, а нулевой идентификатор туннеля получает ТОЛЬКО SCCRQ
Было бы здорово получить разъяснения по этим деталям