pf_ring и libpcap if_index не возвращаются
Недавно я начал использовать 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" нет способа указать устройство в общем виде. Я говорю здесь в общем, потому что будет два интерфейса, захватывающих пакеты. Любые идеи о том, что моя ошибка новичка может быть?
2 ответа
Я думаю, что вам нужно пройти в PF_RING_LONG_HEADER
как флаг pfring_open()
, Так и становится, pfring_open(device, MAXBYTES2CAPTURE, PF_RING_LONG_HEADER);
Если pkthdr->extended_hdr.if_index
не установлена в функции обратного вызова, вы всегда можете передать ее в функцию обратного вызова в arg
аргумент.
struct Dev {
int count;
int if_index;
};
...
char *device = "eth0";
struct Dev dev;
dev.count = 0;
dev.if_index = if_nametoindex(device); //from #include <net/in.h>
printf("Opening Device: %s\n", device);
pfring* ring = pfring_open(device, MAXBYTES2CAPTURE, 0);
pfring_enable_ring(ring);
pfring_loop(ring, processRingPacket, (u_char*)&dev, 1);
И восстановите это в функции обратного вызова:
void processRingPacket(const struct pfring_pkthdr* pkthdr, const u_char* packet, const u_char *arg)
{
struct Dev *dev = (struct Dev*)arg;
int i=0, *counter = (int*)&dev->count;
//and use dev->if_index; whenever you need to.