From f8c35c865cb41009399518aa769846ca7afb128c Mon Sep 17 00:00:00 2001 From: stubbfel Date: Wed, 19 Aug 2015 00:57:35 +0200 Subject: [PATCH] refactor methods --- 1T1NAT.depend | 8 ++- 1T1NAT.layout | 36 +++++----- main.cpp | 1 + src/map/natmap.cpp | 124 ++++++++++++++++++++++++++++++++++- src/map/natmap.h | 27 +++++++- test/case/testcaseipcalc.cpp | 7 ++ 6 files changed, 177 insertions(+), 26 deletions(-) diff --git a/1T1NAT.depend b/1T1NAT.depend index 578641b..c2ffe37 100644 --- a/1T1NAT.depend +++ b/1T1NAT.depend @@ -4,11 +4,13 @@ -1439330649 source:/home/dev/projects/1T1NAT/src/map/natmap.cpp +1439937901 source:/home/dev/projects/1T1NAT/src/map/natmap.cpp "natmap.h" -1439327491 /home/dev/projects/1T1NAT/src/map/natmap.h +1439938543 /home/dev/projects/1T1NAT/src/map/natmap.h + + 1439326884 source:/home/dev/projects/1T1NAT/test/unittest_main.cpp @@ -17,7 +19,7 @@ -1439329061 source:/home/dev/projects/1T1NAT/test/case/testcaseipcalc.cpp +1439500558 source:/home/dev/projects/1T1NAT/test/case/testcaseipcalc.cpp "UnitTest++/UnitTest++.h" "../../src/map/natmap.h" diff --git a/1T1NAT.layout b/1T1NAT.layout index b31bd4d..c0aba56 100644 --- a/1T1NAT.layout +++ b/1T1NAT.layout @@ -1,29 +1,24 @@ - - - - - - - - - - - - - - - - + - + - + + + + + + + + + + + @@ -31,4 +26,9 @@ + + + + + diff --git a/main.cpp b/main.cpp index 4c6f6cd..0b0ecc6 100644 --- a/main.cpp +++ b/main.cpp @@ -39,6 +39,7 @@ bool arpm2(const PDU &pdu) { // Retrieve the ARP layer const ARP &arp = pdu.rfind_pdu(); + std::cout << arp.opcode()<< std::endl; if (arp.opcode() == ARP::REPLY) { diff --git a/src/map/natmap.cpp b/src/map/natmap.cpp index 8ccd49c..b2c92ce 100644 --- a/src/map/natmap.cpp +++ b/src/map/natmap.cpp @@ -8,7 +8,7 @@ NatMap::NatMap(): NatMap(Tins::NetworkInterface::all()) //ctor } -NatMap::NatMap(std::vector interfaceList) : interfaces(interfaceList) +NatMap::NatMap(NetworkInterfaceList interfaceList) : interfaces(interfaceList), arpMap(), transMap(), pduQueue(), zeroIp() { } @@ -17,7 +17,7 @@ NatMap::~NatMap() //dtor } -NatMap::NatMap(const NatMap& other) : interfaces(other.interfaces) +NatMap::NatMap(const NatMap& other) : interfaces(other.interfaces), arpMap(), transMap(), pduQueue(), zeroIp() { //copy ctor } @@ -27,6 +27,9 @@ NatMap& NatMap::operator=(const NatMap& rhs) if (this == &rhs) return *this; // handle self assignment interfaces = rhs.interfaces; + arpMap = rhs.arpMap; + transMap = rhs.transMap; + pduQueue = rhs.pduQueue; return *this; } @@ -39,4 +42,121 @@ const Tins::IPv4Address NatMap::mapIPv4Address(const Tins::IPv4Address & ip, con 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) +{ + if (pdu == NULL) + { + return; + } + + switch(pdu->pdu_type()) + { + case Tins::PDU::ARP: + handleArp(static_cast(pdu)); + break; + case Tins::PDU::IP: + handleIp(static_cast(pdu)); + return; + default: + break; + } + + handlePdu(const_cast(pdu->inner_pdu())); +} + +void NatMap::handleIp(const Tins::IP * ip) +{ + IpAdressMap::iterator transIpIter = transMap.find(ip->dst_addr()); + if (transIpIter != transMap.end()) + { + // handle know traslation ip + TranslateIpPacket(ip, transIpIter->second); + } + else + { + // Determine Traslation Ip + } +} + +void NatMap::TranslateIpPacket(const Tins::IP * ip, const Tins::IPv4Address & transIp) +{ + // copy ip packet, for modifaktion + Tins::IP * modifyIp = ip->clone(); + + // set translated dst address + modifyIp->dst_addr(transIp); + + // translate src adress + const Tins::IPv4Address & originSrc = ip->src_addr(); + IpAdressMap::iterator transIpIter = transMap.find(originSrc); + Tins::IPv4Address transSrcAttr; + if (transIpIter != transMap.end()) + { + // set translated src address + transSrcAttr = transIpIter->second; + } + else + { + transSrcAttr = InsertOrUdpateTranslateIpAddress(originSrc, interfaces); + } + + modifyIp->src_addr(transSrcAttr); +} + +Tins::IPv4Address NatMap::InsertOrUdpateTranslateIpAddress(const Tins::IPv4Address & originIp, NetworkInterfaceList & interfaceList) +{ + // calc translated ip address for first up and not same interfaces + for (NetworkInterfaceList::iterator interfaceIter = interfaceList.begin() ; interfaceIter != interfaceList.end(); ++interfaceIter) + { + // insert or update translated ip address + const Tins::NetworkInterface::Info & interfaceInfo = interfaceIter->info(); + if (!interfaceInfo.is_up) + { + continue; + } + + Tins::IPv4Range range = calcIpRange(interfaceInfo);//networkInterfaceIpRangeMap[interfaceInfo.ip_addr]; + if (range.contains(originIp)) + { + continue; + } + + return InsertOrUdpateTranslateIpAddress(originIp, interfaceInfo); + } + + return zeroIp; +} + +Tins::IPv4Address NatMap::InsertOrUdpateTranslateIpAddress(const Tins::IPv4Address & originIp, const Tins::NetworkInterface::Info & interfaceInfo) +{ + // translated ip address + Tins::IPv4Address transAddr = mapIPv4Address(originIp, interfaceInfo); + + // insert forward translation + transMap.insert(IPv4AddressEntry(originIp, transAddr)); + + // insert or update backward translation + IpAdressMap::iterator transIpIter = transMap.find(transAddr); + if (transIpIter != transMap.end()) + { + transMap[transAddr] = originIp; + } + else + { + transMap.insert(IPv4AddressEntry(transAddr,originIp)); + } + + return transAddr; +} + +void NatMap::handleArp(const Tins::ARP * /*arp*/) +{ + return; +} + } diff --git a/src/map/natmap.h b/src/map/natmap.h index f8ad57e..d8603e0 100644 --- a/src/map/natmap.h +++ b/src/map/natmap.h @@ -2,6 +2,8 @@ #define NATMAP_H #include +#include +#include #include namespace otonat @@ -9,18 +11,37 @@ 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; + + NatMap(); - NatMap(std::vector interfaceList); + NatMap(NetworkInterfaceList interfaceList); virtual ~NatMap(); NatMap(const NatMap& other); NatMap& operator=(const NatMap& other); - std::vector interfaces; + NetworkInterfaceList interfaces; + IpAdressMacMap arpMap; + IpAdressMap transMap; + PduQueue pduQueue; + 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); + protected: private: - + void handleIp(const Tins::IP * ip); + void handleArp(const Tins::ARP * arp); + Tins::IPv4Address InsertOrUdpateTranslateIpAddress(const Tins::IPv4Address & originIp, const Tins::NetworkInterface::Info & interfaceInfo); + Tins::IPv4Address InsertOrUdpateTranslateIpAddress(const Tins::IPv4Address & originIp, NetworkInterfaceList & interfaceList); + void TranslateIpPacket(const Tins::IP * ip, const Tins::IPv4Address & transIp); + Tins::IPv4Address zeroIp; }; } diff --git a/test/case/testcaseipcalc.cpp b/test/case/testcaseipcalc.cpp index 5930d92..2a90cb2 100644 --- a/test/case/testcaseipcalc.cpp +++ b/test/case/testcaseipcalc.cpp @@ -94,4 +94,11 @@ SUITE(NatTests) CHECK_EQUAL(expetedIp,resultIp); } + TEST(TestHandlePDU) + { + Tins::EthernetII eth = Tins::EthernetII() / Tins::IP() / Tins::TCP(); + otonat::NatMap natMap = otonat::NatMap(); + natMap.handlePdu(ð); + } + }