Что делает dev_net_set в Linux? - PullRequest
3 голосов
/ 03 июля 2019

Я пишу простой драйвер сетевого устройства на основе драйвера обратной связи и хочу зарегистрировать мою net_device структуру. Эта и эта страница о написании сетевого устройства говорит просто позвонить register_netdev. Но они пишут модные драйверы с PCI Express и другими сложными вещами.

Итак, если я просто хочу что-то вроде драйвера обратной петли, я должен основывать свой код на loopback.c. Мой вопрос в том, что делает первая строка этого кода в loopback_net_init:

dev_net_set(dev, net);
err = register_netdev(dev);

Видимо net определяется этим кодом в net_namespace.c:

register_pernet_device(ops) ...
__register_pernet_operations(list, ops)
   for_each_net(net) ...

Для чего этот цикл? Что может пойти не так, если я пропущу вызов dev_net_set? Почему другие не используют его?

Ответы [ 3 ]

0 голосов
/ 05 июля 2019

AFAIK, зацикливание происходит на уровне сокетов (уровень 5-7), тогда как net_dev используется в качестве компонента ядра, который немедленно взаимодействует с драйвером, когда вы на самом деле хотите использовать, скажем, карту Ethernet или SLIP, PLIPдля передачи кадров (уровень 2-0).Обратная петля происходит на уровне сетевой подсистемы ядра и располагается над драйверами, взаимодействующими с оборудованием.Так что я не понимаю, зачем вам нужен драйвер для использования функции обратной петли.Тем не менее, существует также положение для регистрации фиктивного устройства с помощью net_dev, хотя я не знаю, является ли это тем, что вы ищете.

Тем не менее, если вы намереваетесь просто использовать какой-то драйвер, который имитируетфактическое физическое устройство без такового и, скажем, отражает пакеты, которые оно получает, что также возможно.По существу, до уровня net_dev ядро ​​выполняет всю работу по протоколу (TCP / IP) и, наконец, передает пакет некоторому дескриптору, который драйвер устройства регистрирует с помощью net_dev или чего-то подобного.Аналогичным образом, при получении данных, устройство запускает прерывание, драйвер выполняет операцию DMA, и ядро ​​принимает управление оттуда.Следовательно, вместо кода для выполнения операции DMA, вы можете создать модуль, который просто передает статический пакет, совместимый с Ethernet / TCP / IP.В подавляющем большинстве случаев все эти аспекты (сеть и другие подсистемы) не зависят от деталей базовой шины, т. Е. Не должно иметь значения, подключена ли карта Ethernet к PCI или ISA, но могут быть исключения.Таким образом, ИМХО, вы пытаетесь сделать что-то, что следует делать только после тщательного понимания сетевой подсистемы и достаточного понимания ядра в целом.До этого момента вы будете снимать в темноте.Иногда вы можете ударить, но часто вы пропустите.

0 голосов
/ 09 июля 2019

http://man7.org/linux/man-pages/man8/ip-netns.8.html

Пространство имен сети логически является еще одной копией сетевого стека, со своими собственными маршрутами, правилами брандмауэра и сетевыми устройствами.

Таким образом, for_each_net проходит по этим пространствам имен и создает копии всех сетевых устройств в каждом.

Используйте ip netns list, чтобы определить, используете ли вы сетевые пространства имен. Часто они не используются, поэтому не обязательно использовать драйверы dev_net_set.

0 голосов
/ 03 июля 2019

AFAIK, net - это структура, которая позволит ядру взаимодействовать с устройством.Это необходимо для регистрации устройства и удаления его в функции очистки модуля.Пожалуйста, просмотрите код в linux / net / 8021q / для примеров.

...