问题标签 [netlink]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux-kernel - 通用网络链接 - PID 不是线程唯一的
我正在编写通过通用网络链接从用户空间接收消息的内核模块。当我在内核回调函数中访问 genl_info->snd_pid 时,我得到了进程 ID。
根据 libnl 文档:
libnl 根据进程标识符生成唯一的端口号,并为其添加一个偏移量,以允许使用多个套接字。出于向后兼容性的原因,初始套接字仍将等于进程标识符。
我的用户空间应用程序使用多个线程,我需要区分它们。谢谢你的帮助。
linux - 如何查询特定邻居的 IPv6 NDP(邻居发现协议)表
我正在使用 Linux 并试图弄清楚如何(通过 API)查询 NDP 表以获取特定条目。到目前为止,我发现的唯一示例(在 iproute2 的源代码中)使用 Netlink 并获取整个表。有没有办法在特定接口上查询 Netlink 以获取特定 IPv6 地址?或者有没有与使用 Netlink 不同的方法,我应该这样做?
linux - 使用 IP 队列时出现 Netlink 错误
我似乎对 IP 队列有疑问。
我有一台 linux 机器,我用它来运行一些实验。linux机器被配置成路由器,有两个网卡,连接另外两台电脑,管理它们的网络流量。使用 iptables 捕获所有传入的包,并由 C 应用程序进行分析。
作为实验的一部分,分析数据包的应用程序具有内置延迟。
所以我有一台非常快的计算机通过我的 linux-router 发送数据包,还有一个(相对)慢的 linux-router 一个一个地分析和处理数据包。
这种情况导致这样一个事实,即当我在连接到 linux-router 的一台计算机上启动发送方应用程序时,我在 linux-router 上的 IP 队列(几乎)瞬间被填满。
IP 队列的最大长度当前设置为 1024,如果溢出,则丢弃数据包。这是意料之中的,我可以接受。
但是,(这就是有趣的地方),我时不时地收到以下错误:
“接收网络链接消息失败:没有可用的缓冲区空间”
一开始以为是IP队列溢出导致的,但分析后发现有时IP队列缓冲区没有溢出也会报错,有时即使缓冲区DID也收不到消息溢出。
当我运行时> cat /proc/net/ip_queue
,我得到下表(也用于监控 IP 队列溢出):
查看最后两个值,Queue dropped
似乎是指由于缓冲区已满而无法进入 IP 队列的数据包。当我轰炸 linux-router 时,我可以看到这个值上升。Netlink dropped
(顾名思义:))似乎与我遇到的错误有关。
我尽我所能搜索有关此错误的材料,但找不到任何似乎指向我所需方向的内容。
底线:为什么我会收到此错误,我该怎么做才能避免它?
linux - libnl-3 包括损坏的?
我正在尝试在 Ubuntu 下使用 libnl 3 ( http://www.infradead.org/~tgr/libnl/ ) 来使用 netlink 以便从 IPv6 邻居缓存中获取一些信息。
我为这个库包含了一堆头文件,但第一个库的 gcc 已经失败:
没有像 libnl.h 这样的“主标头”。
文件 netlink.h 包括“netlink/netlink-compat.h”。不幸的是,没有“/usr/include/netlink/”文件夹。只有“/usr/include/libnl3/netlink/”
包括“netlink/netlink.h”因此给了我:
我在 Ubuntu 12.04 下安装了以下软件包:
我在这里遗漏了什么还是真的坏了?
linux - 授予用户权限以使用 netlink 套接字设置 qdisc
我有一个使用 Libnl 并尝试通过 netlink 套接字设置一些 qdisc 的程序。
我如何管理程序以获得设置 qdisc 的权限?
我知道我可以运行它,sudo
但这不是我的选择。是否有任何配置文件limits.conf
可以授予特定用户的权限?
netlink - 了解导致netlink中链路状态变化的接口
我已经使用 Netlink 套接字编写了一个程序。我能够成功检测到链接状态的变化(即,插入/拔出网络电缆时)。但在这两种情况下,我都得到了一个RTM_NEWLINK
事件。
我想我可以使用 getifaddrs 系统调用查询SIOCGIFFLAGS
并获取IFF_UP
状态以了解状态。为此,我想知道导致链接事件的接口是什么。有办法知道吗?目前我不知道结构中的任何成员,nlmsghdr
或者sockaddr_nl
会给出导致链接更改的接口。
c++ - 如何通过 netlink 获取网络链接 L2 地址?
我netlink
用来获取接口、它的名称、类型等,但我无法获取 L2 地址(ugly_data
is nlmsghdr*
):
type_
,id_
并name_
包含正确的值,与我从中得到的值相同ifconfig
,但address_
始终为空。我做错了什么以及如何获取地址?
sockets - netlink 连接器插座
我以前从事过网络编程工作。但这是我第一次涉足 netlink 套接字。
我选择研究“连接器”类型的 netlink 套接字。与任何内核组件一样,它也有一个用户对应项。linux 内核有一个名为ucon.c的示例程序,可用于基于上述连接器 netlink 套接字构建用户空间程序。
所以在这里我想指出我想确认我理解的程序部分以及我不遵循逻辑的程序部分。说够了。开始了。无论我误入歧途,请纠正我。
据我了解,netlink 套接字是一种 IPC 方法,用于连接同一台机器上的进程,因此进程 ID 用作标识符。由于 netlink 消息可以理想地多播,netlink 套接字需要的另一个标识符是消息组。连接到同一消息组的所有组件实际上都是相关的。因此,在 IPv4 的情况下,我们使用sockaddr_in代替sockaddr,这里我们使用包含上述标识符的sockaddr_nl 。
现在,由于我们不打算使用内核的 TCP/IP 堆栈,所以在 netlink 消息的情况下,netlink数据包可以被认为是原始的(如果我错了,请在这里纠正我)。因此,netlink 数据包经过的唯一封装是定义为nlmsghdr的netlink 消息头。
现在进入我们的程序 ucon,首先使用连接器协议main()
创建一个 NETLINK 系列套接字。然后它用相关信息填充前面提到的 netlink socketaddress 结构。为了在这里做一点实验,我在 connector.h 文件中添加了一个条目。现在我的第一个问题来了。
连接器消息具有在 connector.h 中定义的特定类型。现在这个连接器消息结构完全是 netlink内部的东西,对吧?就 netlink 而言,这只是有效载荷。正确的?
继续前进,在 netlink 消息头结构中nl-group字段究竟是什么意思?定义实际上并不包含此名称的元素。那么我们是否使用覆盖技术来填充 netlink 消息头的某些字段?如果是这样,对应的具体内容是什么?我似乎无法在任何地方找到它。
因此,在将套接字地址绑定到套接字之后,它会发送 10,000 个基于连接器的唯一数据,就 netlink 而言,这些数据是纯有效负载。但就这些消息而言,奇怪的是,它们似乎都具有相同的序列号。
继续前进,我们发现自己在netlink_send子例程中通过我们上面绑定的套接字发送这些数据包。此子例程使用各种 netlink 帮助宏来操作要发送的数据。正如我们上面所说,该main()
函数发送了 10,000 条数据,每条数据长度为零,不需要确认,因为 ack 字段为 0(如果我在这里错了,请纠正我)。因此,每个“数据包”只不过是一个连接器消息头,其中没有任何内容。正确的?
现在令人惊讶的是 netlink_Send 函数使用与 main() 相同的序列号,因为它是一个全局变量。但是,在 main() 中的后增量之后,它现在是“1”。所以基本上我们的netlink 谈话是从序列号“1”开始的。可以吗?
查看 linux/netlink.h 中定义的一些辅助宏,我将尝试总结我对在该程序中直接或间接使用的宏的理解。
所以这个宏会先对齐netlink消息头长度,然后加上payload长度。对于我们的例子,netlink 有效负载是一个连接器标头,没有任何自己的有效负载。在我们的例子中,这个 micro 是这样使用的
在这里,我不明白的是netlink消息的实际有效负载。在上述情况下,它是连接器消息头的大小(因为连接器消息本身不包含其自身的有效负载)减去指针(指向 netlink 消息的第一个字节,因此指向 netlink 消息头)。这个指针(像任何其他指针变量一样)等于机器字大小,在我的例子中是 4 个字节。为什么我们要从连接器消息头中减去它?
之后,我们通过这个 netlink 套接字发送消息,就像任何其他 IPv4 套接字一样。关于上述问题,希望能听到各位大侠的来信。在实际问题之前包括一些句子会有所帮助,因为我的帖子相当长。但我希望它对人们有用的不仅仅是我自己。
问候。
c++ - 从哪里获取设备类型常量描述?
我正在通过 netlink 套接字获取有关系统网络设备的信息。我正在解析结构中定义的三种消息类型RTM_NEWLINK
, 。RTM_DELLINK
RTM_GETLINK
ifinfomsg
定义来自这里http://www.kernel.org/doc/man-pages/online/pages/man7/rtnetlink.7.html
但是设备类型字段没有描述,ifi_type
我在哪里可以找到描述可能值的常量?
甚至这里也没有描述 http://www.foxprofr.com/rfc/RFC3549-LINUX-NETLINK-AS-AN-IP-SERVICES-PROTOCOL/3549.aspx
现在我知道这1
是以太网并且772
是环回,但我想知道所有可能的值。可能答案很明显,但谷歌不想告诉我任何有用的东西。