[英]Linux kernel UDP reception timestamp
我一直在閱讀linux內核的網絡時間戳文檔,有些東西我不清楚。
SO_TIMESTAMPNS
提供的時間戳在哪里生成? 在硬件或內核中? 如果是這樣的話,一旦新數據包的中斷被提出就會被調整?
SO_TIMESTAMPING
還應允許生成硬件時間戳。 所有NIC都支持這個嗎? SO_TIMESTAMPING
如何使用SOF_TIMESTAMPING_RX_HARDWARE and
SO_TIMESTAMPNS
選項? 在這種情況下,硬件時間戳是指系統時鍾還是NIC時鍾? 在第二種情況下如何檢索NIC時鍾來計算經過的時間?
用於軟件時間戳的套接字屬性是SO_TIMESTAMPNS。 此套接字屬性返回系統時鍾的時間。 它不是在硬件中生成的,而是在軟件中處理中斷時系統時間的快照。 我們可以通過輔助數據(CMSG)訪問此時間戳,該輔助數據不屬於套接字有效負載,使用:
int level, type;
struct cmsghdr *cm;
struct timespec *ts = NULL;
for (cm = CMSG_FIRSTHDR(&msg); cm != NULL; cm = CMSG_NXTHDR(&msg, cm))
{
level = cm->cmsg_level;
type = cm->cmsg_type;
if (SOL_SOCKET == level && SO_TIMESTAMPNS == type) {
ts = (struct timespec *) CMSG_DATA(cm);
printf("SW TIMESTAMP %ld.%09ld\n", (long)ts[0].tv_sec, (long)ts[0].tv_nsec);
}
}
SO_TIMESTAMPING套接字選項提供了許多不同的標志,其中一些是,
SOF_TIMESTAMPING_TX_HARDWARE // Transmit timestamp generated in hardware by NIC clock
SOF_TIMESTAMPING_RX_HARDWARE // Receive timestamp generated in hardware by NIC clock
SOF_TIMESTAMPING_TX_SOFTWARE // Transmit timestamp generated in kernel driver by NIC clock
SOF_TIMESTAMPING_RX_SOFTWARE // Receive timestamp generated in kernel driver by NIC clock
所有網絡接口卡(NIC)均不支持此套接字選項。 目前,許多以太網NIC支持SO_TIMESTAMPING。 要查找特定接口驅動程序是否支持SO_TIMESTAMPING,請使用:
ethtool -T ethX // where X corresponds to your particular interface
這將返回ethX支持的所有套接字屬性以進行時間戳。
要使用特定NIC提供的硬件時間戳功能,請使用以下代碼:
int flags;
flags = SOF_TIMESTAMPING_TX_HARDWARE
| SOF_TIMESTAMPING_RX_HARDWARE
| SOF_TIMESTAMPING_TX_SOFTWARE
| SOF_TIMESTAMPING_RX_SOFTWARE
| SOF_TIMESTAMPING_RAW_HARDWARE;
if (setsockopt(sd, SOL_SOCKET, SO_TIMESTAMPING, &flags, sizeof(flags)) < 0)
printf("ERROR: setsockopt SO_TIMESTAMPING\n");
int level, type;
struct cmsghdr *cm;
struct timespec *ts = NULL;
for (cm = CMSG_FIRSTHDR(&msg); cm != NULL; cm = CMSG_NXTHDR(&msg, cm))
{
if (SOL_SOCKET == level && SO_TIMESTAMPING == type) {
ts = (struct timespec *) CMSG_DATA(cm);
printf("HW TIMESTAMP %ld.%09ld\n", (long)ts[2].tv_sec, (long)ts[2].tv_nsec);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.