www.pudn.com > PIPMasq.zip > tablemgr.cpp
#include "stdafx.h" #include "PIPMasq.h" #includebool rev_inet_addr(__u32 netByteIPAddr32, char *dotIP); ////////////////////////// TableMgr ///////////////////////////////// TableMgr::TableMgr( PortMgr* portMgr ) { m_portMgr = portMgr; top_of_TableEntry = (TableEntry *)malloc(sizeof(TableEntry)); end_of_TableEntry = (TableEntry *)malloc(sizeof(TableEntry)); top_of_TableEntry->p_before = NULL; top_of_TableEntry->p_after = end_of_TableEntry; end_of_TableEntry->p_before = top_of_TableEntry; end_of_TableEntry->p_after = NULL; tableLock = CreateMutex(0, FALSE, "tableLock"); } TableMgr::~TableMgr() { TableEntry *entry; if (top_of_TableEntry != NULL) { while(end_of_TableEntry->p_before != top_of_TableEntry) { entry = end_of_TableEntry; end_of_TableEntry = entry->p_before; free((void *)entry); } free((void *)end_of_TableEntry); free((void *)top_of_TableEntry); top_of_TableEntry = NULL; } CloseHandle(tableLock); printf(".....TableMgr is destructed.\n"); // Sleep(1000); } RefLevel TableMgr::refEntry( __u8 Protocol, // TCP or UDP __u16 srcPort, // Source Port __u32 srcIPAddr, // Source IP Address __u16 destPort, // Destination Port __u32 destIPAddr, // Destination IP Address TableEntry* *tableEntry ) { WaitForSingleObject(tableLock, INFINITE); TableEntry *entry = top_of_TableEntry->p_after; bool _flagL1 = false; TableEntry *entryL1; while(entry != end_of_TableEntry) { if ((entry->Protocol == Protocol) && (entry->destPort == destPort) && (entry->destIPAddr == destIPAddr)) { if ((entry->srcPort == srcPort) && (entry->srcIPAddr == srcIPAddr ) ) { *tableEntry = entry; ReleaseMutex(tableLock); return L2; } else { _flagL1 = true; entryL1 = entry; } } entry = entry->p_after; } ReleaseMutex(tableLock); if (_flagL1 == true) { *tableEntry = entryL1; return L1; } *tableEntry = NULL; return L0; } bool TableMgr::refEntry2( __u8 Protocol, // TCP or UDP or ICMP __u16 masqPort, // Masq Port TableEntry* *tableEntry ) { WaitForSingleObject(tableLock, INFINITE); TableEntry *entry = top_of_TableEntry->p_after; while(entry != end_of_TableEntry) { if ((entry->Protocol == Protocol) && (entry->masqPort == masqPort)) { *tableEntry = entry; ReleaseMutex(tableLock); return true; } entry = entry->p_after; } ReleaseMutex(tableLock); *tableEntry = NULL; return false; } bool TableMgr::addEntry(TableEntry *tableEntry) { WaitForSingleObject(tableLock, INFINITE); TableEntry *entry = (TableEntry *)malloc(sizeof(TableEntry)); if (entry == NULL) return false; memcpy(entry, tableEntry, sizeof(TableEntry)); top_of_TableEntry->p_after->p_before = entry; entry->p_before = top_of_TableEntry; entry->p_after = top_of_TableEntry->p_after; top_of_TableEntry->p_after = entry; ReleaseMutex(tableLock); return true; } bool TableMgr::delEntry(time_t now) { WaitForSingleObject(tableLock, INFINITE); TableEntry *entry = top_of_TableEntry->p_after; while(entry != end_of_TableEntry) { TableEntry *entry_p_after; bool passFlag =false; if (entry->expireTime <= now ) { // delete the entry entry->p_before->p_after = entry->p_after; entry->p_after->p_before = entry->p_before; passFlag = true; entry_p_after = entry->p_after; // Release Port Number m_portMgr->cancelPort(entry->Protocol, ntohs(entry->masqPort)); free((void *)entry); } if (passFlag == true) entry = entry_p_after; else entry = entry->p_after; } ReleaseMutex(tableLock); return true; } void TableMgr::printOneEntry(TableEntry *entry) { static char dotIPsrcIPAddr[16]; static char dotIPdestIPAddr[16]; static char strTCP[] = "tcp"; static char strUDP[] = "udp"; static char strICMP[] = "icmp"; static char strUnknown[] = "unknown"; static char *strProtocol; rev_inet_addr(entry->srcIPAddr, dotIPsrcIPAddr); rev_inet_addr(entry->destIPAddr, dotIPdestIPAddr); switch( entry->Protocol ) { case TCP: strProtocol = strTCP; break; case UDP: strProtocol = strUDP; break; case ICMP: strProtocol = strICMP; break; default: strProtocol = strUnknown; } time_t ct = entry->expireTime; struct tm *lst = localtime(&ct); printf(" %-6s %02d:%02d:%02d %-16s %-16s %d(%d)->%d\n", strProtocol, lst->tm_hour, lst->tm_min, lst->tm_sec, dotIPsrcIPAddr, dotIPdestIPAddr, ntohs(entry->srcPort), ntohs(entry->masqPort), ntohs(entry->destPort) ); } int TableMgr::countEntry(void) { int num = 0; TableEntry *entry = top_of_TableEntry->p_after; while(entry != end_of_TableEntry) { entry = entry->p_after; num++; } return num; } bool TableMgr::sortEntry(EntryPointer* entries, int num) { if(num < 2) return true; int i, j; EntryPointer ep; for (i = 0; i < num - 1; i++) { for (j = 0; j < num - i - 1; j++) { if (entries[j]._entry->expireTime < entries[j + 1]._entry->expireTime) { ep = entries[j]; entries[j] = entries[j+1]; entries[j+1] = ep; } } } return true; } bool TableMgr::browseEntry(void) { printf("\n Pseud IP masquerading entries\n"); printf(" prot expire source destination ports\n"); printf(" ----------------------------------------------------------------------\n"); WaitForSingleObject(tableLock, INFINITE); TableEntry *entry = top_of_TableEntry->p_after; while(entry != end_of_TableEntry) { int num = countEntry(); if (num > 0) { EntryPointer *sortedEntry; sortedEntry = (EntryPointer *)malloc(sizeof(EntryPointer) * num); int i = 0; entry = top_of_TableEntry->p_after; for(i = 0; i < num; i++) { sortedEntry[i]._entry = entry; entry = entry->p_after; } sortEntry(sortedEntry, num); for(i = 0; i < num; i++) { printOneEntry(sortedEntry[i]._entry); } free (sortedEntry); } } printf("\n"); ReleaseMutex(tableLock); return true; }