[freebsd] netgraph

12 views
Skip to first unread message

Nick Kostirya via freebsd

unread,
Apr 2, 2021, 3:43:35 AM4/2/21
to fre...@uafug.org.ua
Привет.

У меня наивный вопрос про netgraph.

Я правильно понял, что при помощи ng_socket можно соединить два компьютера в одну сеть через, например, UART проводами или при помощи радио?
Для этого лишь достаточно написать демона, который будет просто перекладывать байты из socket в UART сразу или передавать радиочипу?
_______________________________________________
freebsd mailing list
fre...@uafug.org.ua
http://mailman.uafug.org.ua/mailman/listinfo/freebsd

Eugene Grosbein

unread,
Apr 4, 2021, 1:05:23 PM4/4/21
to Nick Kostirya, fre...@uafug.org.ua
02.04.2021 14:43, Nick Kostirya via freebsd пишет:

> Привет.
>
> У меня наивный вопрос про netgraph.
>
> Я правильно понял, что при помощи ng_socket можно соединить два компьютера в одну сеть через, например, UART проводами или при помощи радио?
> Для этого лишь достаточно написать демона, который будет просто перекладывать байты из socket в UART сразу или передавать радиочипу?

Не этой нодой.

ng_socket это "переходник" между BSD-сокетами стека TCP/IP и внутренностями NETGRAPH и не более того.
То есть, если у нас есть некая абстрактная нода или сеть нод внутри NETGRAPH и их надо кормить
данными, приходящими из TCP/IP (или в обратную сторону, или в обе), для этого можно использовать ng_socket.

Для передачи данных (соединения в сеть) через UART штатный драйвер uart(4) уже создаёт файлы устройств
в /dev, плюс драйвер этот реализует абстракцию termios(4) line discipline и уже написаны демоны,
которые перекладывают байты в девайс и обратно: ppp, mpd5 и раньше ещё был slattach, но протокол SLIP
для работы поверх UART выпилили давно из FreeBSD (во время FreeBSD 4 он ещё работал).

Если вам интересно использование именно NETGRAPH через некое железо, то плясать надо от драйвера
этого железа, в какой форме драйвер принимает данные для отправки или выдаёт принятые от железа данные?

Если вы сами пишете такой драйвер - вполне возможно реализовать новую ноду NETGRAPH,
которая с одной стороны будет частью драйвера, общающейся с железом "напрямую",
а с другой стороны посредством нетграфовых хуков может быть соединена с ng_iface или ng_eiface
или ng_device.

Nick Kostirya via freebsd

unread,
Apr 4, 2021, 11:31:41 PM4/4/21
to Eugene Grosbein, fre...@uafug.org.ua
On Mon, 5 Apr 2021 00:04:50 +0700
Eugene Grosbein <eu...@grosbein.net> wrote:

> 02.04.2021 14:43, Nick Kostirya via freebsd пишет:
> > Привет.
> >
> > У меня наивный вопрос про 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 штатный драйвер uart(4) уже создаёт файлы устройств
> в /dev, плюс драйвер этот реализует абстракцию termios(4) line discipline и уже написаны демоны,
> которые перекладывают байты в девайс и обратно: ppp, mpd5 и раньше ещё был slattach, но протокол SLIP
> для работы поверх UART выпилили давно из FreeBSD (во время FreeBSD 4 он ещё работал).
>
> Если вам интересно использование именно NETGRAPH через некое железо, то плясать надо от драйвера
> этого железа, в какой форме драйвер принимает данные для отправки или выдаёт принятые от железа данные?

Драйверов пока нет. Другие железки работают через spi протокол. Но что-то они не хочет дружить с микрокомпьютером под управление FreeBSD, так что скорее всего сделаю через промежуточный микропроцессор, который spi будет преобразовывать в uart. Тем более, что упомянутая выше так сама делает.

Eugene Grosbein

unread,
Apr 5, 2021, 1:10:11 AM4/5/21
to Nick Kostirya, fre...@uafug.org.ua
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.

Nick Kostirya via freebsd

unread,
Apr 5, 2021, 1:42:31 AM4/5/21
to Eugene Grosbein, fre...@uafug.org.ua
On Mon, 5 Apr 2021 12:10:00 +0700
Eugene Grosbein <eu...@grosbein.net> wrote:

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

Большое спасибо.

Reply all
Reply to author
Forward
0 new messages