2015-02-03 10 views
1

Как сообщить libpcap v1.6.2 для хранения значений наносекунд в struct pcap_pkthdr::ts.tv_usec (вместо значений микросекунды) при захвате живых пакетов?Как включить точность наносекунд при захвате прямого трафика?

(Примечание. Этот вопрос похож на How to enable nanosecond resolution when capturing live packets in libpcap?, но этот вопрос достаточно расплывчат, что я решил задать новый вопрос)

Для автономных и «мертвых» захватов, следующие функции могут быть использованы сказать Libpcap, чтобы заполнить struct pcap_pkthdr «s ts.tv_usec элемента со значениями наносекундных:

К сожалению, не представляется, _with_tstamp_precision варианты для pcap_open_live() или pcap_create().

Я считаю, что захват живых пакетов с наносекундным разрешением должно быть возможным, так как changelog для v1.5.0 говорит (курсив мой):

Добавить поддержку для получения временных меток наносекундным разрешением при захвате и чтение файлов захвата

Я вижу pcap_set_tstamp_type() функцию и pcap-tstamp man page, в котором говорится:

  • 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() никогда не называется?

ответ

2

pcap_create() мало что может установить параметры для устройства захвата и не имеет альтернативных вызовов для установки этих параметров; это по дизайну. Было введено намерение в то время, когда были введены pcap_create() и pcap_activate(), что ни один из этих вызовов не должен быть изменен для поддержки новых параметров и что новые API будут введены с введением новых параметров.

Вы должны позвонить pcap_create(), чтобы создать еще не активированный дескриптор, установить параметры с соответствующими вызовами, а затем попытаться активировать дескриптор с помощью pcap_activate().

Один из соответствующих звонков: pcap_set_tstamp_precision(), который вы используете между pcap_create() и pcap_activate(), чтобы указать, что вы хотите наносекундные метки времени. По умолчанию используются метки времени с микросекундной точностью, для обратной и двоичной совместимости.

Обратите внимание, что pcap_set_tstamp_precision() потерпит неудачу, если вы не можете получить марку наносекунд точности времени от устройства, на котором вы захват, так что вы должны проверить, успешно ли он или не может или позвонить pcap_get_tstamp_precision() после активации pcap_t для того, чтобы увидеть какую метку времени вы получите.

И, нет, «высокая точность» не имеет ничего общего с тем, получаете ли вы микросекунды или наносекунды, это связано с тем, действительно ли номинальные микросекунды или наносекунды обеспечивают микросекундную или наносекундную детализацию, или вы всегда будете получать значения, кратные мощности 10, поскольку используемые часы не измеряются до микросекунды или наносекунды.

+0

Не могу ли я просто проверить возвращаемое значение 'pcap_set_tstamp_precision()', чтобы увидеть, не сработало ли оно вместо вызова 'pcap_get_tstamp_precision()'? –

+0

Я обновил обе страницы man, чтобы упомянуть о функциях. Обновления появятся в некоторых будущих выпусках; когда это будет отображаться в вашем любимом дистрибутиве/* BSD/OS X/Solaris/etc. это другое дело. –

+0

Удивительный, спасибо! –