[c8021d2e0ab08a5c94683412de59e1774705909a] #bsd #c #ipv6 #systemd 

TAP через последовательный порт

https://en.wikipedia.org/wiki/Serial_Line_Internet_Protocol
Есть у нас тут запускаемый под виртуальной машиной образ GNU/Linux (хотя
я из него бы сделал musl/busybox), в котором нет сетевых интерфейсов, но
есть COM-порты. Но в настоящем варианте сеть будет. Надо бы уже отлаживать
сетевой софт для него.

Знаю, что можно собрать PPP и через него организовать IP соединение.
Но... когда кто-либо из нас последний раз поднимал его? Хотя я то ещё в
2020-х трогал. А кое кто из коллег даже не знает что такое PPP. Не самый
тривиальный вариант.

Коллеги удовлетворились slattach командой и поддержкой SLIP в Linux.
Явно в host системе отключая ARP-ы и заполняя его таблицы вручную.
Но... какая же это сеть, есть там ходят только IPv4 пакеты? Ничто в
теории не мешает передавать IPv6 поверх него, но раз это реализовали
"линуксоиды", то и заголовки (первый ниббл) они не парят и поэтому не
понимают что к ним пришло (какой именно протокол).

Увидел что есть SLIP6. Обрадовался. Потом обломался :-). "6" это не про
IPv6, а про 6-битные линии связи.

Видел, что на всяких форумах люди упоминают теоретическую возможность
socat-а соединить и TUN и TTY. Вот только там даже сам автор подтвердил,
что раз нет framing (реализуемый самим socat), то это не будет работать,
возможно как повезёт.

Конечно, можно бы было ещё туннель поверх slattach-ed интерфейса
поднять, поверх которого уже нормальную IP(v6)-сеть. Но уже многовато
костылей.

Психанул, написал на голом Си "tapser" утилиту. С одной стороны
открывает TAP интерфейс (и под GNU/Linux и под FreeBSD), с другой TTY
устройство. Настраивает 8N1 сырой режим для него. Далее poll() для
чтения сети или TTY.

По началу реализовал framing через добавление 16-бит поля длины, но,
очевидно, при разсинхронизации -- всё перестанет работать. Посмотрел на
SLIP поближе, который в RFC 1055 описан. Очень понравилась простота. А
предложенное в том RFC использование END байта и в начале кадра ещё и
от мусора в начале поможет избавиться. Так что реализовал такой SLIP, с
двойным END-ом. По мне так прям красиво.

Ну и ещё добавил XXH3 (dffa894abeab4eaec509b95af9d23b51e4e0f844)
контрольную сумму (после настоящего payload, в пределах кадра). Чтобы с
чистой совестью можно было использовать IPv6 поверх такого канала связи.

Что-то у меня снова желание поднять через COM-порт связь между
компьютерами дома, но уже без PPP, с которым были сложности. А тут,
так как я именно TAP использую, а не TUN, так прям просто Ethernet
полноценный типа. Программа принимает два аргумента: путь/имя TAP
устройства (под Linux создаёт сама), путь к TTY устройству, больше
ничего.

[оставить комментарий]