• Main Page
  • Classes
  • Files
  • File List

/Users/yzchen/ns/ns-allinone-2.33/ns-2.33/um-olsr-0.8.8/OLSR.h

00001 /***************************************************************************
00002  *   Copyright (C) 2004 by Francisco J. Ros                                *
00003  *   fjrm@dif.um.es                                                        *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program is distributed in the hope that it will be useful,       *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
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 /********** Useful macros **********/
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 /********** Intervals **********/
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 /********** Holding times **********/
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 /********** Link types **********/
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 /********** Neighbor types **********/
00123 
00125 #define OLSR_NOT_NEIGH          0
00126 
00127 #define OLSR_SYM_NEIGH          1
00128 
00129 #define OLSR_MPR_NEIGH          2
00130 
00131 
00132 /********** Willingness **********/
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 /********** Miscellaneous constants **********/
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 /************** CDSWL parameters *************/
00160 // Added by YPC 20090727
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;                     // forward declaration
00174 
00175 
00176 /********** Timers **********/
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 // Timer for CDSWL clustering -- Added by YPC 20090726
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 /*********** hierarchical link metric **************/
00332 // Added by YPC -- 20090316
00333 class HierMetric
00334 {
00335 public:
00336         nsaddr_t        from;                   // from
00337         nsaddr_t        to;                             // to
00338         int                     nLevels;                // number of levels in the hierarchy
00339         int*            cost;                   // cost of the all levels
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 /*********** CDSWL **************/
00357 // Added by YPC -- 20090727
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 /********** OLSR Agent **********/
00384 class OLSR : public Agent {
00385         // Makes some friends.
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         // Added for mmc - YPC - 20090309
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         // Added for CDSWL - YPC 20090727
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_;   //      CDSWL timer --- Added by YPC 20090726
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();         // Hierarchical addresses for OSP; YPC 20090314
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);              // Packet type as defined in cdswl.h
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

Generated on Tue Aug 10 2010 16:16:09 for ns-2.33 by  doxygen 1.7.1