forest-net
an overlay networks for large-scale virtual worlds
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator
RouteTable.cpp
1 
9 #include "RouteTable.h"
10 
11 namespace forest {
12 
13 
19 RouteTable::RouteTable(int maxRtx1, fAdr_t myAdr1, ComtreeTable* ctt1)
20  : maxRtx(maxRtx1), myAdr(myAdr1), ctt(ctt1) {
21  tbl = new RouteEntry[maxRtx+1];
22  rteMap = new IdMap(maxRtx);
23 };
24 
26 RouteTable::~RouteTable() { delete [] tbl; delete rteMap; }
27 
36 int RouteTable::addEntry(comt_t comt, fAdr_t adr, int cLnk) {
37  if (!ctt->validComtLink(cLnk)) return 0;
38  int rtx = rteMap->addPair(key(comt,adr));
39  if (rtx == 0) return 0;
40  tbl[rtx].ct = comt;
41  if (Forest::mcastAdr(adr)) {
42  tbl[rtx].adr = adr;
43  tbl[rtx].links = new set<int>();
44  if (cLnk != 0) {
45  tbl[rtx].links->insert(cLnk);
46  ctt->registerRte(cLnk,rtx);
47  }
48  } else {
49  int zip = Forest::zipCode(adr);
50  tbl[rtx].adr = (zip == Forest::zipCode(myAdr) ?
51  adr : Forest::forestAdr(zip,0));
52  tbl[rtx].lnk = cLnk;
53  }
54  return rtx;
55 }
56 
60 void RouteTable::removeEntry(int rtx) {
61  if (!validRteIndex(rtx)) return;
62  if (Forest::mcastAdr(tbl[rtx].adr)) {
63  set<int>& links = *(tbl[rtx].links);
64  set<int>::iterator lp;
65  for (lp = links.begin(); lp != links.end(); lp++)
66  ctt->deregisterRte(*lp,rtx);
67  delete tbl[rtx].links;
68  }
69  rteMap->dropPair(key(tbl[rtx].ct,tbl[rtx].adr));
70 }
71 
75 void RouteTable::purgeRoutes(comt_t comt) {
76  int ctx = ctt->getComtIndex(comt);
77  set<int>& links = ctt->getLinks(ctx);
78  set<int>::iterator lp;
79  for (lp = links.begin(); lp != links.end(); lp++) {
80  int cLnk = *lp;
81  set<int>& routes = ctt->getRteSet(cLnk);
82  set<int>::iterator rp;
83  int *rvec = new int[routes.size()]; int i = 0;
84  for (rp = routes.begin(); rp != routes.end(); rp++)
85  rvec[i++] = *rp;
86  while (--i >= 0) removeEntry(rvec[i]);
87  delete [] rvec;
88  }
89 }
90 
101 bool RouteTable::readEntry(istream& in) {
102  int comt, lnk; fAdr_t adr;
103  Misc::skipBlank(in);
104  if (!Misc::readNum(in, comt) || !Forest::readForestAdr(in,adr))
105  return false;
106  int rtx = addEntry(comt,adr,0);
107  if (rtx == 0) return false;
108  if (Forest::mcastAdr(adr)) {
109  do {
110  if (!Misc::readNum(in,lnk)) {
111  removeEntry(rtx); return false;
112  }
113  int cLnk = ctt->getComtLink(comt,lnk);
114  if (cLnk == 0) return false;
115  addLink(rtx,cLnk);
116  } while (Misc::verify(in,','));
117  } else {
118  if (!Misc::readNum(in,lnk)) {
119  removeEntry(rtx); return false;
120  }
121  Misc::cflush(in,'\n');
122  int cLnk = ctt->getComtLink(comt,lnk);
123  if (cLnk == 0) return false;
124  setLink(rtx,cLnk);
125  }
126  Misc::cflush(in,'\n');
127  return true;
128 }
129 
135 bool RouteTable::read(istream& in) {
136  int num;
137  Misc::skipBlank(in);
138  if (!Misc::readNum(in,num)) return false;
139  Misc::cflush(in,'\n');
140  for (int i = 1; i <= num; i++) {
141  if (!readEntry(in)) {
142  cerr << "Error in route table entry # " << i << endl;
143  return false;
144  }
145  }
146  return true;
147 }
148 
154 string& RouteTable::entry2string(int rtx, string& s) const {
155  stringstream ss;
156  ss << getComtree(rtx) << " ";
157  fAdr_t adr = getAddress(rtx);
158  if (Forest::mcastAdr(adr)) {
159  ss << Forest::fAdr2string(adr,s) << " ";
160  if (noLinks(rtx)) { ss << "-\n"; s = ss.str(); return s; }
161  bool first = true;
162  set<int>& subLinks = getSubLinks(rtx);
163  set<int>::iterator p;
164  for (p = subLinks.begin(); p != subLinks.end(); p++) {
165  if (first) first = false;
166  else ss << ",";
167  ss << ctt->getLink(*p);
168  }
169  } else
170  ss << Forest::fAdr2string(adr,s) << " "
171  << ctt->getLink(getLink(rtx));
172  ss << endl;
173  s = ss.str();
174  return s;
175 }
176 
181 string& RouteTable::toString(string& s) const {
182  stringstream ss;
183  ss << rteMap->size() << endl;
184  for (int rtx = firstRteIndex(); rtx != 0; rtx = nextRteIndex(rtx))
185  ss << entry2string(rtx,s);
186  s = ss.str();
187  return s;
188 }
189 
190 } // ends namespace
191