Browse Source

przeciazenie natu wzglednie dziala

master
Piotr Dergun 7 years ago
parent
commit
618b504aa1
6 changed files with 116 additions and 32 deletions
  1. +69
    -1
      Log.cpp
  2. +1
    -0
      Log.h
  3. +1
    -1
      Main.cpp
  4. +22
    -10
      NATRouter.cpp
  5. +1
    -0
      NATRouter.h
  6. +22
    -20
      Simulation.cpp

+ 69
- 1
Log.cpp View File

@ -53,6 +53,74 @@ string* Log::getObjectName() const
return objectName;
}
void Log::printProgressBar(int lineNumber, int offset, string msg,
float percent)
{
int cols, rows, bar_width, pools;
stringstream ss;
#ifndef DEBUG
if (this->getObjectName() == NULL)
return;
if (this->getDelay() == 0)
return;
getmaxyx(stdscr, rows, cols);
pthread_mutex_lock(this->writeMutex);
move(lineNumber, 0);
clrtoeol();
ss << msg << ":" << (int) (percent * 100) << "%";
bar_width = cols - ss.str().size() - offset;
pools = (int) (percent * bar_width);
if (has_colors())
attron(COLOR_PAIR(this->getColor()));
printw("%s:", msg.c_str());
if (has_colors())
attroff(COLOR_PAIR(this->getColor()));
for (int i = 0; i < offset; ++i)
printw(" ");
if (has_colors())
{
if (percent < 0.66)
attron(COLOR_PAIR(GREEN));
else if (percent < 0.90)
attron(COLOR_PAIR(YELLOW));
else
attron(COLOR_PAIR(RED));
}
attron(A_BOLD);
for (int i = 0; i < pools; ++i)
printw("#");
ss.str("");
ss << " " << (int) (percent * 100) << "%";
move(lineNumber, cols - ss.str().size());
printw(" %d%%", (int) (percent * 100));
attroff(A_BOLD);
if (has_colors())
{
if (percent < 0.66)
attroff(COLOR_PAIR(GREEN));
else if (percent < 0.90)
attroff(COLOR_PAIR(YELLOW));
else
attroff(COLOR_PAIR(RED));
}
move(0, 0);
pthread_mutex_unlock(this->writeMutex);
#else
cout << this->getObjectName()->c_str() << ": " << this->getDelimiter() << msg << endl;
#endif
}
void Log::setObjectName(string* objectName)
{
this->objectName = objectName;
@ -74,8 +142,8 @@ void Log::print(string msg, bool force)
if(has_colors())
attron(COLOR_PAIR(this->getColor()));
//printw("%s:%s%s", this->getObjectName()->c_str(), this->getDelimiter().c_str(), msg.c_str());
printw("%s:%s", this->getObjectName()->c_str(), this->getDelimiter().c_str());
if(has_colors())
attron(A_BOLD);
printw("%s", msg.c_str());
attroff(A_BOLD);

+ 1
- 0
Log.h View File

@ -33,6 +33,7 @@ class Log
public:
Log();
void print(string msg, bool force=false);
void printProgressBar(int lineNumber, int offset, string msg, float percent);
LOG_COLOR getColor() const;
void setColor(LOG_COLOR color);

+ 1
- 1
Main.cpp View File

@ -47,7 +47,7 @@ int main(int argc, char *argv[])
}
Simulation sim;
//sim.createThread("timer", SIM_TIMER, &sim);
sim.createThread("timer", SIM_TIMER, &sim);
sim.natOverflowSimulation(nodesCount);
}
else if (!strcmp(argv[1], "-v"))

+ 22
- 10
NATRouter.cpp View File

