From 26833adf15fbb5ac2867b0599c2de91d6e309463 Mon Sep 17 00:00:00 2001 From: stubbfel Date: Tue, 29 Sep 2015 23:20:00 +0200 Subject: [PATCH] add pdusniffer --- nbproject/Makefile-Debug.mk | 19 ++++++++++ nbproject/Makefile-Release.mk | 19 ++++++++++ nbproject/Makefile-Unitest.mk | 19 ++++++++++ nbproject/configurations.xml | 14 ++++++++ src/PduSniffer.cpp | 67 +++++++++++++++++++++++++++++++++++ src/PduSniffer.h | 40 +++++++++++++++++++++ 6 files changed, 178 insertions(+) create mode 100644 src/PduSniffer.cpp create mode 100644 src/PduSniffer.h diff --git a/nbproject/Makefile-Debug.mk b/nbproject/Makefile-Debug.mk index aa76813..6eeb954 100644 --- a/nbproject/Makefile-Debug.mk +++ b/nbproject/Makefile-Debug.mk @@ -36,6 +36,7 @@ OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} # Object Files OBJECTFILES= \ ${OBJECTDIR}/src/PduSender.o \ + ${OBJECTDIR}/src/PduSniffer.o \ ${OBJECTDIR}/src/main.o \ ${OBJECTDIR}/src/map/NatRange.o \ ${OBJECTDIR}/src/map/natmap.o @@ -76,6 +77,11 @@ ${OBJECTDIR}/src/PduSender.o: src/PduSender.cpp ${RM} "$@.d" $(COMPILE.cc) -g -Wall -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSender.o src/PduSender.cpp +${OBJECTDIR}/src/PduSniffer.o: src/PduSniffer.cpp + ${MKDIR} -p ${OBJECTDIR}/src + ${RM} "$@.d" + $(COMPILE.cc) -g -Wall -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSniffer.o src/PduSniffer.cpp + ${OBJECTDIR}/src/main.o: src/main.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" @@ -126,6 +132,19 @@ ${OBJECTDIR}/src/PduSender_nomain.o: ${OBJECTDIR}/src/PduSender.o src/PduSender. ${CP} ${OBJECTDIR}/src/PduSender.o ${OBJECTDIR}/src/PduSender_nomain.o;\ fi +${OBJECTDIR}/src/PduSniffer_nomain.o: ${OBJECTDIR}/src/PduSniffer.o src/PduSniffer.cpp + ${MKDIR} -p ${OBJECTDIR}/src + @NMOUTPUT=`${NM} ${OBJECTDIR}/src/PduSniffer.o`; \ + if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \ + (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \ + (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \ + then \ + ${RM} "$@.d";\ + $(COMPILE.cc) -g -Wall -std=c++11 -Dmain=__nomain -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSniffer_nomain.o src/PduSniffer.cpp;\ + else \ + ${CP} ${OBJECTDIR}/src/PduSniffer.o ${OBJECTDIR}/src/PduSniffer_nomain.o;\ + fi + ${OBJECTDIR}/src/main_nomain.o: ${OBJECTDIR}/src/main.o src/main.cpp ${MKDIR} -p ${OBJECTDIR}/src @NMOUTPUT=`${NM} ${OBJECTDIR}/src/main.o`; \ diff --git a/nbproject/Makefile-Release.mk b/nbproject/Makefile-Release.mk index 84063e1..554cc2e 100644 --- a/nbproject/Makefile-Release.mk +++ b/nbproject/Makefile-Release.mk @@ -36,6 +36,7 @@ OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} # Object Files OBJECTFILES= \ ${OBJECTDIR}/src/PduSender.o \ + ${OBJECTDIR}/src/PduSniffer.o \ ${OBJECTDIR}/src/main.o \ ${OBJECTDIR}/src/map/NatRange.o \ ${OBJECTDIR}/src/map/natmap.o @@ -76,6 +77,11 @@ ${OBJECTDIR}/src/PduSender.o: src/PduSender.cpp ${RM} "$@.d" $(COMPILE.cc) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSender.o src/PduSender.cpp +${OBJECTDIR}/src/PduSniffer.o: src/PduSniffer.cpp + ${MKDIR} -p ${OBJECTDIR}/src + ${RM} "$@.d" + $(COMPILE.cc) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSniffer.o src/PduSniffer.cpp + ${OBJECTDIR}/src/main.o: src/main.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" @@ -126,6 +132,19 @@ ${OBJECTDIR}/src/PduSender_nomain.o: ${OBJECTDIR}/src/PduSender.o src/PduSender. ${CP} ${OBJECTDIR}/src/PduSender.o ${OBJECTDIR}/src/PduSender_nomain.o;\ fi +${OBJECTDIR}/src/PduSniffer_nomain.o: ${OBJECTDIR}/src/PduSniffer.o src/PduSniffer.cpp + ${MKDIR} -p ${OBJECTDIR}/src + @NMOUTPUT=`${NM} ${OBJECTDIR}/src/PduSniffer.o`; \ + if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \ + (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \ + (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \ + then \ + ${RM} "$@.d";\ + $(COMPILE.cc) -O2 -Dmain=__nomain -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSniffer_nomain.o src/PduSniffer.cpp;\ + else \ + ${CP} ${OBJECTDIR}/src/PduSniffer.o ${OBJECTDIR}/src/PduSniffer_nomain.o;\ + fi + ${OBJECTDIR}/src/main_nomain.o: ${OBJECTDIR}/src/main.o src/main.cpp ${MKDIR} -p ${OBJECTDIR}/src @NMOUTPUT=`${NM} ${OBJECTDIR}/src/main.o`; \ diff --git a/nbproject/Makefile-Unitest.mk b/nbproject/Makefile-Unitest.mk index 20ed031..aa716f9 100644 --- a/nbproject/Makefile-Unitest.mk +++ b/nbproject/Makefile-Unitest.mk @@ -36,6 +36,7 @@ OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} # Object Files OBJECTFILES= \ ${OBJECTDIR}/src/PduSender.o \ + ${OBJECTDIR}/src/PduSniffer.o \ ${OBJECTDIR}/src/main.o \ ${OBJECTDIR}/src/map/NatRange.o \ ${OBJECTDIR}/src/map/natmap.o @@ -76,6 +77,11 @@ ${OBJECTDIR}/src/PduSender.o: src/PduSender.cpp ${RM} "$@.d" $(COMPILE.cc) -g -Itest -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSender.o src/PduSender.cpp +${OBJECTDIR}/src/PduSniffer.o: src/PduSniffer.cpp + ${MKDIR} -p ${OBJECTDIR}/src + ${RM} "$@.d" + $(COMPILE.cc) -g -Itest -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSniffer.o src/PduSniffer.cpp + ${OBJECTDIR}/src/main.o: src/main.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" @@ -126,6 +132,19 @@ ${OBJECTDIR}/src/PduSender_nomain.o: ${OBJECTDIR}/src/PduSender.o src/PduSender. ${CP} ${OBJECTDIR}/src/PduSender.o ${OBJECTDIR}/src/PduSender_nomain.o;\ fi +${OBJECTDIR}/src/PduSniffer_nomain.o: ${OBJECTDIR}/src/PduSniffer.o src/PduSniffer.cpp + ${MKDIR} -p ${OBJECTDIR}/src + @NMOUTPUT=`${NM} ${OBJECTDIR}/src/PduSniffer.o`; \ + if (echo "$$NMOUTPUT" | ${GREP} '|main$$') || \ + (echo "$$NMOUTPUT" | ${GREP} 'T main$$') || \ + (echo "$$NMOUTPUT" | ${GREP} 'T _main$$'); \ + then \ + ${RM} "$@.d";\ + $(COMPILE.cc) -g -Itest -std=c++11 -Dmain=__nomain -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/PduSniffer_nomain.o src/PduSniffer.cpp;\ + else \ + ${CP} ${OBJECTDIR}/src/PduSniffer.o ${OBJECTDIR}/src/PduSniffer_nomain.o;\ + fi + ${OBJECTDIR}/src/main_nomain.o: ${OBJECTDIR}/src/main.o src/main.cpp ${MKDIR} -p ${OBJECTDIR}/src @NMOUTPUT=`${NM} ${OBJECTDIR}/src/main.o`; \ diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml index a82e7fb..ab6086a 100644 --- a/nbproject/configurations.xml +++ b/nbproject/configurations.xml @@ -9,6 +9,7 @@ src/map/NatRange.h src/PduSender.h + src/PduSniffer.h src/map/NatRange.cpp src/PduSender.cpp + src/PduSniffer.cpp src/main.cpp + + + + @@ -146,6 +152,10 @@ + + + + @@ -201,6 +211,10 @@ + + + + diff --git a/src/PduSniffer.cpp b/src/PduSniffer.cpp new file mode 100644 index 0000000..f1a05d7 --- /dev/null +++ b/src/PduSniffer.cpp @@ -0,0 +1,67 @@ +/* + * File: PduSniffer.cpp + * Author: dev + * + * Created on 29. September 2015, 21:29 + */ + +#include "PduSniffer.h" + +namespace otonat { + + PduSniffer::PduSniffer(NatMap * map) { + this->map = map; + this->isRunnig = false; + config.set_promisc_mode(true); + config.set_immediate_mode(true); + } + + PduSniffer::PduSniffer(const PduSniffer& orig) : snifferList(orig.snifferList), config(orig.config) { + this->map = orig.map; + this->isRunnig = orig.isRunnig; + } + + PduSniffer::~PduSniffer() { + Stop(); + for (Tins::Sniffer * sniffer : snifferList) { + delete sniffer; + } + + this->snifferList.clear(); + } + + PduSniffer& PduSniffer::operator=(const PduSniffer& rhs) { + if (this == &rhs) return *this; // handle self assignment + + this->map = rhs.map; + this->isRunnig = rhs.isRunnig; + this->config = rhs.config; + this->snifferList = rhs.snifferList; + return *this; + } + + bool PduSniffer::sniffPdu(const Tins::PDU& pdu) { + this->map->pushPduToIncommingPduQueue(pdu.clone()); + return this->isRunnig; + } + + void PduSniffer::Start() { + this->isRunnig = true; + } + + void PduSniffer::Stop() { + this->isRunnig = false; + } + + void PduSniffer::SniffInterface(const Tins::NetworkInterface & interface) { + Start(); + Tins::Sniffer * sniffer = new Tins::Sniffer(interface.name(), config); + sniffer->sniff_loop(std::bind(&PduSniffer::sniffPdu, this, std::placeholders::_1)); + this->snifferList.push_back(sniffer); + } + + std::thread * PduSniffer::SniffInterfaceInNewThread(const Tins::NetworkInterface& interface){ + std::thread * newThread = new std::thread(std::bind(&PduSniffer::SniffInterface, this, interface)); + return newThread; + } +} \ No newline at end of file diff --git a/src/PduSniffer.h b/src/PduSniffer.h new file mode 100644 index 0000000..942c81c --- /dev/null +++ b/src/PduSniffer.h @@ -0,0 +1,40 @@ +/* + * File: PduSniffer.h + * Author: dev + * + * Created on 29. September 2015, 21:29 + */ + +#ifndef PDUSNIFFER_H +#define PDUSNIFFER_H + +#include "map/natmap.h" +#include +#include + +namespace otonat { + + class PduSniffer { + public: + typedef std::vector SnifferList; + + PduSniffer(NatMap * map); + PduSniffer(const PduSniffer& orig); + PduSniffer& operator=(const PduSniffer& rhs); + virtual ~PduSniffer(); + void SniffInterface(const Tins::NetworkInterface & interface); + std::thread * SniffInterfaceInNewThread(const Tins::NetworkInterface & interface); + void Start(); + void Stop(); + private: + SnifferList snifferList; + NatMap * map; + Tins::SnifferConfiguration config; + bool isRunnig; + bool sniffPdu(const Tins::PDU &pdu); + }; + +} + +#endif /* PDUSNIFFER_H */ +