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

网络

开发平台:

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. #include "connection.h"
  19. #include "connectionmanager.h"
  20. #include "mac802_16.h"
  21. static int basicIndex = BASIC_CID_START;
  22. static int primaryIndex = PRIMARY_CID_START;
  23. static int transportIndex = TRANSPORT_SEC_CID_START;
  24. static int multicastIndex = MULTICAST_CID_START;
  25. /**
  26.  * Constructor used by BS to automatically assign CIDs
  27.  * @param type The connection type. 
  28.  */
  29. Connection::Connection (ConnectionType_t type) : peer_(0), 
  30.  frag_status_(FRAG_NOFRAG), 
  31.  frag_nb_(0), 
  32.  frag_byte_proc_(0),
  33.  frag_enable_(true)
  34. {
  35.    switch (type) {
  36.    case CONN_INIT_RANGING:
  37.      cid_ = INITIAL_RANGING_CID;
  38.      break;
  39.    case CONN_AAS_INIT_RANGING:
  40.      cid_ = AAS_INIT_RANGIN_CID;
  41.      break;
  42.    case CONN_PADDING:
  43.      cid_ = PADDING_CID;
  44.      break;
  45.    case CONN_BROADCAST:
  46.      cid_ = BROADCAST_CID;
  47.      break;
  48.    case CONN_MULTICAST_POLLING:
  49.      cid_ = multicastIndex++;
  50.      assert (multicastIndex <= MULTICAST_CID_STOP);
  51.      break;
  52.    case CONN_BASIC:
  53.      cid_ = basicIndex++;
  54.      assert (basicIndex <= BASIC_CID_STOP);
  55.      break;
  56.    case CONN_PRIMARY:
  57.      cid_ = primaryIndex++;
  58.      assert (primaryIndex <= PRIMARY_CID_STOP);
  59.        break;
  60.    case CONN_SECONDARY:
  61.    case CONN_DATA:
  62.      cid_ = transportIndex++;
  63.      assert (transportIndex <= TRANSPORT_SEC_CID_STOP);
  64.      break;
  65.    default:
  66.      fprintf (stderr, "Unsupported connection typen");
  67.      exit (1);
  68.    }
  69.    type_ = type;
  70.    queue_ = new PacketQueue();
  71. }
  72. /**
  73.  * Constructor used by SSs when the CID is already known
  74.  * @param type The connection type
  75.  * @param cid The connection cid
  76.  */
  77. Connection::Connection (ConnectionType_t type, int cid) : peer_(0), 
  78.   frag_status_(FRAG_NOFRAG), 
  79.   frag_nb_(0), 
  80.   frag_byte_proc_(0),
  81.   frag_enable_(true)
  82. {
  83.   cid_ = cid;
  84.   type_ = type;
  85.   queue_ = new PacketQueue();
  86. }
  87. /**
  88.  * Destructor
  89.  */
  90. Connection::~Connection ()
  91. {
  92.   flush_queue ();
  93. }
  94. /**
  95.  * Set the connection manager
  96.  * @param manager The Connection manager 
  97.  */
  98. void Connection::setManager (ConnectionManager *manager)
  99. {
  100.   manager_ = manager;
  101. }
  102. /**
  103.  * Enqueue the given packet
  104.  * @param p The packet to enqueue
  105.  */
  106. void Connection::enqueue (Packet * p) 
  107. {
  108.   queue_->enque (p);
  109. }
  110. /**
  111.  * Dequeue a packet from the queue
  112.  * @param p The packet to enqueue
  113.  */
  114. Packet * Connection::dequeue () 
  115. {
  116.   return queue_->deque ();
  117. }
  118. /**
  119.  * Flush the queue and return the number of packets freed
  120.  * @return The number of packets flushed
  121.  */
  122. int Connection::flush_queue()
  123. {
  124.   int i=0;
  125.   Packet *p;
  126.   while ( (p=queue_->deque()) ) {
  127.     manager_->getMac()->drop(p, "CON");
  128.     i++;
  129.   }
  130.   return i;
  131. }
  132. /**
  133.  * Return queue size in bytes
  134.  */
  135. int Connection::queueByteLength () 
  136. {
  137.   return queue_->byteLength ();
  138. }
  139. /**
  140.  * Return queue size in bytes
  141.  */
  142. int Connection::queueLength () 
  143. {
  144.   return queue_->length ();
  145. }
  146. /** 
  147.  * Update the fragmentation information
  148.  * @param status The new fragmentation status
  149.  * @param index The new fragmentation index
  150.  * @param bytes The number of bytes 
  151.  */
  152. void Connection::updateFragmentation (fragment_status status, int index, int bytes)
  153. {
  154.   frag_status_ = status;
  155.   frag_nb_ = index;
  156.   frag_byte_proc_ = bytes;
  157. }