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

网络

开发平台:

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 "connectionmanager.h"
  19. #include "mac802_16.h"
  20. /**
  21.  * Create the manager for the given mac
  22.  * @param mac The Mac where the manager is located
  23.  */
  24. ConnectionManager::ConnectionManager (Mac802_16 * mac) 
  25. {
  26.   assert (mac!=NULL);
  27.   mac_ = mac;
  28.   //init list
  29.   LIST_INIT (&up_con_list_);
  30.   LIST_INIT (&down_con_list_);
  31. }
  32. /**
  33.  * Add a connection to the list
  34.  * @param con The connection to add
  35.  * @param incoming true if it is an uplink connection
  36.  */
  37. void ConnectionManager::add_connection (Connection* con, bool uplink) {
  38.   assert (con!=NULL);
  39.   assert (!get_connection (con->get_cid(), uplink)); //check duplicate
  40.   mac_->debug ("At %f in %d adding %s connection %dn", 
  41.        NOW, mac_->addr(), uplink?"uplink":"downlink", con->get_cid());
  42.   if (uplink)
  43.     con->insert_entry (&up_con_list_);
  44.   else
  45.     con->insert_entry (&down_con_list_);
  46.   con->setManager(this);
  47. }
  48. /**
  49.  * Remove a connection
  50.  * @param The connection to remove
  51.  */
  52. void ConnectionManager::remove_connection (Connection* con) {
  53.   assert (con !=NULL);
  54.   mac_->debug ("At %f in %d removing connection %dn", 
  55.        NOW, mac_->addr(), con->get_cid());
  56.   con->remove_entry ();
  57. }
  58. /**
  59.  * Remove connection by CID, both directions.
  60.  * @param cid The connection id
  61.  */
  62. void ConnectionManager::remove_connection (int cid)
  63. {
  64.   Connection *con = get_connection (cid, true);
  65.   if (con)
  66.     remove_connection (con);
  67.   con = get_connection (cid, false);
  68.   if (con)
  69.     remove_connection (con);
  70. }
  71.   
  72. /**
  73.  * Return the connection that has the given CID
  74.  * @param cid The connection ID
  75.  * @param uplink The direction
  76.  * @return the connection or NULL
  77.  */
  78. Connection* ConnectionManager::get_connection (int cid, bool uplink) {
  79.   //search throught the list
  80.   for (Connection *n=uplink?up_con_list_.lh_first:down_con_list_.lh_first; 
  81.        n; n=n->next_entry()) {
  82.     if (n->get_cid ()==cid)
  83.       return n;
  84.   }
  85.   return NULL;
  86. }
  87. /**
  88.  * Flush the queues. This can be called after switching BS.
  89.  */
  90. void ConnectionManager::flush_queues () {
  91.   mac_->debug ("At %f in %d Flushing queuesn", NOW, mac_->addr());
  92.   for (Connection *n=down_con_list_.lh_first; n; n=n->next_entry()) {
  93.     int i = n->flush_queue();
  94.     mac_->debug ("tFreed %d packet in queue for connection %dn", i, n->get_cid());
  95.   }
  96. }