Недавно я столкнулся с необходимостью использовать pf_ring / libpcap. Я никогда не разрабатывал с помощью libpcap или pf_ring, поэтому, пожалуйста, простите за глупый вопрос, поскольку сетевое программирование для меня почти новое... В общих чертах, я пытаюсь получить доступ к if_index для полученных пакетов. В настоящее время у меня есть простой сниффер необработанных пакетов, созданный с помощью «C» с использованием pf_ring, как показано ниже:
#include <pcap.h>
#include <pfring.h>
#include <string.h>
#include <stdlib.h>
#define MAXBYTES2CAPTURE 2048
void processRingPacket(const struct pfring_pkthdr* pkthdr, const u_char* packet, const u_char *arg)
{
int i=0, *counter = (int*)arg;
printf("Packet Count: %d ", ++(*counter));
printf("Received Packet Size: %d ", pkthdr->len);
printf("ifIndex: %d ", pkthdr->extended_hdr.if_index);
printf("Payload:\n");
for(i=0; i < pkthdr->len; i++)
{
if(isprint(packet[i]))
{
printf("%c ", packet[i]);
}
else
{
printf(". ");
}
if((i % 16 == 0) && (i != 0) || (i == pkthdr->len-1))
{
printf("\n");
}
}
return;
}
int main()
{
int count = 0;
char *device = "eth0";
printf("Opening Device: %s\n", device);
pfring* ring = pfring_open(device, MAXBYTES2CAPTURE, 0);
pfring_enable_ring(ring);
pfring_loop(ring, processRingPacket, (u_char*)&count, 1);
return 0;
}
Глядя на структуру pfring_pkthdr в API pf_ring, я должен сделать следующее:
pkthdr->extended_hdr.if_index
Однако, когда я пытаюсь распечатать индекс, он просто печатает 0. Я предполагаю, что if_index на самом деле не устанавливается, так как когда я фактически вызываю функцию pf_ring для получения устройства, если индекс, я фактически получаю значение для указанного устройства :
pfring_get_device_ifindex (pfring *ring, char *device_name, int *if_index)
Проблема в том, что я пытаюсь просмотреть if_index для каждого пакета, поэтому в функции обратного вызова «processRingPacket» нет способа указать устройство в общем. Я говорю здесь в общем, потому что будет два интерфейса, перехватывающих пакеты. Любые идеи о том, что моя ошибка новичка может быть?