Как указать libpcap v1.6.2 сохранять значения в наносекундах в struct pcap_pkthdr::ts.tv_usec
(вместо значений в микросекундах) при захвате пакетов в реальном времени?
(Примечание: этот вопрос похож на Как включить наносекундное разрешение при захвате живых пакетов в libpcap? но этот вопрос достаточно расплывчатый, поэтому я решил задать новый вопрос.)
Для автономных и «мертвых» захватов можно использовать следующие функции, чтобы указать libpcap заполнить член struct pcap_pkthdr
ts.tv_usec
значениями в наносекундах:
pcap_open_dead_with_tstamp_precision()
pcap_open_offline_with_tstamp_precision()
pcap_fopen_offline_with_tstamp_precision()
К сожалению, не существует _with_tstamp_precision
вариантов для pcap_open_live()
или pcap_create()
.
Я считаю, что захват живых пакетов с разрешением в наносекунды должен быть возможен, поскольку журнал изменений для v1. 5.0 говорит (выделено мной):
Добавлена поддержка получения меток времени с разрешением в наносекунды при захвате и чтении файлов захвата.
Я видел функцию pcap_set_tstamp_type()
и pcap-tstamp
справочная страница, в которой говорится:
PCAP_TSTAMP_HOST
—host
: Отметка времени, предоставленная хостом, на котором выполняется захват. Точность этой отметки времени не указана; он может быть синхронизирован или не синхронизирован с часами операционной системы хоста.PCAP_TSTAMP_HOST_LOWPREC
—host_lowprec
: Отметка времени, предоставленная хостом, на котором выполняется захват. Это отметка времени низкой точности, синхронизированная с часами операционной системы хоста.PCAP_TSTAMP_HOST_HIPREC
—host_hiprec
: Отметка времени, предоставленная хостом, на котором выполняется захват. Это высокоточная метка времени; он может быть синхронизирован или не синхронизирован с часами операционной системы хоста. Это может быть дороже, чемPCAP_TSTAMP_HOST_LOWPREC
.PCAP_TSTAMP_ADAPTER
—adapter
: метка времени, предоставляемая сетевым адаптером, на котором выполняется захват. Это высокоточная метка времени, синхронизированная с часами основной операционной системы.PCAP_TSTAMP_ADAPTER_UNSYNCED
—adapter_unsynced
: метка времени, предоставляемая сетевым адаптером, на котором выполняется захват. Это высокоточная метка времени; он не синхронизирован с часами операционной системы хоста.
Означает ли здесь фраза «высокоточная метка времени», что значения в наносекундах хранятся в поле ts.tv_usec
заголовка? Если это так, PCAP_TSTAMP_HOST
говорит «не указано», так как же во время выполнения определить, содержит ли поле ts.tv_usec
микросекунды или наносекунды? И какой из них используется по умолчанию, если pcap_set_tstamp_type()
никогда не вызывается?