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

网络

开发平台:

C/C++

  1. /* This software was developed at the National Institute of Standards and
  2.  * Technology by employees of the Federal Government in the course of
  3.  * their official duties. Pursuant to title 17 Section 105 of the United
  4.  * States Code this software is not subject to copyright protection and
  5.  * is in the public domain.
  6.  * NIST assumes no responsibility whatsoever for its use by other parties,
  7.  * and makes no guarantees, expressed or implied, about its quality,
  8.  * reliability, or any other characteristic.
  9.  * <BR>
  10.  * We would appreciate acknowledgement if the software is used.
  11.  * <BR>
  12.  * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  13.  * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  14.  * FROM THE USE OF THIS SOFTWARE.
  15.  * </PRE></P>
  16.  * @author  rouil
  17.  */
  18. #ifndef BSSCHEDULER_H
  19. #define BSSCHEDULER_H
  20. #include "wimaxscheduler.h"
  21. #include "scanningstation.h"
  22. #define INIT_DL_DURATION 20 //enough for DL_MAP, UL_MAP, DCD, UCD and some RNG-RSP
  23. #define MIN_CONTENTION_SIZE 5 //minimum number of opportunity for allocation
  24. /** Information about a new client */
  25. struct new_client_t {
  26.   int cid; //primary cid of new client
  27.   new_client_t *next;
  28. };
  29. class T17Element;
  30. LIST_HEAD (t17element, T17Element);
  31. /** Object to handle timer t17 */
  32. class T17Element {
  33.  public:
  34.   T17Element (Mac802_16 *mac, int index) {
  35.     index_ = index;
  36.     timer = new WimaxT17Timer (mac, index);
  37.     timer->start (mac->macmib_.t17_timeout);
  38.   }
  39.   ~T17Element () { delete (timer); }
  40.   int index () { return index_; }
  41.   int paused () { return timer->paused(); }
  42.   void cancel () { timer->stop(); }
  43.   // Chain element to the list
  44.   inline void insert_entry(struct t17element *head) {
  45.     LIST_INSERT_HEAD(head, this, link);
  46.   }
  47.   
  48.   // Return next element in the chained list
  49.   T17Element* next_entry(void) const { return link.le_next; }
  50.   // Remove the entry from the list
  51.   inline void remove_entry() { 
  52.     LIST_REMOVE(this, link); 
  53.   }
  54.  protected:
  55.   
  56.   /*
  57.    * Pointer to next in the list
  58.    */
  59.   LIST_ENTRY(T17Element) link;
  60.   //LIST_ENTRY(T17Element); //for magic draw
  61.  private:
  62.   int index_;
  63.   WimaxT17Timer *timer;
  64. };
  65. class FastRangingInfo;
  66. LIST_HEAD (fastRangingInfo, FastRangingInfo);
  67. /** Store information about a fast ranging request to send */
  68. class FastRangingInfo {
  69.  public:
  70.   FastRangingInfo (int frame, int macAddr) {
  71.     frame_ = frame;
  72.     macAddr_ = macAddr;
  73.   }
  74.   int frame () { return frame_; }
  75.   int macAddr () { return macAddr_; }
  76.   // Chain element to the list
  77.   inline void insert_entry(struct fastRangingInfo *head) {
  78.     LIST_INSERT_HEAD(head, this, link);
  79.   }
  80.   
  81.   // Return next element in the chained list
  82.   FastRangingInfo* next_entry(void) const { return link.le_next; }
  83.   // Remove the entry from the list
  84.   inline void remove_entry() { 
  85.     LIST_REMOVE(this, link); 
  86.   }
  87.  protected:
  88.   
  89.   /*
  90.    * Pointer to next in the list
  91.    */
  92.   LIST_ENTRY(FastRangingInfo) link;
  93.   //LIST_ENTRY(FastRangingInfo); //for magic draw
  94.  private:
  95.   int frame_;
  96.   int macAddr_;
  97. };
  98. class WimaxCtrlAgent;
  99. /**
  100.  * Class BSScheduler
  101.  * Implement the packet scheduler on the BS side
  102.  */ 
  103. class BSScheduler : public WimaxScheduler {
  104.   //friend class SendTimer;
  105.  public:
  106.   /*
  107.    * Create a scheduler
  108.    */
  109.   BSScheduler ();
  110.   /*
  111.    * Interface with the TCL script
  112.    * @param argc The number of parameter
  113.    * @param argv The list of parameters
  114.    */
  115.   int command(int argc, const char*const* argv);
  116.     
  117.   /**
  118.    * Process a packet received by the Mac. Only scheduling related packets should be sent here (BW request, UL_MAP...)
  119.    * @param p The packet to process
  120.    */
  121.   void  process (Packet * p);
  122.   /**
  123.    * Return the type of STA this scheduler is good for
  124.    */
  125.   virtual station_type_t getNodeType ();
  126.   /**
  127.    * Initializes the scheduler
  128.    */
  129.   virtual void init ();
  130.  
  131.   /**
  132.    * Called when a timer expires
  133.    * @param The timer ID
  134.    */
  135.   virtual void expire (timer_id id);
  136.   /**
  137.    * Start a new DL subframe
  138.    */
  139.   virtual void start_dlsubframe ();
  140.   /**
  141.    * Start a new UL subframe
  142.    */
  143.   virtual void start_ulsubframe ();
  144.   /** 
  145.    * Finds out if the given station is currently scanning
  146.    * @param nodeid The MS id
  147.    */
  148.   bool isPeerScanning (int nodeid);
  149.   /**
  150.    * Set the control agent
  151.    * @param agent The control agent
  152.    */
  153.   void setCtrlAgent (WimaxCtrlAgent *agent);
  154.   /** Add a new Fast Ranging allocation
  155.    * @param time The time when to allocate data
  156.    * @param macAddr The MN address
  157.    */
  158.   void addNewFastRanging (double time, int macAddr);
  159.   /**
  160.    * Send a scan response to the MN
  161.    * @param rsp The response from the control
  162.    * @cid The CID for the MN
  163.    */
  164.   void send_scan_response (mac802_16_mob_scn_rsp_frame *rsp, int cid);
  165.  protected:
  166.   /**
  167.    * Default modulation 
  168.    */
  169.   Ofdm_mod_rate default_mod_;
  170.   /**
  171.    * Number of transmission opportunity for initial ranging
  172.    * and bw request (i.e contention slots)
  173.    */
  174.   int contention_size_; 
  175.   /**
  176.    * Compute and return the bandwidth request opportunity size
  177.    * @return The bandwidth request opportunity size
  178.    */
  179.   int getBWopportunity ();
  180.   /**
  181.    * Compute and return the initial ranging opportunity size
  182.    * @return The initial ranging opportunity size
  183.    */
  184.   int getInitRangingopportunity ();  
  185.  private:
  186.   /**
  187.    * Process a RNG-REQ message
  188.    * @param frame The ranging request information
  189.    */
  190.   void process_ranging_req (Packet *p);
  191.   /**
  192.    * Process bandwidth request
  193.    * @param p The request
  194.    */
  195.   void process_bw_req (Packet *p);
  196.   /**
  197.    * Process bandwidth request
  198.    * @param p The request
  199.    */
  200.   void process_reg_req (Packet *p);
  201.   /**
  202.    * Process handover request
  203.    * @param req The request
  204.    */
  205.   void process_msho_req (Packet *req);
  206.  
  207.   /**
  208.    * Process handover indication
  209.    * @param p The indication
  210.    */
  211.   void process_ho_ind (Packet *p);
  212.  
  213.   /**
  214.    * Send a neighbor advertisement message
  215.    */
  216.   void send_nbr_adv ();
  217.   /**
  218.    * Add a new timer 17 for client
  219.    * @param index The client address
  220.    */
  221.   void addtimer17 (int index);
  222.   
  223.   /**
  224.    * Cancel and remove the timer17 associated with the node
  225.    * @param index The client address
  226.    */
  227.   void removetimer17 (int index);
  228.   struct new_client_t *cl_head_;
  229.   struct new_client_t *cl_tail_;
  230.   struct t17element t17_head_;
  231.   /**
  232.    * The index of the last SS that had bandwidth allocation
  233.    */
  234.   int bw_node_index_;
  235.   
  236.   /**
  237.    * The node that had the last bandwidth allocation
  238.    */
  239.   PeerNode *bw_peer_; 
  240.   /**
  241.    * Timer for DCD
  242.    */
  243.   WimaxDCDTimer *dcdtimer_; 
  244.   /**
  245.    * Timer for UCD
  246.    */
  247.   WimaxUCDTimer *ucdtimer_;
  248.   /**
  249.    * Timer for MOB-NBR_ADV messages
  250.    */
  251.   WimaxMobNbrAdvTimer *nbradvtimer_;
  252.   /**
  253.    * Indicates if it is time to send a DCD message
  254.    */
  255.   bool sendDCD;
  256.   int dlccc_;
  257.   bool sendUCD;
  258.   int ulccc_;
  259.   
  260.   /** 
  261.    * List of station in scanning 
  262.    */
  263.   struct scanningStation scan_stations_;
  264.   /**
  265.    * The Wimax control for BS synchronization
  266.    */
  267.   WimaxCtrlAgent *ctrlagent_;
  268.   /**
  269.    * List of the upcoming Fast Ranging allocation 
  270.    */
  271.   struct fastRangingInfo fast_ranging_head_;
  272. };
  273. #endif //BSSCHEDULER_H