Почему pcap захватывает только сообщения PTP в режиме реального времени? - PullRequest
0 голосов
/ 14 июля 2020

Я использую сетевую карту Intel i210-T1. Я запускаю клиент avnu gptp (https://github.com/Avnu/gptp) с: sudo ./daemon_cl -S -V Другая сторона - это мастер gPTP.

Я хочу в реальном времени захватывать входящие UDP-пакеты на сетевом интерфейсе с метки времени оборудования. Я могу видеть UDP-пакеты с помощью wirehark, так что пакеты на самом деле находятся на проводе.

Моя проблема в том, что pcap вообще не возвращает никаких пакетов, кроме PTP (ethertype 0x88f7). Это ошибка или я неправильно использую pcap?

Я написал минимальный пример, чтобы показать свою проблему. Код печатает:

enp1s0
returnvalue pcap_set_tstamp_type: 0
returnvalue pcap_set_tstamp_precision: 0
returnvalue pcap_activate: 0

и только после этого:

packet received with ethertype:88f7
#include <iostream>

#include <netinet/in.h>
#include <netinet/if_ether.h>

#include <pcap/pcap.h>

int main(int argc, char **argv)
{
    char errbuf[PCAP_ERRBUF_SIZE];
    std::string dev = "enp1s0";
    pcap_t* pcap_dev;
    int i = 0;
    printf("%s\n", dev.c_str());
    pcap_dev = pcap_create(dev.c_str(), errbuf);
    if(pcap_dev == NULL)
    {
        printf("pcap_create(): %s\n", errbuf);
        exit(1);
    }

    i = pcap_set_tstamp_type(pcap_dev, PCAP_TSTAMP_ADAPTER_UNSYNCED);
    printf("returnvalue pcap_set_tstamp_type: %i\n", i);
    i = pcap_set_tstamp_precision(pcap_dev, PCAP_TSTAMP_PRECISION_NANO);
    printf("returnvalue pcap_set_tstamp_precision: %i\n", i);
    i = pcap_activate(pcap_dev);
    printf("returnvalue pcap_activate: %i\n", i);

    struct pcap_pkthdr* pkthdr;
    const u_char* bytes;
    while (pcap_next_ex(pcap_dev, &pkthdr, &bytes))
    {
        struct ether_header* ethhdr = (struct ether_header*) bytes;
        std::cout << "packet received with ethertype:" << std::hex << ntohs(ethhdr->ether_type) << std::endl;
    }
}

1 Ответ

0 голосов
/ 14 июля 2020

Решение состоит в том, чтобы включить неразборчивый режим с помощью функции: https://linux.die.net/man/3/pcap_set_promisc

неразборчивый режим отключает любую фильтрацию нижними уровнями, поэтому вы получаете каждое сообщение, поступающее на интерфейс.

int pcap_set_promisc(pcap_t *p, int promisc);

pcap_set_promisc() устанавливает, должен ли быть установлен неразборчивый режим для дескриптора захвата, когда дескриптор активирован. Если промис c не равен нулю, будет установлен неразборчивый режим, в противном случае он не будет установлен.

Возвращаемое значение

pcap_set_promisc() возвращает 0 в случае успеха или PCAP_ERROR_ACTIVATED в случае вызова дескриптора захвата, который был активирован.

...