src/devices/wifi/amrr-mac-stations.cc
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 13 Dec 2007 14:43:56 +0100
changeset 2274 406712a0c6ef
parent 2273 0bfe240ec168
child 2275 f1ae27b37d8f
permissions -rw-r--r--
implement AMRR for true.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2273
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2003,2007 INRIA
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 *
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as 
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 *
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 *
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 *
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 */
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#include "amrr-mac-stations.h"
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
#include "ns3/default-value.h"
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
#include "ns3/time-default-value.h"
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
#include "ns3/simulator.h"
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
#include "ns3/log.h"
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    26
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    27
NS_LOG_COMPONENT_DEFINE ("AmrrMacStation");
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    28
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
namespace ns3 {
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    31
static TimeDefaultValue g_updatePeriod
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    32
("WifiAmrrUpdatePeriod",
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
 "The interval between decisions about rate control changes",
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    34
 Seconds (1.0));
2274
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    35
static NumericDefaultValue<double> g_failureRatio
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    36
("WifiAmrrFailureRatio",
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    37
 "Ratio of erronous transmissions needed to switch to a lower rate",
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    38
 1.0/3.0);
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    39
static NumericDefaultValue<double> g_successRatio
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    40
("WifiAmrrSuccessRatio",
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    41
 "Ratio of successful transmissions needed to switch to a higher rate",
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    42
 1.0/10.0);
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    43
static NumericDefaultValue<uint32_t> g_maxSuccessThreshold
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    44
("WifiAmrrMaxSuccessThreshold",
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    45
 "maximum number of consecutive success periods needed to switch to a higher rate",
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    46
 10);
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    47
static NumericDefaultValue<uint32_t> g_minSuccessThreshold
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    48
("WifiAmrrMinSuccessThreshold",
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    49
 "minimum number of consecutive success periods needed to switch to a higher rate",
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    50
 1);
2273
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    51
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    52
AmrrMacStations::AmrrMacStations (WifiMode defaultTxMode)
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    53
  : MacStations (defaultTxMode),
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    54
    m_updatePeriod (g_updatePeriod.GetValue ())
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    55
{}
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    56
MacStation *
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    57
AmrrMacStations::CreateStation (void)
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
{
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
  return new AmrrMacStation (this);
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    60
}
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    62
AmrrMacStation::AmrrMacStation (AmrrMacStations *stations)
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    63
  : m_stations (stations),
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    64
    m_nextModeUpdate (Simulator::Now () + stations->m_updatePeriod),
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    65
    m_tx_ok (0),
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    66
    m_tx_err (0),
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    67
    m_tx_retr (0),
2274
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    68
    m_successThreshold (m_stations->m_minSuccessThreshold),
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    69
    m_success (0),
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    70
    m_recovery (false)
2273
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
{}
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    72
AmrrMacStation::~AmrrMacStation ()
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    73
{}
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    74
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
void 
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    76
AmrrMacStation::ReportRxOk (double rxSnr, WifiMode txMode)
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
{}
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
void 
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
AmrrMacStation::ReportRtsFailed (void)
2274
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    80
{}
2273
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
void 
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    82
AmrrMacStation::ReportDataFailed (void)
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    83
{
2274
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    84
  m_tx_retr++;
2273
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    85
}
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    86
void 
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
AmrrMacStation::ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr)
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
{}
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    89
void 
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
AmrrMacStation::ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr)
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    91
{
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    92
  m_tx_ok++;
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    93
}
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    94
void 
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    95
AmrrMacStation::ReportFinalRtsFailed (void)
2274
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
    96
{}
2273
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    97
void 
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    98
AmrrMacStation::ReportFinalDataFailed (void)
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    99
{
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   100
  m_tx_err++;
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   101
}
2274
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   102
bool
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   103
AmrrMacStation::IsMinRate (void) const
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   104
{
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   105
  return (m_txrate == 0);
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   106
}
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   107
bool
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   108
AmrrMacStation::IsMaxRate (void) const
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   109
{
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   110
  return (m_txrate + 1 < GetNSupportedModes ());
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   111
}
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   112
bool
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   113
AmrrMacStation::IsSuccess (void) const
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   114
{
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   115
  return m_tx_ok > (m_tx_retr + m_tx_err) * m_stations->m_successRatio;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   116
}
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   117
bool
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   118
AmrrMacStation::IsFailure (void) const
2273
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   119
{
2274
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   120
  return (m_tx_retr + m_tx_err) > m_tx_ok * m_stations->m_failureRatio;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   121
}
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   122
bool
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   123
AmrrMacStation::IsEnough (void) const
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   124
{
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   125
  return (m_tx_retr + m_tx_err + m_tx_ok) > 10;
2273
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   126
}
2274
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   127
void 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   128
AmrrMacStation::ResetCnt (void)
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   129
{
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   130
  m_tx_ok = 0;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   131
  m_tx_err = 0;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   132
  m_tx_retr = 0;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   133
}
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   134
void 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   135
AmrrMacStation::IncreaseRate (void)
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   136
{
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   137
  m_txrate++;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   138
}
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   139
void 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   140
AmrrMacStation::DecreaseRate (void)
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   141
{
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   142
  m_txrate--;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   143
}
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   144
2273
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   145
void
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   146
AmrrMacStation::UpdateMode (void)
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   147
{
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   148
  if (Simulator::Now () < m_nextModeUpdate)
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   149
    {
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
      return;
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   151
    }
2274
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   152
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   153
  bool needChange = false;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   154
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   155
  if (IsSuccess () && IsEnough ()) 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   156
    {
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   157
      m_success++;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   158
      if (m_success >= m_successThreshold &&
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   159
          !IsMaxRate ()) 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   160
        {
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   161
          m_recovery = true;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   162
          m_success = 0;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   163
          IncreaseRate ();
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   164
          needChange = true;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   165
        } 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   166
      else 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   167
        {
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   168
          m_recovery = false;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   169
        }
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   170
    } 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   171
  else if (IsFailure ()) 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   172
    {
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   173
      m_success = 0;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   174
      if (!IsMinRate ()) 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   175
        {
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   176
          if (m_recovery) 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   177
            {
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   178
              m_successThreshold *= 2;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   179
              m_successThreshold = std::min (m_successThreshold,
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   180
                                             m_stations->m_maxSuccessThreshold);
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   181
            } 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   182
          else 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   183
            {
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   184
              m_successThreshold = m_stations->m_minSuccessThreshold;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   185
            }
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   186
          m_recovery = false;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   187
          DecreaseRate ();
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   188
          needChange = true;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   189
        } 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   190
      else 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   191
        {
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   192
          m_recovery = false;
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   193
        }
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   194
    }
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   195
  if (IsEnough () || needChange) 
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   196
    {
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   197
      ResetCnt ();
406712a0c6ef implement AMRR for true.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2273
diff changeset
   198
    }
2273
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   199
}
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   200
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   201
AmrrMacStations *
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   202
AmrrMacStation::GetStations (void) const
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
{
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   204
  return m_stations;
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   205
}
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   206
WifiMode 
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   207
AmrrMacStation::DoGetDataMode (uint32_t size)
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   208
{
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   209
  UpdateMode ();
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   210
  //XXX
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   211
  return GetSupportedMode (0);
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   212
}
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   213
WifiMode 
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   214
AmrrMacStation::DoGetRtsMode (void)
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   215
{
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   216
  UpdateMode ();
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   217
  // XXX: can we implement something smarter ?
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   218
  return GetSupportedMode (0);
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   219
}
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   220
0bfe240ec168 AMRR rate control algorithm
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   221
} // namespace ns3