2015-07-01 9 views
1

Я использую fp = pcap_open_dead(DLT_EN10MB,65535); для захвата кадров в формате pcap. Но что fp = pcap_open_dead(**DLT_XXX**) Должен ли я использовать , если я хочу пропустить заголовок ethernet. Мой модуль работает на уровне 3, поэтому я хочу, чтобы захватить пакеты, начиная от слоя 3.как захватить пакеты в pcap и пропустить заголовок ethernet

fp = pcap_open_dead(DLT_EN10MB,65535); 
if (NULL == fp) 
{ 
    FPA_ERROR_PRINT("unable to open the dead interface \n"); 
    return 1; 

Любая помощь будет на это будет высоко оценен.

Заранее спасибо.

+0

Ethernet-заголовок всегда длиной 14 байт, поэтому вы можете выдвинуть указатель на 14 позиций, чтобы его пропустить :) –

ответ

0

Я использую fp = pcap_open_dead(DLT_EN10MB,65535); для захвата кадров в формате pcap.

Предположительно вы имеете в виду «для записи кадров в файл в формате pcap»; «мертвый» в «pcap_open_dead» означает «не жить», как в «вы не можете захватить пакеты из этого».

(Это необходимо потому, что pcap_dump_open() вызов не принимает значение DLT_ и длину снимки в качестве типа, он принимает pcap_t * и получает значение DLT_ и длину снимки оттуда. Это удобно, если вы сохраняете пакеты из живой захват вы открыли с pcap_open_live() или pcap_create()/pcap_activate() или другого захвата файла, который вы открыли с pcap_open_offline(), но это не очень удобно, если пакеты не приходят из Libpcap/WinPcap.)

но что Fp = pcap_open_dead (DLT_XXX) следует использовать, если я хочу пропустить заголовок ethernet. Мой модуль работает на уровне 3, поэтому я хочу, чтобы захватить пакеты, начиная от слоя 3.

Если слой «3» означает «IP», так что все ваши пакеты IPv4 или IPv6-пакеты, вы хотите DLT_RAW.

Пропуск заголовка Ethernet, однако, составляет . Если какой-либо механизм подает захваченные кадры, то снабжает фреймы заголовками Ethernet, то вы должны пропустить заголовок Ethernet - и отбрасывать кадры, где поле типа/длины в заголовке Ethernet имеет значение, отличное от 0x0800 для IPv4 или 0x86dd для IPv6 - и вычислить соответствующую длину захваченной длины и длины проводов (на 14 байтов меньше, чем захваченные и по-проводные длины кадров с Ethernet-заголовками; если любой из них меньше или равен 14, отбросьте кадр), и передайте их вместе с указателем на данные после заголовка Ethernet до pcap_dump().

+0

Спасибо, Харрис! Это было полезно – user3647469

0

Я не думаю, что вы можете. При анализе пакетного буфера вам необходимо вручную пропустить часть заголовка Ethernet.

+0

Это комментарий больше, чем ответ – Samer

+0

@Samer Я не могу оставлять комментарии, вам нужен определенный уровень репутации для это :) В любом случае, надеюсь, что это будет полезно. –