forest-net
an overlay networks for large-scale virtual worlds
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator
RouterCoreFeng.h
1 
9 #ifndef ROUTERCORE_H
10 #define ROUTERCORE_H
11 
12 #include <queue>
13 #include <map>
14 
15 #include "stdinc.h"
16 #include "Forest.h"
17 
18 #include "IfaceTable.h"
19 #include "LinkTable.h"
20 #include "ComtreeTable.h"
21 #include "RouteTable.h"
22 #include "PacketStore.h"
23 #include "CtlPkt.h"
24 #include "QuManager.h"
25 #include "IoProcessor.h"
26 #include "StatsModule.h"
27 #include "PacketLog.h"
28 
29 namespace forest {
30 
32 struct RouterInfo {
33  string mode;
34 
35  fAdr_t myAdr;
36  ipa_t bootIp;
37  ipp_t portNum;
38  fAdr_t nmAdr;
39  ipa_t nmIp;
40  fAdr_t ccAdr;
43 
44  string ifTbl;
45  string lnkTbl;
46  string comtTbl;
47  string rteTbl;
48  string statSpec;
49 
50  int finTime;
51 };
52 
53 class RouterCore {
54 public:
55  RouterCore(bool, const RouterInfo&);
56  ~RouterCore();
57 
58  bool readTables(const RouterInfo&);
59  bool setup();
60  bool setBooting(bool state) { return booting = state; }
61  void run(uint64_t);
62  void dump(ostream& os);
63 private:
64  ipa_t bootIp;
65  fAdr_t myAdr;
66  ipa_t nmIp;
67  fAdr_t nmAdr;
68  fAdr_t ccAdr;
69 
70  bool booting;
71 
72  uint64_t now;
73 
74  uint64_t seqNum;
76  UiSetPair *leafAdr;
77 
79  struct ControlInfo {
80  pktx px;
81  int nSent;
82  int lnk;
83  uint64_t timestamp;
84  };
85  map<uint64_t,ControlInfo> *pending;
86  int nIfaces;
87  int nLnks;
88  int nComts;
89  int nRts;
90  int nPkts;
91  int nBufs;
92  int nQus;
93 
94  IfaceTable *ift;
95  LinkTable *lt;
96  ComtreeTable *ctt;
97  RouteTable *rt;
98  PacketStore *ps;
99  QuManager *qm;
100  IoProcessor *iop;
101  StatsModule *sm;
102  PacketLog *pktLog;
103 
105  struct nuClient {
106  uint64_t nonce;
107  time_t timestamp;
108  int iface;
109  int link;
110  };
111  list<nuClient> *pendingClients;
112 
114  // setup
115  bool setupIfaces();
116  bool setupLeafAddresses();
117  bool setupQueues();
118  bool checkTables();
119  bool setAvailRates();
120  void addLocalRoutes();
121 
123  bool allocLeafAdr(fAdr_t);
124  void freeLeafAdr(fAdr_t);
125  bool validLeafAdr(fAdr_t) const;
126  bool isFreeLeafAdr(fAdr_t) const;
127 
128  // basic forwarding
129  void forward(pktx,int);
130  bool pktCheck(pktx,int);
131  void multiSend(pktx,int,int);
132 
133  // inband control
134  void handleConnDisc(pktx);
135  void handleRteReply(pktx, int);
136  void sendRteReply(pktx,int);
137  void subUnsub(pktx,int);
138 
139  // signalling packets
140  void handleCtlPkt(pktx);
141 
142  bool addIface(CtlPkt&, CtlPkt&);
143  bool dropIface(CtlPkt&, CtlPkt&);
144  bool getIface(CtlPkt&, CtlPkt&);
145  bool modIface(CtlPkt&, CtlPkt&);
146 
147  bool addLink(CtlPkt&, CtlPkt&);
148  bool dropLink(CtlPkt&, CtlPkt&);
149  void dropLink(int,fAdr_t=0);
150  bool getLink(CtlPkt&, CtlPkt&);
151  bool getLinkSet(CtlPkt&, CtlPkt&);
152  bool getComtreeSet(CtlPkt&, CtlPkt&);
153  bool getIfaceSet(CtlPkt&, CtlPkt&);
154  bool getRouteSet(CtlPkt&, CtlPkt&);
155  bool modLink(CtlPkt&, CtlPkt&);
156 
157  bool addComtree(CtlPkt&, CtlPkt&);
158  bool dropComtree(CtlPkt&, CtlPkt&);
159  bool dropComtree(comt_t);
160  bool getComtree(CtlPkt&, CtlPkt&);
161  bool modComtree(CtlPkt&, CtlPkt&);
162  //feng
163  bool modComtree(comt_t, int, CtlPkt&);
164  bool addComtreeLink(CtlPkt&, CtlPkt&);
165  //feng
166  bool addComtreeLink(comt_t, int, CtlPkt&);
167  bool dropComtreeLink(CtlPkt&, CtlPkt&);
168  void dropComtreeLink(int, int, int);
169  bool modComtreeLink(CtlPkt&, CtlPkt&);
170  //feng
171  bool modComtreeLink(comt_t, int, RateSpec, CtlPkt&);
172  bool getComtreeLink(CtlPkt&, CtlPkt&);
173  //feng
174  void handleClientJoinComtree(pktx, CtlPkt&, CtlPkt&);
175  void handleClientLeaveComtree(pktx, CtlPkt&, CtlPkt&);
176  void handleComtPath(pktx, CtlPkt&);
177  void handleComtAddBranch(pktx, CtlPkt&, CtlPkt&);
178  void handleComtPrune(pktx, CtlPkt&, CtlPkt&);
179  void handleAllPending(vector<pktx>&, CtlPkt&);
180  void handleComtPruneReply(pktx, CtlPkt&);
181  void handleComtNewLeafReply(pktx, CtlPkt&);
182  void handleAddBranchConfirm(pktx, CtlPkt&, CtlPkt&);
183  void handleAddBranchReply(pktx, CtlPkt&);
184  void handleConfirmReply(pktx, CtlPkt&);
185 
186  bool addRoute(CtlPkt&, CtlPkt&);
187  bool dropRoute(CtlPkt&, CtlPkt&);
188  bool getRoute(CtlPkt&, CtlPkt&);
189  bool modRoute(CtlPkt&, CtlPkt&);
190 
191  bool addFilter(CtlPkt&, CtlPkt&);
192  bool dropFilter(CtlPkt&, CtlPkt&);
193  bool getFilter(CtlPkt&, CtlPkt&);
194  bool modFilter(CtlPkt&, CtlPkt&);
195  bool getFilterSet(CtlPkt&, CtlPkt&);
196  bool getLoggedPackets(CtlPkt&, CtlPkt&);
197  bool enablePacketLog(CtlPkt&, CtlPkt&);
198 
199  bool setLeafRange(CtlPkt&, CtlPkt&);
200 
201  void sendConnDisc(int,Forest::ptyp_t);
202  bool sendCpReq(CtlPkt&, fAdr_t);
203  bool sendControl(pktx,uint64_t,int);
204  void resendControl();
205  void handleControlReply(pktx);
206 
207  void returnToSender(pktx,CtlPkt&);
208 };
209 
215  int offset = leafAdr->firstOut();
216  if (offset == 0) return 0;
217  leafAdr->swap(offset);
218  return firstLeafAdr + offset - 1;
219 }
220 
226 inline bool RouterCore::allocLeafAdr(fAdr_t adr) {
227  int offset = (adr - firstLeafAdr) + 1;
228  if (!leafAdr->isOut(offset)) return false;
229  leafAdr->swap(offset);
230  return true;
231 }
232 
236 inline void RouterCore::freeLeafAdr(fAdr_t adr) {
237  int offset = (adr - firstLeafAdr) + 1;
238  if (!leafAdr->isIn(offset)) return;
239  leafAdr->swap(offset);
240  return;
241 }
242 
247 inline bool RouterCore::validLeafAdr(fAdr_t adr) const {
248  int offset = (adr - firstLeafAdr) + 1;
249  return leafAdr->isIn(offset);
250 }
251 
256 inline bool RouterCore::isFreeLeafAdr(fAdr_t adr) const {
257  int offset = (adr - firstLeafAdr) + 1;
258  return leafAdr->isOut(offset);
259 }
260 
261 } // ends namespace
262 
263 #endif