C程序如何在不轮询内核的情况下获取新添加的NIC的pci地址?
How can I get the pci address of a newly added NIC in C program without polling the kernel?
根据下面的 link,我了解到通过创建 netlink 套接字并监听 RTMGRP_LINK 我们可以检测事件(网络接口 create/delete/up/down 事件)。
How can I monitor the NIC status(up/down) in a C program without polling the kernel?
是否可以检测到新添加接口的pci地址?
一旦您知道它的接口名称(例如 eth0),您就可以使用 ethtool 查询该信息 API:
#include <linux/ethtool.h>
#include <linux/sockios.h>
.. and other socket headers.
...
int sock = socket(PF_INET, SOCK_DGRAM, 0);
struct ifreq ifr;
struct ethtool_cmd cmd;
struct ethtool_drvinfo drvinfo;
memset(&ifr, 0, sizeof ifr);
memset(&cmd, 0, sizeof cmd);
memset(&drvinfo, 0, sizeof drvinfo);
strcpy(ifr.ifr_name, "eno1");
ifr.ifr_data = &drvinfo;
drvinfo.cmd = ETHTOOL_GDRVINFO;
if(ioctl(sock, SIOCETHTOOL, &ifr) < 0) {
perror("ioctl")
return;
}
现在 PCI 总线地址可以在 drvinfo.bus_info
中作为字符串使用 - 假定 NIC 实际上是一个 PCI 设备。
您也可以通过命令行检查:
$ ethtool -i eno1
driver: e1000e
version: 2.3.2-k
firmware-version: 0.13-4
bus-info: 0000:00:19.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no
根据下面的 link,我了解到通过创建 netlink 套接字并监听 RTMGRP_LINK 我们可以检测事件(网络接口 create/delete/up/down 事件)。
How can I monitor the NIC status(up/down) in a C program without polling the kernel?
是否可以检测到新添加接口的pci地址?
一旦您知道它的接口名称(例如 eth0),您就可以使用 ethtool 查询该信息 API:
#include <linux/ethtool.h>
#include <linux/sockios.h>
.. and other socket headers.
...
int sock = socket(PF_INET, SOCK_DGRAM, 0);
struct ifreq ifr;
struct ethtool_cmd cmd;
struct ethtool_drvinfo drvinfo;
memset(&ifr, 0, sizeof ifr);
memset(&cmd, 0, sizeof cmd);
memset(&drvinfo, 0, sizeof drvinfo);
strcpy(ifr.ifr_name, "eno1");
ifr.ifr_data = &drvinfo;
drvinfo.cmd = ETHTOOL_GDRVINFO;
if(ioctl(sock, SIOCETHTOOL, &ifr) < 0) {
perror("ioctl")
return;
}
现在 PCI 总线地址可以在 drvinfo.bus_info
中作为字符串使用 - 假定 NIC 实际上是一个 PCI 设备。
您也可以通过命令行检查:
$ ethtool -i eno1
driver: e1000e
version: 2.3.2-k
firmware-version: 0.13-4
bus-info: 0000:00:19.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no