1
0
mirror of https://github.com/mfontanini/libtins synced 2026-01-23 02:35:57 +01:00

Allow configuring pcap timestamp precision

This commit is contained in:
Matias Fontanini
2016-06-17 09:20:43 -07:00
parent ccda631708
commit a192e814bf
4 changed files with 35 additions and 6 deletions

View File

@@ -75,6 +75,7 @@ include(CheckFunctionExists)
set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY}) set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY})
check_function_exists(pcap_get_pfring_id HAVE_PF_RING) check_function_exists(pcap_get_pfring_id HAVE_PF_RING)
check_function_exists(pcap_set_immediate_mode HAVE_PCAP_IMMEDIATE_MODE) check_function_exists(pcap_set_immediate_mode HAVE_PCAP_IMMEDIATE_MODE)
check_function_exists(pcap_set_tstamp_precision HAVE_PCAP_TIMESTAMP_PRECISION)
set(CMAKE_REQUIRED_LIBRARIES) set(CMAKE_REQUIRED_LIBRARIES)
mark_as_advanced( mark_as_advanced(

View File

@@ -350,14 +350,11 @@ private:
friend class SnifferConfiguration; friend class SnifferConfiguration;
void set_snap_len(unsigned snap_len); void set_snap_len(unsigned snap_len);
void set_buffer_size(unsigned buffer_size); void set_buffer_size(unsigned buffer_size);
void set_promisc_mode(bool promisc_enabled); void set_promisc_mode(bool promisc_enabled);
void set_rfmon(bool rfmon_enabled); void set_rfmon(bool rfmon_enabled);
void set_immediate_mode(bool enabled); void set_immediate_mode(bool enabled);
void set_timestamp_precision(int value);
}; };
/** /**
@@ -586,6 +583,12 @@ public:
* \param enabled The immediate mode option value. * \param enabled The immediate mode option value.
*/ */
void set_immediate_mode(bool enabled); void set_immediate_mode(bool enabled);
/**
* Sets the timestamp precision value
* \param value The timestamp option value.
*/
void set_timestamp_precision(int value);
protected: protected:
friend class Sniffer; friend class Sniffer;
friend class FileSniffer; friend class FileSniffer;
@@ -596,7 +599,8 @@ protected:
RFMON = 4, RFMON = 4,
PACKET_FILTER = 8, PACKET_FILTER = 8,
IMMEDIATE_MODE = 16, IMMEDIATE_MODE = 16,
DIRECTION = 32 DIRECTION = 32,
TIMESTAMP_PRECISION = 64,
}; };
void configure_sniffer_pre_activation(Sniffer& sniffer) const; void configure_sniffer_pre_activation(Sniffer& sniffer) const;
@@ -613,6 +617,7 @@ protected:
bool rfmon_; bool rfmon_;
bool immediate_mode_; bool immediate_mode_;
pcap_direction_t direction_; pcap_direction_t direction_;
int timestamp_precision_;
}; };
template <typename Functor> template <typename Functor>

View File

@@ -4,6 +4,10 @@ IF(HAVE_PCAP_IMMEDIATE_MODE)
ADD_DEFINITIONS("-DHAVE_PCAP_IMMEDIATE_MODE=1") ADD_DEFINITIONS("-DHAVE_PCAP_IMMEDIATE_MODE=1")
ENDIF() ENDIF()
IF(HAVE_PCAP_TIMESTAMP_PRECISION)
ADD_DEFINITIONS("-DHAVE_PCAP_TIMESTAMP_PRECISION=1")
ENDIF()
INCLUDE_DIRECTORIES( INCLUDE_DIRECTORIES(
${LIBTINS_INCLUDE_DIR} ${LIBTINS_INCLUDE_DIR}
${OPENSSL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR}

View File

@@ -359,6 +359,16 @@ void Sniffer::set_immediate_mode(bool enabled) {
#endif // HAVE_PCAP_IMMEDIATE_MODE #endif // HAVE_PCAP_IMMEDIATE_MODE
} }
void Sniffer::set_timestamp_precision(int value) {
// This function exists as of libpcap version 1.5.0.
#ifdef HAVE_PCAP_TIMESTAMP_PRECISION
int result = pcap_set_tstamp_precision(get_pcap_handle(), value);
if (result == PCAP_ERROR_TSTAMP_PRECISION_NOTSUP) {
throw pcap_error("Timestamp precision not supported");
}
#endif // HAVE_PCAP_TIMESTAMP_PRECISION
}
void Sniffer::set_rfmon(bool rfmon_enabled) { void Sniffer::set_rfmon(bool rfmon_enabled) {
#ifndef _WIN32 #ifndef _WIN32
if (pcap_can_set_rfmon(get_pcap_handle()) == 1) { if (pcap_can_set_rfmon(get_pcap_handle()) == 1) {
@@ -408,7 +418,8 @@ const unsigned SnifferConfiguration::DEFAULT_TIMEOUT = 1000;
SnifferConfiguration::SnifferConfiguration() SnifferConfiguration::SnifferConfiguration()
: flags_(0), snap_len_(DEFAULT_SNAP_LEN), buffer_size_(0), timeout_(DEFAULT_TIMEOUT), : flags_(0), snap_len_(DEFAULT_SNAP_LEN), buffer_size_(0), timeout_(DEFAULT_TIMEOUT),
promisc_(false), rfmon_(false), immediate_mode_(false), direction_(PCAP_D_INOUT) { promisc_(false), rfmon_(false), immediate_mode_(false), direction_(PCAP_D_INOUT),
timestamp_precision_(0) {
} }
@@ -427,6 +438,9 @@ void SnifferConfiguration::configure_sniffer_pre_activation(Sniffer& sniffer) co
if ((flags_ & IMMEDIATE_MODE) != 0) { if ((flags_ & IMMEDIATE_MODE) != 0) {
sniffer.set_immediate_mode(immediate_mode_); sniffer.set_immediate_mode(immediate_mode_);
} }
if ((flags_ & TIMESTAMP_PRECISION) != 0) {
sniffer.set_timestamp_precision(timestamp_precision_);
}
} }
void SnifferConfiguration::configure_sniffer_pre_activation(FileSniffer& sniffer) const { void SnifferConfiguration::configure_sniffer_pre_activation(FileSniffer& sniffer) const {
@@ -486,6 +500,11 @@ void SnifferConfiguration::set_immediate_mode(bool enabled) {
immediate_mode_ = enabled; immediate_mode_ = enabled;
} }
void SnifferConfiguration::set_timestamp_precision(int value) {
flags_ |= TIMESTAMP_PRECISION;
timestamp_precision_ = value;
}
void SnifferConfiguration::set_direction(pcap_direction_t direction) { void SnifferConfiguration::set_direction(pcap_direction_t direction) {
direction_ = direction; direction_ = direction;
flags_ |= DIRECTION; flags_ |= DIRECTION;