libpcap中pcap_next_ex函数得到的时间是网卡的硬时间戳吗?如果没有,如何获取收到数据包时的硬时间戳 pcap_next_ex(pcap_t* p,struct pcap_pkthdr** pkt_header,const u_char** pkt_data)
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_ADAPTER
或PCAP_TSTAMP_ADAPTER_UNSYNCED
可用,您将希望让 libpcap 使用其中之一。为此,请pcap_set_tstamp_type()
在调用之前使用设置时间戳类型pcap_activate()
。
注意:您获得的时间戳可能不会表示为自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的秒数;它们可能与该值相差几秒钟(无论 TAI 和 UTC 在某个时间点之间的差异是什么——我必须检查精确时间协议规范以查看该偏移量是多少)。这是一个错误,如果有办法确定 Linux 中适配器提供的时间戳是基于 UN*X 纪元还是基于某个 TAI 纪元,我将尝试在某个时候修复它。