Меня интересует хранение пакетов, которые я прослушиваю с помощью PCAP.
Поскольку я заранее выделяю нужную мне память - то есть кратное MTU интерфейса, с которого я обнюхиваю, я хотел бы узнать, сколько памяти мне нужно, прежде чем открывать живой сеанс.
Можно ли запросить PCAP для получения MTU перехваченного интерфейса?
Как я могу получить эту информацию иначе (возможно, используя системные библиотеки)?
Спасибо
Один из вариантов в Linux - это файл sysfs mtu в / sys / class / net / devicename
$ cat /sys/class/net/eth0/mtu /sys/class/net/lo/mtu
1500
16436
В 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
предлагается.