[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 устройству, больше
ничего.
[оставить комментарий]