poprawka losowania wolnego portu, poprawka liczenia timeoutu dla SNAT (+15 zamiast sztywno 15)

This commit is contained in:
2017-01-19 12:42:13 +01:00
parent 618b504aa1
commit 4f7736de3b
3 changed files with 44 additions and 9 deletions

View File

@@ -45,8 +45,14 @@ int NATRouter::getFreePort()
if (this->lastUsedPort == NAT_TABLE_LEN-1) if (this->lastUsedPort == NAT_TABLE_LEN-1)
this->lastUsedPort = 0; this->lastUsedPort = 0;
if (this->natTable[this->lastUsedPort+1].isFree()) //if (this->natTable[this->lastUsedPort+1].isFree())
return ++this->lastUsedPort; // return ++this->lastUsedPort;
for (int i = this->lastUsedPort+1; i<NAT_TABLE_LEN; ++i)
if (this->natTable[i].isFree())
{
this->lastUsedPort = i;
return i;
}
for (int i = 1; i<this->lastUsedPort; ++i) for (int i = 1; i<this->lastUsedPort; ++i)
if (this->natTable[i].isFree()) if (this->natTable[i].isFree())
@@ -148,9 +154,11 @@ void NATRouter::sNAT(Packet *packet)
{ {
int port; int port;
NATItem *natItem; NATItem *natItem;
bool allocated = false;
stringstream ss;
// mozliwe, ze juz port zostal zaalokowany, to trzeba wykorzystac // mozliwe, ze juz port zostal zaalokowany, to trzeba wykorzystac
// TODO getAllocatedPort - STRASZNIE zmula caly symulator // TO
port = this->getAllocatedPort(packet->getSrcIp(), packet->getSrcPort()); port = this->getAllocatedPort(packet->getSrcIp(), packet->getSrcPort());
if (port == -1) if (port == -1)
while ((port = this->getFreePort()) == -1) while ((port = this->getFreePort()) == -1)
@@ -159,14 +167,25 @@ void NATRouter::sNAT(Packet *packet)
this->print("NAT table full, waiting 1s", true); this->print("NAT table full, waiting 1s", true);
this->delay(1); this->delay(1);
} }
else
allocated = true;
// wstawiam do tablicy NAT info ze port zarezerowany na odbior // wstawiam do tablicy NAT info ze port zarezerowany na odbior
natItem = &this->natTable[port]; natItem = &this->natTable[port];
natItem->setIp(packet->getSrcIp()); natItem->setIp(packet->getSrcIp());
natItem->setPort(packet->getSrcPort()); natItem->setPort(packet->getSrcPort());
if (allocated)
natItem->increaseTimeout(15);
else
natItem->setTimeout(15); natItem->setTimeout(15);
stringstream ss; ss << packet->getSrcIp() << ":" << packet->getSrcPort();
if (!allocated)
this->natHelper.insert(pair<string, int>(ss.str(), port));
ss.str("");
ss << "SNAT " << packet->getSrcIp() << ":" << packet->getSrcPort() << " --> " << this->getWanIp() << ":" << port; ss << "SNAT " << packet->getSrcIp() << ":" << packet->getSrcPort() << " --> " << this->getWanIp() << ":" << port;
packet->setSrcIp(this->getWanIp()); // zamieniam IP lokalne na WAN'owe packet->setSrcIp(this->getWanIp()); // zamieniam IP lokalne na WAN'owe
@@ -219,11 +238,26 @@ string NATRouter::getWanNetwork()
*/ */
int NATRouter::getAllocatedPort(string srcIp, int srcPort) int NATRouter::getAllocatedPort(string srcIp, int srcPort)
{ {
for (int i=1; i<NAT_TABLE_LEN; ++i) map<string, int>::iterator it;
int pos = -1;
/*for (int i=1; i<NAT_TABLE_LEN; ++i)
if (this->natTable[i].getIp() == srcIp && this->natTable[i].getPort() == srcPort) if (this->natTable[i].getIp() == srcIp && this->natTable[i].getPort() == srcPort)
return i; return i;
*/
stringstream ss;
ss << srcIp << ":" << srcPort;
return -1; // nic nie znaleziono it = this->natHelper.find(ss.str());
if (it != this->natHelper.end())
{
// sprawdz czy wpis o podanym IP z nat nie zostal napisany (referencja nieaktualna)
if (this->natTable[it->second].getIp() != srcIp || this->natTable[it->second].getPort() != srcPort)
this->natHelper.erase(it);
else
pos = it->second;
}
return pos;
} }
void NATRouter::freePorts() void NATRouter::freePorts()

View File

@@ -15,6 +15,7 @@
class NATRouter : public Node class NATRouter : public Node
{ {
NATItem *natTable = NULL; // tablica z zaalokowanymi portami na zewnątrz NATItem *natTable = NULL; // tablica z zaalokowanymi portami na zewnątrz
map<string, int> natHelper; // mapa pomocnicza pozwalajaca szybko znalezc wpis
NetConf netWanConf; // konfiguracja sieciowa na zewnątrz NetConf netWanConf; // konfiguracja sieciowa na zewnątrz
void initalizeNatTable(); void initalizeNatTable();
int getFreePort(); int getFreePort();

View File

@@ -324,8 +324,8 @@ void Simulation::natOverflowSimulation(int nNodes)
if (currentSrcPort[i] == 65535) if (currentSrcPort[i] == 65535)
currentSrcPort[i] = 1; currentSrcPort[i] = 1;
p.setSrcPort(currentSrcPort[i]++); //p.setSrcPort(currentSrcPort[i]++);
//p.setSrcPort(0);
client[i].send(p); client[i].send(p);
this->delay(150); this->delay(150);