首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NETLINK的VLAN信息

使用NETLINK的VLAN信息
EN

Stack Overflow用户
提问于 2015-05-21 01:12:34
回答 3查看 1.7K关注 0票数 12

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

我很少像评论中所建议的那样在NETLINK man上做研究。我添加并删除了一个VLAN子接口,并使用netlink套接字程序进行监视。用于添加和删除每个接收3条消息。加法发送3条NEWLINK消息,删除发送2条NEWLINK和1条DELLINK消息。为什么是这样?

为了添加新的VLAN接口eth1.75:

代码语言:javascript
复制
RTM_NEWLINK Link eth2.75 Down
RTM_NEWLINK Link eth2 Up
RTM_NEWLINK Link eth2.75 Up

删除VLAN接口(eth2.75):

代码语言:javascript
复制
RTM_NEWLINK Link eth2 Up
RTM_NEWLINK Link eth2.75 Down
RTM_DELLINK eth2.75
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-27 02:20:05

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

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

net子系统是上层控制装置。另外两个是用于处理数据的queues。您可以按以下方式验证它。

当我执行一个udevadm monitor --env并创建一个vlan时,我从内核中得到以下事件:

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 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接口,您可以获得:

  1. 关闭状态下的新接口eth2.75的通知
  2. 通知底层物理接口eth2的状态(它现在有一个以前没有的“从属”接口--例如,一些网卡有HW卸载来过滤不需要的VLAN标记。接口现在可能需要更新NIC等)。eth2处于向上状态,并且仍然如此--但是它的内部状态发生了变化。
  3. 通知eth2.75从下到上的状态。

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

  1. 通知eth2状态更改(与eth2.75和VLAN断开关联)
  2. 通知eth2.75从上到下状态
  3. 删除eth2.75接口的通知
票数 1
EN

Stack Overflow用户

发布于 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文件中查找logsendto指令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30362928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档