1

私は最近、pf_ring / libpcap を利用しなければならないことに関与しています。私は libpcap や pf_ring を使って開発したことがないので、ばかげた質問のように見えるかもしれませんが、ご容赦ください。現在、以下に示すように、pf_ring を利用して "C" で作成された単純な raw パケット スニファーがあります。

#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;
}

pf_ring API 内の pfring_pkthdr 構造体を見ると、次のことができるはずです。

pkthdr->extended_hdr.if_index

ただし、インデックスを出力しようとすると、0 が出力されるだけです。実際に pf_ring 関数を呼び出してデバイス if インデックスを取得すると、指定されたデバイスの値を実際に受け取るため、if_index が実際には設定されていないと推測しています。 :

pfring_get_device_ifindex (pfring *ring, char *device_name, int *if_index)

問題は、各パケットの if_index を表示しようとしているため、コールバック関数「processRingPacket」内でデバイスを一般的に指定する方法がないことです。パケットをキャプチャする 2 つのインターフェイスがあるため、ここでは一般的に言います。私のルーキーミスが何であるかについてのアイデアはありますか?

4

2 に答える 2

2

PF_RING_LONG_HEADERにフラグとして渡す必要があると思いますpfring_open()。したがって、pfring_open(device, MAXBYTES2CAPTURE, PF_RING_LONG_HEADER);

于 2014-09-01T13:17:47.270 に答える
1

がコールバック関数に設定されていない場合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.
于 2014-09-01T13:41:05.347 に答える