wimaxctrlagent.h
上传用户:hzie11
上传日期:2013-10-07
资源大小:1487k
文件大小:6k
源码类别:

网络

开发平台:

C/C++

  1. /* This class contains the control agent located in IEEE 802.16 BS responsible
  2.  * for synchronization between BSs.
  3.  * This software was developed at the National Institute of Standards and
  4.  * Technology by employees of the Federal Government in the course of
  5.  * their official duties. Pursuant to title 17 Section 105 of the United
  6.  * States Code this software is not subject to copyright protection and
  7.  * is in the public domain.
  8.  * NIST assumes no responsibility whatsoever for its use by other parties,
  9.  * and makes no guarantees, expressed or implied, about its quality,
  10.  * reliability, or any other characteristic.
  11.  * <BR>
  12.  * We would appreciate acknowledgement if the software is used.
  13.  * <BR>
  14.  * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  15.  * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  16.  * FROM THE USE OF THIS SOFTWARE.
  17.  * </PRE></P>
  18.  * @author  rouil
  19.  */
  20. #ifndef WIMAXCTRLAGENT_H
  21. #define WIMAXCTRLAGENT_H
  22. #include "agent.h"
  23. #include "tclcl.h"
  24. #include "packet.h"
  25. #include "address.h"
  26. #include "ip.h"
  27. #include "node.h"
  28. #include "random.h"
  29. #include "mac802_16pkt.h" 
  30. #define MAX_MAP_ENTRY 10
  31. #define MAX_MN_REQ    10  //maximum number of concurrent MN requests 
  32. #define UPDATE_JITTER 0.5 //jitter at start up to avoid synchronization
  33. #define START_FRAME_OFFSET 2 //in the response we set teh start_frame to this value
  34. /* 
  35.  * Packet structure for 
  36.  */
  37. #define HDR_WIMAXBS(p)    ((struct hdr_wimaxbs*)(p)->access(hdr_wimaxbs::offset_))
  38. /** Types of message */
  39. enum wimaxbs_type {
  40.   WIMAX_BS_ADV,
  41.   WIMAX_BS_SYNCH_REQ,
  42.   WIMAX_BS_SYNCH_RSP,
  43. };
  44. /** Structure of packet exchanged between BSs */
  45. struct hdr_wimaxbs {
  46.   wimaxbs_type subtype_; //type of message
  47.   uint32_t macaddr_;     //address of the MAC of interest in this message
  48.   //data for BS association request
  49.   int cid; //to know for which connection the message is
  50.   wimax_scanning_type scanning_type;
  51.   int current_frame;
  52.   int rdvt; //rendez-vous time in units of frame
  53.   double rendezvous_time; //rendez-vous time in seconds
  54.   static int offset_;
  55.   inline static int& offset() { return offset_; }
  56.   inline static hdr_wimaxbs* access(Packet* p) {
  57.     return (hdr_wimaxbs*) p->access(offset_);
  58.   }
  59.   inline wimaxbs_type& getType() {return subtype_;}
  60.   inline uint32_t& macAddr() { return macaddr_; }
  61. };
  62. class WimaxCtrlAgent;
  63. class Scan_req;
  64. LIST_HEAD (scan_req, Scan_req);
  65. //structure to handle scan requests
  66. /** 
  67.  * Timer to send an update to neighboring BSs
  68.  */
  69. class ScanRspTimer : public TimerHandler {
  70.  public:
  71.         ScanRspTimer(Scan_req *a) : TimerHandler() 
  72.   { a_ = a;}
  73.  protected:
  74.         void expire(Event *);
  75.         Scan_req *a_;
  76. };
  77. /**
  78.  * Store information about a pending scan request
  79.  */
  80. class Scan_req {
  81.  public:
  82.   Scan_req (WimaxCtrlAgent *agent, double delay, int cid, mac802_16_mob_scn_req_frame *req) {
  83.     agent_ = agent;
  84.     timer_ = new ScanRspTimer (this);
  85.     timer_->sched (delay);
  86.     cid_ = cid;
  87.     memcpy (&req_, req, sizeof (mac802_16_mob_scn_req_frame)); 
  88.   }
  89.   int cid() { return cid_; }
  90.   int& start_frame() { return start_frame_; }
  91.   int& pending_rsp () { return pending_rsp_; }
  92.   WimaxCtrlAgent *agent() {return agent_; }
  93.   mac802_16_mob_scn_req_frame *request() { return &req_; }
  94.   mac802_16_mob_scn_rsp_frame *response() { return &rsp_; }
  95.  
  96.   inline void cancel_timer () {
  97.     if (timer_->status()==TIMER_PENDING)
  98.       timer_->cancel();
  99.   }
  100.   inline void sched_timer (double time) {
  101.     timer_->sched (time);
  102.   }
  103.   // Chain element to the list
  104.   inline void insert_entry(struct scan_req *head) {
  105.     LIST_INSERT_HEAD(head, this, link);
  106.   }
  107.   
  108.   // Return next element in the chained list
  109.   Scan_req* next_entry(void) const { return link.le_next; }
  110.   // Remove the entry from the list
  111.   inline void remove_entry() { 
  112.     cancel_timer ();
  113.     LIST_REMOVE(this, link); 
  114.   }
  115.  protected:
  116.   /*
  117.    * Pointer to next in the list
  118.    */
  119.   LIST_ENTRY(Scan_req) link;
  120.   //LIST_ENTRY(Scan_req); //for magic draw
  121.  private:
  122.   int cid_;                         //CID of the connection the request came from
  123.   mac802_16_mob_scn_req_frame req_; //store request data
  124.   mac802_16_mob_scn_rsp_frame rsp_; //store response data
  125.   int pending_rsp_;                 //number of pending responses
  126.   int start_frame_;                  //frame number when the serving BS decided the rendez-vous time
  127.   ScanRspTimer *timer_;
  128.   WimaxCtrlAgent *agent_;
  129. };
  130. /** 
  131.  * Timer to send an update to neighboring BSs
  132.  */
  133. class UpdateTimer : public TimerHandler {
  134.  public:
  135.         UpdateTimer(WimaxCtrlAgent *a) : TimerHandler() 
  136.   { a_ = a;}
  137.  protected:
  138.         void expire(Event *);
  139.         WimaxCtrlAgent *a_;
  140. };
  141. class Mac802_16;
  142. /** 
  143.  * Agnet to handle communication between BSs
  144.  */
  145. class WimaxCtrlAgent : public Agent {
  146.   
  147.  public:
  148.   /**
  149.    * Constructor
  150.    */
  151.   WimaxCtrlAgent();
  152.   /* 
  153.    * Interface with TCL interpreter
  154.    * @param argc The number of elements in argv
  155.    * @param argv The list of arguments
  156.    * @return TCL_OK if everything went well else TCL_ERROR
  157.    */
  158.   int command(int argc, const char*const* argv);
  159.   /* 
  160.    * Process received packet
  161.    * @param p The packet received
  162.    * @param h The handler that sent the packet
  163.    */
  164.   void recv(Packet*, Handler*);
  165.   /*
  166.    * Send an update (DCD/UCD) to all neighboring BSs
  167.    */
  168.   void sendUpdate ();
  169.   /**
  170.    * Process a request from a MN
  171.    * @param req The request
  172.    */
  173.   virtual void process_scan_request (Packet *req);
  174.   /**
  175.    * Process synchronization request
  176.    * @param p The request
  177.    */
  178.   virtual void process_synch_request (Packet *p);
  179.   /**
  180.    * Process synchronization response
  181.    * @param p The response
  182.    */
  183.   virtual void process_synch_response (Packet *p);
  184.   /**
  185.    * Send a scan response to the MN that has the given CID
  186.    * @param cid The CID of the MN
  187.    */
  188.   virtual void send_scan_response (int cid);
  189.  protected:
  190.   /**
  191.    * Process an update message
  192.    */
  193.   void processUpdate(Packet* p);
  194.   Mac802_16 *mac_;
  195.   /**
  196.    * Timer to send update messages to neighbor BSs
  197.    */
  198.   UpdateTimer updatetimer_;
  199.   /**
  200.    * time interval between updates
  201.    */
  202.   double adv_interval_;
  203.   /**
  204.    * Table mapping neighbor IP address and Mac address
  205.    */
  206.   int maptable_[MAX_MAP_ENTRY][2]; 
  207.   /**
  208.    * number of element in the mapping table
  209.    */
  210.   int nbmapentry_;
  211.   /**
  212.    * Default association level
  213.    */
  214.   int defaultlevel_; 
  215.   /**
  216.    * Contains list of requests
  217.    */
  218.   struct scan_req scan_req_head_;
  219.   /**
  220.    * Synchronization delay in unit of frame (i.e time we wait for synchronization with BSs)
  221.    */
  222.   int synch_frame_delay_;
  223. };
  224. #endif