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.
Другие вопросы по тегам