/**
|
|
* @file NATRouter.h
|
|
*
|
|
* Created on: 11-01-2017
|
|
* @author Piotr Dergun
|
|
*/
|
|
|
|
#ifndef NATROUTER_H_
|
|
#define NATROUTER_H_
|
|
|
|
#include "common.h"
|
|
#include "Node.h"
|
|
#include "NATItem.h"
|
|
|
|
class NATRouter : public Node
|
|
{
|
|
/** tablica z zaalokowanymi portami na zewnątrz (indeksy to numery portów po stronie WAN) */
|
|
NATItem *natTable = NULL;
|
|
/**
|
|
* mapa do numerów portów, które wykorzystuje dana para zza NAT (IP, port)
|
|
* potrzebne do szybkiego przeszukiwania zaalokowanego portu w NAT
|
|
*/
|
|
map<string, int> natHelper;
|
|
/** konfiguracja interfejsu WAN routera */
|
|
NetConf netWanConf;
|
|
/** zachowuje ostatnio zaalokowany numer portu, aby zaalokować kolejny (o ile możliwe) */
|
|
int lastUsedPort;
|
|
/**
|
|
* inicjalizuje tablicę NAT
|
|
*/
|
|
void initalizeNatTable();
|
|
/**
|
|
* zwraca pierwszy wolny numer portu w tablicy NAT
|
|
*/
|
|
int getFreePort();
|
|
/**
|
|
* szuka aktywnego zaalokowanego portu (aktywna
|
|
* transmisja) w tablicy NAT dla pary (srcIp:srcPort)
|
|
*/
|
|
int getAllocatedPort(string srcIp, int srcPort);
|
|
/**
|
|
* zapisuje w tablicy NAT numer portu źródłowego komputera z LAN oraz jego IP
|
|
* i przekształca pakiet, zmieniając zródłowy IP na IP zewnętrzny routera
|
|
* oraz wolny port z tablicy NAT. Jeżeli portu nie ma to funkcja czeka, aż sie zwolni
|
|
* @param packet wskaźnik do przetwarzanego pakietu
|
|
*/
|
|
void sNAT(Packet *packet);
|
|
/**
|
|
* ma za zadanie znaleźć w tablicy NAT port i adres IP węzła na który ma wrócić
|
|
* odpowiedź z sieci Internet (z zewnątrz), a także przedlużyć czas życia tego portu
|
|
* @param packet wskaźnik do przetwarzanego pakietu
|
|
*/
|
|
void dNAT(Packet *packet);
|
|
/**
|
|
* przelicza adres sieci dla połączenia WAN
|
|
*/
|
|
void setWanNetwork();
|
|
|
|
public:
|
|
NATRouter();
|
|
NATRouter(string hostname);
|
|
NATRouter(string hostname, string ip, string mask);
|
|
NATRouter(string hostname, string ip, string mask, string gatewayIp);
|
|
~NATRouter();
|
|
/**
|
|
* obsługuje całą logikę routera/NAT/switcha w momencie nadejścia pakietu
|
|
*/
|
|
virtual void onRecv();
|
|
/**
|
|
* wyświetla statystyki zajętości tablicy NAT
|
|
*/
|
|
void freePorts();
|
|
|
|
/* mutuatory */
|
|
void setWanIp(string wanIp);
|
|
void setWanMask(string wanMask);
|
|
void setWanGatewayIp(string wanGatewayIp);
|
|
string getWanIp();
|
|
string getWanMask();
|
|
string getWanNetwork();
|
|
string getWanGatewayIp();
|
|
};
|
|
|
|
#define NAT_TABLE_LEN 65536
|
|
|
|
#endif /* NATROUTER_H_ */
|