diff --git a/Makefile.am b/Makefile.am index c72d57a..5d2e0b4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -36,6 +36,7 @@ libtins_la_SOURCES=src/arp.cpp \ src/network_interface.cpp \ src/packet_sender.cpp \ src/packet_writer.cpp \ + src/ppi.cpp \ src/pdu.cpp \ src/radiotap.cpp \ src/rawpdu.cpp \ @@ -91,6 +92,7 @@ libtins_HEADERS = include/internals.h \ include/bootp.h \ include/network_interface.h \ include/sll.h \ + include/ppi.h \ include/radiotap.h \ include/dns.h \ include/rawpdu.h \ diff --git a/Makefile.in b/Makefile.in index f561bd4..76b3d8e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -113,10 +113,10 @@ am_libtins_la_OBJECTS = src/arp.lo src/bootp.lo \ src/ethernetII.lo src/icmp.lo src/icmpv6.lo src/internals.lo \ src/ip.lo src/ip_address.lo src/ipv6.lo src/ipv6_address.lo \ src/llc.lo src/loopback.lo src/network_interface.lo \ - src/packet_sender.lo src/packet_writer.lo src/pdu.lo \ - src/radiotap.lo src/rawpdu.lo src/rsn_information.lo \ - src/sll.lo src/snap.lo src/sniffer.lo src/tcp.lo \ - src/tcp_stream.lo src/udp.lo src/utils.lo \ + src/packet_sender.lo src/packet_writer.lo src/ppi.lo \ + src/pdu.lo src/radiotap.lo src/rawpdu.lo \ + src/rsn_information.lo src/sll.lo src/snap.lo src/sniffer.lo \ + src/tcp.lo src/tcp_stream.lo src/udp.lo src/utils.lo \ src/dot11/dot11_base.lo src/dot11/dot11_data.lo \ src/dot11/dot11_mgmt.lo src/dot11/dot11_beacon.lo \ src/dot11/dot11_assoc.lo src/dot11/dot11_auth.lo \ @@ -324,6 +324,7 @@ libtins_la_SOURCES = src/arp.cpp \ src/network_interface.cpp \ src/packet_sender.cpp \ src/packet_writer.cpp \ + src/ppi.cpp \ src/pdu.cpp \ src/radiotap.cpp \ src/rawpdu.cpp \ @@ -378,6 +379,7 @@ libtins_HEADERS = include/internals.h \ include/bootp.h \ include/network_interface.h \ include/sll.h \ + include/ppi.h \ include/radiotap.h \ include/dns.h \ include/rawpdu.h \ @@ -533,6 +535,7 @@ src/packet_sender.lo: src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/packet_writer.lo: src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) +src/ppi.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/pdu.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/radiotap.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/rawpdu.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) @@ -638,6 +641,8 @@ mostlyclean-compile: -rm -f src/packet_writer.lo -rm -f src/pdu.$(OBJEXT) -rm -f src/pdu.lo + -rm -f src/ppi.$(OBJEXT) + -rm -f src/ppi.lo -rm -f src/pppoe.$(OBJEXT) -rm -f src/pppoe.lo -rm -f src/radiotap.$(OBJEXT) @@ -691,6 +696,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/packet_sender.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/packet_writer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/pdu.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/ppi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/pppoe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/radiotap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/rawpdu.Plo@am__quote@ diff --git a/include/endianness.h b/include/endianness.h index c55c1c0..79e6424 100644 --- a/include/endianness.h +++ b/include/endianness.h @@ -80,7 +80,7 @@ namespace Endian { * \param data The data to convert. */ inline uint64_t do_change_endian(uint64_t data) { - return (((uint64_t)(do_change_endian((uint32_t)((data << 32) >> 32))) << 32) | + return (((uint64_t)(do_change_endian((uint32_t)(data & 0xffffffff))) << 32) | (do_change_endian(((uint32_t)(data >> 32))))); } diff --git a/include/exceptions.h b/include/exceptions.h index 670d518..e0d8466 100644 --- a/include/exceptions.h +++ b/include/exceptions.h @@ -124,6 +124,17 @@ public: return "The provided socket type is invalid"; } }; + +/** + * \brief Exception thrown when an unkown link layer PDU type is + * found while sniffing. + */ +class unknown_link_type : public std::exception { +public: + const char *what() const throw() { + return "The sniffed link layer PDU type is unknown"; + } +}; } #endif // TINS_EXCEPTIONS_H diff --git a/include/internals.h b/include/internals.h index c89c9b7..304508a 100644 --- a/include/internals.h +++ b/include/internals.h @@ -118,6 +118,10 @@ bool increment(IPv4Address &addr); bool increment(IPv6Address &addr); bool decrement(IPv4Address &addr); bool decrement(IPv6Address &addr); + +inline bool is_dot3(const uint8_t *ptr, size_t sz) { + return (sz >= 13 && ptr[12] < 8); +} } // namespace Internals } // namespace Tins /** diff --git a/include/pdu.h b/include/pdu.h index 04819a7..11883cc 100644 --- a/include/pdu.h +++ b/include/pdu.h @@ -117,7 +117,8 @@ namespace Tins { DHCPv6, DOT1Q, PPPOE, - STP + STP, + PPI }; /** diff --git a/include/sniffer.h b/include/sniffer.h index 6d5bafd..bb3b3c4 100644 --- a/include/sniffer.h +++ b/include/sniffer.h @@ -47,6 +47,8 @@ #include "sll.h" #include "cxxstd.h" #include "exceptions.h" +#include "internals.h" +#include "ppi.h" namespace Tins { class SnifferIterator; @@ -240,9 +242,7 @@ namespace Tins { BaseSniffer(const BaseSniffer&); BaseSniffer &operator=(const BaseSniffer&); - static bool is_dot3(const uint8_t *ptr, size_t sz) { - return (sz >= 13 && ptr[12] < 8); - } + template static bool call_functor(LoopData *data, const u_char *packet, const struct pcap_pkthdr *header); @@ -321,7 +321,7 @@ namespace Tins { PCapLoopBreaker _(ret_val, data->handle); try { if(data->iface_type == DLT_EN10MB) { - ret_val = is_dot3((const uint8_t*)packet, header->caplen) ? + ret_val = Internals::is_dot3((const uint8_t*)packet, header->caplen) ? call_functor(data, packet, header) : call_functor(data, packet, header); } @@ -340,6 +340,8 @@ namespace Tins { ret_val = call_functor(data, packet, header); else if(data->iface_type == DLT_LINUX_SLL) ret_val = call_functor(data, packet, header); + else if(data->iface_type == DLT_PPI) + ret_val = call_functor(data, packet, header); } catch(malformed_packet&) { ret_val = true; diff --git a/src/sniffer.cpp b/src/sniffer.cpp index a18a8e3..7431bba 100644 --- a/src/sniffer.cpp +++ b/src/sniffer.cpp @@ -71,7 +71,7 @@ PtrPacket BaseSniffer::next_packet() { if(content) { try { if(iface_type == DLT_EN10MB) { - if(is_dot3((const uint8_t*)content, header.caplen)) + if(Internals::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); @@ -84,6 +84,10 @@ PtrPacket BaseSniffer::next_packet() { 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_PPI) + ret = new Tins::PPI((const uint8_t*)content, header.caplen); + else + throw unknown_link_type(); } catch(malformed_packet&) {} }