diff --git a/NATItem.cpp b/NATItem.cpp index 6caed2f..f4e2ba2 100644 --- a/NATItem.cpp +++ b/NATItem.cpp @@ -57,3 +57,8 @@ void NATItem::free() { this->setTimeout(0); } + +void NATItem::increaseTimeout(int timeout) +{ + this->setTimeout(this->getTimeout() + timeout); +} diff --git a/NATItem.h b/NATItem.h index e0fb37d..0254989 100644 --- a/NATItem.h +++ b/NATItem.h @@ -20,6 +20,7 @@ public: NATItem(); bool isFree(); + void increaseTimeout(int timeout); const string& getIp() const; void setIp(const string& ip); diff --git a/NATRouter.cpp b/NATRouter.cpp index d6fcf41..c9d28ae 100644 --- a/NATRouter.cpp +++ b/NATRouter.cpp @@ -1,7 +1,7 @@ /* * NATItem.cpp * - * Created on: 10-01-2017 + * Created on: 11-01-2017 * Author: Piotr Dergun */ @@ -121,12 +121,15 @@ void NATRouter::sNAT(Packet *packet) int port; NATItem *natItem; - while ((port = this->getFreePort()) == -1) - { - //TESTOWO - cout << "Brak wolnych portow, czekam 1s" << endl; - sleep(1); - } + // mozliwe, ze juz port zostal zaalokowany, to trzeba wykorzystac + port = this->getAllocatedPort(packet->getSrcIp(), packet->getSrcPort()); + if (port == -1) + 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]; @@ -145,8 +148,8 @@ void NATRouter::sNAT(Packet *packet) /* * funkcja DNAT ma za zadanie znalezc w tablicy NAT * port i adres IP wezla na ktory ma wrocic odpowiedz - * z sieci Internet (z zewnatrz), a takze zwolnic ten - * port + * z sieci Internet (z zewnatrz), a takze przedluzyc + * czas zycia tego portu */ void NATRouter::dNAT(Packet* packet) { @@ -154,7 +157,8 @@ void NATRouter::dNAT(Packet* packet) 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 + //natItem->free(); // zwalniam port w routerze + natItem->increaseTimeout(5); // podbijam o kolejne 5 sekund skoro transmisja trwa this->send(*packet, true); // wysylam dalej @@ -171,6 +175,19 @@ string NATRouter::getWanNetwork() return this->netWanConf.network; } +/* + * funkcja szuka aktywnego zaalokowanego portu (aktywna + * transmisja) w tablicy NAT dla pary (srcIp:srcPort) + */ +int NATRouter::getAllocatedPort(string srcIp, int srcPort) +{ + for (int i=1; i<65536; ++i) + if (this->natTable[i].getIp() == srcIp && this->natTable[i].getPort() == srcPort) + return i; + + return -1; // nic nie znaleziono +} + string NATRouter::getWanGatewayIp() { return this->netWanConf.gatewayIp; diff --git a/NATRouter.h b/NATRouter.h index 220af7c..6f02544 100644 --- a/NATRouter.h +++ b/NATRouter.h @@ -18,6 +18,7 @@ class NATRouter : public Node NetConf netWanConf; // konfiguracja sieciowa na zewnÄ…trz void initalizeNatTable(); int getFreePort(); + int getAllocatedPort(string srcIp, int srcPort); void sNAT(Packet *packet); void dNAT(Packet *packet); void setWanNetwork(); diff --git a/Node.cpp b/Node.cpp index 50deb34..d149a64 100644 --- a/Node.cpp +++ b/Node.cpp @@ -155,9 +155,12 @@ bool Node::send(Packet packet, bool isRouter) 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); + if (packet.getSrcPort() == 0) + { + // 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);