如何使用C中的NETLINK套接字从内核到用户空间中添加和删除VLAN子接口等VLAN信息?
我很少像评论中所建议的那样在NETLINK man上做研究。我添加并删除了一个VLAN子接口,并使用netlink套接字程序进行监视。用于添加和删除每个接收3条消息。加法发送3条NEWLINK消息,删除发送2条NEWLINK和1条DELLINK消息。为什么是这样?
为了添加新的VLAN接口eth1.75:
RTM_NEWLINK Link eth2.75 Down
RTM_NEWLINK Link eth2 Up
RTM_NEWLINK Link eth2.75 Up删除VLAN接口(eth2.75):
RTM_NEWLINK Link eth2 Up
RTM_NEWLINK Link eth2.75 Down
RTM_DELLINK eth2.75发布于 2015-05-27 02:20:05
在创建netlink套接字时,它创建了3个设备。这就是为什么你会收到3个事件。下面是它在add事件中创建的3个设备。
net子系统是上层控制装置。另外两个是用于处理数据的queues。您可以按以下方式验证它。
当我执行一个udevadm monitor --env并创建一个vlan时,我从内核中得到以下事件:
UDEV [305215.045416] add /devices/virtual/net/vpn0 (net)
ACTION=add
DEVPATH=/devices/virtual/net/vpn0
ID_MM_CANDIDATE=1
IFINDEX=10
INTERFACE=vpn0
SEQNUM=3665
SUBSYSTEM=net
USEC_INITIALIZED=5215023319
UDEV [305215.046658] add /devices/virtual/net/vpn0/queues/rx-0 (queues)
ACTION=add
DEVPATH=/devices/virtual/net/vpn0/queues/rx-0
SEQNUM=3666
SUBSYSTEM=queues
USEC_INITIALIZED=15044665
UDEV [305215.047628] add /devices/virtual/net/vpn0/queues/tx-0 (queues)
ACTION=add
DEVPATH=/devices/virtual/net/vpn0/queues/tx-0
SEQNUM=3667
SUBSYSTEM=queues
USEC_INITIALIZED=5215044729发布于 2015-05-27 06:42:27
RTM_NEWLINK消息是针对接口状态中的每一项更改发送的,通常来自netdev_state_change (参见:http://lxr.free-electrons.com/source/net/core/dev.c#L1226)。
基本上,把RTM_NEWLINK看作是“接口改变了的状态”,而不仅仅是“创建了一个新的接口”。
例如,对于添加VLAN接口,您可以获得:
以类似的方式删除您可以看到:
发布于 2021-10-11 07:41:44
很可能您使用的是ifupdown实用程序,例如ifup,对吗?
由于某种原因,它包含了一个奇怪的逻辑:在添加或提升过程中,如果接口名称包含一个点符号(‘.“),那么在处理子接口之前,它会调用ip link set up作为”父“接口。它还包含一个特殊的逻辑,用于“设置”过程,类似于您所写的过程。您可以在link.defn源代码的“ifupdown”文件中检查它。
顺便说一句,现在您可以使用strace实用程序来调试netlink。
sudo strace ip link add link eth2 name eth2.75 type vlan id 75 2> ./log。
然后在sendmsg文件中查找log或sendto指令。
https://stackoverflow.com/questions/30362928
复制相似问题