获取硬件时间戳

问题描述

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

解决方法

libpcap中的pcap_next_ex函数获得的时间是否是网卡的硬时间戳?

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

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

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

如果没有,如何在接收到数据包时获取硬时间戳

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

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

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