From b07deba105dabe3826f73601714f902f0f2f7815 Mon Sep 17 00:00:00 2001 From: Jesus Llorente Date: Mon, 23 Nov 2015 23:10:34 +0200 Subject: [PATCH 1/6] Added pcap_setdirection to sniffer --- include/tins/sniffer.h | 17 +++++++++++++++++ src/sniffer.cpp | 16 +++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) 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; From 4b9f99878472a9f14f5fd3e08a3c76ab53a2341e Mon Sep 17 00:00:00 2001 From: Jesus Llorente Date: Tue, 24 Nov 2015 20:09:41 +0200 Subject: [PATCH 2/6] Removed tins_direction_t typedef in favor of native pcap_direction_t --- include/tins/sniffer.h | 8 +++----- src/sniffer.cpp | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/include/tins/sniffer.h b/include/tins/sniffer.h index f788249..0b552d7 100644 --- a/include/tins/sniffer.h +++ b/include/tins/sniffer.h @@ -47,8 +47,6 @@ namespace Tins { class SnifferIterator; class SnifferConfiguration; - typedef pcap_direction_t tins_direction_t; - /** * \class BaseSniffer * \brief Base class for sniffers. @@ -220,7 +218,7 @@ namespace Tins { * This calls pcap_setdirection using the provided parameter. * \param d The direction for the sniffer. */ - int set_direction(tins_direction_t d); + int set_direction(pcap_direction_t d); /** * \brief Sets whether to extract RawPDUs or fully parsed packets. @@ -580,7 +578,7 @@ namespace Tins { * Sets the direction option. * \param direction The direction to be set. */ - void set_direction(tins_direction_t direction); + void set_direction(pcap_direction_t direction); /** * Sets the immediate mode option. @@ -612,7 +610,7 @@ namespace Tins { bool _promisc; bool _rfmon; bool _immediate_mode; - tins_direction_t _direction; + pcap_direction_t _direction; }; template diff --git a/src/sniffer.cpp b/src/sniffer.cpp index d4eb8ae..03fd3db 100644 --- a/src/sniffer.cpp +++ b/src/sniffer.cpp @@ -224,7 +224,7 @@ void BaseSniffer::set_timeout(int ms) { pcap_set_timeout(handle, ms); } -int BaseSniffer::set_direction(tins_direction_t d) { +int BaseSniffer::set_direction(pcap_direction_t d) { return pcap_setdirection(handle, d); } @@ -492,7 +492,7 @@ void SnifferConfiguration::set_timeout(unsigned timeout) _timeout = timeout; } -void SnifferConfiguration::set_direction(tins_direction_t direction) +void SnifferConfiguration::set_direction(pcap_direction_t direction) { _direction = direction; } From 6b82e50c032b18f37f1cba531c3f8d4675c73d2e Mon Sep 17 00:00:00 2001 From: Jesus Llorente Date: Mon, 21 Dec 2015 17:56:18 +0200 Subject: [PATCH 3/6] Modified set_direction to return a bool --- include/tins/sniffer.h | 2 +- src/sniffer.cpp | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/include/tins/sniffer.h b/include/tins/sniffer.h index 0b552d7..3526ea5 100644 --- a/include/tins/sniffer.h +++ b/include/tins/sniffer.h @@ -218,7 +218,7 @@ namespace Tins { * This calls pcap_setdirection using the provided parameter. * \param d The direction for the sniffer. */ - int set_direction(pcap_direction_t d); + bool set_direction(pcap_direction_t d); /** * \brief Sets whether to extract RawPDUs or fully parsed packets. diff --git a/src/sniffer.cpp b/src/sniffer.cpp index 03fd3db..82adcea 100644 --- a/src/sniffer.cpp +++ b/src/sniffer.cpp @@ -224,8 +224,9 @@ void BaseSniffer::set_timeout(int ms) { pcap_set_timeout(handle, ms); } -int BaseSniffer::set_direction(pcap_direction_t d) { - return pcap_setdirection(handle, d); +bool BaseSniffer::set_direction(pcap_direction_t d) { + bool result = pcap_setdirection(handle, d) != -1; + return result; } // ****************************** Sniffer ****************************** @@ -453,7 +454,7 @@ void SnifferConfiguration::configure_sniffer_post_activation(Sniffer& sniffer) c throw std::runtime_error("Could not set the filter! "); } } - if (sniffer.set_direction(_direction) < 0) { + if (!sniffer.set_direction(_direction)) { throw std::runtime_error("Could not set the direction! "); } } From 36216107ec865553ba2fb2e5f8db31f2df537215 Mon Sep 17 00:00:00 2001 From: Matias Fontanini Date: Sat, 26 Dec 2015 07:30:29 -0800 Subject: [PATCH 4/6] Catch exceptions on arpmonitor Fixes #119 --- examples/arpmonitor.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/examples/arpmonitor.cpp b/examples/arpmonitor.cpp index 16655ff..97949c9 100644 --- a/examples/arpmonitor.cpp +++ b/examples/arpmonitor.cpp @@ -92,9 +92,14 @@ int main(int argc, char *argv[]) config.set_promisc_mode(true); config.set_filter("arp"); - // Sniff on the provided interface in promiscuous mode - Sniffer sniffer(argv[1], config); - - // Only capture arp packets - monitor.run(sniffer); + try { + // Sniff on the provided interface in promiscuous mode + Sniffer sniffer(argv[1], config); + + // Only capture arp packets + monitor.run(sniffer); + } + catch (std::exception& ex) { + std::cerr << "Error: " << ex.what() << std::endl; + } } From 49af3714e8161d285065169f5a70fe8e325c485e Mon Sep 17 00:00:00 2001 From: Matias Fontanini Date: Sat, 26 Dec 2015 07:31:53 -0800 Subject: [PATCH 5/6] Add padding at the end of the line on dns_stats Fixes #118 --- examples/dns_stats.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/dns_stats.cpp b/examples/dns_stats.cpp index c467d4f..d7d5b79 100644 --- a/examples/dns_stats.cpp +++ b/examples/dns_stats.cpp @@ -189,7 +189,7 @@ int main(int argc, char *argv[]) { auto info = monitor.stats().get_information(); std::cout << "\rAverage " << info.average.count() << "ms. Worst: " << info.worst.count() << "ms. Count: " - << info.count; + << info.count << " "; std::cout.flush(); std::this_thread::sleep_for(std::chrono::seconds(1)); } From 58e3a7a687151e5dca9b15f048fea4108f1b423a Mon Sep 17 00:00:00 2001 From: Matias Fontanini Date: Mon, 25 Jan 2016 12:50:29 -0800 Subject: [PATCH 6/6] Don't use pcap_setdirection on Windows --- src/sniffer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sniffer.cpp b/src/sniffer.cpp index 82adcea..64a2606 100644 --- a/src/sniffer.cpp +++ b/src/sniffer.cpp @@ -454,9 +454,12 @@ void SnifferConfiguration::configure_sniffer_post_activation(Sniffer& sniffer) c throw std::runtime_error("Could not set the filter! "); } } + // TODO: see how to actually do this on winpcap + #ifndef _WIN32 if (!sniffer.set_direction(_direction)) { throw std::runtime_error("Could not set the direction! "); } + #endif // _WIN32 } void SnifferConfiguration::set_snap_len(unsigned snap_len)