首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么pcap只在实时捕获模式下捕获PTP报文?

为什么pcap只在实时捕获模式下捕获PTP报文?
EN

Stack Overflow用户
提问于 2020-07-14 23:08:46
回答 1查看 117关注 0票数 0

我正在使用英特尔i210-T1网络接口卡。我使用以下命令运行avnu gptp客户端(https://github.com/Avnu/gptp):sudo ./daemon_cl -S -V,另一端是gPTP主机。

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

我的问题是pcap根本不会返回除PTP (以太网类型0x88f7)以外的任何数据包。这是一个bug,还是我错误地使用了pcap?

我写了一个最小的例子来说明我的问题。代码打印如下:

代码语言:javascript
复制
enp1s0
returnvalue pcap_set_tstamp_type: 0
returnvalue pcap_set_tstamp_precision: 0
returnvalue pcap_activate: 0

只有在此之后:

代码语言:javascript
复制
packet received with ethertype:88f7
代码语言:javascript
复制
#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;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-07-14 23:08:46

解决方案是使用function:https://linux.die.net/man/3/pcap_set_promisc启用混杂模式

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

代码语言:javascript
复制
int pcap_set_promisc(pcap_t *p, int promisc);

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

返回值

如果成功,则

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62898229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档