@ -42,10 +42,23 @@ NATRouter::NATRouter(string hostname, string ip, string mask, string gatewayIp)
int NATRouter::getFreePort()
{
if (this->lastUsedPort == NAT_TABLE_LEN-1)
this->lastUsedPort = 0;
if (this->natTable[this->lastUsedPort+1].isFree())
return ++this->lastUsedPort;
for (int i = 1; i<this->lastUsedPort; ++i)
if (this->natTable[i].isFree())
{
this->lastUsedPort = i;
return i;
}
/*
for (int i=1; i<NAT_TABLE_LEN; ++i)
if (this->natTable[i].isFree())
return i;
*/
return -1; // nie ma żadnego wolnego portu
}
@ -62,10 +75,6 @@ void NATRouter::onRecv()
Packet p = this->recv();
stringstream s;
/*if (this->getHostname() == "Router 2") {
s << "src: " << p.getSrcIp() << ":" << p.getSrcPort() << "dst: " << p.getDstIp() << ":" << p.getDstPort();
this->print(s.str());
}*/
if (p.getSrcPort() != 0)
{
// jezeli pakiet idzie z jednego wezla do drugiego w danej possieci to odeslij mu "jak switch"
@ -141,12 +150,13 @@ void NATRouter::sNAT(Packet *packet)
NATItem *natItem;
// mozliwe, ze juz port zostal zaalokowany, to trzeba wykorzystac
// TODO getAllocatedPort - STRASZNIE zmula caly symulator
port = this->getAllocatedPort(packet->getSrcIp(), packet->getSrcPort());
if (port == -1)
while ((port = this->getFreePort()) == -1)
{
//TESTOWO
this->print("NAT table full, waiting 1s");
this->print("NAT table full, waiting 1s", true);
this->delay(1);
}
@ -154,7 +164,7 @@ void NATRouter::sNAT(Packet *packet)
natItem = &this->natTable[port];
natItem->setIp(packet->getSrcIp());
natItem->setPort(packet->getSrcPort());
natItem->setTimeout(/*5*/15);
natItem->setTimeout(15);
stringstream ss;
ss << "SNAT " << packet->getSrcIp() << ":" << packet->getSrcPort() << " --> " << this->getWanIp() << ":" << port;
@ -162,7 +172,7 @@ void NATRouter::sNAT(Packet *packet)
packet->setSrcIp(this->getWanIp()); // zamieniam IP lokalne na WAN'owe
packet->setSrcPort(port); // zamieniam port lokalny na WAN'owy - z tablicy NAT
this->print(ss.str());
this->print(ss.str(), true);
this->delay();
this->send(*packet, true); // wysylam dalej
natItem = NULL;
@ -223,8 +233,9 @@ void NATRouter::freePorts()
Log portsLog;
string name = "NAT";
portsLog.setLogParams(10, BLUE, "\t\t");
portsLog.setLogParams(3, GREEN, "\t\t");
portsLog.setObjectName(&name);
portsLog.setDelay(100000);
while(true)
{
@ -238,9 +249,10 @@ void NATRouter::freePorts()
if (ports < peak)
peak = ports;
ss << "Free:\t" << ports << " (" << peak << ")\t\tReserved:\t" << (NAT_TABLE_LEN-ports-1); // poprawka na nieuzywany port 0
ss << "Free/Reserved:\t" << ports << " (" << peak << ")/" << (NAT_TABLE_LEN-ports-1); // poprawka na nieuzywany port 0
portsLog.print(ss.str());
portsLog.printProgressBar(4, 4, "Utilization", (float)(NAT_TABLE_LEN-ports-1)/(NAT_TABLE_LEN-1));
portsLog.delay();
}

+ 1
- 0
NATRouter.h View File

@ -18,6 +18,7 @@ class NATRouter : public Node
NetConf netWanConf; // konfiguracja sieciowa na zewnątrz
void initalizeNatTable();
int getFreePort();
int lastUsedPort = 0;
int getAllocatedPort(string srcIp, int srcPort);
void sNAT(Packet *packet);
void dNAT(Packet *packet);

+ 22
- 20
Simulation.cpp View File

@ -155,6 +155,7 @@ void Simulation::timer()
char str[10];
int h,m, s;
unsigned long timeElapsed;
pthread_mutex_t *mutex;
#endif
while(true)
{
@ -164,10 +165,12 @@ void Simulation::timer()
h = timeElapsed / 3600;
m = (timeElapsed % 3600) / 60;
s = (timeElapsed % 3600) % 60;
//refresh();
mutex = Log::getMutex();
pthread_mutex_lock(mutex);
sprintf(str, "%02d:%02d:%02d", h, m, s);
move(0, this->cols-strlen(str));
printw(str);
pthread_mutex_unlock(mutex);
#endif
usleep(100000); // 100 ms
//sleep(1);
@ -242,16 +245,21 @@ void Simulation::p2pSimulation()
sleep(3);
this->createThread("p1", NODE_RECV, &seed);
this->createThread("p2", NODE_RECV, &peer);
this->createThread("nat", NAT_FP, &r1);
while(true);
}
void Simulation::natOverflowSimulation(int nNodes)
{
int i = 0, srcPort;
int i = 0;//, srcPort;
stringstream ss;
this->print("Creating server");
Node server("Server", "93.92.91.90", "255.255.255.255");
server.setLogParams(0, BLUE, "\t\t");
server.print("IP 93.92.91.90/32");
sleep(1);
this->print("Creating NAT device");
NATRouter router("Router", "10.13.12.254", "255.255.255.0");
router.setLogParams(1, YELLOW, "\t\t");
@ -265,19 +273,13 @@ void Simulation::natOverflowSimulation(int nNodes)
router.print("WAN IP 80.55.33.12/32", true);
sleep(1);
this->print("Creating server");
Node server("Server", "93.92.91.90", "255.255.255.255");
server.setLogParams(2, BLUE, "\t\t");
server.print("IP 93.92.91.90/32");
sleep(1);
this->print("Creating and setting clients");
Node *client = new Node[nNodes];
int *currentSrcPort = new int[nNodes];
for (i = 0; i < nNodes; ++i)
{
currentSrcPort[i] = 0;
client[i].setLogParams(0, CYAN, "\t");
currentSrcPort[i] = 1;
client[i].setLogParams(2, CYAN, "\t");
ss.str("");
ss << "Client " << (i + 1);
client[i].setHostname(ss.str());
@ -315,18 +317,18 @@ void Simulation::natOverflowSimulation(int nNodes)
p.setDstIp("93.92.91.90");
p.setDstPort(80);
i=0;
struct timespec ts, ts2;
ts.tv_sec = 0;
ts.tv_nsec = 100;
while(true)
{
if (i==65535)
i=1;
p.setSrcPort(i++);
client[0].send(p);
//this->delay(10);
i = (nNodes>1) ? rand()%nNodes : 0;
if (currentSrcPort[i] == 65535)
currentSrcPort[i] = 1;
p.setSrcPort(currentSrcPort[i]++);
client[i].send(p);
this->delay(150);
//usleep(1);
nanosleep(&ts, &ts2);
}
}

Loading…
Cancel
Save