使用PCAP获取Linux下的接口MTU

使用PCAP获取Linux下的接口MTU

我有兴趣存储使用 PCAP 嗅探的数据包。

当我预先分配我需要的内存时 - 即我正在嗅探的接口的 MTU 的倍数,我想在打开实时会话之前发现我需要多少内存。

是否可以通过查询 PCAP 来获取嗅探接口的 MTU ?

否则我怎样才能获取这些信息(可能使用系统库)?

谢谢

答案1

Linux 上的一个选项是 /sys/class/net/devicename 中的 sysfs 文件 mtu

$ cat /sys/class/net/eth0/mtu /sys/class/net/lo/mtu
1500
16436

答案2

在 PCAP 中没有直接的方法可以做到这一点(没有 API)。

但是对于 Linux >=2.6溶剂发布了一个简单的解决方案,正在读取如下文件:/sys/class/net/INTERFACE_X/mtu。用 C 语言做这件事很简单。

int getMTU(char *name) {
FILE *f;
char buf[128];
char *line = NULL;
ssize_t count;
size_t len = 0;
int mtu;

snprintf(buf, sizeof(buf), "/sys/class/net/%s/mtu", name);
f = fopen(buf, "r");
if(!f) {
    perror("Error opening:");
    exit(EXIT_FAILURE);
}
count = getline(&line, &len, f);

if (count == -1) {
    perror("Error opening:");
    exit(EXIT_FAILURE);
}
sscanf(line, "%d\n", &mtu);
fclose(f);

return mtu;
}

阅读 PCAP 源代码后,我发现 PCAP 开发人员使用了一种更复杂但更优雅的解决方案来读取接口 MTU 调用ioctl。这是我编写的简化版本:

#include <sys/ioctl.h>
#include <net/if.h>

int get_mtu(int fd, const char *device) {
struct ifreq ifr;

if (!device)
    return 65535;

memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));

if (ioctl(fd, SIOCGIFMTU, &ifr) == -1) {
    perror("Error opening:");
    exit(EXIT_FAILURE);
}

return ifr.ifr_mtu;
}

man netdevice建议进一步参考。

相关内容