src/devices/wifi/dcf.h
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Sat, 17 Nov 2007 18:57:33 +0100
changeset 2136 46315cd94b6f
parent 2060 fc8e44324a15
permissions -rw-r--r--
add XXX for two bugs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2005 INRIA
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 *
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as 
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 *
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 *
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 *
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 */
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
#ifndef DCF_H
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#define DCF_H
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
#include <stdint.h>
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
#include "ns3/event-id.h"
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
#include "ns3/uv-trace-source.h"
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    26
#include "ns3/callback-trace-source.h"
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    27
#include "ns3/nstime.h"
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    28
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
namespace ns3 {
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
1968
1bf97adf7f56 use the new RandomStream class and fix a small bug in the testsuite
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1923
diff changeset
    31
class RandomStream;
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    32
class MacParameters;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    34
/**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    35
 * \brief listen to DCF events
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    36
 *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    37
 * If you want to call methods from the ns3::Dcf class,
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    38
 * you need to provide an instance of this class
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    39
 * to be notified of the DCF evens.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    40
 */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
class DcfAccessListener {
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    42
public:
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    43
  DcfAccessListener ();
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    44
  virtual ~DcfAccessListener ();
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    45
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    46
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    47
   * Tell the listener than it can start
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    48
   * accessing the medium right now.
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    49
   */
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    50
  virtual void AccessGrantedNow (void) = 0;
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    51
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    52
   * ask the listener if there are candidates 
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    53
   * who need access to the medium.
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    54
   *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    55
   * \return true if access to the medium is 
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    56
   *         needed, false otherwise.
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    57
   */
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
  virtual bool AccessNeeded (void) = 0;
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    59
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    60
   * ask the listener if it is currently
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
   * performing an access which was granted 
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    62
   * earlier to him and if it will notify
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    63
   * the Dcf when the access is complete.
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    64
   *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    65
   * \return true if the listener expects to call
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    66
   *         Dcf::RequestAccess later, false otherwise.
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    67
   */
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    68
  virtual bool AccessingAndWillNotify (void) = 0;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    69
};
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    70
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    71
/**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    72
 * \brief the Distributed Coordination Function
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    73
 *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    74
 * This class implements the DCF as described in IEEE 802.11-1999
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    75
 * section 9.2, p72.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    76
 *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    77
 * This implementation is based on the technique described in
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    78
 * <i>Scalable simulation of large-scale wireless networks with
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    79
 * bounded inaccuracies.</i>, by Z. Ji, J. Zhou, M. Takai, and R. Bagrodia. 
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    80
 */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
class Dcf
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    82
{
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    83
public:
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    84
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    85
   * \param minCw the minimum value for CW
2060
fc8e44324a15 fix dox warnings
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2059
diff changeset
    86
   * \param maxCw the maximum value for CW
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    87
   */
1969
a3803bfd94f9 fix valgrind warning
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1968
diff changeset
    88
  Dcf (uint32_t minCw, uint32_t maxCw);
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    89
  ~Dcf ();
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    91
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    92
   * \param parameters
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    93
   *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    94
   * Must be invoked after construction to configure
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    95
   * a set of parameters.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    96
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    97
  void SetParameters (const MacParameters *parameters);
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    98
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
    99
   * \param difs the difs
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   100
   *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   101
   * Must be invoked after construction.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   102
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   103
  void SetDifs (Time difs);
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   104
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   105
   * \param eifs the eifs
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   106
   *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   107
   * Must be invoked after construction.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   108
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
  void SetEifs (Time eifs);
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   110
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   111
   * \param minCw the minimum value for CW
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   112
   * \param maxCw the maximum value for CW
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   113
   *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   114
   * Reset the cw bounds and CW to minCW.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   115
   */
1969
a3803bfd94f9 fix valgrind warning
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1968
diff changeset
   116
  void SetCwBounds (uint32_t minCw, uint32_t maxCw);
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   117
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   118
   * \param listener the listener
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   119
   *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   120
   * This listener is notified of DCF-specific events
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   121
   * when they happen. You _must_ register a listener
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   122
   * before calling Dcf::RequestAccess.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   123
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   124
  void RegisterAccessListener (DcfAccessListener *listener);
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   125
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   126
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   127
   * Request access to the medium. This method will grant
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   128
   * access by calling the DcfAccessListener::AccessGrantedNow
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   129
   * method
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   130
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   131
  void RequestAccess (void);
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   133
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   134
   * Reset the CW to CWmin
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   135
   * This method is typically invoked after a successfully
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   136
   * transmission or after the maximum number of retries has
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   137
   * been reached.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   138
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   139
  void ResetCw (void);
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   140
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   141
   * Update the CW to a new value. This method is typically
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   142
   * invoked after a failed transmission before calling
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   143
   * Dcf::StartBackoff.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   144
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   145
  void UpdateFailedCw (void);
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   146
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   147
   * Start a backoff now by picking a backoff duration
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   148
   * in the [0, cw] interval.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   149
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
  void StartBackoff (void);
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   151
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   152
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   153
   * \param duration expected duration of reception
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   154
   *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   155
   * Notify the DCF that a packet reception started 
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   156
   * for the expected duration.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   157
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   158
  void NotifyRxStartNow (Time duration);
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   159
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   160
   * Notify the DCF that a packet reception was just
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   161
   * completed successfully.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   162
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   163
  void NotifyRxEndOkNow (void);
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   164
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   165
   * Notify the DCF that a packet reception was just
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   166
   * completed unsuccessfully.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   167
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   168
  void NotifyRxEndErrorNow (void);
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   169
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   170
   * \param duration expected duration of transmission
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   171
   *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   172
   * Notify the DCF that a packet transmission was
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   173
   * just started and is expected to last for the specified
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   174
   * duration.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   175
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   176
  void NotifyTxStartNow (Time duration);
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   177
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   178
   * \param duration expected duration of cca busy period
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   179
   *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   180
   * Notify the DCF that a CCA busy period has just started.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   181
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   182
  void NotifyCcaBusyStartNow (Time duration);
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   183
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   184
   * \param now the time at which a NAV starts
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   185
   * \param duration the value of the received NAV.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   186
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
  void NotifyNavReset (Time now, Time duration);
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   188
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   189
   * \param now the time at which a NAV starts
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   190
   * \param duration the value of the received NAV.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   191
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   192
  void NotifyNavStart (Time now, Time duration);
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   193
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   194
   * \param now the time at which a NAV starts
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   195
   * \param duration the value of the received NAV.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   196
   */
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   197
  void NotifyNavContinue (Time now, Time duration);
1968
1bf97adf7f56 use the new RandomStream class and fix a small bug in the testsuite
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1923
diff changeset
   198
2059
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   199
  /**
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   200
   * \param stream a random stream
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   201
   *
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   202
   * This method is used for testing only to force a predictable
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   203
   * set of random numbers to be used.
d8b7b2de044e doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2040
diff changeset
   204
   */
1968
1bf97adf7f56 use the new RandomStream class and fix a small bug in the testsuite
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1923
diff changeset
   205
  void ResetRngForTest (RandomStream *stream);
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   206
private:
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   207
  void AccessTimeout (void);
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   208
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   209
  /* trivial helpers */
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   210
  Time PickBackoffDelay (void);
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   211
  Time MostRecent (Time a, Time b) const;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   212
  Time MostRecent (Time a, Time b, Time c) const;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   213
  Time MostRecent (Time a, Time b, Time c, Time d) const;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   214
  Time GetDifs (void) const;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   215
  Time GetEifs (void) const;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   216
  uint32_t GetCwMin (void) const;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   217
  uint32_t GetCwMax (void) const;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   218
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   219
  /* time calculation helpers */
1968
1bf97adf7f56 use the new RandomStream class and fix a small bug in the testsuite
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1923
diff changeset
   220
  bool IsPhyBusy (void) const;
1bf97adf7f56 use the new RandomStream class and fix a small bug in the testsuite
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1923
diff changeset
   221
  bool IsNavBusy (void) const;
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   222
  bool IsBackoffNotCompleted (Time now);
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   223
  Time GetDelayUntilAccessGranted (Time now);
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   224
  Time GetAccessGrantedStart (void) const;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   225
  void UpdateBackoff (Time time);
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   226
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   227
  EventId m_accessTimerEvent;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   228
1968
1bf97adf7f56 use the new RandomStream class and fix a small bug in the testsuite
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1923
diff changeset
   229
  RandomStream *m_rng;
1923
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   230
  const MacParameters *m_parameters;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   231
  DcfAccessListener *m_listener;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   232
  Time m_difs;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   233
  Time m_eifs;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   234
  uint32_t m_cwMin;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   235
  uint32_t m_cwMax;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   236
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   237
  UVTraceSource<uint32_t> m_cw;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   238
  Time m_backoffStart;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   239
  Time m_backoffLeft;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   240
  Time m_lastNavStart;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   241
  Time m_lastNavDuration;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   242
  Time m_lastRxStart;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   243
  Time m_lastRxDuration;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   244
  bool m_lastRxReceivedOk;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   245
  Time m_lastRxEnd;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   246
  Time m_lastTxStart;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   247
  Time m_lastTxDuration;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   248
  Time m_lastBusyStart;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   249
  Time m_lastBusyDuration;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   250
  bool m_rxing;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   251
  bool m_sleeping;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   252
  /* "80211-dcf-backoff"
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   253
   * param1: backoff Duration
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   254
   * reports the start of a backoff
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   255
   */
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   256
  CallbackTraceSource<Time> m_backoffTrace;
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   257
};
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   258
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   259
} // namespace ns3
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   260
a8caecf6637f add Dcf to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   261
#endif /* DCF_H */