38#include <tins/packet.h>
39#include <tins/cxxstd.h>
40#include <tins/macros.h>
41#include <tins/exceptions.h>
42#include <tins/detail/type_traits.h>
51class SnifferConfiguration;
63class TINS_API BaseSniffer {
68 typedef SnifferIterator iterator;
75 BaseSniffer(BaseSniffer &&rhs) TINS_NOEXCEPT
76 : handle_(0), mask_(), extract_raw_(
false),
77 pcap_sniffing_method_(pcap_loop) {
78 *
this = std::move(rhs);
85 BaseSniffer& operator=(BaseSniffer &&rhs) TINS_NOEXCEPT {
87 swap(handle_, rhs.handle_);
88 swap(mask_, rhs.mask_);
89 swap(extract_raw_, rhs.extract_raw_);
90 swap(pcap_sniffing_method_, rhs.pcap_sniffing_method_);
99 virtual ~BaseSniffer();
188 template <
typename Functor>
189 void sniff_loop(Functor function, uint32_t max_packets = 0);
196 bool set_filter(
const std::string& filter);
217 bool set_direction(pcap_direction_t d);
225 void set_timeout(
int ms);
241 void set_extract_raw_pdus(
bool value);
254 typedef int(*PcapSniffingMethod)(pcap_t*, int, pcap_handler, u_char*);
270 void set_pcap_sniffing_method(PcapSniffingMethod method);
278 int link_type()
const;
293 pcap_t* get_pcap_handle();
298 const pcap_t* get_pcap_handle()
const;
305 void set_pcap_handle(pcap_t* pcap_handle);
307 void set_if_mask(bpf_u_int32 if_mask);
309 bpf_u_int32 get_if_mask()
const;
311 BaseSniffer(
const BaseSniffer&);
312 BaseSniffer& operator=(
const BaseSniffer&);
317 PcapSniffingMethod pcap_sniffing_method_;
324class TINS_API Sniffer :
public BaseSniffer {
340 Sniffer(
const std::string& device);
353 Sniffer(
const std::string& device,
const SnifferConfiguration& configuration);
369 TINS_DEPRECATED(Sniffer(
const std::string& device,
unsigned max_packet_size,
370 bool promisc =
false,
const std::string& filter =
"",
bool rfmon =
false));
385 TINS_DEPRECATED(Sniffer(
const std::string& device, promisc_type promisc,
386 const std::string& filter =
"",
bool rfmon =
false));
389 friend class SnifferConfiguration;
391 void init(
const std::string& device,
const SnifferConfiguration& configuration);
392 void set_snap_len(
unsigned snap_len);
393 void set_buffer_size(
unsigned buffer_size);
394 void set_promisc_mode(
bool promisc_enabled);
395 void set_rfmon(
bool rfmon_enabled);
396 void set_immediate_mode(
bool enabled);
397 void set_timestamp_precision(
int value);
407class TINS_API FileSniffer :
public BaseSniffer {
414 FileSniffer(FILE *fp,
const SnifferConfiguration& configuration);
421 FileSniffer(
const std::string& file_name,
const SnifferConfiguration& configuration);
430 FileSniffer(
const std::string& file_name,
const std::string& filter =
"");
439 FileSniffer(FILE *fp,
const std::string& filter =
"");
446 typedef bool (T::*fun_type)(PDU&) ;
448 HandlerProxy(ptr_type ptr, fun_type function)
449 : object_(ptr), fun_(function) {}
451 bool operator()(PDU& pdu) {
452 return (object_->*fun_)(pdu);
460HandlerProxy<T> make_sniffer_handler(T* ptr,
461 typename HandlerProxy<T>::fun_type function) {
462 return HandlerProxy<T>(ptr, function);
468class SnifferIterator {
470 typedef std::forward_iterator_tag iterator_category;
471 typedef Packet value_type;
472 typedef std::ptrdiff_t difference_type;
473 typedef Packet* pointer;
474 typedef Packet& reference;
480 SnifferIterator(BaseSniffer* sniffer = 0)
481 : sniffer_(sniffer) {
490 SnifferIterator& operator++() {
498 SnifferIterator operator++(
int) {
499 SnifferIterator other(*
this);
508 Packet& operator*() {
516 Packet* operator->() {
524 bool operator==(
const SnifferIterator& rhs)
const {
525 return sniffer_ == rhs.sniffer_;
532 bool operator!=(
const SnifferIterator& rhs)
const {
533 return !(*
this == rhs);
537 pkt_ = sniffer_->next_packet();
543 BaseSniffer* sniffer_;
580class TINS_API SnifferConfiguration {
587 static const unsigned DEFAULT_SNAP_LEN;
594 static const unsigned DEFAULT_TIMEOUT;
599 SnifferConfiguration();
605 void set_snap_len(
unsigned snap_len);
611 void set_buffer_size(
unsigned buffer_size);
617 void set_promisc_mode(
bool enabled);
623 void set_filter(
const std::string& filter);
629 void set_pcap_sniffing_method(BaseSniffer::PcapSniffingMethod method);
635 void set_rfmon(
bool enabled);
641 void set_timeout(
unsigned timeout);
647 void set_direction(pcap_direction_t direction);
653 void set_immediate_mode(
bool enabled);
659 void set_timestamp_precision(
int value);
661 friend class Sniffer;
662 friend class FileSniffer;
671 TIMESTAMP_PRECISION = 64,
672 PCAP_SNIFFING_METHOD = 128,
675 void configure_sniffer_pre_activation(Sniffer& sniffer)
const;
676 void configure_sniffer_pre_activation(FileSniffer& sniffer)
const;
678 void configure_sniffer_post_activation(Sniffer& sniffer)
const;
682 unsigned buffer_size_;
684 BaseSniffer::PcapSniffingMethod pcap_sniffing_method_;
688 bool immediate_mode_;
689 pcap_direction_t direction_;
690 int timestamp_precision_;
693template <
typename Functor>
694void Tins::BaseSniffer::sniff_loop(Functor function, uint32_t max_packets) {
695 for(iterator it = begin(); it != end(); ++it) {
698 #if TINS_IS_CXX11 && !defined(_MSC_VER)
699 if (!Tins::Internals::invoke_loop_cb(function, *it)) {
703 if (!function(*it->pdu())) {
708 catch(malformed_packet&) { }
709 catch(pdu_not_found&) { }
710 if (max_packets && --max_packets == 0) {
The Tins namespace.
Definition address_range.h:38
bool operator==(const PDUIteratorBase< Concrete > &lhs, const PDUIteratorBase< Concrete > &rhs)
Definition pdu_iterator.h:108
PacketWrapper< PDU *, Timestamp > PtrPacket
Thin wrapper over a PDU pointer and a Timestamp.
Definition packet.h:54
bool operator!=(const PDUIteratorBase< Concrete > &lhs, const PDUIteratorBase< Concrete > &rhs)
Definition pdu_iterator.h:121