libpcap中的pcap_next_ex函数获取的时间是否是网卡的硬时间戳?若否,如何获取收到报文时的硬时间戳(pcap_next_ex p,pcap_t* pcap_pkthdr** pkt_header,const u_char** pkt_data)
发布于 2020-10-01 08:40:09
libpcap中的pcap_next_ex函数获取的时间是网卡的硬时间戳吗?
仅当向libpcap传递数据包的代码路径从网卡获取时间戳并提供时间戳时。
目前,libpcap提供了在常规网络接口上获取硬件时间戳选项的唯一操作系统是Linux,但这不是默认的;默认情况下,包获得标准的Linux网络堆栈时间戳,该时间戳是在处理包时由操作系统生成的。
一些专用设备可能会提供硬件时间戳,其中libpcap不使用常规网络堆栈来获取数据包。这可能是Endace DAG卡的情况,但我不知道是不是这样。
如果不是,如何在收到报文时获取硬时间戳
您将需要使用新的pcap_create()/pcap_activate()应用编程接口,而不是旧的pcap_open_live()应用编程接口来打开适配器。
在调用pcap_create()之后,调用pcap_list_tstamp_types();它将返回适配器和操作系统支持的time stamp types的列表。如果libpcap或PCAP_TSTAMP_ADAPTER_UNSYNCED可用,您将希望使libpcap使用其中之一。为此,请在调用pcap_activate()之前使用pcap_set_tstamp_type()设置时间戳类型。
注意:您得到的时间戳可能不会表示为自1970年1月1日00:00:00 UTC以来所经过的秒数;它们可能与该值相差几秒(无论TAI和UTC在某个时间点上有什么不同-我必须检查Precision time Protocol规范以了解该偏移量是多少)。这是一个Bug,如果有办法确定Linux中适配器提供的时间戳是基于UN*X纪元还是基于某个TAI纪元,我将尝试修复它。
https://stackoverflow.com/questions/64088545
复制相似问题