00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00030
00031 #ifndef __OLSR_h__
00032 #define __OLSR_h__
00033
00034 #include <olsr/OLSR_pkt.h>
00035 #include <olsr/OLSR_state.h>
00036 #include <olsr/OLSR_rtable.h>
00037 #include <olsr/OLSR_repositories.h>
00038 #include <olsr/cdswl.h>
00039 #include <trace.h>
00040 #include <classifier-port.h>
00041 #include <agent.h>
00042 #include <packet.h>
00043 #include <timer-handler.h>
00044 #include <random.h>
00045 #include <vector>
00046
00047
00048
00050 #ifndef MAX
00051 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
00052 #endif
00053
00055 #ifndef MIN
00056 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
00057 #endif
00058
00060 #ifndef NULL
00061 #define NULL 0
00062 #endif
00063
00065 #define CURRENT_TIME Scheduler::instance().clock()
00066
00073 #define DELAY(time) (((time) < (CURRENT_TIME)) ? (0.000001) : \
00074 (time - CURRENT_TIME + 0.000001))
00075
00077 #define OLSR_C 0.0625
00078
00079
00080
00081
00083 #define OLSR_HELLO_INTERVAL 2
00084
00086 #define OLSR_TC_INTERVAL 5
00087
00089 #define OLSR_MID_INTERVAL OLSR_TC_INTERVAL
00090
00096 #define OLSR_REFRESH_INTERVAL 2
00097
00098
00099
00100
00102 #define OLSR_NEIGHB_HOLD_TIME 3*OLSR_REFRESH_INTERVAL
00103
00104 #define OLSR_TOP_HOLD_TIME 3*OLSR_TC_INTERVAL
00105
00106 #define OLSR_DUP_HOLD_TIME 30
00107
00108 #define OLSR_MID_HOLD_TIME 3*OLSR_MID_INTERVAL
00109
00110
00111
00112
00114 #define OLSR_UNSPEC_LINK 0
00115
00116 #define OLSR_ASYM_LINK 1
00117
00118 #define OLSR_SYM_LINK 2
00119
00120 #define OLSR_LOST_LINK 3
00121
00122
00123
00125 #define OLSR_NOT_NEIGH 0
00126
00127 #define OLSR_SYM_NEIGH 1
00128
00129 #define OLSR_MPR_NEIGH 2
00130
00131
00132
00133
00135 #define OLSR_WILL_NEVER 0
00136
00137 #define OLSR_WILL_LOW 1
00138
00139 #define OLSR_WILL_DEFAULT 3
00140
00141 #define OLSR_WILL_HIGH 6
00142
00143 #define OLSR_WILL_ALWAYS 7
00144
00145
00146
00147
00149 #define OLSR_MAXJITTER OLSR_HELLO_INTERVAL/4
00150
00151 #define OLSR_MAX_SEQ_NUM 65535
00152
00153 #define OLSR_STATUS_NOT_SYM 0
00154
00155 #define OLSR_STATUS_SYM 1
00156
00157 #define JITTER (Random::uniform()*OLSR_MAXJITTER)
00158
00159
00160
00161 #define CDSWL_STATUS_INIT 0
00162 #define CDSWL_STATUS_HELLO 1
00163 #define CDSWL_STATUS_NVEX 2
00164 #define CDSWL_STATUS_INITDECL 3
00165 #define CDSWL_STATUS_RESGDECL 4
00166 #define CDSWL_STATUS_DOMDECL 5
00167
00168 #define CDSWL_HELLO_INTERVAL 6
00169 #define CDSWL_PHASE_INTERVAL 1
00170 #define CDSWL_HELLO_JITTER (Random::uniform()*CDSWL_PHASE_INTERVAL/4)
00171 #define CDSWL_PHASE_JITTER (Random::uniform()*CDSWL_PHASE_INTERVAL/4)
00172
00173 class OLSR;
00174
00175
00176
00177
00178
00180 class OLSR_MsgTimer : public TimerHandler {
00181 public:
00182 OLSR_MsgTimer(OLSR* agent) : TimerHandler() {
00183 agent_ = agent;
00184 }
00185 protected:
00186 OLSR* agent_;
00187 virtual void expire(Event* e);
00188 };
00189
00191 class OLSR_HelloTimer : public TimerHandler {
00192 public:
00193 OLSR_HelloTimer(OLSR* agent) : TimerHandler() { agent_ = agent; }
00194 protected:
00195 OLSR* agent_;
00196 virtual void expire(Event* e);
00197 };
00198
00199
00201 class OLSR_TcTimer : public TimerHandler {
00202 public:
00203 OLSR_TcTimer(OLSR* agent) : TimerHandler() { agent_ = agent; }
00204 protected:
00205 OLSR* agent_;
00206 virtual void expire(Event* e);
00207 };
00208
00209
00211 class OLSR_MidTimer : public TimerHandler {
00212 public:
00213 OLSR_MidTimer(OLSR* agent) : TimerHandler() { agent_ = agent; }
00214 protected:
00215 OLSR* agent_;
00216 virtual void expire(Event* e);
00217 };
00218
00219
00220
00221 class CDSWL_PktTimer : public TimerHandler {
00222 public:
00223 CDSWL_PktTimer(OLSR* agent) : TimerHandler() {
00224 agent_ = agent;
00225 }
00226 protected:
00227 OLSR* agent_;
00228 virtual void expire(Event* e);
00229 };
00230
00231
00233 class OLSR_DupTupleTimer : public TimerHandler {
00234 public:
00235 OLSR_DupTupleTimer(OLSR* agent, OLSR_dup_tuple* tuple) : TimerHandler() {
00236 agent_ = agent;
00237 tuple_ = tuple;
00238 }
00239 protected:
00240 OLSR* agent_;
00241 OLSR_dup_tuple* tuple_;
00242
00243 virtual void expire(Event* e);
00244 };
00245
00246
00248 class OLSR_LinkTupleTimer : public TimerHandler {
00256 bool first_time_;
00257 public:
00258 OLSR_LinkTupleTimer(OLSR* agent, OLSR_link_tuple* tuple) : TimerHandler() {
00259 agent_ = agent;
00260 tuple_ = tuple;
00261 first_time_ = true;
00262 }
00263 protected:
00264 OLSR* agent_;
00265 OLSR_link_tuple* tuple_;
00266
00267 virtual void expire(Event* e);
00268 };
00269
00270
00272 class OLSR_Nb2hopTupleTimer : public TimerHandler {
00273 public:
00274 OLSR_Nb2hopTupleTimer(OLSR* agent, OLSR_nb2hop_tuple* tuple) : TimerHandler() {
00275 agent_ = agent;
00276 tuple_ = tuple;
00277 }
00278 protected:
00279 OLSR* agent_;
00280 OLSR_nb2hop_tuple* tuple_;
00281
00282 virtual void expire(Event* e);
00283 };
00284
00285
00287 class OLSR_MprSelTupleTimer : public TimerHandler {
00288 public:
00289 OLSR_MprSelTupleTimer(OLSR* agent, OLSR_mprsel_tuple* tuple) : TimerHandler() {
00290 agent_ = agent;
00291 tuple_ = tuple;
00292 }
00293 protected:
00294 OLSR* agent_;
00295 OLSR_mprsel_tuple* tuple_;
00296
00297 virtual void expire(Event* e);
00298 };
00299
00300
00302 class OLSR_TopologyTupleTimer : public TimerHandler {
00303 public:
00304 OLSR_TopologyTupleTimer(OLSR* agent, OLSR_topology_tuple* tuple) : TimerHandler() {
00305 agent_ = agent;
00306 tuple_ = tuple;
00307 }
00308 protected:
00309 OLSR* agent_;
00310 OLSR_topology_tuple* tuple_;
00311
00312 virtual void expire(Event* e);
00313 };
00314
00315
00317 class OLSR_IfaceAssocTupleTimer : public TimerHandler {
00318 public:
00319 OLSR_IfaceAssocTupleTimer(OLSR* agent, OLSR_iface_assoc_tuple* tuple) : TimerHandler() {
00320 agent_ = agent;
00321 tuple_ = tuple;
00322 }
00323 protected:
00324 OLSR* agent_;
00325 OLSR_iface_assoc_tuple* tuple_;
00326
00327 virtual void expire(Event* e);
00328 };
00329
00330
00331
00332
00333 class HierMetric
00334 {
00335 public:
00336 nsaddr_t from;
00337 nsaddr_t to;
00338 int nLevels;
00339 int* cost;
00340 HierMetric(nsaddr_t f, nsaddr_t t, int l, int* c) {
00341 from = f;
00342 to = t;
00343 nLevels = l;
00344 cost = c;
00345
00346 }
00347 ~HierMetric()
00348 {
00349 delete [] cost;
00350 }
00351 bool lessThan(HierMetric*);
00352 HierMetric* addBy(HierMetric*);
00353 string toString();
00354 };
00355
00356
00357
00358 class NeighborInfo {
00359 nsaddr_t id;
00360 double lastSeen;
00361 map<nsaddr_t, NeighborInfo> *nbrList;
00362 bool dominator;
00363 public:
00364 NeighborInfo(nsaddr_t addr) {
00365 id = addr;
00366 lastSeen = Scheduler::instance().clock();
00367 nbrList = NULL;
00368 dominator = false;
00369 }
00370 ~NeighborInfo() {
00371 nbrList->clear();
00372 delete nbrList;
00373 }
00374 };
00375
00376
00384 class OLSR : public Agent {
00385
00386 friend class OLSR_HelloTimer;
00387 friend class OLSR_TcTimer;
00388 friend class OLSR_MidTimer;
00389 friend class OLSR_DupTupleTimer;
00390 friend class OLSR_LinkTupleTimer;
00391 friend class OLSR_Nb2hopTupleTimer;
00392 friend class OLSR_MprSelTupleTimer;
00393 friend class OLSR_TopologyTupleTimer;
00394 friend class OLSR_IfaceAssocTupleTimer;
00395 friend class OLSR_MsgTimer;
00396 friend class CDSWL_PktTimer;
00397
00399 nsaddr_t ra_addr_;
00400
00402 u_int16_t pkt_seq_;
00404 u_int16_t msg_seq_;
00406 u_int16_t ansn_;
00407
00409 int hello_ival_;
00411 int tc_ival_;
00413 int mid_ival_;
00415 int willingness_;
00417 int use_mac_;
00418
00420 OLSR_rtable rtable_;
00422 OLSR_state state_;
00424 std::vector<OLSR_msg> msgs_;
00425
00426
00427 static int *hAddr;
00428 static int nNodes;
00429 static int nLevels;
00430 int* initHierAddr();
00431 int print_nodes(nsaddr_t, std::set<nsaddr_t>, std::vector<OLSR_topology_tuple*>);
00432 bool isNeighborFromTo(nsaddr_t, nsaddr_t, std::vector<OLSR_topology_tuple*>);
00433 HierMetric* getLinkCost(nsaddr_t, nsaddr_t, std::vector<HierMetric*>);
00434 void dumpDistVector(std::map<nsaddr_t, HierMetric*>, std::map<nsaddr_t, nsaddr_t>);
00435
00436
00437 int cdswl_status_;
00438 map<nsaddr_t, NeighborInfo> nbr_list_;
00439
00440 protected:
00441 PortClassifier* dmux_;
00442 Trace* logtarget_;
00443
00444 OLSR_HelloTimer hello_timer_;
00445 OLSR_TcTimer tc_timer_;
00446 OLSR_MidTimer mid_timer_;
00447
00448 CDSWL_PktTimer cdswl_timer_;
00449
00451 inline u_int16_t pkt_seq() {
00452 pkt_seq_ = (pkt_seq_ + 1)%(OLSR_MAX_SEQ_NUM + 1);
00453 return pkt_seq_;
00454 }
00456 inline u_int16_t msg_seq() {
00457 msg_seq_ = (msg_seq_ + 1)%(OLSR_MAX_SEQ_NUM + 1);
00458 return msg_seq_;
00459 }
00460
00461 inline nsaddr_t& ra_addr() { return ra_addr_; }
00462
00463 inline int& hello_ival() { return hello_ival_; }
00464 inline int& tc_ival() { return tc_ival_; }
00465 inline int& mid_ival() { return mid_ival_; }
00466 inline int& willingness() { return willingness_; }
00467 inline int& use_mac() { return use_mac_; }
00468
00469 inline linkset_t& linkset() { return state_.linkset(); }
00470 inline mprset_t& mprset() { return state_.mprset(); }
00471 inline mprselset_t& mprselset() { return state_.mprselset(); }
00472 inline nbset_t& nbset() { return state_.nbset(); }
00473 inline nb2hopset_t& nb2hopset() { return state_.nb2hopset(); }
00474 inline topologyset_t& topologyset() { return state_.topologyset(); }
00475 inline dupset_t& dupset() { return state_.dupset(); }
00476 inline ifaceassocset_t& ifaceassocset() { return state_.ifaceassocset(); }
00477
00478 void recv_olsr(Packet*);
00479 void recv_cdswl_pkt(Packet*);
00480
00481 void mpr_computation();
00482 void rtable_computation();
00483 void rtable_computation_h();
00484
00485 void process_hello(OLSR_msg&, nsaddr_t, nsaddr_t);
00486 void process_tc(OLSR_msg&, nsaddr_t);
00487 void process_mid(OLSR_msg&, nsaddr_t);
00488 void process_cdswl_hello(Packet*);
00489
00490 void forward_default(Packet*, OLSR_msg&, OLSR_dup_tuple*, nsaddr_t);
00491 void forward_data(Packet*);
00492
00493 void enque_msg(OLSR_msg&, double);
00494 void send_hello();
00495 void send_tc();
00496 void send_mid();
00497 void send_pkt();
00498 void send_cdswl_pkt(int pkt_type, int pkt_subtype = 0);
00499 void reset_cdswl_pkt_timer();
00500
00501 void link_sensing(OLSR_msg&, nsaddr_t, nsaddr_t);
00502 void populate_nbset(OLSR_msg&);
00503 void populate_nb2hopset(OLSR_msg&);
00504 void populate_mprselset(OLSR_msg&);
00505
00506 void set_hello_timer();
00507 void set_tc_timer();
00508 void set_mid_timer();
00509
00510 void nb_loss(OLSR_link_tuple*);
00511 void add_dup_tuple(OLSR_dup_tuple*);
00512 void rm_dup_tuple(OLSR_dup_tuple*);
00513 void add_link_tuple(OLSR_link_tuple*, u_int8_t);
00514 void rm_link_tuple(OLSR_link_tuple*);
00515 void updated_link_tuple(OLSR_link_tuple*);
00516 void add_nb_tuple(OLSR_nb_tuple*);
00517 void rm_nb_tuple(OLSR_nb_tuple*);
00518 void add_nb2hop_tuple(OLSR_nb2hop_tuple*);
00519 void rm_nb2hop_tuple(OLSR_nb2hop_tuple*);
00520 void add_mprsel_tuple(OLSR_mprsel_tuple*);
00521 void rm_mprsel_tuple(OLSR_mprsel_tuple*);
00522 void add_topology_tuple(OLSR_topology_tuple*);
00523 void rm_topology_tuple(OLSR_topology_tuple*);
00524 void add_ifaceassoc_tuple(OLSR_iface_assoc_tuple*);
00525 void rm_ifaceassoc_tuple(OLSR_iface_assoc_tuple*);
00526
00527 nsaddr_t get_main_addr(nsaddr_t);
00528 int degree(OLSR_nb_tuple*);
00529
00530 static bool seq_num_bigger_than(u_int16_t, u_int16_t);
00531
00532 public:
00533 OLSR(nsaddr_t);
00534 int command(int, const char*const*);
00535 void recv(Packet*, Handler*);
00536 void mac_failed(Packet*);
00537
00538 static double emf_to_seconds(u_int8_t);
00539 static u_int8_t seconds_to_emf(double);
00540 static int node_id(nsaddr_t);
00541 };
00542
00543 #endif