- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我知道可以使用 NETLINK 中的 RTE_NEWLINK 消息类型检测新接口(interface)添加。 Netlink 发送一条消息,我们可以使用 (if_indextoname & if_nametoindex) 获取接口(interface)的索引和名称。
我的问题是,如果我们添加一个 VLAN 接口(interface),它会发送一 strip 有接口(interface)名称的消息(例如:eth1.10)。此 vlan 号是否仅在接口(interface)名称中可用或者它是否在 NL_MSG 结构内的任何地方可用。我不想解析接口(interface)名称和获取VLAN号
我执行了下面的代码并添加了一个vlan子接口(interface),但是无法从属性结构中找到vlan信息。即使 RTM_NEWLINK 检测到新界面,它也没有打印任何内容。如果我在错误的代码位置查找 VLAN 信息,请纠正我。
if(nl_msg_hdr->nlmsg_type == RTM_NEWLINK)
{
struct ifinfomsg *ifi;
struct rtattr *rt_attr;
int rtattrlen;
ifi = (struct ifinfomsg *) NLMSG_DATA(nl_msg_hdr);
printf("RTM_NEWLINK");
for (;RTA_OK(rt_attr, rtattrlen); rt_attr = RTA_NEXT(rt_attr, rtattrlen)) {
if (rt_attr->rta_type == IFLA_LINKINFO)
printf(" IFLA_LINKINFO \n");
if (rt_attr->rta_type == IFLA_LINK)
printf(" IFLA_LINK \n");
if (rt_attr->rta_type == IFLA_INFO_DATA)
printf(" IFLA_INFO_DATA\n");
if (rt_attr->rta_type == IFLA_VLAN_ID)
printf(" IFLA_VLAN_ID\n");
}
}
x/200bx nl_msg_hdr - 200 bytes hex-dump (VLAN ID is 33 in my case)
0x7fffffffd250: 0xa4 0x04 0x00 0x00 0x10 0x00 0x00 0x00
0x7fffffffd258: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffd260: 0x00 0x00 0x01 0x00 0x27 0x00 0x00 0x00
0x7fffffffd268: 0x02 0x10 0x00 0x00 0xff 0xff 0xff 0xff
0x7fffffffd270: 0x0d 0x00 0x03 0x00 0x76 0x65 0x74 0x68
0x7fffffffd278: 0x31 0x2e 0x33 0x33 0x00 0x00 0x00 0x00
0x7fffffffd280: 0x08 0x00 0x0d 0x00 0x00 0x00 0x00 0x00
0x7fffffffd288: 0x05 0x00 0x10 0x00 0x02 0x00 0x00 0x00
0x7fffffffd290: 0x05 0x00 0x11 0x00 0x00 0x00 0x00 0x00
0x7fffffffd298: 0x08 0x00 0x04 0x00 0xdc 0x05 0x00 0x00
0x7fffffffd2a0: 0x08 0x00 0x1b 0x00 0x00 0x00 0x00 0x00
0x7fffffffd2a8: 0x08 0x00 0x1e 0x00 0x00 0x00 0x00 0x00
0x7fffffffd2b0: 0x08 0x00 0x1f 0x00 0x01 0x00 0x00 0x00
0x7fffffffd2b8: 0x08 0x00 0x20 0x00 0x01 0x00 0x00 0x00
0x7fffffffd2c0: 0x08 0x00 0x05 0x00 0x0a 0x00 0x00 0x00
0x7fffffffd2c8: 0x05 0x00 0x21 0x00 0x01 0x00 0x00 0x00
0x7fffffffd2d0: 0x09 0x00 0x06 0x00 0x6e 0x6f 0x6f 0x70
0x7fffffffd2d8: 0x00 0x00 0x00 0x00 0x24 0x00 0x0e 0x00
0x7fffffffd2e0: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffd2e8: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffd2f0: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7fffffffd2f8: 0x00 0x00 0x00 0x00 0x00 0x88 0xff 0xff
0x7fffffffd300: 0x0a 0x00 0x01 0x00 0x66 0x0f 0x70 0x37
0x7fffffffd308: 0x0b 0x27 0x00 0x00 0x0a 0x00 0x02 0x00
0x7fffffffd310: 0xff 0xff 0xff 0xff 0xff 0xff 0x00 0x00
最佳答案
vlan 信息在 RTM_NEWLINK 消息中可用:IFLA_LINKINFO/IFLA_INFO_DATA/IFLA_VLAN_ID:
# the message structure:
[ nlmsg fields ]
[ ifinfmsg fields ]
nla chain:
[ IFLA_IFNAME ]
[ IFLA_… ]
[ IFLA_LINKINFO ]
nla chain:
[ IFLA_INFO_KIND ]
...
[ IFLA_INFO_DATA ]
nla chain:
[ IFLA_VLAN_ID ]
和相应的代码(带有 pyroute2 的 python 示例):
from pyroute2 import IPRoute
ip = IPRoute()
# assume `ifindex` contains VLAN interface index
nlmsg = ip.get_links(ifindex)[0]
vid = nlmsg.get_attr('IFLA_LINKINFO').\
get_attr('IFLA_INFO_DATA').\
get_attr('IFLA_VLAN_ID')
print(vid)
检查从 2.6.32 (RHEL6.5) 到 4.1.0-rc6 (F22) 的内核。
是的,你是对的——不应该依赖接口(interface)名称作为 VLAN id 的来源。接口(interface)名称可以是任何字面意思。
关于linux - 使用 NETLINK 的 Vlan 接口(interface)详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30991848/
我在将 netlink 套接字与新的 netlink 系列一起使用时遇到了一些问题……尤其是对于组。我在内核空间中使用 netlink_broadcast 或 nlmsg_multicast 方法向用
我试图实现的任务实际上非常简单(将字符串“TEST”多播到用户级守护程序),但内核模块无法编译。它因错误而停止: passing argument 4 of ‘genlmsg_multicast_al
我的应用程序应该从内核获取 netlink 多播路由更新。我做了一些研究,发现多播使用不同的系列:RTNL_FAMILY_IPMR组是 RTMGRP_IPV4_MROUTE。 但是如果我使用:
我没有在内核中找到任何文档/说明,要求以网络字节顺序将 netlink 消息中的 16/32-bit 值传递给内核。所以我的问题是在填充网络链接消息时是否必须使用 htonl/htons 函数。有这样
我正在尝试将消息从用户空间发送到内核。我能够通过 netlink 套接字成功发送它。但我想知道我是否应该释放我编写的内核函数中的消息,或者 netlink 套接字 API 正在释放内存? 同样在/pr
我最近又开始开发 C++ 应用程序。我正在使用 NetLink for Sockets 和 Visual Studio 进行开发。 我编写了一个小代码,但出现了一些错误。我已经包含了来自 NetLin
我编写了一个内核模块和用户空间程序,内核模块发送 netlink 多播消息,用户空间程序读取这些消息并将它们打印出来。内核模块和用户空间程序可在此处 (https://github.com/aksha
静态分析器 PVS-Studio 在 nh = (struct nlmsghdr *) buf 中报告, The pointer 'buf' is cast to a more strictly al
我正在使用 netlink和 genetlink Go packages 编写一个实用程序来与 MAC80211_HWSIM netlink 系列功能进行交互。它运作良好……几乎。 我发现,如果我执行
我想使用 netlink 在应用程序和内核空间之间进行通信。我的Linux内核版本是2.6.28,下面是我的错误代码: nf_sock=netlink_kernel_create(NL_PROTO,0
我了解 Netlink 是在 Linux 中通信内核和用户空间的现代且正确的方式。 我有一个需要配置的内核模块,所以我使用 Netlink 让它与用户空间应用程序对话。 一切都很顺利,但在我看来任何用
我正在使用 Linux 作为主要平台学习嵌入式系统编程。我想创建一个设备事件管理服务。该服务是一个用户空间应用程序/守护进程,它将检测连接的硬件模块是否触发了事件。但我的问题是我不知道应该从哪里开始。
我正在开发一个用于嵌入式设备的 C++ 应用程序,该应用程序通过 netlink 套接字监听 USB 热插拔事件。检测事件完美无缺,但另外我想在程序开始时查询已经连接的设备。我能够为网络接口(inte
我编写了一个内核模块,它接受数据(结构形式)并将一些数据(相同结构格式)传回用户空间。我可以成功接收来自用户的消息,但在尝试取消引用从内核接收的数据结构的某些成员时出现段错误。我正在使用 netlin
我试过this program 。该程序向内核发送“hello”,内核再次向用户空间回复“hello”一次。 我的要求:用户必须发送“hello”并且必须每2秒接收一次消息。 我已经尝试过了。 用户应
我一直在尝试在内核模块和进程之间实现非常简单的网络链接通信。但我似乎一直坚持在内核模块上创建 netlink 套接字。正如我从内核 3.6 及更高版本中了解到的,netlink_kernel_crea
我是内核开发新手,在通过 netlink 套接字将数据从内核空间统一转换到用户空间时遇到问题。 send_nat()函数将从内核模块调用,以将用户定义的struct nat_mntr写入netlink
我想以内核作为客户端在内核模块和用户应用程序之间建立连接。换句话说,内核会向用户应用程序发送消息,等待回复,收到回复,然后继续执行。 例如,在内核中我会发送消息然后等待回复。 // inside ke
我正在尝试获取通过 NetLink(Linux 内核)发送的数据 block 的大小。我已尝试使用 size = nlh->nlmsg_len - NLMSG_HDRLEN,但未返回正确的大小。获取消
我的目标是始终在内核内存中拥有一个数组或列表,以便始终可以从内核空间访问它。为此,我使用此处推荐的 netlink 套接字。我关注this example ,它显示了如何发送字符串。我不确定如何在套接
我是一名优秀的程序员,十分优秀!