landmark.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:16k
源码类别:

通讯编程

开发平台:

Visual C++

  1. // Author: Satish Kumar, kkumar@isi.edu
  2. #ifndef landmark_h_
  3. #define landmark_h_
  4. #include <agent.h>
  5. #include <ip.h>
  6. #include <delay.h>
  7. #include <scheduler.h>
  8. #include <queue.h>
  9. #include <trace.h>
  10. #include <arp.h>
  11. #include <ll.h>
  12. #include <mac.h>
  13. #include <priqueue.h>
  14. #include <mobilenode.h>
  15. #include "tags.h"
  16. #include "agent-list.h"
  17. typedef double Time;
  18. #define ROUTER_PORT 255
  19. #define QUERY_PORT 0
  20. #define NOT_CHILD 0
  21. #define IS_CHILD 1
  22. #define NOT_POTL_CHILD 2 // Not within appropriate vicinity
  23. #define NO_PARENT 60000
  24. #define OLD_ENTRY 0     // Object already exists in list
  25. #define NEW_ENTRY 1     // New object created in list
  26. #define OLD_MESSAGE 2   // Old information; Object not added to list
  27. #define ENTRY_NOT_FOUND 3 // Object not found
  28. #define NEW_CHILD 4     // New child added
  29. #define OLD_CHILD_TAGS_CHANGED 5
  30. #define TRUE 1
  31. #define FALSE 0
  32. #define MAX_ENERGY 100000
  33. #define MAX_LEVELS 8
  34. #define MAX_CHILDREN 30
  35. #define MAX_DEMOTION_RECORDS 20
  36. #define INITIAL_WAIT_TIME 10.0
  37. #define PERIODIC_WAIT_TIME 60.0
  38. #define LM_STARTUP_JITTER 10.0 // secs to jitter LM's periodic adverts
  39. #define IP_HDR_SIZE 20 // 20 byte IP header as in the Internet
  40. #define WAIT_TIME 2 // 1s for each hop; round-trip is 2
  41. #define MAX_TIMEOUT 200 // Value divided by local population density and 
  42.             // level to compute promotion timeout at node
  43. #define CONST_TIMEOUT 10 // Constant portion of timeout across levels
  44. #define LOW_FREQ_UPDATE 300
  45. #define PROMO_TIMEOUT_MULTIPLES 1 // Used in promotion timer
  46. #define DEMOTION 0    // update pkt should advertise demotion
  47. #define PERIODIC_ADVERTS 1   // periodic update for each level node is at
  48. #define UNICAST_ADVERT_CHILD 2
  49. #define UNICAST_ADVERT_PARENT 3
  50. #define GLOBAL_ADVERT 4 // global advertisement from root LM
  51. #define QUERY_PKT  5        // query/response pkt
  52. #define DIR_QUERY_PKT 6
  53. #define DIR_RESPONSE_PKT 7
  54. #define OBJECT_QUERY_PKT 8
  55. #define OBJECT_RESPONSE_PKT 9
  56. #define HASH_PKT 10
  57. #define HASH_ACK_PKT 11
  58. #define REHASH_PKT 12
  59. #define FLOOD 0
  60. #define UNICAST 1
  61. #define SUPPRESS 2
  62. #define DEMOTION_RATIO 1.3
  63. #define DEMOTION_DIFF  5000
  64. #define NO_NEXT_HOP 50000
  65. #define MAX_CACHE_ITEMS 200
  66. #define NO_GLOBAL_LM 60000
  67. class TagMobilityHandler;
  68. class TagAdvtHandler;
  69. //class TagCache {
  70. //public:
  71. //  int obj_name_;
  72. //  int origin_time_;
  73. //  double X_;
  74. //  double Y_;
  75. //};
  76. // Used in aggregation
  77. class aggreg_taglist {
  78. public:
  79.   aggreg_taglist() { marked_ = 0; next_ = NULL;}
  80.   int obj_name_;
  81.   int marked_;
  82.   aggreg_taglist *next_;
  83. };
  84. class LMAddrs {
  85. public:
  86.   LMAddrs() {
  87.     lmaddr_ = 0;
  88.     num_lm_addrs_ = 0;
  89.   }
  90.   ~LMAddrs() {  
  91.     delete_lm_addrs();
  92.   }
  93.   void add_lm_addr(int64_t lmaddr) {
  94.     int i = 0;
  95.     assert(num_lm_addrs_ >= 0);
  96.     if(num_lm_addrs_) {
  97.        int64_t *tmp_addrs = new int64_t[num_lm_addrs_];
  98.        for(i = 0; i < num_lm_addrs_; ++i) {
  99.           tmp_addrs[i] = lmaddr_[i];
  100.        }
  101.        delete[] lmaddr_;
  102.        lmaddr_ = new int64_t[num_lm_addrs_+1];
  103.        for(i = 0; i < num_lm_addrs_; ++i) {
  104.          lmaddr_[i] = tmp_addrs[i];
  105.        }
  106.        delete[] tmp_addrs;
  107.     }
  108.     else 
  109.       lmaddr_ = new int64_t[num_lm_addrs_+1];
  110.     lmaddr_[num_lm_addrs_] = lmaddr;
  111.     ++num_lm_addrs_;
  112.   }
  113.   void delete_lm_addrs() {
  114.     if(!num_lm_addrs_) return;
  115.     num_lm_addrs_ = 0;
  116.     delete[] lmaddr_;
  117.     lmaddr_ = NULL;
  118.   }
  119.   void get_lm_addrs(int *num_lm_addrs, int64_t **lmaddr) {
  120.     *num_lm_addrs = num_lm_addrs_;
  121.     *lmaddr = NULL;
  122.     if(num_lm_addrs_) {
  123.       *lmaddr = new int64_t[num_lm_addrs_];
  124.       for(int i = 0; i < num_lm_addrs_; ++i) {
  125.           (*lmaddr)[i] = lmaddr_[i];
  126.       }
  127.     }
  128.   }
  129.   int match_lm_addr(int *addr, int level) {
  130.     int i[8];
  131.     int num_addrs = 0;
  132.     int match = FALSE;
  133.     assert(level < 8);
  134.     for(num_addrs = 0; num_addrs < num_lm_addrs_; ++num_addrs) {
  135.        i[7] = (lmaddr_[num_addrs] >> 56) & 0xFF;
  136.        i[6] = (lmaddr_[num_addrs] >> 48) & 0xFF;
  137.        i[5] = (lmaddr_[num_addrs] >> 40) & 0xFF;
  138.        i[4] = (lmaddr_[num_addrs] >> 32) & 0xFF;
  139.        i[3] = (lmaddr_[num_addrs] >> 24) & 0xFF;
  140.        i[2] = (lmaddr_[num_addrs] >> 16) & 0xFF;
  141.        i[1] = (lmaddr_[num_addrs] >> 8) & 0xFF;
  142.        i[0] = (lmaddr_[num_addrs]) & 0xFF;
  143.        match = TRUE;
  144.        for(int j = 7; j >= level; --j) {
  145.           if(addr[j] != i[j]) {
  146.             match = FALSE;
  147.             break;
  148.           }
  149.        }
  150.        if(match == TRUE)
  151.           return(match);
  152.     }
  153.     return(match);
  154.   }
  155. private:
  156.  int64_t *lmaddr_;
  157.  int num_lm_addrs_;
  158. };
  159. // We need a separate record to keep track of old demotion messages so that
  160. // the same msg is not forwarded more than once. We cant use the potl children
  161. // or potl parent list for this because the entry is deleted on demotion.
  162. class RecentMsgRecord {
  163. public:
  164.   RecentMsgRecord() {
  165.     id_ = 60000;
  166.     level_ = -1;
  167.     origin_time_ = 0;
  168.   }
  169.   nsaddr_t id_;
  170.   int level_;
  171.   int origin_time_;
  172. };
  173. class NodeIDList {
  174. public:
  175.   NodeIDList() {
  176.     next_ = NULL;
  177.   }
  178.   nsaddr_t dst_node_;
  179.   nsaddr_t dst_next_hop_;
  180.   int next_hop_level_;
  181.   NodeIDList *next_;
  182. };
  183. class LMNode {
  184.   friend class ParentChildrenList;
  185.   friend class LandmarkAgent;
  186.   friend class PromotionTimer;
  187. public:
  188.   LMNode(nsaddr_t id, nsaddr_t next_hop, int num_hops, int level, int num_children, int energy, int origin_time, double update_time) {
  189.     id_ = id;
  190.     lmaddr_ = new LMAddrs;
  191.     next_hop_ = next_hop;
  192.     child_flag_ = NOT_CHILD;
  193.     num_hops_ = num_hops;
  194.     level_ = level;
  195.     num_children_ = num_children;
  196.     energy_ = energy;
  197.     last_upd_origin_time_ = origin_time;
  198.     last_upd_seqnum_ = -1;
  199.     last_update_rcvd_ = update_time;
  200.     tag_list_ = NULL;
  201.     next_ = NULL;
  202.   }
  203.   
  204.   ~LMNode() {
  205.     compr_taglist *tag_ptr1, *tag_ptr2;
  206.     tag_ptr1 = tag_list_;
  207.     while(tag_ptr1) {
  208.       tag_ptr2 = tag_ptr1;
  209.       tag_ptr1 = tag_ptr1->next_;
  210.       delete tag_ptr2;
  211.     }
  212.     delete lmaddr_;
  213.    }
  214.   nsaddr_t id_;             // ID of this node
  215.   LMAddrs *lmaddr_;       // Landmark addresses of this node        
  216.   nsaddr_t next_hop_;     // Next hop to reach this node
  217.   int child_flag_;     // indicates whether this node is a child
  218.   int num_hops_;            // number of hops away
  219.   int level_;               // level of the child node
  220.   int num_children_;        // Number of children that this node has
  221.   int energy_;              // Energy reserves of the child node
  222.   int last_upd_origin_time_; // Origin time of last update
  223.   int last_upd_seqnum_;      // Seqnum of last upd; used to distinguish
  224.                              // different messages originated at same time
  225.   double last_update_rcvd_; // Time at which last update received
  226.   compr_taglist *tag_list_;  // Tag advertisements of this node
  227.   LMNode *next_;     
  228.   void copy_tag_list(compr_taglist *taglist);
  229. };
  230. class LMEvent : public Event {
  231. public:
  232.   int level_;
  233.   LMEvent(int level) : Event() {level_ = level;}
  234. };
  235. class ParentChildrenList {
  236.   friend class LandmarkAgent;
  237.   friend class LMNode;
  238.   friend class PromotionTimer;
  239.   friend class LMPeriodicAdvtHandler;
  240. public:
  241.   ParentChildrenList(int level, LandmarkAgent *a);
  242.   ~ParentChildrenList() {
  243.     LMNode *node1, *node2;
  244.     node1 = pchildren_;
  245.     while(node1) {
  246.       node2 = node1;
  247.       node1 = node1->next_;
  248.       delete node2;
  249.     }
  250.     node1 = pparent_;
  251.     while(node1) {
  252.       node2 = node1;
  253.       node1 = node1->next_;
  254.       delete node2;
  255.     }
  256.     // Event id > 0 for valid event
  257.     if(periodic_update_event_->uid_) {
  258.        Scheduler &s = Scheduler::instance();
  259.        s.cancel(periodic_update_event_);
  260.     }
  261.     delete mylmaddrs_;
  262.   }
  263. //  void set_lmaddress(int64_t lmaddr) {
  264. //    mylmaddr_ = lmaddr;
  265. //  }
  266. //  int64_t get_lmaddress() {
  267. //    return(mylmaddr_);
  268. //  }
  269.   int level_;          // my level
  270.   LMNode *parent_;    // points to the appropriate object in the pparent_ list
  271.   int num_heard_;     // number of nodes heard at one level lower than 
  272.                       // our level; superset of potential children heard
  273.                       // with the "election" vicinity condition
  274.   int num_children_;   // number of children
  275.   int num_potl_children_; // number of potential children
  276.   int num_pparent_;     // number of potential parents        
  277.   LMNode *pchildren_;  // list of children and potential children
  278.   LMNode *pparent_;   // list of potential parents     
  279.   // Periodic advertisement stuff        
  280.   int seqnum_;          // Sequence number of last advertisement    
  281.   double last_update_sent_; // Time at which last update was sent 
  282.   double update_period_;    // period between updates  
  283.   double update_timeout_;   // Updates are deleted after this timeout  
  284.   Event *periodic_update_event_;  // event used to schedule periodic 
  285.                                     // landmark updates
  286.   LMPeriodicAdvtHandler *periodic_handler_; // handler called by the scheduler
  287.   ParentChildrenList *next_;  // pointer to next list element
  288.   int update_round_;        // To be used for demotion
  289.   // Update/add/delete info abt a potential parent or child
  290.   // Returns 1 if parent or child already present else adds the relevant
  291.   // object and returns 0
  292.   // Deletes the specified parent or child if delete flag is set to 1;
  293.   // should be set to 0 otherwise
  294.   // One method might be enough but have two in case different
  295.   // actions have to be taken for adding parent and child in the future
  296.   int UpdatePotlParent(nsaddr_t id, nsaddr_t next_hop, int num_hops, int level,int num_children, int energy, int origin_time, int delete_flag);
  297.   int UpdatePotlChild(nsaddr_t id, nsaddr_t next_hop, int num_hops, int level, int num_children, int energy, int origin_time, int child_flag, int delete_flag, compr_taglist *taglist);
  298.   void UpdateChildLMAddr(nsaddr_t id, int num_lm_addrs, int64_t *lm_addrs);
  299.   LandmarkAgent *a_; // Agent associated with this object
  300.   compr_taglist *tag_list_; // Aggregated list of tags for each level      
  301.   int num_tags_;            // Number of tags in tag_list        
  302.   int adverts_type_;  // Indicates whether adverts should be flooded, unicast
  303.                   // or suppresed when no changes as in a hard-state scheme
  304.   LMAddrs *mylmaddrs_;  // My landmark addresses; 8 bits per level; assume
  305.                             // max of 8 levels; 0 at any level indicates 
  306.                             // unassigned, addrs start from 1 onwards.
  307. };
  308. #define HIER_ADVS 0
  309. #define OBJECT_ADVS 1
  310. #define HIER_AND_OBJECT_ADVS 2
  311. class LandmarkAgent : public Agent {
  312.   friend class LMPeriodicAdvtHandler;
  313.   friend class PromotionTimer;
  314.   friend class ParentChildrenList;
  315. public:
  316.   LandmarkAgent();
  317.   virtual int command(int argc, const char * const * argv);
  318.   //  RoutingTable *table_;     // Routing Table
  319.   // Promotion timer stuff
  320.   PromotionTimer *promo_timer_; // Promotion timer object
  321.   double promo_start_time_;     // Time when the promotion timer was started
  322.   double promo_timeout_; // Promotion timeout. Same for all levels.
  323.   double promo_timeout_decr_; // Amount by which promotion timer is
  324.                                // decr when another LM's adverts is heard
  325.   int promo_timer_running_; // indicates that promotion timer is running
  326.   void startUp();           // Starts off the hierarchy construction protocol
  327.   virtual void stop();             // Resets the agent state
  328.   int seqno_;               // Sequence number to advertise with...
  329.   int myaddr_;              // My address...
  330.   // Periodic advertisements stuff
  331.   virtual void periodic_callback(Event *e, int level); // method to send periodic advts
  332.   
  333.   int highest_level_;       // My highest level in the hierarchy (note
  334.                             // that a LM can be at multiple levels)
  335.   // List of parent and children nodes for each level I'm at. Methods to add
  336.   // and remove parent, child information from this list.
  337.   ParentChildrenList *parent_children_list_;
  338.   void Addparent(const nsaddr_t parent, int level);
  339.   void Addpotentialchild(const nsaddr_t child, int level);
  340.   // pkt_type is one of HIER_ADVS, OBJECT_ADVS, HIER_AND_OBJECT_ADVS
  341.   // action is one of DEMOTION, PERIODIC_ADVERTS, UNICAST_ADVERT_CHILD,
  342.   // UNICAST_ADVERT_PARENT, GLOBAL_ADVERT (from root LM) and QUERY_PKT
  343.   virtual Packet *makeUpdate(ParentChildrenList *pcl, int pkt_type, int action); 
  344.                                   
  345.   int radius(int level); // returns the LM radius for the specified level
  346.   PriQueue *ll_queue;       // link level output queue
  347.   void recv(Packet *p, Handler *);
  348.   virtual void ProcessHierUpdate(Packet *p);
  349.   virtual void ForwardPacket(Packet *p);
  350.   // Prints neighbour information for this node
  351.   void get_nbrinfo();
  352.   // Store a record of recent forwarded demotion msgs
  353.   RecentMsgRecord *recent_demotion_msgs_;
  354.   int num_demotion_msgs_;
  355.   int CheckDemotionMsg(nsaddr_t id, int level, int origin_time);
  356.   // Tracing stuff
  357.   void trace(char* fmt,...);       
  358.   Trace *tracetarget_;  // Trace target
  359.   // Assign landmark addresses to children
  360.   void assign_lmaddress(int64_t *lmaddr, int num_lm_addrs, int root_level);
  361.      
  362.   // Pointer to global tag database
  363.   tags_database *tag_dbase_;
  364.   compr_taglist *aggregate_taginfo(compr_taglist *unagg_tags, int agg_level, int *num_tags);
  365.   compr_taglist *aggregate_tags(compr_taglist *unagg_tags, int agg_level, int *num_tags);
  366.   NodeIDList *search_tag(int obj_name, int prev_hop_level, int next_hop_level, nsaddr_t last_hop_id, int *num_dst);
  367.   virtual nsaddr_t get_next_hop(nsaddr_t dst, int next_hop_level);
  368.   // Mobile node to which agent is attached; Used to get position information
  369.   MobileNode *node_;
  370.   // Randomness/MAC/logging parameters
  371.   int be_random_;    // set to 1 on initialization
  372.   int num_resched_; // used in rescheduling timers
  373.   int wait_state_;  // used to indicate that the node is waiting to receive
  374.                     // other LM hierarchy messages
  375.   double total_wait_time_; // total time the node has spent in wait state
  376.   // Debug flags
  377.   int debug_;   
  378.   int qry_debug_;
  379.   // Tag cache info
  380.   int cache_;      // set to 1 to enable caching
  381.   TagCache *tag_cache_;
  382.   int num_cached_items_;
  383.   // Update period info
  384.   double update_period_;
  385.   double update_timeout_;
  386.   // Option to indicate whether updates are to be flooded, unicast or
  387.   // suppressed when no changes occur as in a hard-state based scheme
  388.   int adverts_type_;  
  389.   // Option to indicate whether there is a global LM. We dont need a global
  390.   // LM for all the query direction schemes
  391.   int global_lm_; 
  392.   // ID and level of global LM that this node sees
  393.   nsaddr_t global_lm_id_;
  394.   int global_lm_level_;
  395.   // Indicates whether the node that the agent is attached to is alive or not
  396.   int node_dead_;
  397.   // Random number generator
  398.   RNG *rn_;
  399.   inline double jitter(double max, int be_random_);
  400.   inline double random_timer(double max, int be_random_);
  401.   virtual void GenerateReHashMsg(int64_t lm_addr, double net_change_time) { }
  402.   int num_nbrs_;
  403.   int *nbrs_;
  404.   // Tag mobility stuff
  405.   TagMobilityHandler *tag_mobility_;
  406.   Event *tag_mobility_event_;
  407.   double mobility_period_;
  408.   virtual void MoveTags();
  409.   virtual void AddMobileTag(void *mobile_tag);
  410.   // Pointer to tags that have moved within this sensor's range
  411.   // while the sensor was dead
  412.   compr_taglist *mobile_tags_;
  413.   TagAdvtHandler *tag_advt_handler_;
  414.   Event *tag_advt_event_;
  415.   RNG *tag_rng_;
  416.   void SendChangedTagListUpdate(int our_tag_changed, int level);
  417.   int compare_tag_lists(compr_taglist *tag_list1, int num_tags1, compr_taglist *tag_list2, int num_tags2);
  418. };
  419. class LMPeriodicAdvtHandler : public Handler {
  420. public:
  421.   LMPeriodicAdvtHandler(ParentChildrenList *p) { p_ = p; }
  422.   virtual void handle(Event *e) { (p_->a_)->periodic_callback(e,p_->level_); }
  423. private:
  424.   ParentChildrenList *p_;
  425. };
  426. class PromotionTimer : public TimerHandler {
  427. public:
  428.   PromotionTimer(LandmarkAgent *a) : TimerHandler() { a_ = a;}
  429. protected:
  430.   virtual void expire(Event *e);
  431.   LandmarkAgent *a_;
  432. };
  433. class TagMobilityHandler : public Handler {
  434. public:
  435.   TagMobilityHandler(LandmarkAgent *a) { a_ = a; }
  436.   virtual void handle(Event *) { a_->MoveTags(); }
  437. private:
  438.   LandmarkAgent *a_;
  439. };
  440. class TagAdvtHandler : public Handler {
  441. public:
  442.   TagAdvtHandler(LandmarkAgent *a) { a_ = a; our_tags_changed_ = 1; }
  443.   virtual void handle(Event *) { a_->SendChangedTagListUpdate(our_tags_changed_,0); }
  444. private:
  445.   LandmarkAgent *a_;
  446.   int our_tags_changed_;
  447. };
  448. #endif