[freebsd] netgraph

Eugene Grosbein eugen at grosbein.net
Mon Apr 5 08:10:00 EEST 2021


On 05.04.2021 10:31, Nick Kostirya wrote:

>>> Привет. 
>>>
>>> У меня наивный вопрос про netgraph.
>>>
>>> Я правильно понял, что при помощи ng_socket можно соединить два компьютера в одну сеть через, например, UART проводами или при помощи радио?
>>> Для этого лишь достаточно написать демона, который будет просто перекладывать байты из socket в UART сразу или передавать радиочипу?  
>>
>> Не этой нодой.
>>
>> ng_socket это "переходник" между BSD-сокетами стека TCP/IP и внутренностями NETGRAPH и не более того.
>> То есть, если у нас есть некая абстрактная нода или сеть нод внутри NETGRAPH и их надо кормить
>> данными, приходящими из TCP/IP (или в обратную сторону, или в обе), для этого можно использовать ng_socket.
> 
> А в случае UART можно использовать ng_tty(4)?

Не вижу, каким образом.

> Общение с железкой осуществляется через gpio и uart. Сначала она настраивается через uart, потом при помощи gpio переключается в режим, когда через uart (/dev/cuaU* или /dev/ttyU*) идут только данные, которые прямо без обработки можно заворачивать в TCP/IP.
> Получится, после настрой железки, при помощи ng_tty создать netgraph ноду и ее при помощи ng_ksocket соединить ее к стеку TCP/IP?

Если драйвером является uart(4), который вовсе не заточен отдавать принимаемые данные в NETGRAPH, то нет.
uart(4) рассчитан на работу с пользовательскими процессами через файл устройства в /dev,
то есть системными вызовами read/write (ещё ioctl). Это существенный момент - данные из UART можно получить
только через файл устройства, то есть ориентация на обработку данных пользовательскими процессами,
а не в ядре, на что заточен NETGRAPH.

Можно, конечно, использовать ng_device для создания ещё одного девайса типа /dev/ngd0
и запустить пару процессов cat < /dev/cuau0 > /dev/ngd0 и второй cat в обратную сторону,
а затем соединить ng_device с ng_ksocket, но это как-то некузяво. Для тестовой схемы, может быть, сойдет,
но для работы такое вряд ли годится.

Если цель это получить данные именно из UART на другой машине, то конкрето эта задача,
разумеется, давным давно решена и много раз. В /usr/ports/comms хватает разного софта для этого:
comserv, remserial. Или, если вместо этого хочется "экспортировать" локальный /dev/cuau0 так,
чтобы удаленный хост мог подключиться по TCP и получить поток данных,
там же serialoverip, sredird, tits, и тот же comserv, который умеет и так.

Я когда-то давно с успехом пользовался каким-то из подобных пакетов под FreeBSD 8,
но ставил не сам и уже не помню, каким именно. У меня была система FreeBSD с обычной
мультипортовкой и разные коммутаторы, циски и прочее, подключенные к портам,
стандартный консольный сервер. Он позволял подключаться к разным TCP-портам
стандартным telnet-ом и попадать на соответствующие порты UART.




More information about the freebsd mailing list