libpcap не может перехватить пакеты после обновления до нового драйвера linux ethernet - PullRequest
0 голосов
/ 03 ноября 2011

У меня есть старая система, в которой работает собственное ядро ​​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);
}

1 Ответ

0 голосов
/ 07 ноября 2013

Попробуйте libpcap 1.4.0, который в настоящее время является самым последним выпуском; В 1.1.1 есть ошибка, которая, как я помню, может привести к тому, что пакет будет снабжен слишком коротким caplen, даже если вы предоставили достаточно большой аргумент длины снимка для pcap_open_live() (который у вас есть - BUFSIZ обычно где-то между 1К и 4К, которые больше, чем 42, и я думаю, что это 4К в Linux).

...