dev_net_set 在 Linux 中做什么?
What does dev_net_set do in Linux?
我正在编写一个基于环回驱动程序的简单网络设备驱动程序,并且想注册我的 net_device
结构。 This and that 关于编写网络设备的页面说只需调用 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
调用,可能会出现什么问题?为什么其他人不用它?
据我所知,net 是一个允许内核与设备交互的结构。您需要它来注册设备并在模块清理功能中将其删除。请查看 linux/net/8021q/ 下的代码以获取示例。
AFAIK,循环发生在套接字级别(第 5-7 层),而 net_dev 用作内核组件,当您真正想要使用以太网时,它会立即与驱动程序交互卡,或 SLIP,PLIP 用于传输帧(第 2-0 层)。环回发生在内核的网络子系统级别,并且位于与硬件交互的驱动程序之上。所以我不明白为什么你需要一个驱动程序来使用环回功能。但是,还有一个使用 net_dev 注册虚拟设备的规定,但我不知道这是否是您正在寻找的。
就是说,如果您的目的是简单地使用一些模拟实际物理设备的驱动程序,而不是说,反映它收到的数据包,那也是可能的。基本上直到 net_dev 层,内核完成所有协议工作(TCP/IP),最后将数据包传递给设备驱动程序向 net_dev 或类似的东西注册的某个句柄。类似地,在接收东西时,设备触发中断,驱动程序执行 DMA 操作,然后内核从那里接管。因此,除了执行 DMA 操作的代码之外,您还可以制作一个简单地传递静态数据包的模块,该模块与 ethernet/TCP/IP 兼容。在绝大多数情况下,所有这些方面(网络和其他子系统)都与底层总线细节无关,即以太网卡是连接到 PCI 还是 ISA 并不重要,但也有例外。因此,恕我直言,您正在尝试做一些只有在对网络子系统有透彻的了解并且对整个内核有足够的了解之后才应该尝试的事情。到那时你将在黑暗中拍摄。有时你可能会打中,但often-times你会打不中。
http://man7.org/linux/man-pages/man8/ip-netns.8.html
A network namespace is logically another copy of the network stack,
with its own routes, firewall rules, and network devices.
因此 for_each_net
遍历这些命名空间并在每个命名空间中创建所有 "per net" 网络设备的副本。
使用ip netns list
确定您是否正在使用网络命名空间。它们通常不被使用,因此驱动程序不一定需要使用 dev_net_set
.
我正在编写一个基于环回驱动程序的简单网络设备驱动程序,并且想注册我的 net_device
结构。 This and that 关于编写网络设备的页面说只需调用 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
调用,可能会出现什么问题?为什么其他人不用它?
据我所知,net 是一个允许内核与设备交互的结构。您需要它来注册设备并在模块清理功能中将其删除。请查看 linux/net/8021q/ 下的代码以获取示例。
AFAIK,循环发生在套接字级别(第 5-7 层),而 net_dev 用作内核组件,当您真正想要使用以太网时,它会立即与驱动程序交互卡,或 SLIP,PLIP 用于传输帧(第 2-0 层)。环回发生在内核的网络子系统级别,并且位于与硬件交互的驱动程序之上。所以我不明白为什么你需要一个驱动程序来使用环回功能。但是,还有一个使用 net_dev 注册虚拟设备的规定,但我不知道这是否是您正在寻找的。
就是说,如果您的目的是简单地使用一些模拟实际物理设备的驱动程序,而不是说,反映它收到的数据包,那也是可能的。基本上直到 net_dev 层,内核完成所有协议工作(TCP/IP),最后将数据包传递给设备驱动程序向 net_dev 或类似的东西注册的某个句柄。类似地,在接收东西时,设备触发中断,驱动程序执行 DMA 操作,然后内核从那里接管。因此,除了执行 DMA 操作的代码之外,您还可以制作一个简单地传递静态数据包的模块,该模块与 ethernet/TCP/IP 兼容。在绝大多数情况下,所有这些方面(网络和其他子系统)都与底层总线细节无关,即以太网卡是连接到 PCI 还是 ISA 并不重要,但也有例外。因此,恕我直言,您正在尝试做一些只有在对网络子系统有透彻的了解并且对整个内核有足够的了解之后才应该尝试的事情。到那时你将在黑暗中拍摄。有时你可能会打中,但often-times你会打不中。
http://man7.org/linux/man-pages/man8/ip-netns.8.html
A network namespace is logically another copy of the network stack, with its own routes, firewall rules, and network devices.
因此 for_each_net
遍历这些命名空间并在每个命名空间中创建所有 "per net" 网络设备的副本。
使用ip netns list
确定您是否正在使用网络命名空间。它们通常不被使用,因此驱动程序不一定需要使用 dev_net_set
.