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

网络

开发平台:

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 MAC802_16_H
  19. #define MAC802_16_H
  20. #include "sduclassifier.h"
  21. #include "connectionmanager.h"
  22. #include "serviceflowhandler.h"
  23. #include "serviceflowqos.h"
  24. #include "peernode.h"
  25. #include "mac.h"
  26. #include "mac802_16pkt.h"
  27. #include "mac802_16timer.h"
  28. //Define new debug function for cleaner code
  29. #ifdef DEBUG_WIMAX
  30. #define debug2 printf 
  31. #else
  32. #define debug2(arg1,...) 
  33. #endif
  34. #define BS_NOT_CONNECTED -1 //bs_id when MN is not connected
  35. #define DL_PREAMBLE 3  //preamble+fch
  36. #define INIT_RNG_PREAMBLE 2
  37. #define BW_REQ_PREAMBLE 1
  38. /** Defines different types of nodes */
  39. enum station_type_t {
  40.   STA_UNKNOWN,
  41.   STA_MN,
  42.   STA_BS
  43. };
  44. /** Defines the state of the MAC */
  45. enum Mac802_16State {
  46.   MAC802_16_DISCONNECTED,
  47.   MAC802_16_WAIT_DL_SYNCH,
  48.   MAC802_16_WAIT_DL_SYNCH_DCD,
  49.   MAC802_16_UL_PARAM,
  50.   MAC802_16_RANGING,
  51.   MAC802_16_WAIT_RNG_RSP,
  52.   MAC802_16_REGISTER,
  53.   MAC802_16_SCANNING,
  54.   MAC802_16_CONNECTED
  55. };
  56. /** Data structure to store MAC state */
  57. struct state_info {
  58.   Mac802_16State state; 
  59.   int bs_id;
  60.   double frameduration;
  61.   int frame_number;
  62.   int channel;
  63.   ConnectionManager * connectionManager;
  64.   ServiceFlowHandler * serviceFlowHandler;
  65.   struct peerNode *peer_list;
  66. };
  67. /** Defines profiles */
  68. struct phyprofile {
  69.   int nb_channel; //number of valid channel in the array
  70.   int current; //index of the channel currently used
  71.   double freq[]; //list of channel frequencies
  72. };
  73. /** MAC MIB */
  74. class Mac802_16MIB {
  75.  public: 
  76.   Mac802_16MIB (Mac802_16 *parent);
  77.  
  78.   int queue_length;
  79.   double frame_duration;
  80.   double dcd_interval;
  81.   double ucd_interval;
  82.   double init_rng_interval;
  83.   double lost_dlmap_interval;
  84.   double lost_ulmap_interval;
  85.   
  86.   double t1_timeout;
  87.   double t2_timeout;
  88.   double t3_timeout;
  89.   double t6_timeout;
  90.   double t12_timeout;
  91.   double t16_timeout;
  92.   double t17_timeout;
  93.   double t21_timeout;
  94.   double t44_timeout;
  95.   u_int32_t contention_rng_retry;
  96.   u_int32_t invited_rng_retry;
  97.   u_int32_t request_retry;
  98.   u_int32_t reg_req_retry;
  99.   double    tproc;
  100.   u_int32_t dsx_req_retry;
  101.   u_int32_t dsx_rsp_retry;
  102.   u_int32_t rng_backoff_start;
  103.   u_int32_t rng_backoff_stop;
  104.   u_int32_t bw_backoff_start;
  105.   u_int32_t bw_backoff_stop;
  106.   //mobility extension
  107.   u_int32_t scan_duration;
  108.   u_int32_t interleaving;
  109.   u_int32_t scan_iteration;
  110.   u_int32_t max_dir_scan_time;
  111.   double    nbr_adv_interval;
  112.   u_int32_t scan_req_retry;
  113.   //miscalleous
  114.   double rxp_avg_alpha;  //for measurements
  115.   double lgd_factor_; 
  116.   double RXThreshold_;
  117.   double client_timeout; //used to clear information on BS side
  118. };
  119. /** PHY MIB */
  120. class Phy802_16MIB {
  121.  public: 
  122.   Phy802_16MIB (Mac802_16 *parent);
  123.  
  124.   int channel; //current channel
  125.   double fbandwidth;
  126.   u_int32_t ttg; 
  127.   u_int32_t rtg;
  128. };
  129. class WimaxScheduler;
  130. class FrameMap;
  131. class StatTimer;
  132. /**
  133.  * Class implementing IEEE 802_16
  134.  */ 
  135. class Mac802_16 : public Mac {
  136.   friend class PeerNode;
  137.   friend class SDUClassifier;
  138.   friend class WimaxFrameTimer;
  139.   friend class FrameMap;
  140.   friend class WimaxScheduler;
  141.   friend class BSScheduler;
  142.   friend class SSscheduler;
  143.   friend class ServiceFlowHandler;
  144.   friend class Connection;
  145.   friend class StatTimer;
  146.  public:
  147.   Mac802_16();
  148.   /**
  149.    * Return the connection manager
  150.    * @return the connection manager
  151.    */
  152.   inline ConnectionManager *  getCManager () { return connectionManager_; }
  153.   
  154.   /**
  155.    * Return The Service Flow handler
  156.    * @return The Service Flow handler
  157.    */
  158.   inline ServiceFlowHandler *  getServiceHandler () { return serviceFlowHandler_; }
  159.   
  160.   /**
  161.    * Return the Scheduler
  162.    * @return the Scheduler
  163.    */
  164.   inline WimaxScheduler * getScheduler () { return scheduler_; }
  165.   /**
  166.    * Return the frame duration (in s)
  167.    * @return the frame duration (in s)
  168.    */
  169.   double  getFrameDuration () { return macmib_.frame_duration; }
  170.   
  171.   /**
  172.    * Set the frame duration
  173.    * @param duration The frame duration (in s)
  174.    */
  175.   void  setFrameDuration (double duration) { macmib_.frame_duration = duration; }
  176.   
  177.   /**
  178.    * Return the current frame number
  179.    * @return the current frame number
  180.    */
  181.   int getFrameNumber ();
  182.   /**
  183.    * Add a flow
  184.    * @param qos The QoS required
  185.    * @param handler The entity that requires to add a flow
  186.    */
  187.   void  addFlow (ServiceFlowQoS * qos, void * handler);
  188.   /**
  189.    * Return the head of the peer nodes list
  190.    * @return the head of the peer nodes list
  191.    */
  192.   PeerNode * getPeerNode_head () { return peer_list_->lh_first; }
  193.   /**
  194.    * Return the peer node that has the given address
  195.    * @param index The address of the peer
  196.    * @return The peer node that has the given address
  197.    */
  198.   PeerNode *getPeerNode (int index);
  199.   /**
  200.    * Add the peer node
  201.    * @param The peer node to add
  202.    */
  203.   void addPeerNode (PeerNode *node);
  204.   /**
  205.    * Remove a peer node
  206.    * @param The peer node to remove
  207.    */
  208.   void removePeerNode (PeerNode *node);
  209.   /**
  210.    * Interface with the TCL script
  211.    * @param argc The number of parameter
  212.    * @param argv The list of parameters
  213.    */
  214.   int command(int argc, const char*const* argv);
  215.   /**
  216.    * Set the mac state
  217.    * @param state The new mac state
  218.    */  
  219.   void setMacState (Mac802_16State state);
  220.   /**
  221.    * Return the mac state
  222.    * @return The new mac state
  223.    */  
  224.   Mac802_16State getMacState ();
  225.   /**
  226.    * Change the channel
  227.    * @param channel The new channel
  228.    */
  229.   void setChannel (int channel);
  230.   /**
  231.    * Return the channel index
  232.    * @return The channel
  233.    */
  234.   int getChannel ();
  235.   /**
  236.    * Return the channel number for the given frequency
  237.    * @param freq The frequency
  238.    * @return The channel number of -1 if the frequency does not match
  239.    */
  240.   int getChannel (double freq);
  241.   /**
  242.    * Set the channel to the next from the list
  243.    * Used at initialisation and when loosing signal
  244.    */
  245.   void nextChannel ();
  246.   /**
  247.    * Process packets going out
  248.    * @param p The packet to transmit
  249.    */
  250.   void sendDown(Packet *p);
  251.   /**
  252.    * Process packets going out
  253.    * @param p The packet to transmit
  254.    */
  255.   void transmit(Packet *p);
  256.         
  257.   /**
  258.    * Process incoming packets 
  259.    * @param p The received packet
  260.    */
  261.   void sendUp(Packet *p);
  262.   /**
  263.    * Process the packet after receiving last bit
  264.    */
  265.   void receive();
  266.   /**
  267.    * Creates a snapshot of the MAC's state and reset it
  268.    * @return The snapshot of the MAC's state
  269.    */
  270.   state_info *backup_state ();
  271.   /**
  272.    * Restore the state of the Mac
  273.    * @param state The state to restore
  274.    */
  275.   void restore_state (state_info *state);  
  276.   /**
  277.    * Set the variable used to find out if upper layers
  278.    * must be notified to send packets. During scanning we
  279.    * do not want upper layers to send packet to the mac.
  280.    * @param notify Value indicating if we want to receive packets 
  281.    * from upper layers
  282.    */
  283.   void setNotify_upper (bool notify);
  284.   /**
  285.    * Return the PHY layer
  286.    * @return The physical layer
  287.    */
  288.   OFDMPhy* getPhy ();
  289.   /**
  290.    * The MAC MIB
  291.    */
  292.    Mac802_16MIB macmib_;
  293.    /**
  294.     * The Physical layer MIB
  295.     */
  296.    Phy802_16MIB phymib_;
  297. #ifdef USE_802_21 //Switch to activate when using 802.21 modules (external package)
  298.    /* 
  299.     * Configure/Request configuration
  300.     * The upper layer sends a config object with the required 
  301.     * new values for the parameters (or PARAMETER_UNKNOWN_VALUE).
  302.     * The MAC tries to set the values and return the new setting.
  303.     * For examples if a MAC does not support a parameter it will
  304.     * return  PARAMETER_UNKNOWN_VALUE
  305.     * @param config The configuration object
  306.     */ 
  307.    void link_configure (link_parameter_config_t* config);
  308.    /* 
  309.     * Configure the threshold values for the given parameters
  310.     * @param numLinkParameter number of parameter configured
  311.     * @param linkThresholds list of parameters and thresholds
  312.     */
  313.    struct link_param_th_status * link_configure_thresholds (int numLinkParameter, struct link_param_th *linkThresholds); //configure threshold
  314.         
  315.    /*
  316.     * Disconnect from the PoA
  317.     */
  318.    void link_disconnect ();
  319.    /*
  320.     * Connect to the PoA
  321.     * @param poa The address of PoA
  322.     */
  323.    void link_connect (int poa);
  324.      
  325. #endif
  326.    
  327.  protected:
  328.    /**
  329.     * Initialize default connection
  330.     */
  331.    void init_default_connections ();
  332.    /**
  333.     * The packet scheduler
  334.     */
  335.    WimaxScheduler * scheduler_;
  336.    
  337.    /**
  338.     * Return a new allocated packet
  339.     * @return A newly allocated packet 
  340.     */
  341.    Packet * getPacket();
  342.    
  343.    /*
  344.     * Return the code for the frame duration
  345.     * @return the code for the frame duration
  346.     */
  347.    int getFrameDurationCode ();
  348.    
  349.    /*
  350.     * Set the frame duration using code
  351.     * @param code The frame duration code
  352.     */
  353.    void setFrameDurationCode (int code);
  354.    
  355.    /**
  356.     * Current frame number
  357.     */
  358.    int frame_number_;
  359.    
  360.    /**
  361.     * Statistics for queueing delay
  362.     */
  363.    StatWatch delay_watch_; 
  364.    
  365.    /**
  366.     * Delay for last packet
  367.     */
  368.    double last_tx_delay_;
  369.    /**
  370.     * Statistics for delay jitter 
  371.     */
  372.    StatWatch jitter_watch_;
  373.    
  374.    /**
  375.     * Stats for packet loss
  376.     */
  377.    StatWatch loss_watch_;
  378.    /**
  379.     * Stats for incoming data throughput
  380.     */
  381.    ThroughputWatch rx_data_watch_;
  382.    /**
  383.     * Stats for incoming traffic throughput (data+management)
  384.     */
  385.    ThroughputWatch rx_traffic_watch_;
  386.    /**
  387.     * Stats for outgoing data throughput
  388.     */
  389.    ThroughputWatch tx_data_watch_;
  390.    /**
  391.     * Stats for outgoing traffic throughput (data+management)
  392.     */
  393.    ThroughputWatch tx_traffic_watch_;
  394.    /**
  395.     * Timers to continuously poll stats in case it is not updated by
  396.     * sending or receiving packets
  397.     */
  398.    StatTimer *rx_data_timer_;
  399.    StatTimer *rx_traffic_timer_;
  400.    StatTimer *tx_data_timer_;
  401.    StatTimer *tx_traffic_timer_;
  402.    /**
  403.     * Indicates if the stats must be printed
  404.     */
  405.    int print_stats_;
  406.    
  407.    /**
  408.     * Update the given timer and check if thresholds are crossed
  409.     * @param watch the stat watch to update
  410.     * @param value the stat value
  411.     */
  412.    void update_watch (StatWatch *watch, double value);
  413.    /**
  414.     * Update the given timer and check if thresholds are crossed
  415.     * @param watch the stat watch to update
  416.     * @param size the size of packet received
  417.     */
  418.    void update_throughput (ThroughputWatch *watch, double size);
  419. #ifdef USE_802_21 //Switch to activate when using 802.21 modules (external package)
  420.    /**
  421.     * Poll the given stat variable to check status
  422.     * @param type The link parameter type
  423.     */
  424.    void poll_stat (link_parameter_t type);
  425. #endif
  426.  private:
  427.    /**
  428.     * The list of classifier
  429.     */
  430.    struct sduClassifier classifier_list_;
  431.    
  432.    /**
  433.     * List of connected peer nodes. Only one for SSs.
  434.     */
  435.    struct peerNode *peer_list_;
  436.    
  437.    /**
  438.     * The class to handle connections
  439.     */
  440.    ConnectionManager * connectionManager_;
  441.    
  442.    /**
  443.     * The module that handles flow requests
  444.     */
  445.    ServiceFlowHandler * serviceFlowHandler_;
  446.    /**
  447.     * Packet being received
  448.     */
  449.    Packet *pktRx_;
  450.    /**
  451.     * A packet buffer used to temporary store a packet 
  452.     * received by upper layer. Used during scanning
  453.     */
  454.    Packet *pktBuf_;
  455.    /**
  456.     * Add a classifier
  457.     */
  458.    void addClassifier (SDUClassifier *);
  459.    /**
  460.     * Set the node type
  461.     * @param type The station type
  462.     */
  463.    void setStationType (station_type_t type);
  464.    /*
  465.     * The type of station (MN or BS) 
  466.     */
  467.    station_type_t type_;
  468.    /*
  469.     * Address of the Base Station. If STA is BS then equal index_
  470.     */
  471.    int bs_id_;
  472.    /*
  473.     * The state of the MAC
  474.     */
  475.    Mac802_16State state_;
  476.    /**
  477.     * Receiving timer
  478.     */
  479.    WimaxRxTimer rxTimer_;
  480.    /**
  481.     * Indicates if a collision occured
  482.     */
  483.    bool collision_;
  484.    /**
  485.     * Indicate if upper layer must be notified to send more packets
  486.     */
  487.    bool notify_upper_;
  488.    /**
  489.     * Last time a packet was sent
  490.     */
  491.    double last_tx_time_;
  492.    /**
  493.     * Last transmission duration
  494.     */
  495.    double last_tx_duration_;
  496. };
  497. /** Class to poll stats */
  498. class StatTimer : public TimerHandler {
  499.  public:
  500.   StatTimer (Mac802_16 *mac, ThroughputWatch *watch) : TimerHandler() {
  501.     mac_ = mac;
  502.     watch_ = watch;
  503.     timer_interval_ = 0.1; //default 100ms
  504.     resched (timer_interval_);
  505.   }
  506.     void expire (Event *) {
  507.       mac_->update_throughput (watch_, 0);
  508.       //double tmp = watch_->get_timer_interval();
  509.       //resched(tmp > 0? tmp: timer_interval_);
  510.     }
  511.     inline void set_timer_interval(double ti) { timer_interval_ = ti; }
  512.  private:
  513.     Mac802_16 *mac_;
  514.     ThroughputWatch *watch_;
  515.     double timer_interval_;
  516. };
  517. #endif //MAC802_16_H