add natrange
This commit is contained in:
@@ -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`; \
|
||||
|
||||
@@ -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`; \
|
||||
|
||||
@@ -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`; \
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
<logicalFolder name="map" displayName="map" projectFiles="true">
|
||||
<itemPath>src/map/natmap.h</itemPath>
|
||||
</logicalFolder>
|
||||
<itemPath>src/map/NatRange.h</itemPath>
|
||||
</logicalFolder>
|
||||
<logicalFolder name="ResourceFiles"
|
||||
displayName="Resource Files"
|
||||
@@ -18,6 +19,7 @@
|
||||
<logicalFolder name="f1" displayName="map" projectFiles="true">
|
||||
<itemPath>src/map/natmap.cpp</itemPath>
|
||||
</logicalFolder>
|
||||
<itemPath>src/map/NatRange.cpp</itemPath>
|
||||
<itemPath>src/main.cpp</itemPath>
|
||||
</logicalFolder>
|
||||
<logicalFolder name="TestFiles"
|
||||
@@ -79,6 +81,10 @@
|
||||
</folder>
|
||||
<item path="src/main.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
<item path="src/map/NatRange.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
<item path="src/map/NatRange.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="src/map/natmap.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
<item path="src/map/natmap.h" ex="false" tool="3" flavor2="0">
|
||||
@@ -132,6 +138,10 @@
|
||||
</folder>
|
||||
<item path="src/main.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
<item path="src/map/NatRange.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
<item path="src/map/NatRange.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="src/map/natmap.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
<item path="src/map/natmap.h" ex="false" tool="3" flavor2="0">
|
||||
@@ -179,6 +189,10 @@
|
||||
</folder>
|
||||
<item path="src/main.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
<item path="src/map/NatRange.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
<item path="src/map/NatRange.h" ex="false" tool="3" flavor2="0">
|
||||
</item>
|
||||
<item path="src/map/natmap.cpp" ex="false" tool="1" flavor2="0">
|
||||
</item>
|
||||
<item path="src/map/natmap.h" ex="false" tool="3" flavor2="0">
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include <tins/tins.h>
|
||||
#include <thread>
|
||||
|
||||
|
||||
using namespace std;
|
||||
using namespace Tins;
|
||||
|
||||
|
||||
81
src/map/NatRange.cpp
Normal file
81
src/map/NatRange.cpp
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
36
src/map/NatRange.h
Normal file
36
src/map/NatRange.h
Normal file
@@ -0,0 +1,36 @@
|
||||
#ifndef NATRANGE_H
|
||||
#define NATRANGE_H
|
||||
|
||||
#include <tins/tins.h>
|
||||
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 */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,44 +5,45 @@
|
||||
#include <map>
|
||||
#include <queue>
|
||||
#include <tins/tins.h>
|
||||
#include "NatRange.h"
|
||||
namespace otonat {
|
||||
|
||||
namespace otonat
|
||||
{
|
||||
class NatMap
|
||||
{
|
||||
public:
|
||||
typedef std::vector<Tins::NetworkInterface> NetworkInterfaceList;
|
||||
typedef std::queue<const Tins::PDU *> PduQueue;
|
||||
typedef std::pair<Tins::IPv4Address,Tins::IPv4Address> IPv4AddressEntry;
|
||||
typedef std::map<Tins::IPv4Address, Tins::HWAddress<6>> IpAdressMacMap;
|
||||
typedef std::map<Tins::IPv4Address, Tins::IPv4Address> IpAdressMap;
|
||||
class NatMap {
|
||||
public:
|
||||
typedef std::vector<NatRange> NatRangeList;
|
||||
typedef std::queue<const Tins::PDU *> PduQueue;
|
||||
typedef std::pair<Tins::IPv4Address, Tins::IPv4Address> IPv4AddressEntry;
|
||||
typedef std::map<Tins::IPv4Address, Tins::HWAddress < 6 >> IpAdressMacMap;
|
||||
typedef std::map<Tins::IPv4Address, Tins::IPv4Address> 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);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
#include "nattest.h"
|
||||
#include "../src/map/NatRange.h"
|
||||
#include <iostream>
|
||||
|
||||
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<Tins::EthernetII>(), "00:00:00:00:00:04", "00:00:00:00:00:01", "172.18.4.40", "172.27.0.20");
|
||||
checkEth(result3Ack->rfind_pdu<Tins::EthernetII>(), "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<Tins::EthernetII>(), "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<Tins::EthernetII>(), "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<Tins::IP>(), targetDstIp, targetSrcIp);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user