使用NETLINK的VLAN信息

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

正如评论中所build议的那样,我在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 

在创建一个netlink套接字时,它创建了3个设备。 这就是为什么你收到3个事件。 这是它创建的3个设备,同时add事件。

  • 网络子系统。
  • 发送队列子系统。
  • 接收队列子系统。

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 

通常从netdev_state_change(请参阅: http ://lxr.free-electrons.com/source/net/core/dev.c#L1226),发送RTM_NEWLINK消息的每个接口状态更改。

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

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

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

以类似的方式删除你看到:

  1. eth2状态变化通知(与eth2.75和VLAN分离)
  2. eth2.75从UP状态变为DOWN状态的通知
  3. 删除eth2.75接口的通知