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

通讯编程

开发平台:

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 "ra-snr.h"
  30. #include"mac-802_11mr.h"
  31. static class SnrRateAdapterClass : public TclClass {
  32. public:
  33. SnrRateAdapterClass() : TclClass("RateAdapter/SNR") {}
  34. TclObject* create(int, const char*const*) {
  35. return (new SnrRateAdapter);
  36. }
  37. } class_snr_rate_adapter;
  38. SnrRateAdapter::SnrRateAdapter() 
  39. {
  40.   bind("maxper_", &maxper_); 
  41.   bind("pktsize_", &pktsize_); 
  42. }
  43. SnrRateAdapter::~SnrRateAdapter()
  44. {
  45. }
  46. int SnrRateAdapter::command(int argc, const char*const* argv)
  47. {
  48.  
  49.   // Add TCL commands here...
  50.   // Fallback for unknown commands
  51.   return RateAdapter::command(argc, argv);
  52. }
  53. void SnrRateAdapter::sendDATA(Packet* p)
  54. {
  55.   hdr_cmn* ch = HDR_CMN(p);
  56.   MultiRateHdr *mrh = HDR_MULTIRATE(p);
  57.   struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  58.   u_int32_t dst = (u_int32_t)ETHER_ADDR(dh->dh_ra);
  59.   u_int32_t src = (u_int32_t)(mac_->addr());
  60.   if((u_int32_t)ETHER_ADDR(dh->dh_ra) == MAC_BROADCAST) 
  61.     {
  62.       // Broadcast packets are always sent at the basic rate
  63.       return;
  64.     }
  65.   double snr =  getSNR(p); 
  66.   assert(getPER());
  67.   
  68.   int idx = 0;
  69.   PhyMode pm = getModeAtIndex(idx);
  70.   double per = 0;
  71.   while ( ((idx+1) < numPhyModes_) && (per<maxper_))
  72.     {
  73.       pm = getModeAtIndex(idx + 1);
  74.       per = getPER()->get_per(pm, snr, pktsize_);
  75.       if (per<maxper_)
  76. idx++;      
  77.     }
  78.   
  79.   setModeAtIndex(idx);
  80. }
  81. double SnrRateAdapter::getSNR(Packet* p)
  82. {
  83.   struct hdr_mac802_11* dh = HDR_MAC802_11(p);
  84.   
  85.   u_int32_t dst = (u_int32_t)ETHER_ADDR(dh->dh_ra);
  86.   u_int32_t src = (u_int32_t)(mac_->addr());
  87.   return getPeerStats(src, dst)->getSnr();  
  88. }