33 pAddr parsedA = parseAddr(dst);
35 domNeighbours[parsedA.
domId][parsedA.
addr].insert(port);
37 if(domNeighbours[parsedA.
domId][parsedA.
addr].size() == 1){
38 rt->insertFlow(addr, parsedA.
addr, parsedA.
domId, 1);
41 fwd->setTmp(addr, port);
46 pAddr parsedA = parseAddr(dst);
48 domNeighbours[parsedA.
domId][parsedA.
addr].insert(port);
50 if(domNeighbours[parsedA.
domId][parsedA.
addr].size() <= 0){
51 rt->removeFlow(addr, parsedA.
addr, parsedA.
domId);
52 domNeighbours[parsedA.
domId].erase(dst);
55 fwd->removeTmp(addr, port);
60 map<string, map<string, nhLMetric<mType> > > changes = rt->getChanges();
62 for(
const auto & domain : changes){
63 for(
const auto & entry : domain.second){
64 vector< RMTPort * > ps;
65 for(
string nextHop : entry.second.nh){
68 auto n = domNeighbours[domain.first].find(nextHop);
69 if(n != domNeighbours[domain.first].end()){
70 if(!n->second.empty()) {
71 p = *(n->second.begin());
79 if(entry.first ==
"*") {
80 for(
auto domain : domains){
81 fwd->addReplace(domain,
"*", ps);
86 fwd->addReplace(domain.first, entry.first, ps);
96 rt = getRINAModule<tDomain::TDomainRouting<mType> *>(
this, 2, {
MOD_POL_ROUTING});
98 myAddr = getModuleByPath(
"^.^")->par(
"ipcAddress").stringValue();
99 parsStr =
split(myAddr,
'.');
101 string alg = par(
"alg").stdstringValue();
105 for(
string tAddr : parsStr){
106 string domId = to_string(k);
109 pref =
join(parsStr, k,
'.');
112 fwd->addDomain(domId,pref);
113 rt->addDomain(domId, tAddr, 32, algT);
114 domains.push_back(domId);
119 string domId = to_string(k);
120 string pref =
join(parsStr, k,
'.');
122 fwd->addDomain(domId,pref);
123 rt->addDomain(domId,
"*", 32, algT);
130 vector<string> sep =
split(addr,
'.');
132 for(; i < (int)parsStr.size() && i < (int)sep.size(); i++){
133 if(parsStr[i] != sep[i]) {
134 return pAddr(to_string(i), sep[i]);
137 if(i < (
int)sep.size()) {
138 return pAddr(to_string(i), sep[i]);
140 return pAddr(to_string(i),
"*");
const char * MOD_POL_ROUTING
const char * MOD_DIFALLOC
const APN & getIpcAddress() const
Getter of IPC Process address which should be unambiguous within DIF.
std::vector< std::string > & split(const std::string &s, char delim, std::vector< std::string > &elems)
std::string join(const std::vector< std::string > &elems, const unsigned int n, const char delim)
virtual void insertedFlow(const Address &addr, const QoSCube &qos, RMTPort *port)
const char * MOD_RELAYANDMUX
virtual void onPolicyInit()
Class representing QoSCube with all its properties that is primarily used by FA, RMT and RA Specifica...
virtual void removedFlow(const Address &addr, const QoSCube &qos, RMTPort *port)
pAddr parseAddr(const string &addr)
const std::string & getName() const
Gets APN string name representation.
virtual void routingUpdated()
const char * MOD_POL_RMT_PDUFWD
Address class holds IPC Process identification.
Register_Class(HierarchicalGenerator)