【问题标题】:Why is pcap only capturing PTP messages in live capture mode?为什么 pcap 只在实时捕获模式下捕获 PTP 消息?
【发布时间】:2020-07-16 15:39:19
【问题描述】:

我使用的是 Intel i210-T1 网络接口卡。 我正在运行 avnu gptp 客户端 (https://github.com/Avnu/gptp): sudo ./daemon_cl -S -V 另一边是 gPTP Master。

我想实时捕获带有硬件时间戳的网络接口上的传入 UDP 数据包。 我可以看到带有wireshark的UDP数据包,所以数据包实际上是在线上的。

我的问题是 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;
    }
}

【问题讨论】:

    标签: pcap


    【解决方案1】:

    解决方法是使用函数开启混杂模式: https://linux.die.net/man/3/pcap_set_promisc

    混杂模式禁用任何较低层的过滤,因此您可以让每条消息都到达接口。

    int pcap_set_promisc(pcap_t *p, int promisc);
    

    pcap_set_promisc() 设置在激活句柄时是否应在捕获句柄上设置混杂模式。如果 promisc 不为零,则设置混杂模式,否则不设置。

    返回值

    pcap_set_promisc() 在成功时返回 0,如果在已激活的捕获句柄上调用,则返回 PCAP_ERROR_ACTIVATED

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-07
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多