簡體   English   中英

Linux內核UDP接收時間戳

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM