Download this file

DomainTable.cc    100 lines (79 with data), 2.6 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <DomainTable/DomainTable.h>
#include <Utils.h>
#include <sstream>
namespace DomainTable {
Register_Class(DomainTable);
using namespace std;
// Lookup function, return a list of RMTPorts to forward a PDU/Address+qos.
vector<RMTPort * > DomainTable::lookup(const PDU * pdu){
return lookup(pdu->getDstAddr(), pdu->getConnId().getQoSId());
}
vector<RMTPort * > DomainTable::lookup(const Address &dst, const unsigned short &qos){
vector<RMTPort* > ret;
pAddr pa = parseAddr(dst.getIpcAddress().getName());
if(table[pa.domain].entries.find(pa.addr) != table[pa.domain].entries.end()){
ret.push_back(table[pa.domain].entries[pa.addr]);
return ret;
}
return ret;
}
// Returns a representation of the Forwarding Knowledge
string DomainTable::toString(){
std::ostringstream os;
os << this->getName()<<endl;
for(FWDTableIt tIt = table.begin(); tIt != table.end(); tIt++){
os << "\t Domain : \"" <<tIt->first<<"\""<<endl;
for(s2PortIt qIt = tIt->second.entries.begin();
qIt != tIt->second.entries.end();
qIt++){
os << "\t\t->(" << qIt->first << " , "<<qIt->second->getFullPath()<<")" <<endl;
}
}
return os.str();
}
//Insert/Remove a domain
void DomainTable::addDomain(const string &domain){
domains.push_back(domain);
if(domain == ""){
table[""].len = 0;
} else {
table[domain].len = split(domain, '.').size();
}
}
void DomainTable::removeDomain(const string &domain){
for(sListIt it = domains.begin(); it!= domains.end(); it++){
if(*it == domain){
domains.erase(it);
break;
}
}
domains.push_back(domain);
table.erase(domain);
}
//Insert/Remove an entry
void DomainTable::insert(const string &domain, const string &addr, RMTPort * port){
table[domain].entries[addr] = port;
}
void DomainTable::remove(const string &domain, const string &addr){
table[domain].entries.erase(addr);
}
pAddr DomainTable::parseAddr(const string &addr){
for(sListIt it = domains.begin(); it!= domains.end(); it++){
if(isPrefix(*it, addr)){
unsigned short len = table[*it].len;
vector<string> sep = split(addr, '.');
if(sep.size() <= len) {
return pAddr(*it, "");
} else {
return pAddr(*it, sep[len]);
}
}
}
return pAddr("", addr);
}
// Called after initialize
void DomainTable::onPolicyInit(){}
void DomainTable::finish(){
EV << toString() <<endl;
}
}