12

如何使用 C 中的 NETLINK 套接字获取 VLAN 信息,例如从内核到用户空间的 VLAN 子接口的添加和删除?

正如评论中所建议的那样,我对 NETLINK 人做了很少的研究。我添加和删除了一个 VLAN 子接口,并使用 netlink socket 程序进行了监控。用于添加和删除每个接收 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
4

3 回答 3

4

在创建 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-27T02:20:05.337 回答
1

RTM_NEWLINK 消息会针对接口状态的每次变化发送,通常来自 netdev_state_change(参见:http ://lxr.free-electrons.com/source/net/core/dev.c#L1226 )。

基本上,将 RTM_NEWLINK 视为“接口更改状态”,而不仅仅是“创建的新接口”。

例如,要添加 VLAN 接口,您将获得:

  1. 新接口eth2.75处于DOWN状态的通知
  2. 底层物理接口 eth2 的状态通知(它现在有一个以前没有的“从属”接口 - 例如,一些 NIC 卡具有 HW 卸载功能以过滤不需要的 VLAN 标签。接口现在可能需要更新 NIC ETC。)。eth2 处于 UP 状态并且仍然如此 - 但它的内部状态发生了变化。
  3. eth2.75 从 DOWN 变为 UP 状态的通知。

以类似的方式删除您会看到:

  1. eth2 状态更改通知(与 eth2.75 和 VLAN 解除关联)
  2. eth2.75 从 UP 变为 DOWN 状态的通知
  3. 移除eth2.75接口的通知
于 2015-05-27T06:42:27.087 回答
0

您可能正在使用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.

然后在文件中查找sendmsgsendto说明。log

于 2021-10-11T07:41:44.150 回答