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

通讯编程

开发平台:

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 "rbar.h"
  30. #include"mac-802_11mr.h"
  31. #include<otcl.h>
  32. static class RBARClass : public TclClass {
  33. public:
  34. RBARClass() : TclClass("RateAdapter/RBAR") {}
  35. TclObject* create(int, const char*const*) {
  36. return (new RBAR);
  37. }
  38. } class_snr_rate_adapter;
  39. RBAR::RBAR() 
  40. {
  41.  
  42. }
  43. RBAR::~RBAR()
  44. {
  45. }
  46. int RBAR::command(int argc, const char*const* argv)
  47. {
  48.   Tcl& tcl = Tcl::instance();
  49. if(argc == 4)
  50.     {
  51.       if (strcasecmp(argv[1], "phymode") == 0) 
  52. {
  53.   cerr << "Error in RBAR::command "phymode" : command requires further argument (SNR threshold) " << endl;
  54.   return TCL_ERROR;
  55. }   
  56.     } 
  57.  else if(argc == 5)
  58.     {
  59.       if (strcasecmp(argv[1], "phymode") == 0) 
  60. {
  61.   PhyMode mode = str2PhyMode(argv[2]);
  62.   if(mode == ModeUnknown)
  63.     {
  64.       cerr << "Error in RateAdapter::command("phymode","<< argv[2] << "," << argv[3] << "," << argv[4] << ") : unknown PHY mode "" << argv[2]  <<""" <<endl;       
  65.       return TCL_ERROR;
  66.     }
  67.   int index = atoi(argv[3]);
  68.   if ((index < 0) || (index >= RA_MAX_NUM_PHY_MODES))
  69.     {
  70.       cerr << "Error in  RateAdapter::command("phymode","<< argv[2] << "," << argv[3] << "," << argv[4] << ") : phymode index out of bounds" << endl;
  71.       return TCL_ERROR;
  72.     }
  73.   double thresh = atof(argv[4]);
  74.   modes[index] = mode;
  75.   snr_thresholds[index] = thresh;
  76.   
  77.   return TCL_OK;     
  78. }   
  79.     }
  80.   // Fallback for unknown commands
  81.   return RateAdapter::command(argc, argv);
  82. }
  83. void RBAR::sendDATA(Packet* p)
  84. {
  85.   hdr_cmn* ch = HDR_CMN(p);
  86.   MultiRateHdr *mrh = HDR_MULTIRATE(p);
  87.   struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  88.   u_int32_t dst = (u_int32_t)ETHER_ADDR(dh->dh_ra);
  89.   u_int32_t src = (u_int32_t)(mac_->addr());
  90.   if((u_int32_t)ETHER_ADDR(dh->dh_ra) == MAC_BROADCAST) 
  91.     {
  92.       // Broadcast packets are always sent at the basic rate
  93.       return;
  94.     }
  95.   double snr =  getSNR(p); 
  96.   assert(getPER());
  97.   
  98.   int idx = 0; 
  99.   while ((idx < numPhyModes_-1) && (snr > snr_thresholds[idx+1])) 
  100.     {
  101.       idx++;      
  102.     }
  103.   
  104.   setModeAtIndex(idx);
  105. }
  106. double RBAR::getSNR(Packet* p)
  107. {
  108.   struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  109.   
  110.   u_int32_t dst = (u_int32_t)ETHER_ADDR(dh->dh_ra);
  111.   u_int32_t src = (u_int32_t)(mac_->addr());
  112.   return getPeerStats(src, dst)->getSnr();  
  113. }