У меня есть старая система, в которой работает собственное ядро 2.6.15, которое использует libpcap (версия 1.1.1). Недавно я сменил сетевую карту на чипсет Intel 82575EB, который требует от меня обновить драйвер до igb.ko (был e1000.ko). После обновления libpcap прекратит захват пакетов. Я изменил пример тестового кода с веб-сайта tcpdump, который захватывает 1 пакет и печатает информацию заголовка, libpcap return header.len из 1358 и header.caplen из 42, тогда как в случае e1000 и package.len, и packet.caplen возвращают 1358. Я пытался отключить MSI / MSI-X и увеличить MTU, но ничего не работает. Есть ли какие-либо другие параметры, которые мне нужно установить, чтобы драйвер igb работал с libpcap?
Вот пример тестовой программы (предоставлено командой tcpdump / libpcap):
#include <pcap.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
pcap_t *handle; /* Session handle */
char dev[20]; /* The device to sniff on */
char errbuf[PCAP_ERRBUF_SIZE]; /* Error string */
struct bpf_program fp; /* The compiled filter */
bpf_u_int32 mask; /* Our netmask */
bpf_u_int32 net; /* Our IP */
struct pcap_pkthdr header; /* The header that pcap gives us */
const u_char *packet; /* The actual packet */
if (argc <= 1) return(1);
strcpy(dev, argv[1]);
/* Find the properties for the device */
if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) {
fprintf(stderr, "Couldn't get netmask for device %s: %s\n", dev, errbuf);
net = 0;
mask = 0;
}
/* Open the session in promiscuous mode */
handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
if (handle == NULL) {
fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf);
return(2);
}
/* Grab a packet */
packet = pcap_next(handle, &header);
/* Print its length */
printf("packet length [%d]; captured length [%d]\n", header.len, header.caplen);
/* And close the session */
pcap_close(handle);
return(0);
}