使用NETLINK获取VLAN信息

12
如何使用C语言中的NETLINK套接字从内核到用户空间获取VLAN信息,例如添加和删除VLAN子接口?
我按照评论中的建议对NETLINK手册进行了一些研究。我添加和删除了一个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

2
阅读手册并在遇到具体问题时回来。从man 7 netlink开始,然后是man 7 rtnetlink。我认为您将获得添加的RTM_NEWLINK和删除的RTM_DELINK。查看Network Manager的源代码以获取示例。 - Brian McFarland
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

1

RTM_NEWLINK消息会在接口状态发生变化时发送,通常是从netdev_state_change(参见:http://lxr.free-electrons.com/source/net/core/dev.c#L1226)。

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

例如,添加VLAN接口时,您会收到以下内容:

  1. 通知一个处于DOWN状态的新接口eth2.75
  2. 通知底层物理接口eth2的状态(它现在有了一个“下属”接口,以前没有-例如一些NIC卡具有硬件卸载以过滤不需要的VLAN标记。接口现在可能需要更新NIC等)。 eth2处于UP状态并保持不变-但其内部状态已更改。
  3. 通知eth2.75从DOWN状态转变为UP状态。

类似地,删除操作如下:

  1. 以太网2状态变化通知(从以太网2.75和VLAN中取消关联)
  2. 以太网2.75接口从UP状态变为DOWN状态通知
  3. 移除以太网2.75接口通知

0

你可能正在使用ifupdown实用程序,例如ifup,对吧?

由于某种原因,它包含了奇怪的逻辑:在添加或启动过程中,如果接口名称包含点符号(“.”),则在处理子接口之前会调用“父”接口的ip link set up。它还包含了一种类似于你所写的“设置下行”过程的特殊逻辑。您可以在ifupdown源代码的“link.defn”文件中进行检查。

顺便说一句,现在您可以使用strace实用程序来调试netlink,例如:

sudo strace ip link add link eth2 name eth2.75 type vlan id 75 2> ./log

然后在log文件中查找sendmsgsendto指令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接