rateadapter.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2007 Regents of the SIGNET lab, University of Padova.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. Neither the name of the University of Padova (SIGNET lab) nor the 
  14.  *    names of its contributors may be used to endorse or promote products 
  15.  *    derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
  18.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 
  19.  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  20.  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
  21.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
  22.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
  23.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
  24.  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
  25.  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
  26.  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
  27.  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28.  */
  29. #include"rateadapter.h"
  30. #include"mac-802_11mr.h"
  31. #include <errno.h>
  32. static class RateAdapterClass : public TclClass {
  33. public:
  34. RateAdapterClass() : TclClass("RateAdapter") {}
  35. TclObject* create(int, const char*const*) {
  36. return (new RateAdapter());
  37. }
  38. } class_rate_adapter;
  39. RateAdapter::RateAdapter()
  40.   : curr_mode_index(0),
  41.     file(0)
  42. {
  43.   bind("numPhyModes_", &numPhyModes_);  
  44.   bind("debug_", &debug_);
  45.   for (int i=0; i<RA_MAX_NUM_PHY_MODES; i++)
  46.     modes[i] = ModeUnknown;
  47. }
  48. RateAdapter::~RateAdapter()
  49. {
  50.   fclose(file);
  51. }
  52. int RateAdapter::command(int argc, const char*const* argv)
  53. {
  54.   Tcl& tcl = Tcl::instance();
  55.   if(argc == 2)
  56.     {
  57.       if (strcasecmp(argv[1], "getRate") == 0) {
  58. tcl.resultf("%d", getDataMode() );                   return TCL_OK;
  59.   return TCL_OK;
  60.       }
  61.     } 
  62.   else if(argc == 3)
  63.     {    
  64.       if (strcasecmp(argv[1], "setmodeatindex") == 0) {
  65. int idx = atoi(argv[2]);
  66. if (debug_) 
  67.   cerr << " setmodeatindex " << idx << endl ; 
  68. setModeAtIndex(idx);
  69. return TCL_OK;
  70.       }
  71.       if (strcasecmp(argv[1], "initlog") == 0) 
  72. {   
  73.   if (!file)    
  74.     file= fopen(argv[2],"a");
  75.   else 
  76.     {
  77.       cerr << "ERROR: RateAdapter::command(initlog, " 
  78.    << argv[2] << ") : FILE* file already initialized" << endl;
  79.       return TCL_ERROR;
  80.     }
  81.   if (file == NULL)
  82.     {
  83.       cerr << "ERROR: RateAdapter::command(initlog, " 
  84.    << argv[2] << ") cannot open file: " << strerror(errno) << endl;
  85.       return TCL_ERROR;
  86.     }
  87.   return TCL_OK;
  88. }
  89.     }
  90.   else if(argc == 4)
  91.     {
  92.       if (strcasecmp(argv[1], "phymode") == 0) 
  93. {
  94.   PhyMode mode = str2PhyMode(argv[2]);
  95.   if(mode == ModeUnknown)
  96.     {
  97.       cerr << "Error in RateAdapter::command("phymode","<< argv[2] << "," << argv[3] << ") : unknown PHY mode "" << argv[2]  <<""" <<endl;       
  98.       return TCL_ERROR;
  99.     }
  100.   int index = atoi(argv[3]);
  101.   if ((index < 0) || (index >= RA_MAX_NUM_PHY_MODES))
  102.     {
  103.       cerr << "Error in  RateAdapter::command("phymode","<< argv[2] << "," << argv[3] << ") : phymode index out of bounds" << endl;
  104.       return TCL_ERROR;
  105.     }
  106.   
  107.   modes[index] = mode;
  108.   
  109.   return TCL_OK;     
  110. }   
  111.     }
  112.   // Fallback for unknown commands
  113.   return Mac80211EventHandler::command(argc, argv);
  114. }
  115. int RateAdapter::incrMode()
  116. {
  117.   checkConfiguration();
  118.   
  119.   if (curr_mode_index < (numPhyModes_ - 1))  
  120.     {
  121.       curr_mode_index++;
  122.       setDataMode(modes[curr_mode_index]);
  123.       if (file != 0)
  124. {
  125.   fprintf(file," %e %d n", NOW, getDataMode());
  126.   fflush(file);         
  127. }
  128.       
  129.       if (debug_)
  130. cerr << "RateAdapter: increasing rate to " << PhyMode2str(getCurrMode()) << endl;
  131.       return 0;
  132.     }
  133.   if (debug_)
  134.     cerr << "RateAdapter: cannot increase rate above " << PhyMode2str(getCurrMode()) << endl;
  135.   return 1;
  136. }
  137. int RateAdapter::decrMode()
  138. {
  139.   checkConfiguration();
  140.   
  141.   if (curr_mode_index > 0)
  142.     {
  143.       curr_mode_index--;
  144.       setDataMode(modes[curr_mode_index]);
  145.       
  146.       if (file != 0)
  147. {
  148.   fprintf(file," %e %d n", NOW, getDataMode());
  149.   fflush(file);         
  150. }
  151.       if (debug_)
  152. cerr << "RateAdapter: decreasing rate to " << PhyMode2str(getCurrMode()) << endl;
  153.       return 0;
  154.     }
  155.   if (debug_)
  156.     cerr << "RateAdapter: cannot decrease rate below " << PhyMode2str(getCurrMode()) << endl;
  157.   return 1;
  158. }
  159.  
  160. PhyMode RateAdapter::getCurrMode()
  161. {
  162.   return (modes[curr_mode_index]);
  163. }
  164.  
  165. PhyMode RateAdapter::getModeAtIndex(int idx)
  166. {
  167.   assert(idx >= 0);
  168.   assert(idx <  RA_MAX_NUM_PHY_MODES);
  169.   assert(idx < numPhyModes_);
  170.   return modes[idx];
  171. }
  172. void RateAdapter::setModeAtIndex(int idx)
  173. {
  174.   assert(idx >= 0);
  175.   assert(idx <  RA_MAX_NUM_PHY_MODES);
  176.   assert(idx < numPhyModes_);
  177.   curr_mode_index = idx;
  178.   setDataMode(modes[curr_mode_index]);
  179.   
  180.   if (file != 0)   
  181.     {
  182.       fprintf(file," %e %d %en", NOW, getDataMode(), getPhyMib()->getRate(getDataMode()));
  183.     }
  184. }
  185. void RateAdapter::checkConfiguration()
  186. {
  187.   if (numPhyModes_==0)
  188.     {
  189.       cerr << "RateAdapter::checkConfiguration() ERROR: numPhyModes_==0 " << endl
  190.    << "Did you initialize the PhyModes to be used for rate adaptation?" << endl;
  191.       exit(1);
  192.     }
  193.   
  194.     if (numPhyModes_>= RA_MAX_NUM_PHY_MODES)
  195.     {
  196.       cerr << "RateAdapter::checkConfiguration() ERROR: numPhyModes_ >= RA_MAX_NUM_PHY_MODES" << endl;
  197.       exit(1);
  198.     }
  199.     if (getCurrMode() == ModeUnknown)
  200.     {
  201.       cerr << "RateAdapter::checkConfiguration() ERROR: Current Mode == ModeUnknown" << endl;
  202.       exit(1);
  203.     }
  204. }