1

libpcap中pcap_next_ex函数得到的时间是网卡的硬时间戳吗?如果没有,如何获取收到数据包时的硬时间戳 pcap_next_ex(pcap_t* p,struct pcap_pkthdr** pkt_header,const u_char** pkt_data)

4

1 回答 1

1

libpcap中pcap_next_ex函数得到的时间是网卡的硬时间戳吗?

仅当将数据包传递libpcap 的代码路径从网卡获取时间戳并提供它时。

目前,libpcap 提供在常规网络接口上获取硬件时间戳选项的唯一操作系统是 Linux,但这不是默认操作系统;默认情况下,数据包获得标准 Linux 网络堆栈时间戳,该时间戳由操作系统在处理数据包时生成。

一些专用设备,其中 libpcap使用常规网络堆栈来获取数据包,可能会提供硬件时间戳。Endace DAG 卡可能就是这种情况,但我不知道是否是这种情况。

如果不是,如何获取收到数据包时的硬时间戳

您将需要使用新的pcap_create()/ pcap_activate()API,而不是旧的pcap_open_live()API 来打开适配器。

调用后pcap_create(),调用pcap_list_tstamp_types();它将返回适配器和操作系统支持的 时间戳类型列表。如果其中一个PCAP_TSTAMP_ADAPTERPCAP_TSTAMP_ADAPTER_UNSYNCED可用,您将希望让 libpcap 使用其中之一。为此,请pcap_set_tstamp_type()在调用之前使用设置时间戳类型pcap_activate()

注意:您获得的时间戳可能不会表示为自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的秒数;它们可能与该值相差几秒钟(无论 TAI 和 UTC 在某个时间点之间的差异是什么——我必须检查精确时间协议规范以查看该偏移量是多少)。这是一个错误,如果有办法确定 Linux 中适配器提供的时间戳是基于 UN*X 纪元还是基于某个 TAI 纪元,我将尝试在某个时候修复它。

于 2020-10-01T00:40:09.473 回答