forest-net
an overlay networks for large-scale virtual worlds
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator
ComtreeTableFeng.h
1 
9 #ifndef COMTREETABLE_H
10 #define COMTREETABLE_H
11 
12 #include <set>
13 #include <vector>
14 #include "Forest.h"
15 #include "IdMap.h"
16 #include "LinkTable.h"
17 
18 namespace forest {
19 
20 typedef int pktx;
21 
22 
35 class ComtreeTable {
36 public:
37  ComtreeTable(int,int,LinkTable*);
38  ~ComtreeTable();
39 
40  // predicates
41  bool validComtree(comt_t) const;
42  bool validComtIndex(int) const;
43  bool validComtLink(int) const;
44  bool checkEntry(int) const;
45  bool inCore(int) const;
46  bool isLink(int, int) const;
47  bool isRtrLink(int, int) const;
48  bool isRtrLink(int) const;
49  bool isCoreLink(int, int) const;
50  bool isCoreLink(int) const;
51  //feng
52  bool isLocked(int) const;
53  // iteration methods
54  int firstComtIndex() const;
55  int nextComtIndex(int) const;
56 
57  // access routines
58  int getComtIndex(comt_t) const;
59  comt_t getComtree(int) const;
60  int getLink(int) const;
61  int getPlink(int) const;
62  int getLinkCount(int) const;
63  int getComtLink(int, int) const;
64  int getPCLink(int) const;
65  int getLinkQ(int) const;
66  fAdr_t getDest(int) const;
67  pktx getPrunePkt(int) const;
68  //feng
69  RateSpec& getUpperBoundRates(int) const;
70  RateSpec& getRates(int) const;
71  set<int>& getLinks(int) const;
72  set<int>& getRtrLinks(int) const;
73  set<int>& getCoreLinks(int) const;
74  set<int>& getRteSet(int) const;
75  //feng
76  vector<pktx>& getPktNums(int) const;
77 
78  // add/remove/modify table entries
79  int addEntry(comt_t);
80  bool removeEntry(int);
81  bool addLink(int, int, bool, bool);
82  bool removeLink(int, int);
83  void setCoreFlag(int, bool);
84  void setPlink(int, int);
85  void setLock(int, int);
86  void setPrunePkt(int, pktx);
87  void addRequest(int, pktx);
88  void removeRequest(int, pktx);
89  void setUpperBoundRates(int, RateSpec&);
90  void setLinkQ(int, int);
91  void registerRte(int,int);
92  void deregisterRte(int,int);
93  //feng
94  void cleanPktNums(int);
95 
96  // input/output of table contents
97  bool read(istream&);
98  string& toString(string&) const;
99  string& entry2string(int, string&) const;
100 private:
101  int maxCtx;
103  struct TblEntry {
104  int comt;
105  int plnk;
106  int lock;
107  pktx ppkt;
108  int pCLnk;
109  bool cFlag;
110  //feng
112  set<int> *comtLinks;
113  set<int> *rtrLinks;
114  set<int> *coreLinks;
115  //feng
116  vector<pktx> *pktNums;
117  };
118  TblEntry *tbl;
119  IdMap *comtMap;
120 
121  struct ComtLinkInfo {
122  int ctx;
123  int lnk;
125  int qnum;
127  set<int> *rteSet;
128  };
130  IdMap *clMap;
131 
132  LinkTable *lt;
133 
135  uint64_t key(comt_t) const;
136  uint64_t key(comt_t, int) const;
137  bool readEntry(istream&);
138  void readLinks(istream&, set<int>&);
139  string& links2string(int, string&) const;
140 };
141 
146 inline bool ComtreeTable::validComtree(comt_t comt) const {
147  return comtMap->validKey(key(comt));
148 }
149 
154 inline bool ComtreeTable::validComtIndex(int ctx) const {
155  return comtMap->validId(ctx);
156 }
157 
163 inline bool ComtreeTable::validComtLink(int cLnk) const {
164  return clMap->validId(cLnk);
165 }
166 
171 inline bool ComtreeTable::inCore(int ctx) const { return tbl[ctx].cFlag; }
172 
178 inline bool ComtreeTable::isLink(int ctx, int lnk) const {
179  if (!validComtIndex(ctx)) return false;
180  return clMap->validKey(key(tbl[ctx].comt,lnk));
181 }
182 
188 inline bool ComtreeTable::isRtrLink(int ctx, int lnk) const {
189  if (!validComtIndex(ctx)) return false;
190  return isRtrLink(clMap->getId(key(tbl[ctx].comt,lnk)));
191 }
192 
197 inline bool ComtreeTable::isRtrLink(int cLnk) const {
198  if (cLnk == 0) return false;
199  set<int>& rl = *tbl[clTbl[cLnk].ctx].rtrLinks;
200  return (rl.find(cLnk) != rl.end());
201 }
202 
208 inline bool ComtreeTable::isCoreLink(int ctx, int lnk) const {
209  if (!validComtIndex(ctx)) return false;
210  return isCoreLink(clMap->getId(key(tbl[ctx].comt,lnk)));
211 }
212 
217 inline bool ComtreeTable::isCoreLink(int cLnk) const {
218  if (cLnk == 0) return false;
219  set<int>& cl = *tbl[clTbl[cLnk].ctx].coreLinks;
220  return (cl.find(cLnk) != cl.end());
221 }
222 
227 inline bool ComtreeTable::isLocked(int ctx) const {
228  if (!validComtIndex(ctx)) return false;
229  return (tbl[ctx].lock == 1);
230 }
231 
232 inline pktx ComtreeTable::getPrunePkt(int ctx) const {
233  if (!validComtIndex(ctx)) return 0;
234  return tbl[ctx].ppkt;
235 }
242 inline int ComtreeTable::firstComtIndex() const {
243  return comtMap->firstId();
244 }
245 
253 inline int ComtreeTable::nextComtIndex(int ctx) const {
254  return comtMap->nextId(ctx);
255 }
256 
261 inline comt_t ComtreeTable::getComtree(int ctx) const {
262  return tbl[ctx].comt;
263 }
264 
269 inline int ComtreeTable::getComtIndex(comt_t comt) const {
270  return comtMap->getId(key(comt));
271 }
272 
277 inline int ComtreeTable::getLinkCount(int ctx) const {
278  return tbl[ctx].comtLinks->size();
279 }
280 
287 inline int ComtreeTable::getComtLink(int comt, int lnk) const {
288  int cLnk = clMap->getId(key(comt,lnk));
289  return cLnk;
290 }
291 
297 inline int ComtreeTable::getPlink(int ctx) const { return tbl[ctx].plnk; }
298 
305 inline int ComtreeTable::getPCLink(int ctx) const { return tbl[ctx].pCLnk; }
306 
307 //feng
313  return tbl[ctx].upperBoundRates;
314 }
315 
320 inline int ComtreeTable::getLink(int cLnk) const {
321  return (cLnk != 0 ? clTbl[cLnk].lnk : 0);
322 }
323 
328 inline int ComtreeTable::getLinkQ(int cLnk) const {
329  return clTbl[cLnk].qnum;
330 }
331 
337 inline fAdr_t ComtreeTable::getDest(int cLnk) const {
338  return clTbl[cLnk].dest;
339 }
340 
345 inline RateSpec& ComtreeTable::getRates(int cLnk) const {
346  return clTbl[cLnk].rates;
347 }
348 
357 inline set<int>& ComtreeTable::getLinks(int ctx) const {
358  return *(tbl[ctx].comtLinks);
359 }
360 
369 inline set<int>& ComtreeTable::getRtrLinks(int ctx) const {
370  return *(tbl[ctx].rtrLinks);
371 }
372 
381 inline set<int>& ComtreeTable::getCoreLinks(int ctx) const {
382  return *(tbl[ctx].coreLinks);
383 }
384 
393 inline vector<pktx>& ComtreeTable::getPktNums(int ctx) const {
394  return *(tbl[ctx].pktNums);
395 }
396 
397 inline void ComtreeTable::cleanPktNums(int ctx) {
398  tbl[ctx].pktNums->clear();
399 }
400 
409 inline set<int>& ComtreeTable::getRteSet(int cLnk) const {
410  return *(clTbl[cLnk].rteSet);
411 }
412 
418 inline void ComtreeTable::setPlink(int ctx, int plink) {
419  if (!validComtIndex(ctx)) return;
420  if (plink == 0) {
421  tbl[ctx].plnk = 0; tbl[ctx].pCLnk = 0;
422  return;
423  }
424  int cLnk = clMap->getId(key(tbl[ctx].comt,plink));
425  if (!validComtLink(cLnk)) return;
426  if (!isRtrLink(ctx,plink)) return;
427  tbl[ctx].plnk = plink; tbl[ctx].pCLnk =cLnk;
428 }
429 
430 inline void ComtreeTable::setUpperBoundRates(int ctx, RateSpec& rs) {
431  if (validComtIndex(ctx)) tbl[ctx].upperBoundRates = rs;
432 }
433 
434 //feng
439 inline void ComtreeTable::setLock(int ctx, int lock) {
440  if (!validComtIndex(ctx)) return;
441  if (tbl[ctx].lock != lock) {
442  tbl[ctx].lock = lock;
443  return;
444  }
445 }
446 
450 inline void ComtreeTable::setPrunePkt(int ctx, pktx ppkt) {
451  if (validComtIndex(ctx)) tbl[ctx].ppkt = ppkt;
452 }
453 
458 inline void ComtreeTable::setCoreFlag(int ctx, bool f) {
459  if (validComtIndex(ctx)) tbl[ctx].cFlag = f;
460 }
461 
466 inline void ComtreeTable::setLinkQ(int cLnk, int q) {
467  if (validComtLink(cLnk)) clTbl[cLnk].qnum = q;
468 }
469 
498 inline void ComtreeTable::registerRte(int cLnk, int rtx) {
499  if (validComtLink(cLnk)) clTbl[cLnk].rteSet->insert(rtx);
500 }
501 
506 inline void ComtreeTable::deregisterRte(int cLnk, int rtx) {
507  if (validComtLink(cLnk)) clTbl[cLnk].rteSet->erase(rtx);
508 }
509 
514 inline void ComtreeTable::addRequest(int ctx, pktx px) {
515  if (validComtIndex(ctx)) {
516  vector<pktx>::iterator pn;
517  for (pn = tbl[ctx].pktNums->begin(); pn != tbl[ctx].pktNums->end(); pn++) {
518  pktx curpx = *pn;
519  if (curpx == px)
520  return;
521  }
522  tbl[ctx].pktNums->push_back(px);
523  }
524 }
525 
530 inline void ComtreeTable::removeRequest(int ctx, pktx px) {
531  //return;
532  //if (validComtIndex(ctx)) tbl[ctx].pktNums->erase(px);
533 }
534 
547 inline uint64_t ComtreeTable::key(comt_t comt) const {
548  return (uint64_t(comt) << 32) | comt;
549 }
550 
556 inline uint64_t ComtreeTable::key(comt_t comt, int lnk) const {
557  return (uint64_t(comt) << 32) | lnk;
558 }
559 
560 } // ends namespace
561 
562 
563 #endif