From fb8fb92ee639f2501cbee47f53de89aa01729b9f Mon Sep 17 00:00:00 2001 From: Matias Fontanini Date: Wed, 24 Jul 2013 22:27:53 -0300 Subject: [PATCH] BaseSniffer::next_packet now loops until either a valid packet is found or pcap_next fails. --- include/sniffer.h | 1 - src/sniffer.cpp | 39 +++++++++++++++++++++------------------ 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/include/sniffer.h b/include/sniffer.h index 9e1858f..f098b28 100644 --- a/include/sniffer.h +++ b/include/sniffer.h @@ -302,7 +302,6 @@ namespace Tins { LoopData *data = reinterpret_cast*>(args); PCapLoopBreaker _(ret_val, data->handle); try { - Internals::smart_ptr::type pdu; if(data->iface_type == DLT_EN10MB) { ret_val = is_dot3((const uint8_t*)packet, header->caplen) ? call_functor(data, packet, header) : diff --git a/src/sniffer.cpp b/src/sniffer.cpp index 3bd81c0..c39b297 100644 --- a/src/sniffer.cpp +++ b/src/sniffer.cpp @@ -66,26 +66,29 @@ bool BaseSniffer::compile_set_filter(const string &filter, bpf_program &prog) { PtrPacket BaseSniffer::next_packet() { pcap_pkthdr header; PDU *ret = 0; - const u_char *content = pcap_next(handle, &header); -// timestamp_ = header.ts; - if(content) { - try { - if(iface_type == DLT_EN10MB) { - if(is_dot3((const uint8_t*)content, header.caplen)) - ret = new Dot3((const uint8_t*)content, header.caplen); - else - ret = new EthernetII((const uint8_t*)content, header.caplen); + while(!ret) { + const u_char *content = pcap_next(handle, &header); + if(content) { + try { + if(iface_type == DLT_EN10MB) { + if(is_dot3((const uint8_t*)content, header.caplen)) + ret = new Dot3((const uint8_t*)content, header.caplen); + else + ret = new EthernetII((const uint8_t*)content, header.caplen); + } + else if(iface_type == DLT_IEEE802_11_RADIO) + ret = new RadioTap((const uint8_t*)content, header.caplen); + else if(iface_type == DLT_IEEE802_11) + ret = Dot11::from_bytes((const uint8_t*)content, header.caplen); + else if(iface_type == DLT_LOOP) + ret = new Tins::Loopback((const uint8_t*)content, header.caplen); + else if(iface_type == DLT_LINUX_SLL) + ret = new Tins::SLL((const uint8_t*)content, header.caplen); } - else if(iface_type == DLT_IEEE802_11_RADIO) - ret = new RadioTap((const uint8_t*)content, header.caplen); - else if(iface_type == DLT_IEEE802_11) - ret = Dot11::from_bytes((const uint8_t*)content, header.caplen); - else if(iface_type == DLT_LOOP) - ret = new Tins::Loopback((const uint8_t*)content, header.caplen); - else if(iface_type == DLT_LINUX_SLL) - ret = new Tins::SLL((const uint8_t*)content, header.caplen); + catch(malformed_packet&) {} } - catch(malformed_packet&) {} + else + break; } return PtrPacket(ret, header.ts); }