diff --git a/NATItem.cpp b/NATItem.cpp index 8c4953c..6caed2f 100644 --- a/NATItem.cpp +++ b/NATItem.cpp @@ -11,7 +11,7 @@ NATItem::NATItem() { this->ip = "0.0.0.0"; this->port = 0; - this->timeout = 0; + this->timeout = time(NULL); } const string& NATItem::getIp() const @@ -34,12 +34,26 @@ void NATItem::setPort(int port) this->port = port; } -int NATItem::getTimeout() const +unsigned long NATItem::getTimeout() const { - return timeout; + long t = this->timeout - time(NULL); + if (t < 0) + return 0; + + return t; +} + +bool NATItem::isFree() +{ + return (this->getTimeout() == 0); } void NATItem::setTimeout(int timeout) { - this->timeout = timeout; + this->timeout = time(NULL) + timeout; +} + +void NATItem::free() +{ + this->setTimeout(0); } diff --git a/NATItem.h b/NATItem.h index 096e27a..c11e285 100644 --- a/NATItem.h +++ b/NATItem.h @@ -12,28 +12,23 @@ class NATItem { - string ip; // IP wewn. do którego ma trafić odpowiedź / z którego przyszło żądanie - int port; // port komputera wewn. do którego ma trafić odpowiedź - int timeout; // czas (w sekundach) zajętości portu (0 - port wolny) + string ip; // IP wewn. do którego ma trafić odpowiedź / z którego przyszło żądanie + int port; // port komputera wewn. do którego ma trafić odpowiedź + unsigned long timeout; // czas (w sekundach) zajętości portu (0 - port wolny) public: NATItem(); -/* - // settery - void setIp(string ip); - void setPort(int port); - void setTimeout(int timeout); + NATItem(); + + bool isFree(); - // gettery - string getIp(); - int getPort(); - int getTimeout();*/ const string& getIp() const; void setIp(const string& ip); int getPort() const; void setPort(int port); - int getTimeout() const; + unsigned long getTimeout() const; void setTimeout(int timeout); + void free(); }; #endif /* NATITEM_H_ */ diff --git a/NATRouter.cpp b/NATRouter.cpp index e7f8488..5c6dbd5 100644 --- a/NATRouter.cpp +++ b/NATRouter.cpp @@ -18,7 +18,15 @@ NATRouter::NATRouter() cerr << "Nie mozna zaalokowac pamieci dla tablicy NAT!" << endl; exit(1); } +} + +int NATRouter::getFreePort() +{ + for (int i=0; i<65536; ++i) + if (this->natTable[i].isFree()) + return i; + return -1; // nie ma żadnego wolnego portu } NATRouter::~NATRouter() @@ -26,3 +34,91 @@ NATRouter::~NATRouter() if (natTable) delete [] natTable; } + +void NATRouter::onRecv() +{ + Packet p = this->recv(); + + if (p.getSrcPort() != 0) + { + if (p.getDstIp() != this->getIp() && p.getDstIp() != this->getWanIp()) + { + this->sNAT(&p); + } + else if (p.getDstIp() == this->getWanIp() && !this->natTable[p.getDstPort()].isFree()) + { + this->dNAT(&p); + } + else + { + // TUTAJ ew. implementacja obslugi pakietu adresowanego do routera + } + } +} + +void NATRouter::setWanIp(string wanIp) +{ + this->netWanConf.ip = wanIp; +} + +void NATRouter::setWanMask(string wanMask) +{ + this->netWanConf.mask = wanMask; +} + +void NATRouter::setWanGatewayIp(string wanGatewayIp) +{ + this->netWanConf.gatewayIp = wanGatewayIp; +} + +string NATRouter::getWanIp() +{ + return this->netWanConf.ip; +} + +string NATRouter::getWanMask() +{ + return this->netWanConf.mask; +} + +void NATRouter::sNAT(Packet *packet) +{ + int port; + NATItem *natItem; + + while ((port = this->getFreePort()) == -1) + { + //TESTOWO + cout << "Brak wolnych portow, czekam 1s" << endl; + sleep(1); + } + + // wstawiam do tablicy NAT info ze port zarezerowany na odbior + natItem = &this->natTable[port]; + natItem->setIp(packet->getSrcIp()); + natItem->setPort(packet->getSrcPort()); + packet->setSrcIp(this->getWanIp()); // zamieniam IP lokalne na WAN'owe + packet->setSrcPort(port); // zamieniam port lokalny na WAN'owy - z tablicy NAT + + this->send(*packet, true); // wysylam dalej + + natItem = NULL; +} + +void NATRouter::dNAT(Packet* packet) +{ + NATItem *natItem = &this->natTable[packet->getDstPort()]; + + packet->setDstIp(natItem->getIp()); // zamieniam IP lokalne na WAN'owe + packet->setDstPort(natItem->getPort()); // zamieniam port NAT na lokalny wezla + natItem->free(); // zwalniam port w routerze + + this->send(*packet, true); // wysylam dalej + + natItem = NULL; +} + +string NATRouter::getWanGatewayIp() +{ + return this->netWanConf.gatewayIp; +} diff --git a/NATRouter.h b/NATRouter.h index 310c340..6fcc77d 100644 --- a/NATRouter.h +++ b/NATRouter.h @@ -14,9 +14,25 @@ class NATRouter : public Node { - NATItem *natTable; + NATItem *natTable; // tablica z zaalokowanymi portami na zewnątrz + NetConf netWanConf; // konfiguracja sieciowa na zewnątrz + int getFreePort(); + void sNAT(Packet *packet); + void dNAT(Packet *packet); + public: NATRouter(); ~NATRouter(); + virtual void onRecv(); + + // settery + void setWanIp(string wanIp); + void setWanMask(string wanMask); + void setWanGatewayIp(string wanGatewayIp); + + // gettery + string getWanIp(); + string getWanMask(); + string getWanGatewayIp(); }; #endif /* NATROUTER_H_ */ diff --git a/Node.cpp b/Node.cpp index 152172e..a2b9b72 100644 --- a/Node.cpp +++ b/Node.cpp @@ -100,7 +100,7 @@ bool Node::connectNode(Node *node, bool firstConnected) * o ile jest skonfigurowana i istnieje do niej sciezka * TODO zaimplementowac porownywanie z maska - jezeli dstIp z maska nie gra, wysylac na ruter */ -bool Node::send(Packet packet) +bool Node::send(Packet packet, bool isRouter) { Node *node; node = this->findConnection(packet.getDstIp()); // znajdz bezposrednia trase @@ -113,11 +113,14 @@ bool Node::send(Packet packet) if (packet.getDstPort() == 0) return false; // wypada zdefiniowac nadawce oraz docelowy port... - packet.setSrcIp(this->getIp()); - // ustaw port zrodlowy na port losowy z zakresu [32768,61000] - zob. empheral port (port emferyczny) - srand(time(NULL)); - packet.setSrcPort(rand() % 32768 + 28233); - + // jezeli wezel nie jest routerem to ma ustawic pakietowi swoj srcIp oraz losowy port + if (!isRouter) + { + packet.setSrcIp(this->getIp()); + // ustaw port zrodlowy na port losowy z zakresu [32768,61000] - zob. empheral port (port emferyczny) + srand(time(NULL)); + packet.setSrcPort(rand() % 32768 + 28233); + } node->putPacket(packet); return true; diff --git a/Node.h b/Node.h index d5dd04f..c543e1d 100644 --- a/Node.h +++ b/Node.h @@ -34,7 +34,7 @@ public: virtual ~Node(); bool connectNode(Node *node, bool firstConnected = false); - bool send(Packet packet); + bool send(Packet packet, bool isRouter = false); void putPacket(Packet packet); // settery diff --git a/common.h b/common.h index 2e0b0d9..c8df114 100644 --- a/common.h +++ b/common.h @@ -14,6 +14,7 @@ #include #include #include +#include using namespace std;