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

网络

开发平台:

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 CONNECTION_H
  19. #define CONNECTION_H
  20. #include "serviceflow.h"
  21. #include "packet.h"
  22. #include "queue.h"
  23. #include "mac802_16pkt.h"
  24. /* CONSTANTS */
  25. #define INITIAL_RANGING_CID 0x0000
  26. #define BASIC_CID_START     0x0001
  27. #define BASIC_CID_STOP      0x2000
  28. #define PRIMARY_CID_START   0x2001
  29. #define PRIMARY_CID_STOP    0x4000
  30. #define TRANSPORT_SEC_CID_START 0x4001
  31. #define TRANSPORT_SEC_CID_STOP 0xFEFE
  32. #define AAS_INIT_RANGIN_CID 0xFEFF
  33. #define MULTICAST_CID_START 0xFF00
  34. #define MULTICAST_CID_STOP  0xFFFD
  35. #define PADDING_CID         0xFFFE
  36. #define BROADCAST_CID       0xFFFF
  37. /**
  38.  * Define the type of the connection
  39.  */
  40. enum ConnectionType_t {
  41.   CONN_INIT_RANGING,
  42.   CONN_AAS_INIT_RANGING,
  43.   CONN_MULTICAST_POLLING,
  44.   CONN_PADDING,
  45.   CONN_BROADCAST,
  46.   CONN_BASIC,
  47.   CONN_PRIMARY,
  48.   CONN_SECONDARY,
  49.   CONN_DATA
  50. };
  51. class PeerNode;
  52. class ConnectionManager;
  53. class Connection;
  54. LIST_HEAD (connection, Connection);
  55. /** 
  56.  * Class Connection
  57.  * The class supports LIST.
  58.  */ 
  59. class Connection {
  60.  public:
  61.   /** constructor */
  62.   Connection (ConnectionType_t);
  63.   /** constructor */
  64.   Connection (ConnectionType_t, int cid);    
  65.   /** destructor */
  66.   ~Connection ();
  67.   /**
  68.    * Set the connection manager
  69.    * @param manager The Connection manager 
  70.    */
  71.   void setManager (ConnectionManager *manager);
  72.   /**
  73.    * Enqueue the given packet
  74.    * @param p The packet to enqueue
  75.    */
  76.   void  enqueue (Packet * p);
  77.   
  78.   /**
  79.    * Set the service flow for this connection
  80.    * @param sflow The service flow for this connection
  81.    */
  82.   void  setServiceFlow (ServiceFlow * sflow);
  83.   
  84.   /**
  85.    * Return the service flow for this connection
  86.    */
  87.   ServiceFlow *  getServiceFlow ();
  88.   /**
  89.    * Get the value of cid
  90.    * The connection id
  91.    * @return the value of cid
  92.    */
  93.   inline int get_cid ( ) { return cid_; }
  94.   /**
  95.    * Get the value of category_
  96.    * The connection id
  97.    * @return the value of category_
  98.    */
  99.   inline ConnectionType_t get_category ( ) { return category_; }
  100.       
  101.   /**
  102.    * Set the value of category_
  103.    * The connection id
  104.    * @return the value of category_
  105.    */
  106.   inline void set_category (ConnectionType_t value ) { category_ = value; }
  107.     
  108.   /**
  109.    * Get the value of serviceflow_
  110.    * The service flow associated with the connection
  111.    * @return the value of serviceflow_
  112.    */
  113.   inline ServiceFlow * get_serviceflow ( ) { return serviceflow_; }
  114.   
  115.   /**
  116.    * Set the value of serviceflow_
  117.    * The service flow associated with the connection
  118.    * @return the value of serviceflow_
  119.    */
  120.   inline void set_serviceflow (ServiceFlow * value ) { serviceflow_ = value; }
  121.   
  122.   /**
  123.    * return the connection type
  124.    * @return The connection type
  125.    */
  126.   inline ConnectionType_t getType () { return type_; }
  127.   /**
  128.    * Get the value of queue_
  129.    * The queue for this connection
  130.    * @return the value of queue_
  131.    */
  132.   inline PacketQueue * get_queue ( ) { return queue_; }
  133.     
  134.   /**
  135.    * Dequeue a packet from the queue
  136.    * @param p The packet to enqueue
  137.    */
  138.   Packet * dequeue ();
  139.   /**
  140.    * Return queue size in bytes
  141.    * @return The queue size in bytes
  142.    */
  143.   int queueByteLength ();
  144.   /**
  145.    * Return queue size in number of packets
  146.    * @return The number of packet in the queue
  147.    */
  148.   int queueLength ();
  149.   /**
  150.    * Flush the queue
  151.    */
  152.   int flush_queue ();
  153.   /**
  154.    * Enable/Disable fragmentation
  155.    */
  156.   void enable_fragmentation (bool enable) { frag_enable_ = enable; }
  157.   /**
  158.    * Indicates if the connection supports fragmentation
  159.    */
  160.   bool isFragEnable () { return frag_enable_; }
  161.   // Chain element to the list
  162.   inline void insert_entry(struct connection *head) {
  163.     LIST_INSERT_HEAD(head, this, link);
  164.   }
  165.   
  166.   // Return next element in the chained list
  167.   Connection* next_entry(void) const { return link.le_next; }
  168.   // Remove the entry from the list
  169.   inline void remove_entry() { 
  170.     LIST_REMOVE(this, link); 
  171.   }
  172.   /**
  173.    * Return the peer node for this connection
  174.    * @return the peer node for this connection
  175.    */
  176.   inline PeerNode * getPeerNode () { return peer_; }
  177.   /**
  178.    * Set the peer node for this connection
  179.    * @param the peer node for this connection
  180.    */
  181.   inline void setPeerNode (PeerNode *peer) { peer_=peer; }
  182.   /** 
  183.    * Update the fragmentation information
  184.    * @param status The new fragmentation status
  185.    * @param index The new fragmentation index
  186.    * @param bytes The number of bytes 
  187.    */
  188.   void updateFragmentation (fragment_status status, int index, int bytes);
  189.   fragment_status getFragmentationStatus () { return frag_status_; }
  190.   int getFragmentNumber () { return frag_nb_; }
  191.   int getFragmentBytes () { return frag_byte_proc_; }
  192.  protected:
  193.   /**
  194.    * Pointer to next in the list
  195.    */
  196.   LIST_ENTRY(Connection) link;
  197.   //LIST_ENTRY(Connection); //for magic draw
  198.  private:
  199.   /**
  200.    * The connection manager
  201.    */
  202.   ConnectionManager* manager_;
  203.   /**
  204.    * The connection id
  205.    */
  206.   int cid_;
  207.   /**
  208.    * The category
  209.    */
  210.   ConnectionType_t category_;
  211.   /**
  212.    * The service flow associated with the connection
  213.    */
  214.   ServiceFlow * serviceflow_;
  215.   /**
  216.    * The queue for this connection
  217.    */
  218.   PacketQueue * queue_;
  219.   /** 
  220.    * The connection type
  221.    */
  222.   ConnectionType_t type_;
  223.   
  224.   /**
  225.    * Pointer to the peer node data
  226.    */
  227.   PeerNode *peer_;
  228.   /**
  229.    * Fragmentation status 
  230.    */
  231.   fragment_status frag_status_;
  232.   /**
  233.    * Fragmentation number
  234.    */
  235.   int frag_nb_;
  236.   
  237.   /**
  238.    * Bytes already processed (i.e sent or received)
  239.    */
  240.   int frag_byte_proc_;
  241.   /**
  242.    * Indicates if the connection can use fragmentation
  243.    */
  244.   bool frag_enable_;
  245. };
  246. #endif //CONNECTION_H