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