From 411dcbcc1272fcc7e331ac1987cf5c3995a86f2e Mon Sep 17 00:00:00 2001 From: stubbfel Date: Sat, 22 Aug 2015 01:00:52 +0200 Subject: [PATCH] add natrange --- nbproject/Makefile-Debug.mk | 19 ++++++++ nbproject/Makefile-Release.mk | 19 ++++++++ nbproject/Makefile-Unitest.mk | 19 ++++++++ nbproject/configurations.xml | 14 ++++++ src/main.cpp | 1 + src/map/NatRange.cpp | 81 +++++++++++++++++++++++++++++++++++ src/map/NatRange.h | 36 ++++++++++++++++ src/map/natmap.cpp | 73 +++++++++++++++++-------------- src/map/natmap.h | 67 +++++++++++++++-------------- tests/nattest.cpp | 56 +++++++++++++++++------- tests/nattest.h | 4 +- 11 files changed, 305 insertions(+), 84 deletions(-) create mode 100644 src/map/NatRange.cpp create mode 100644 src/map/NatRange.h diff --git a/nbproject/Makefile-Debug.mk b/nbproject/Makefile-Debug.mk index 51dd62c..7a45012 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/main.o \ + ${OBJECTDIR}/src/map/NatRange.o \ ${OBJECTDIR}/src/map/natmap.o # Test Directory @@ -74,6 +75,11 @@ ${OBJECTDIR}/src/main.o: src/main.cpp ${RM} "$@.d" $(COMPILE.cc) -g -Wall -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/main.o src/main.cpp +${OBJECTDIR}/src/map/NatRange.o: src/map/NatRange.cpp + ${MKDIR} -p ${OBJECTDIR}/src/map + ${RM} "$@.d" + $(COMPILE.cc) -g -Wall -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/map/NatRange.o src/map/NatRange.cpp + ${OBJECTDIR}/src/map/natmap.o: src/map/natmap.cpp ${MKDIR} -p ${OBJECTDIR}/src/map ${RM} "$@.d" @@ -114,6 +120,19 @@ ${OBJECTDIR}/src/main_nomain.o: ${OBJECTDIR}/src/main.o src/main.cpp ${CP} ${OBJECTDIR}/src/main.o ${OBJECTDIR}/src/main_nomain.o;\ fi +${OBJECTDIR}/src/map/NatRange_nomain.o: ${OBJECTDIR}/src/map/NatRange.o src/map/NatRange.cpp + ${MKDIR} -p ${OBJECTDIR}/src/map + @NMOUTPUT=`${NM} ${OBJECTDIR}/src/map/NatRange.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/map/NatRange_nomain.o src/map/NatRange.cpp;\ + else \ + ${CP} ${OBJECTDIR}/src/map/NatRange.o ${OBJECTDIR}/src/map/NatRange_nomain.o;\ + fi + ${OBJECTDIR}/src/map/natmap_nomain.o: ${OBJECTDIR}/src/map/natmap.o src/map/natmap.cpp ${MKDIR} -p ${OBJECTDIR}/src/map @NMOUTPUT=`${NM} ${OBJECTDIR}/src/map/natmap.o`; \ diff --git a/nbproject/Makefile-Release.mk b/nbproject/Makefile-Release.mk index 98c1a4e..e9f07ec 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/main.o \ + ${OBJECTDIR}/src/map/NatRange.o \ ${OBJECTDIR}/src/map/natmap.o # Test Directory @@ -74,6 +75,11 @@ ${OBJECTDIR}/src/main.o: src/main.cpp ${RM} "$@.d" $(COMPILE.cc) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/main.o src/main.cpp +${OBJECTDIR}/src/map/NatRange.o: src/map/NatRange.cpp + ${MKDIR} -p ${OBJECTDIR}/src/map + ${RM} "$@.d" + $(COMPILE.cc) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/map/NatRange.o src/map/NatRange.cpp + ${OBJECTDIR}/src/map/natmap.o: src/map/natmap.cpp ${MKDIR} -p ${OBJECTDIR}/src/map ${RM} "$@.d" @@ -114,6 +120,19 @@ ${OBJECTDIR}/src/main_nomain.o: ${OBJECTDIR}/src/main.o src/main.cpp ${CP} ${OBJECTDIR}/src/main.o ${OBJECTDIR}/src/main_nomain.o;\ fi +${OBJECTDIR}/src/map/NatRange_nomain.o: ${OBJECTDIR}/src/map/NatRange.o src/map/NatRange.cpp + ${MKDIR} -p ${OBJECTDIR}/src/map + @NMOUTPUT=`${NM} ${OBJECTDIR}/src/map/NatRange.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/map/NatRange_nomain.o src/map/NatRange.cpp;\ + else \ + ${CP} ${OBJECTDIR}/src/map/NatRange.o ${OBJECTDIR}/src/map/NatRange_nomain.o;\ + fi + ${OBJECTDIR}/src/map/natmap_nomain.o: ${OBJECTDIR}/src/map/natmap.o src/map/natmap.cpp ${MKDIR} -p ${OBJECTDIR}/src/map @NMOUTPUT=`${NM} ${OBJECTDIR}/src/map/natmap.o`; \ diff --git a/nbproject/Makefile-Unitest.mk b/nbproject/Makefile-Unitest.mk index 8c633ca..54d0b26 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/main.o \ + ${OBJECTDIR}/src/map/NatRange.o \ ${OBJECTDIR}/src/map/natmap.o # Test Directory @@ -74,6 +75,11 @@ ${OBJECTDIR}/src/main.o: src/main.cpp ${RM} "$@.d" $(COMPILE.cc) -g -Itest -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/main.o src/main.cpp +${OBJECTDIR}/src/map/NatRange.o: src/map/NatRange.cpp + ${MKDIR} -p ${OBJECTDIR}/src/map + ${RM} "$@.d" + $(COMPILE.cc) -g -Itest -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/map/NatRange.o src/map/NatRange.cpp + ${OBJECTDIR}/src/map/natmap.o: src/map/natmap.cpp ${MKDIR} -p ${OBJECTDIR}/src/map ${RM} "$@.d" @@ -114,6 +120,19 @@ ${OBJECTDIR}/src/main_nomain.o: ${OBJECTDIR}/src/main.o src/main.cpp ${CP} ${OBJECTDIR}/src/main.o ${OBJECTDIR}/src/main_nomain.o;\ fi +${OBJECTDIR}/src/map/NatRange_nomain.o: ${OBJECTDIR}/src/map/NatRange.o src/map/NatRange.cpp + ${MKDIR} -p ${OBJECTDIR}/src/map + @NMOUTPUT=`${NM} ${OBJECTDIR}/src/map/NatRange.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/map/NatRange_nomain.o src/map/NatRange.cpp;\ + else \ + ${CP} ${OBJECTDIR}/src/map/NatRange.o ${OBJECTDIR}/src/map/NatRange_nomain.o;\ + fi + ${OBJECTDIR}/src/map/natmap_nomain.o: ${OBJECTDIR}/src/map/natmap.o src/map/natmap.cpp ${MKDIR} -p ${OBJECTDIR}/src/map @NMOUTPUT=`${NM} ${OBJECTDIR}/src/map/natmap.o`; \ diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml index 8800267..01c9221 100644 --- a/nbproject/configurations.xml +++ b/nbproject/configurations.xml @@ -7,6 +7,7 @@ src/map/natmap.h + src/map/NatRange.h src/map/natmap.cpp + src/map/NatRange.cpp src/main.cpp + + + + @@ -132,6 +138,10 @@ + + + + @@ -179,6 +189,10 @@ + + + + diff --git a/src/main.cpp b/src/main.cpp index 0b0ecc6..7205cd8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,7 @@ #include #include + using namespace std; using namespace Tins; diff --git a/src/map/NatRange.cpp b/src/map/NatRange.cpp new file mode 100644 index 0000000..f4b1161 --- /dev/null +++ b/src/map/NatRange.cpp @@ -0,0 +1,81 @@ +#include "NatRange.h" +namespace otonat { + + NatRange::NatRange(Tins::NetworkInterface interface, Tins::IPv4Address rangeIpAddr, Tins::IPv4Address netmask) : interface(interface), rangeIpAddr(rangeIpAddr), rangeNetmask(netmask) { + } + + NatRange& NatRange::operator=(const NatRange& right) { + // Check for self-assignment! + if (this == &right) // Same object? + return *this; // Yes, so skip assignment, and just return *this. + + interface = right.interface; + rangeIpAddr = right.rangeIpAddr; + rangeNetmask = right.rangeNetmask; + return *this; + } + + NatRange::NatRange(const NatRange& other) : interface(other.interface), rangeIpAddr(other.rangeIpAddr), rangeNetmask(other.rangeNetmask) { + } + + NatRange::~NatRange() { + } + + Tins::IPv4Range NatRange::calcIpRange(const Tins::IPv4Address &ip, const Tins::IPv4Address & netmask) { + return Tins::IPv4Range::from_mask(ip, netmask); + } + + Tins::IPv4Range NatRange::calcIpRange(const Tins::NetworkInterface::Info & interfaceInfo) { + return calcIpRange(interfaceInfo.ip_addr, interfaceInfo.netmask); + } + + Tins::IPv4Range NatRange::calcIpRange(const Tins::NetworkInterface & interface) { + return calcIpRange(interface.info()); + } + + Tins::IPv4Range NatRange::calcIpRange(const NatRange & natRange) { + return calcIpRange(natRange.rangeIpAddr, natRange.rangeNetmask); + } + + Tins::IPv4Range NatRange::calcIpRange(const NatRange& natRange, const bool usedInterfaceIpSetting) { + if (usedInterfaceIpSetting) { + return calcIpRange(natRange.interface); + } + + return calcIpRange(natRange); + } + + Tins::IPv4Range NatRange::calcIpRange(const bool usedInterfaceIpSetting) const { + return calcIpRange(*this, usedInterfaceIpSetting); + } + + Tins::IPv4Address NatRange::mapIPv4Address(const Tins::IPv4Address& originIp, const Tins::NetworkInterface& interface) { + return mapIPv4Address(originIp, interface.info()); + } + + Tins::IPv4Address NatRange::mapIPv4Address(const Tins::IPv4Address & originIp, const Tins::NetworkInterface::Info & interfaceInfo) { + return mapIPv4Address(originIp, interfaceInfo.ip_addr, interfaceInfo.netmask); + } + + Tins::IPv4Address NatRange::mapIPv4Address(const Tins::IPv4Address& originIp, const NatRange& natRange) { + return mapIPv4Address(originIp, natRange.rangeIpAddr, natRange.rangeNetmask); + } + + Tins::IPv4Address NatRange::mapIPv4Address(const Tins::IPv4Address& originIp, const Tins::IPv4Address& netIp, const Tins::IPv4Address& netmask) { + const uint32_t networkStartIp = netIp & netmask; + const uint32_t resultIp = (originIp & ~netmask) | networkStartIp; + return Tins::IPv4Address(resultIp); + } + + Tins::IPv4Address NatRange::mapIPv4Address(const Tins::IPv4Address& originIp, const NatRange& natRange, const bool usedInterfaceIpSetting) { + if (usedInterfaceIpSetting) { + return mapIPv4Address(originIp, natRange.interface); + } + + return mapIPv4Address(originIp, natRange); + } + + Tins::IPv4Address NatRange::mapIPv4Addres(const Tins::IPv4Address& originIp, const bool usedInterfaceIpSetting) const { + return mapIPv4Address(originIp, *this, usedInterfaceIpSetting); + } +} \ No newline at end of file diff --git a/src/map/NatRange.h b/src/map/NatRange.h new file mode 100644 index 0000000..9c7a151 --- /dev/null +++ b/src/map/NatRange.h @@ -0,0 +1,36 @@ +#ifndef NATRANGE_H +#define NATRANGE_H + +#include +namespace otonat { + + class NatRange { + public: + NatRange(Tins::NetworkInterface interface, Tins::IPv4Address rangeIpAddr, Tins::IPv4Address netmask); + NatRange(const NatRange& orig); + NatRange& operator=(const NatRange& right); + virtual ~NatRange(); + + Tins::NetworkInterface interface; + Tins::IPv4Address rangeIpAddr; + Tins::IPv4Address rangeNetmask; + + Tins::IPv4Range calcIpRange(const bool usedInterfaceIpSetting) const; + static Tins::IPv4Range calcIpRange(const Tins::IPv4Address &ip, const Tins::IPv4Address & netmask); + static Tins::IPv4Range calcIpRange(const Tins::NetworkInterface::Info & interfaceInfo); + static Tins::IPv4Range calcIpRange(const Tins::NetworkInterface & interface); + static Tins::IPv4Range calcIpRange(const NatRange & natRange); + static Tins::IPv4Range calcIpRange(const NatRange & natRange, const bool usedInterfaceIpSetting); + + Tins::IPv4Address mapIPv4Addres(const Tins::IPv4Address & originIp, const bool usedInterfaceIpSetting) const; + static Tins::IPv4Address mapIPv4Address(const Tins::IPv4Address & originIp, const Tins::IPv4Address & netIp, const Tins::IPv4Address & netmask); + static Tins::IPv4Address mapIPv4Address(const Tins::IPv4Address & originIp, const Tins::NetworkInterface::Info & interfaceInfo); + static Tins::IPv4Address mapIPv4Address(const Tins::IPv4Address & originIp, const Tins::NetworkInterface & interface); + static Tins::IPv4Address mapIPv4Address(const Tins::IPv4Address & originIp, const NatRange & natRange); + static Tins::IPv4Address mapIPv4Address(const Tins::IPv4Address & originIp, const NatRange & natRange, const bool usedInterfaceIpSetting); + + private: + }; +} +#endif /* NATRANGE_H */ + diff --git a/src/map/natmap.cpp b/src/map/natmap.cpp index 6a6308c..9ac0f52 100644 --- a/src/map/natmap.cpp +++ b/src/map/natmap.cpp @@ -2,24 +2,20 @@ namespace otonat { - NatMap::NatMap() : NatMap(Tins::NetworkInterface::all()) { - //ctor - } - - NatMap::NatMap(NetworkInterfaceList interfaceList) : interfaces(interfaceList) { + NatMap::NatMap(NatRangeList rangeList) : ranges(rangeList) { } NatMap::~NatMap() { //dtor } - NatMap::NatMap(const NatMap& other) : interfaces(other.interfaces), arpMap(other.arpMap), transMap(other.transMap), incommingPduQueue(other.incommingPduQueue), outgoingPduQueue(other.outgoingPduQueue), zeroIp(other.zeroIp) { + NatMap::NatMap(const NatMap& other) : ranges(other.ranges), arpMap(other.arpMap), transMap(other.transMap), incommingPduQueue(other.incommingPduQueue), outgoingPduQueue(other.outgoingPduQueue), zeroIp(other.zeroIp) { } NatMap& NatMap::operator=(const NatMap& rhs) { if (this == &rhs) return *this; // handle self assignment - interfaces = rhs.interfaces; + ranges = rhs.ranges; arpMap = rhs.arpMap; transMap = rhs.transMap; incommingPduQueue = rhs.incommingPduQueue; @@ -27,18 +23,6 @@ namespace otonat { return *this; } - const Tins::IPv4Address NatMap::mapIPv4Address(const Tins::IPv4Address & ip, const Tins::NetworkInterface::Info & interfaceInfo) { - const uint32_t & netmask = interfaceInfo.netmask; - const uint32_t & interfaceIp = interfaceInfo.ip_addr; - const uint32_t networkStartIp = interfaceIp & netmask; - const uint32_t resultIp = (ip & ~netmask) | networkStartIp; - return Tins::IPv4Address(resultIp); - } - - const Tins::IPv4Range NatMap::calcIpRange(const Tins::NetworkInterface::Info & interfaceInfo) { - return Tins::IPv4Range::from_mask(interfaceInfo.ip_addr, interfaceInfo.netmask); - } - void NatMap::handlePdu(const Tins::PDU * pdu) { Tins::PDU * pduCopy = pdu->clone(); if (pdu == NULL) { @@ -67,7 +51,11 @@ namespace otonat { return false; } - const Tins::IPv4Address originDstIp = ip->dst_addr(); + const Tins::IPv4Address & originDstIp = ip->dst_addr(); + if (!isIpInMyRanges(originDstIp)) { + return false; + } + IpAdressMap::iterator transIpIter = transMap.find(originDstIp); if (transIpIter != transMap.end()) { // handle know traslation ip @@ -79,7 +67,7 @@ namespace otonat { } else if (transDstIpIter->second != originDstIp) { transMap[transDstIp] = originDstIp; } - + return true; } else { return false; @@ -93,41 +81,42 @@ namespace otonat { // translate src adress const Tins::IPv4Address & originSrc = ip->src_addr(); + IpAdressMap::const_iterator transIpIter = transMap.find(originSrc); Tins::IPv4Address transSrcAttr; if (transIpIter != transMap.end()) { // set translated src address transSrcAttr = transIpIter->second; } else { - transSrcAttr = InsertOrUdpateTranslateIpAddress(originSrc, transIp, interfaces); + transSrcAttr = InsertOrUdpateTranslateIpAddress(originSrc, transIp, ranges); } ip->src_addr(transSrcAttr); } - Tins::IPv4Address NatMap::InsertOrUdpateTranslateIpAddress(const Tins::IPv4Address & originIp, const Tins::IPv4Address & transIp, NetworkInterfaceList & interfaceList) { + Tins::IPv4Address NatMap::InsertOrUdpateTranslateIpAddress(const Tins::IPv4Address & originIp, const Tins::IPv4Address & transIp, NatRangeList & rangeList) { // calc translated ip address for first up and not same interfaces - for (const Tins::NetworkInterface & interface : interfaceList) { + for (NatRange & range : rangeList) { // insert or update translated ip address - const Tins::NetworkInterface::Info & interfaceInfo = interface.info(); + const Tins::NetworkInterface::Info & interfaceInfo = range.interface.info(); if (!interfaceInfo.is_up) { continue; } - Tins::IPv4Range range = calcIpRange(interfaceInfo); //networkInterfaceIpRangeMap[interfaceInfo.ip_addr]; - if (!range.contains(transIp)) { + Tins::IPv4Range ipRange = range.calcIpRange(true); + if (!ipRange.contains(transIp)) { continue; } - return InsertOrUdpateTranslateIpAddress(originIp, interfaceInfo); + return InsertOrUdpateTranslateIpAddress(originIp, range); } return zeroIp; } - Tins::IPv4Address NatMap::InsertOrUdpateTranslateIpAddress(const Tins::IPv4Address & originIp, const Tins::NetworkInterface::Info & interfaceInfo) { + Tins::IPv4Address NatMap::InsertOrUdpateTranslateIpAddress(const Tins::IPv4Address & originIp, const NatRange & range) { // translated ip address - Tins::IPv4Address transAddr = mapIPv4Address(originIp, interfaceInfo); + Tins::IPv4Address transAddr = range.mapIPv4Addres(originIp, false); // insert forward translation transMap.insert(IPv4AddressEntry(originIp, transAddr)); @@ -147,15 +136,33 @@ namespace otonat { return false; } - bool NatMap::isForMeOrFromMeIp(const Tins::IP * ip) { + bool NatMap::isForMeOrFromMeIp(const Tins::IP* ip) { + return isForMeOrFromMeIp(ip, ranges); + } + + bool NatMap::isForMeOrFromMeIp(const Tins::IP * ip, const NatRangeList & rangeList) { const Tins::IPv4Address & srcAddr = ip->src_addr(); const Tins::IPv4Address & dstAddr = ip->dst_addr(); - for (Tins::NetworkInterface interface : interfaces) { - const Tins::IPv4Address & interfaceAddr = interface.info().ip_addr; + for (NatRange range : rangeList) { + const Tins::IPv4Address & interfaceAddr = range.interface.info().ip_addr; if (srcAddr == interfaceAddr || dstAddr == interfaceAddr) { return true; } } return false; } + + bool NatMap::isIpInMyRanges(const Tins::IPv4Address & ipAddr) { + return isIpInMyRanges(ipAddr, ranges); + } + + bool NatMap::isIpInMyRanges(const Tins::IPv4Address & ipAddr, const NatRangeList & rangeList) { + for (NatRange range : rangeList) { + if (range.calcIpRange(true).contains(ipAddr)) { + return true; + } + } + + return false; + } } diff --git a/src/map/natmap.h b/src/map/natmap.h index 5e4f32a..1471a29 100644 --- a/src/map/natmap.h +++ b/src/map/natmap.h @@ -5,44 +5,45 @@ #include #include #include +#include "NatRange.h" +namespace otonat { -namespace otonat -{ -class NatMap -{ -public: - typedef std::vector NetworkInterfaceList; - typedef std::queue PduQueue; - typedef std::pair IPv4AddressEntry; - typedef std::map> IpAdressMacMap; - typedef std::map IpAdressMap; + class NatMap { + public: + typedef std::vector NatRangeList; + typedef std::queue PduQueue; + typedef std::pair IPv4AddressEntry; + typedef std::map> IpAdressMacMap; + typedef std::map IpAdressMap; + NatMap() { + } - NatMap(); - NatMap(NetworkInterfaceList interfaceList); - virtual ~NatMap(); - NatMap(const NatMap& other); - NatMap& operator=(const NatMap& other); - NetworkInterfaceList interfaces; - IpAdressMacMap arpMap; - IpAdressMap transMap; - PduQueue incommingPduQueue; - PduQueue outgoingPduQueue; - void handlePdu(const Tins::PDU * pdu); - static const Tins::IPv4Address mapIPv4Address(const Tins::IPv4Address & ip, const Tins::NetworkInterface::Info & interfaceInfo); - static const Tins::IPv4Range calcIpRange(const Tins::NetworkInterface::Info & interfaceInfo); + NatMap(NatRangeList rangeList); + virtual ~NatMap(); + NatMap(const NatMap& other); + NatMap& operator=(const NatMap& other); + NatRangeList ranges; + IpAdressMacMap arpMap; + IpAdressMap transMap; + PduQueue incommingPduQueue; + PduQueue outgoingPduQueue; + void handlePdu(const Tins::PDU * pdu); -protected: + protected: -private: - bool handleIp(Tins::IP * ip); - bool handleArp(Tins::ARP * arp); - Tins::IPv4Address InsertOrUdpateTranslateIpAddress(const Tins::IPv4Address & originIp, const Tins::NetworkInterface::Info & interfaceInfo); - Tins::IPv4Address InsertOrUdpateTranslateIpAddress(const Tins::IPv4Address & originIp, const Tins::IPv4Address & transIp, NetworkInterfaceList & interfaceList); - void TranslateIpPacket(Tins::IP * ip, const Tins::IPv4Address & transIp); - Tins::IPv4Address zeroIp; - bool isForMeOrFromMeIp(const Tins::IP * ip); -}; + private: + bool handleIp(Tins::IP * ip); + bool handleArp(Tins::ARP * arp); + Tins::IPv4Address InsertOrUdpateTranslateIpAddress(const Tins::IPv4Address & originIp, const NatRange & range); + Tins::IPv4Address InsertOrUdpateTranslateIpAddress(const Tins::IPv4Address & originIp, const Tins::IPv4Address & transIp, NatRangeList & rangeList); + void TranslateIpPacket(Tins::IP * ip, const Tins::IPv4Address & transIp); + Tins::IPv4Address zeroIp; + bool isForMeOrFromMeIp(const Tins::IP * ip); + static bool isForMeOrFromMeIp(const Tins::IP * ip, const NatRangeList & rangeList); + bool isIpInMyRanges(const Tins::IPv4Address & ipAddr); + static bool isIpInMyRanges(const Tins::IPv4Address & ipAddr, const NatRangeList & rangeList); + }; } diff --git a/tests/nattest.cpp b/tests/nattest.cpp index 59a9ba6..054e826 100644 --- a/tests/nattest.cpp +++ b/tests/nattest.cpp @@ -6,6 +6,7 @@ */ #include "nattest.h" +#include "../src/map/NatRange.h" #include CPPUNIT_TEST_SUITE_REGISTRATION(nattest); @@ -13,9 +14,11 @@ CPPUNIT_TEST_SUITE_REGISTRATION(nattest); nattest::nattest() { Tins::NetworkInterface net1("vboxnet0"); Tins::NetworkInterface net2("vboxnet1"); - otonat::NatMap::NetworkInterfaceList list; - list.push_back(net1); - list.push_back(net2); + otonat::NatRange range1(net1, "10.0.0.0", "255.255.240.0"); + otonat::NatRange range2(net2, "172.27.0.0", "255.255.0.0"); + otonat::NatMap::NatRangeList list; + list.push_back(range1); + list.push_back(range2); natMap = otonat::NatMap(list); } @@ -30,59 +33,65 @@ void nattest::tearDown() { void nattest::testIpCalcEth0() { Tins::IPv4Address expetedIp = deviceIpEth0; - Tins::IPv4Address resultIp = natMap.mapIPv4Address(deviceIpEth0, eth0Info); + Tins::IPv4Address resultIp = otonat::NatRange::mapIPv4Address(deviceIpEth0, eth0Info); CPPUNIT_ASSERT_EQUAL(expetedIp, resultIp); expetedIp = Tins::IPv4Address("10.168.23.42"); - resultIp = natMap.mapIPv4Address(deviceIpEth1, eth0Info); + resultIp = otonat::NatRange::mapIPv4Address(deviceIpEth1, eth0Info); CPPUNIT_ASSERT_EQUAL(expetedIp, resultIp); expetedIp = Tins::IPv4Address("10.27.123.4"); - resultIp = natMap.mapIPv4Address(deviceIpEth2, eth0Info); + resultIp = otonat::NatRange::mapIPv4Address(deviceIpEth2, eth0Info); CPPUNIT_ASSERT_EQUAL(expetedIp, resultIp); } void nattest::testIpCalcEth1() { Tins::IPv4Address expetedIp = Tins::IPv4Address("192.168.23.40"); - Tins::IPv4Address resultIp = natMap.mapIPv4Address(deviceIpEth0, eth1Info); + Tins::IPv4Address resultIp = otonat::NatRange::mapIPv4Address(deviceIpEth0, eth1Info); CPPUNIT_ASSERT_EQUAL(expetedIp, resultIp); expetedIp = deviceIpEth1; - resultIp = natMap.mapIPv4Address(deviceIpEth1, eth1Info); + resultIp = otonat::NatRange::mapIPv4Address(deviceIpEth1, eth1Info); CPPUNIT_ASSERT_EQUAL(expetedIp, resultIp); expetedIp = Tins::IPv4Address("192.168.23.4"); - resultIp = natMap.mapIPv4Address(deviceIpEth2, eth1Info); + resultIp = otonat::NatRange::mapIPv4Address(deviceIpEth2, eth1Info); CPPUNIT_ASSERT_EQUAL(expetedIp, resultIp); } void nattest::testIpCalcEth2() { Tins::IPv4Address expetedIp = Tins::IPv4Address("172.16.3.40"); - Tins::IPv4Address resultIp = natMap.mapIPv4Address(deviceIpEth0, eth2Info); + Tins::IPv4Address resultIp = otonat::NatRange::mapIPv4Address(deviceIpEth0, eth2Info); CPPUNIT_ASSERT_EQUAL(expetedIp, resultIp); expetedIp = Tins::IPv4Address("172.24.23.42"); - resultIp = natMap.mapIPv4Address(deviceIpEth1, eth2Info); + resultIp = otonat::NatRange::mapIPv4Address(deviceIpEth1, eth2Info); CPPUNIT_ASSERT_EQUAL(expetedIp, resultIp); expetedIp = deviceIpEth2; - resultIp = natMap.mapIPv4Address(deviceIpEth2, eth2Info); + resultIp = otonat::NatRange::mapIPv4Address(deviceIpEth2, eth2Info); CPPUNIT_ASSERT_EQUAL(expetedIp, resultIp); } void nattest::testTranslateIp() { + Tins::EthernetII ethW = Tins::EthernetII("00:00:00:00:00:01", "00:00:00:00:00:02") / Tins::IP("172.17.0.20", "172.16.3.55") / Tins::TCP(); Tins::EthernetII eth = Tins::EthernetII("00:00:00:00:00:01", "00:00:00:00:00:02") / Tins::IP("172.27.0.20", "172.16.3.55") / Tins::TCP(); Tins::EthernetII ethAck = Tins::EthernetII("00:00:00:00:00:02", "00:00:00:00:00:01") / Tins::IP("10.0.3.55", "10.0.0.20") / Tins::TCP(); Tins::EthernetII eth2 = Tins::EthernetII("00:00:00:00:00:01", "00:00:00:00:00:03") / Tins::IP("172.27.0.20", "172.17.3.55") / Tins::TCP(); Tins::EthernetII eth2Ack = Tins::EthernetII("00:00:00:00:00:03", "00:00:00:00:00:01") / Tins::IP("10.0.3.55", "10.0.0.20") / Tins::TCP(); Tins::EthernetII eth3 = Tins::EthernetII("00:00:00:00:00:01", "00:00:00:00:00:04") / Tins::IP("172.27.0.20", "172.18.1.40") / Tins::TCP(); Tins::EthernetII eth3Ack = Tins::EthernetII("00:00:00:00:00:04", "00:00:00:00:00:01") / Tins::IP("10.0.1.40", "10.0.0.20") / Tins::TCP(); + Tins::EthernetII eth4 = Tins::EthernetII("00:00:00:00:00:02", "00:00:00:00:00:05") / Tins::IP("10.0.3.55", "10.0.1.41") / Tins::TCP(); + Tins::EthernetII eth4Ack = Tins::EthernetII("00:00:00:00:00:05", "00:00:00:00:00:02") / Tins::IP("172.27.1.41", "172.17.3.55") / Tins::TCP(); natMap.handlePdu(ð); CPPUNIT_ASSERT(natMap.outgoingPduQueue.empty()); natMap.transMap.insert(otonat::NatMap::IPv4AddressEntry(Tins::IPv4Address("172.27.0.20"), Tins::IPv4Address("10.0.0.20"))); + natMap.handlePdu(ðW); + CPPUNIT_ASSERT(natMap.outgoingPduQueue.empty()); + natMap.handlePdu(ð); CPPUNIT_ASSERT(natMap.outgoingPduQueue.size() == 1); const Tins::PDU * result = natMap.outgoingPduQueue.front(); @@ -121,7 +130,21 @@ void nattest::testTranslateIp() { natMap.handlePdu(ð3Ack); CPPUNIT_ASSERT(natMap.outgoingPduQueue.size() == 1); const Tins::PDU * result3Ack = natMap.outgoingPduQueue.front(); - checkEth(result3Ack->rfind_pdu(), "00:00:00:00:00:04", "00:00:00:00:00:01", "172.18.4.40", "172.27.0.20"); + checkEth(result3Ack->rfind_pdu(), "00:00:00:00:00:04", "00:00:00:00:00:01", "172.18.1.40", "172.27.0.20"); + natMap.outgoingPduQueue.pop(); + CPPUNIT_ASSERT(natMap.outgoingPduQueue.empty()); + + natMap.handlePdu(ð4); + CPPUNIT_ASSERT(natMap.outgoingPduQueue.size() == 1); + const Tins::PDU * result4 = natMap.outgoingPduQueue.front(); + checkEth(result4->rfind_pdu(), "00:00:00:00:00:02", "00:00:00:00:00:05", "172.17.3.55", "172.27.1.41"); + natMap.outgoingPduQueue.pop(); + CPPUNIT_ASSERT(natMap.outgoingPduQueue.empty()); + + natMap.handlePdu(ð4Ack); + CPPUNIT_ASSERT(natMap.outgoingPduQueue.size() == 1); + const Tins::PDU * result4Ack = natMap.outgoingPduQueue.front(); + checkEth(result4Ack->rfind_pdu(), "00:00:00:00:00:05", "00:00:00:00:00:02", "10.0.1.41", "10.0.3.55"); natMap.outgoingPduQueue.pop(); CPPUNIT_ASSERT(natMap.outgoingPduQueue.empty()); } @@ -139,7 +162,7 @@ void nattest::testForMeFromMe() { } void nattest::testNatInterfaces() { - CPPUNIT_ASSERT(!natMap.interfaces.empty()); + CPPUNIT_ASSERT(!natMap.ranges.empty()); } void nattest::printIp(const Tins::IP & ip) { @@ -157,7 +180,7 @@ void nattest::printEth(const Tins::EthernetII & eth) { std::cout << "++++++++++++++++++++++" << std::endl; } -void nattest::checkAndPrintIp(const Tins::IP & ip, const Tins::IPv4Address & targetSrcIp, const Tins::IPv4Address & targetDstIp) { +void nattest::checkAndPrintIp(const Tins::IP & ip, const Tins::IPv4Address & targetDstIp, const Tins::IPv4Address & targetSrcIp) { printIp(ip); checkIp(ip, targetDstIp, targetSrcIp); } @@ -167,7 +190,7 @@ void nattest::checkAndPrintEth(const Tins::EthernetII & eth, const Tins::HWAddre checkEth(eth, targetDstMac, targetSrcMac, targetDstIp, targetSrcIp); } -void nattest::checkIp(const Tins::IP & ip, const Tins::IPv4Address & targetSrcIp, const Tins::IPv4Address & targetDstIp) { +void nattest::checkIp(const Tins::IP & ip, const Tins::IPv4Address & targetDstIp, const Tins::IPv4Address & targetSrcIp) { const Tins::IPv4Address & packetSrcIp = ip.src_addr(); const Tins::IPv4Address & packetDstIp = ip.dst_addr(); CPPUNIT_ASSERT_EQUAL(targetSrcIp, packetSrcIp); @@ -179,5 +202,6 @@ void nattest::checkEth(const Tins::EthernetII & eth, const Tins::HWAddress<6> & const Tins::HWAddress<6> & frameDstMac = eth.dst_addr(); CPPUNIT_ASSERT_EQUAL(targetSrcMac, frameSrcMac); CPPUNIT_ASSERT_EQUAL(targetDstMac, frameDstMac); + checkIp(eth.rfind_pdu(), targetDstIp, targetSrcIp); } diff --git a/tests/nattest.h b/tests/nattest.h index 3e5dfc8..7b42bd1 100644 --- a/tests/nattest.h +++ b/tests/nattest.h @@ -67,9 +67,9 @@ private: void printIp(const Tins::IP & ip); void printEth(const Tins::EthernetII & eth); - void checkAndPrintIp(const Tins::IP & ip, const Tins::IPv4Address & targetSrcIp, const Tins::IPv4Address & targetDstIp); + void checkAndPrintIp(const Tins::IP & ip, const Tins::IPv4Address & targetDstIp, const Tins::IPv4Address & targetSrcIp); void checkAndPrintEth(const Tins::EthernetII & eth, const Tins::HWAddress<6> & targetDstMac, const Tins::HWAddress<6> & targetSrcMac, const Tins::IPv4Address & targetDstIp, const Tins::IPv4Address & targetSrcIp); - void checkIp(const Tins::IP & ip, const Tins::IPv4Address & targetSrcIp, const Tins::IPv4Address & targetDstIp); + void checkIp(const Tins::IP & ip, const Tins::IPv4Address & targetDstIp, const Tins::IPv4Address & targetSrcIp); void checkEth(const Tins::EthernetII & eth, const Tins::HWAddress<6> & targetDstMac, const Tins::HWAddress<6> & targetSrcMac, const Tins::IPv4Address & targetDstIp, const Tins::IPv4Address & targetSrcIp); };