diff --git a/include/tins/sniffer.h b/include/tins/sniffer.h index 8de0831..f788249 100644 --- a/include/tins/sniffer.h +++ b/include/tins/sniffer.h @@ -47,6 +47,8 @@ namespace Tins { class SnifferIterator; class SnifferConfiguration; + typedef pcap_direction_t tins_direction_t; + /** * \class BaseSniffer * \brief Base class for sniffers. @@ -212,6 +214,14 @@ namespace Tins { */ void set_timeout(int ms); + /** + * \brief Sets direction for the sniffer. + * + * This calls pcap_setdirection using the provided parameter. + * \param d The direction for the sniffer. + */ + int set_direction(tins_direction_t d); + /** * \brief Sets whether to extract RawPDUs or fully parsed packets. * @@ -566,6 +576,12 @@ namespace Tins { */ void set_timeout(unsigned timeout); + /** + * Sets the direction option. + * \param direction The direction to be set. + */ + void set_direction(tins_direction_t direction); + /** * Sets the immediate mode option. * \param enabled The immediate mode option value. @@ -596,6 +612,7 @@ namespace Tins { bool _promisc; bool _rfmon; bool _immediate_mode; + tins_direction_t _direction; }; template diff --git a/src/sniffer.cpp b/src/sniffer.cpp index 7716382..d4eb8ae 100644 --- a/src/sniffer.cpp +++ b/src/sniffer.cpp @@ -224,6 +224,10 @@ void BaseSniffer::set_timeout(int ms) { pcap_set_timeout(handle, ms); } +int BaseSniffer::set_direction(tins_direction_t d) { + return pcap_setdirection(handle, d); +} + // ****************************** Sniffer ****************************** Sniffer::Sniffer(const string &device, const SnifferConfiguration& configuration) @@ -408,7 +412,8 @@ SnifferConfiguration::SnifferConfiguration() : _timeout(DEFAULT_TIMEOUT), _promisc(false), _rfmon(false), - _immediate_mode(false) + _immediate_mode(false), + _direction(PCAP_D_INOUT) { } @@ -417,6 +422,7 @@ void SnifferConfiguration::configure_sniffer_pre_activation(Sniffer& sniffer) co { sniffer.set_snap_len(_snap_len); sniffer.set_timeout(_timeout); + if ((_flags & BUFFER_SIZE) != 0) { sniffer.set_buffer_size(_buffer_size); } @@ -447,6 +453,9 @@ void SnifferConfiguration::configure_sniffer_post_activation(Sniffer& sniffer) c throw std::runtime_error("Could not set the filter! "); } } + if (sniffer.set_direction(_direction) < 0) { + throw std::runtime_error("Could not set the direction! "); + } } void SnifferConfiguration::set_snap_len(unsigned snap_len) @@ -483,6 +492,11 @@ void SnifferConfiguration::set_timeout(unsigned timeout) _timeout = timeout; } +void SnifferConfiguration::set_direction(tins_direction_t direction) +{ + _direction = direction; +} + void SnifferConfiguration::set_immediate_mode(bool enabled) { _flags |= IMMEDIATE_MODE;