src/devices/wifi/mac-low.cc
author Mirko Banchi <mk.banchi@gmail.com>
Wed, 03 Feb 2010 20:34:51 +0100
changeset 5957 dd5ece55acb9
parent 5956 e9918be47f78
child 5958 dd0accd82659
permissions -rw-r--r--
handle block ack and block ack request frames in MacLow
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2005,2006 INRIA
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
     4
 * Copyright (c) 2009 MIRKO BANCHI
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 *
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License version 2 as 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 * published by the Free Software Foundation;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 *
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 * GNU General Public License for more details.
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 *
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * along with this program; if not, write to the Free Software
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 *
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
    20
 * Author: Mirko Banchi <mk.banchi@gmail.com>
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
 */
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
    23
#include "ns3/assert.h"
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
#include "ns3/packet.h"
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
#include "ns3/simulator.h"
3041
a624276a897b mtag -> tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3040
diff changeset
    26
#include "ns3/tag.h"
1979
d535a38b7fc4 convert TRACE to NS_LOG
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1978
diff changeset
    27
#include "ns3/log.h"
2088
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
    28
#include "ns3/node.h"
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
#include "mac-low.h"
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    31
#include "wifi-phy.h"
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    32
#include "wifi-mac-trailer.h"
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
    33
#include "qos-utils.h"
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    34
1979
d535a38b7fc4 convert TRACE to NS_LOG
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1978
diff changeset
    35
NS_LOG_COMPONENT_DEFINE ("MacLow");
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    36
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
    37
#undef NS_LOG_APPEND_CONTEXT
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
    38
#define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] "
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
    39
1993
e665fb7cea73 add time to debug output
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1990
diff changeset
    40
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
namespace ns3 {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    42
3040
e11e106c7c19 Mtag -> Tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3038
diff changeset
    43
class SnrTag : public Tag
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    44
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    45
public:
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    46
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    47
  static TypeId GetTypeId (void);
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    48
  virtual TypeId GetInstanceTypeId (void) const;
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    49
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    50
  virtual uint32_t GetSerializedSize (void) const;
3040
e11e106c7c19 Mtag -> Tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3038
diff changeset
    51
  virtual void Serialize (TagBuffer i) const;
e11e106c7c19 Mtag -> Tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3038
diff changeset
    52
  virtual void Deserialize (TagBuffer i);
3208
1a754d09c4ba bug 200: Packet::PrintTags is not implemented.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3041
diff changeset
    53
  virtual void Print (std::ostream &os) const;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    54
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    55
  void Set (double snr);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    56
  double Get (void) const;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    57
private:
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
  double m_snr;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
};
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    60
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    61
TypeId 
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    62
SnrTag::GetTypeId (void)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    63
{
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    64
  static TypeId tid = TypeId ("ns3::SnrTag")
3040
e11e106c7c19 Mtag -> Tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3038
diff changeset
    65
    .SetParent<Tag> ()
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    66
    .AddConstructor<SnrTag> ()
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    67
    .AddAttribute ("Snr", "The snr of the last packet received",
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    68
                   DoubleValue (0.0),
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    69
                   MakeDoubleAccessor (&SnrTag::Get),
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    70
                   MakeDoubleChecker<double> ())
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    71
    ;
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    72
  return tid;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    73
}
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    74
TypeId 
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    75
SnrTag::GetInstanceTypeId (void) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    76
{
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    77
  return GetTypeId ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
}
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    79
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
uint32_t 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
SnrTag::GetSerializedSize (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    82
{
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    83
  return sizeof (double);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    84
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    85
void 
3040
e11e106c7c19 Mtag -> Tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3038
diff changeset
    86
SnrTag::Serialize (TagBuffer i) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
{
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    88
  i.WriteDouble (m_snr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    89
}
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    90
void 
3040
e11e106c7c19 Mtag -> Tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3038
diff changeset
    91
SnrTag::Deserialize (TagBuffer i)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    92
{
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
    93
  m_snr = i.ReadDouble ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    94
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    95
void 
3208
1a754d09c4ba bug 200: Packet::PrintTags is not implemented.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3041
diff changeset
    96
SnrTag::Print (std::ostream &os) const
1a754d09c4ba bug 200: Packet::PrintTags is not implemented.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3041
diff changeset
    97
{
1a754d09c4ba bug 200: Packet::PrintTags is not implemented.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3041
diff changeset
    98
  os << "Snr=" << m_snr;
1a754d09c4ba bug 200: Packet::PrintTags is not implemented.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3041
diff changeset
    99
}
1a754d09c4ba bug 200: Packet::PrintTags is not implemented.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3041
diff changeset
   100
void 
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   101
SnrTag::Set (double snr)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   102
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   103
  m_snr = snr;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   104
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   105
double 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
SnrTag::Get (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   107
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   108
  return m_snr;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   110
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   111
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
MacLowTransmissionListener::MacLowTransmissionListener ()
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   113
{}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   114
MacLowTransmissionListener::~MacLowTransmissionListener ()
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   115
{}
5955
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5954
diff changeset
   116
void
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5954
diff changeset
   117
MacLowTransmissionListener::GotBlockAck (const CtrlBAckResponseHeader *blockAck,
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5954
diff changeset
   118
                                         Mac48Address source)
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5954
diff changeset
   119
{}
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
   120
MacLowDcfListener::MacLowDcfListener ()
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   121
{}
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
   122
MacLowDcfListener::~MacLowDcfListener ()
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   123
{}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   124
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   125
MacLowTransmissionParameters::MacLowTransmissionParameters ()
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   126
  : m_nextSize (0),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   127
    m_waitAck (ACK_NONE),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   128
    m_sendRts (false),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   129
    m_overrideDurationId (Seconds (0))
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   130
{}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   131
void 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
MacLowTransmissionParameters::EnableNextData (uint32_t size)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   133
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   134
  m_nextSize = size;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   135
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   136
void 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   137
MacLowTransmissionParameters::DisableNextData (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   138
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   139
  m_nextSize = 0;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   140
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   141
void 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   142
MacLowTransmissionParameters::EnableOverrideDurationId (Time durationId)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   143
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   144
  m_overrideDurationId = durationId;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   145
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   146
void 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   147
MacLowTransmissionParameters::DisableOverrideDurationId (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   148
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   149
  m_overrideDurationId = Seconds (0);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   151
void 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   152
MacLowTransmissionParameters::EnableSuperFastAck (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   153
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   154
  m_waitAck = ACK_SUPER_FAST;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   155
}
5954
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   156
void
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   157
MacLowTransmissionParameters::EnableBasicBlockAck (void)
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   158
{
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   159
  m_waitAck = BLOCK_ACK_BASIC;
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   160
}
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   161
void
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   162
MacLowTransmissionParameters::EnableCompressedBlockAck (void)
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   163
{
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   164
  m_waitAck = BLOCK_ACK_COMPRESSED;
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   165
}
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   166
void
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   167
MacLowTransmissionParameters::EnableMultiTidBlockAck (void)
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   168
{
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   169
  m_waitAck = BLOCK_ACK_MULTI_TID;
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   170
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   171
void 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   172
MacLowTransmissionParameters::EnableFastAck (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   173
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   174
  m_waitAck = ACK_FAST;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   175
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   176
void 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   177
MacLowTransmissionParameters::EnableAck (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   178
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   179
  m_waitAck = ACK_NORMAL;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   180
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   181
void 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   182
MacLowTransmissionParameters::DisableAck (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   183
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   184
  m_waitAck = ACK_NONE;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   185
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   186
void 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
MacLowTransmissionParameters::EnableRts (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   188
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   189
  m_sendRts = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   190
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   191
void 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   192
MacLowTransmissionParameters::DisableRts (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   193
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   194
  m_sendRts = false;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   195
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   196
bool 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   197
MacLowTransmissionParameters::MustWaitAck (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   198
{
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5189
diff changeset
   199
  return (m_waitAck != ACK_NONE);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   200
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   201
bool 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   202
MacLowTransmissionParameters::MustWaitNormalAck (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
{
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5189
diff changeset
   204
  return (m_waitAck == ACK_NORMAL);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   205
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   206
bool 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   207
MacLowTransmissionParameters::MustWaitFastAck (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   208
{
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5189
diff changeset
   209
  return (m_waitAck == ACK_FAST);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   210
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   211
bool 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   212
MacLowTransmissionParameters::MustWaitSuperFastAck (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   213
{
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5189
diff changeset
   214
  return (m_waitAck == ACK_SUPER_FAST);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   215
}
5954
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   216
bool
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   217
MacLowTransmissionParameters::MustWaitBasicBlockAck (void) const
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   218
{
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   219
  return (m_waitAck == BLOCK_ACK_BASIC)?true:false;
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   220
}
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   221
bool
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   222
MacLowTransmissionParameters::MustWaitCompressedBlockAck (void) const
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   223
{
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   224
  return (m_waitAck == BLOCK_ACK_COMPRESSED)?true:false;
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   225
}
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   226
bool
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   227
MacLowTransmissionParameters::MustWaitMultiTidBlockAck (void) const
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   228
{
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   229
  return (m_waitAck == BLOCK_ACK_MULTI_TID)?true:false;
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   230
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   231
bool 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   232
MacLowTransmissionParameters::MustSendRts (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   233
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   234
  return m_sendRts;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   235
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   236
bool 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   237
MacLowTransmissionParameters::HasDurationId (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   238
{
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5189
diff changeset
   239
  return (m_overrideDurationId != Seconds (0));
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   240
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   241
Time
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   242
MacLowTransmissionParameters::GetDurationId (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   243
{
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
   244
  NS_ASSERT (m_overrideDurationId != Seconds (0));
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   245
  return m_overrideDurationId;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   246
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   247
bool 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   248
MacLowTransmissionParameters::HasNextPacket (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   249
{
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5189
diff changeset
   250
  return (m_nextSize != 0);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   251
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   252
uint32_t 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   253
MacLowTransmissionParameters::GetNextPacketSize (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   254
{
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
   255
  NS_ASSERT (HasNextPacket ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   256
  return m_nextSize;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   257
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   258
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   259
std::ostream &operator << (std::ostream &os, const MacLowTransmissionParameters &params)
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   260
{
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   261
  os << "[" 
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   262
     << "send rts=" << params.m_sendRts << ", "
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   263
     << "next size=" << params.m_nextSize << ", "
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   264
     << "dur=" << params.m_overrideDurationId << ", "
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   265
     << "ack=";
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   266
  switch (params.m_waitAck) {
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   267
  case MacLowTransmissionParameters::ACK_NONE:
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   268
    os << "none";
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   269
    break;
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   270
  case MacLowTransmissionParameters::ACK_NORMAL:
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   271
    os << "normal";
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   272
    break;
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   273
  case MacLowTransmissionParameters::ACK_FAST:
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   274
    os << "fast";
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   275
    break;
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   276
  case MacLowTransmissionParameters::ACK_SUPER_FAST:
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   277
    os << "super-fast";
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   278
    break;
5954
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   279
  case MacLowTransmissionParameters::BLOCK_ACK_BASIC:
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   280
    os << "basic-block-ack";
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   281
    break;
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   282
  case MacLowTransmissionParameters::BLOCK_ACK_COMPRESSED:
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   283
    os << "compressed-block-ack";
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   284
    break;
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   285
  case MacLowTransmissionParameters::BLOCK_ACK_MULTI_TID:
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   286
    os << "multi-tid-block-ack";
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   287
    break;
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   288
  }
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   289
  os << "]";
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   290
  return os;
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   291
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   292
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   293
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   294
/***************************************************************
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   295
 *         Listener for PHY events. Forwards to MacLow
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   296
 ***************************************************************/
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   297
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   298
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   299
class PhyMacLowListener : public ns3::WifiPhyListener {
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   300
public:
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   301
  PhyMacLowListener (ns3::MacLow *macLow)
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   302
    : m_macLow (macLow) {}
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   303
  virtual ~PhyMacLowListener () {}
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   304
  virtual void NotifyRxStart (Time duration) {}
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   305
  virtual void NotifyRxEndOk (void) {}
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   306
  virtual void NotifyRxEndError (void) {}
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   307
  virtual void NotifyTxStart (Time duration) {}
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   308
  virtual void NotifyMaybeCcaBusyStart (Time duration) {}
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   309
  virtual void NotifySwitchingStart (Time duration) { 
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   310
    m_macLow->NotifySwitchingStartNow (duration);
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   311
  }
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   312
private:
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   313
  ns3::MacLow *m_macLow;
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   314
};
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   315
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   316
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   317
MacLow::MacLow ()
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   318
  : m_normalAckTimeoutEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   319
    m_fastAckTimeoutEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   320
    m_superFastAckTimeoutEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   321
    m_fastAckFailedTimeoutEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   322
    m_ctsTimeoutEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   323
    m_sendCtsEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   324
    m_sendAckEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   325
    m_sendDataEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   326
    m_waitSifsEvent (),
2286
3704959cf153 ensure m_listener is initialized properly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2268
diff changeset
   327
    m_currentPacket (0),
3704959cf153 ensure m_listener is initialized properly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2268
diff changeset
   328
    m_listener (0)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   329
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   330
  NS_LOG_FUNCTION (this);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   331
  m_lastNavDuration = Seconds (0);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   332
  m_lastNavStart = Seconds (0);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   333
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   334
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   335
MacLow::~MacLow ()
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   336
{
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   337
  NS_LOG_FUNCTION (this);
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   338
}
2530
05f9cec44621 avoid memory leaks
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2524
diff changeset
   339
05f9cec44621 avoid memory leaks
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2524
diff changeset
   340
void 
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   341
MacLow::SetupPhyMacLowListener (Ptr<WifiPhy> phy)
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   342
{
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   343
  m_phyMacLowListener = new PhyMacLowListener (this); 
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   344
  phy->RegisterListener (m_phyMacLowListener);
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   345
}
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   346
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   347
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   348
void 
2530
05f9cec44621 avoid memory leaks
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2524
diff changeset
   349
MacLow::DoDispose (void)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   350
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   351
  NS_LOG_FUNCTION (this);
5846
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   352
  m_normalAckTimeoutEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   353
  m_fastAckTimeoutEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   354
  m_superFastAckTimeoutEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   355
  m_fastAckFailedTimeoutEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   356
  m_ctsTimeoutEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   357
  m_sendCtsEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   358
  m_sendAckEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   359
  m_sendDataEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   360
  m_waitSifsEvent.Cancel ();
2054
ba8e810bae4c derive WifiPhy from Object and manage it with a Ptr<>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2024
diff changeset
   361
  m_phy = 0;
2530
05f9cec44621 avoid memory leaks
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2524
diff changeset
   362
  m_stationManager = 0;
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   363
  delete m_phyMacLowListener;
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   364
  m_phyMacLowListener = 0;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   365
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   366
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   367
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   368
MacLow::CancelAllEvents (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   369
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   370
  NS_LOG_FUNCTION (this);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   371
  bool oneRunning = false;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   372
  if (m_normalAckTimeoutEvent.IsRunning ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   373
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   374
      m_normalAckTimeoutEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   375
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   376
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   377
  if (m_fastAckTimeoutEvent.IsRunning ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   378
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   379
      m_fastAckTimeoutEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   380
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   381
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   382
  if (m_superFastAckTimeoutEvent.IsRunning ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   383
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   384
      m_superFastAckTimeoutEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   385
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   386
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   387
  if (m_fastAckFailedTimeoutEvent.IsRunning ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   388
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   389
      m_fastAckFailedTimeoutEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   390
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   391
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   392
  if (m_ctsTimeoutEvent.IsRunning ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   393
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   394
      m_ctsTimeoutEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   395
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   396
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   397
  if (m_sendCtsEvent.IsRunning ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   398
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   399
      m_sendCtsEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   400
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   401
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   402
  if (m_sendAckEvent.IsRunning ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   403
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   404
      m_sendAckEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   405
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   406
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   407
  if (m_sendDataEvent.IsRunning ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   408
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   409
      m_sendDataEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   410
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   411
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   412
  if (m_waitSifsEvent.IsRunning ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   413
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   414
      m_waitSifsEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   415
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   416
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   417
  if (oneRunning && m_listener != 0) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   418
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   419
      m_listener->Cancel ();
2286
3704959cf153 ensure m_listener is initialized properly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2268
diff changeset
   420
      m_listener = 0;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   421
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   422
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   423
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   424
void
2054
ba8e810bae4c derive WifiPhy from Object and manage it with a Ptr<>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2024
diff changeset
   425
MacLow::SetPhy (Ptr<WifiPhy> phy)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   426
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   427
  m_phy = phy;
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   428
  m_phy->SetReceiveOkCallback (MakeCallback (&MacLow::ReceiveOk, this));
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   429
  m_phy->SetReceiveErrorCallback (MakeCallback (&MacLow::ReceiveError, this));
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   430
  SetupPhyMacLowListener(phy); 
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   431
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   432
void 
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   433
MacLow::SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> manager)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   434
{
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   435
  m_stationManager = manager;
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   436
}
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   437
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   438
void 
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   439
MacLow::SetAddress (Mac48Address ad)
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   440
{
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   441
  m_self = ad;
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   442
}
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   443
void 
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   444
MacLow::SetAckTimeout (Time ackTimeout)
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   445
{
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   446
  m_ackTimeout = ackTimeout;
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   447
}
3597
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   448
void 
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   449
MacLow::SetCtsTimeout (Time ctsTimeout)
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   450
{
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   451
  m_ctsTimeout = ctsTimeout;
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   452
}
3598
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   453
void
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   454
MacLow::SetSifs (Time sifs)
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   455
{
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   456
  m_sifs = sifs;
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   457
}
3599
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   458
void 
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   459
MacLow::SetSlotTime (Time slotTime)
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   460
{
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   461
  m_slotTime = slotTime;
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   462
}
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   463
void 
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   464
MacLow::SetPifs (Time pifs)
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   465
{
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   466
  m_pifs = pifs;
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   467
}
3600
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   468
void
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   469
MacLow::SetBssid (Mac48Address bssid)
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   470
{
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   471
  m_bssid = bssid;
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   472
}
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   473
Mac48Address 
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   474
MacLow::GetAddress (void) const
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   475
{
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   476
  return m_self;
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   477
}
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   478
Time 
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   479
MacLow::GetAckTimeout (void) const
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   480
{
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   481
  return m_ackTimeout;
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   482
}
3597
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   483
Time 
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   484
MacLow::GetCtsTimeout (void) const
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   485
{
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   486
  return m_ctsTimeout;
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   487
}
3598
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   488
Time
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   489
MacLow::GetSifs (void) const
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   490
{
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   491
  return m_sifs;
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   492
}
3599
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   493
Time 
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   494
MacLow::GetSlotTime (void) const
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   495
{
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   496
  return m_slotTime;
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   497
}
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   498
Time 
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   499
MacLow::GetPifs (void) const
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   500
{
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   501
  return m_pifs;
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   502
}
3600
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   503
Mac48Address 
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   504
MacLow::GetBssid (void) const
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   505
{
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   506
  return m_bssid;
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   507
}
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   508
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   509
void 
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   510
MacLow::SetRxCallback (Callback<void,Ptr<Packet>,const WifiMacHeader *> callback)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   511
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   512
  m_rxCallback = callback;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   513
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   514
void 
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
   515
MacLow::RegisterDcfListener (MacLowDcfListener *listener)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   516
{
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
   517
  m_dcfListeners.push_back (listener);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   518
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   519
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   520
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   521
void 
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
   522
MacLow::StartTransmission (Ptr<const Packet> packet, 
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5189
diff changeset
   523
                           const WifiMacHeader* hdr, 
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   524
                           MacLowTransmissionParameters params,
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   525
                           MacLowTransmissionListener *listener)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   526
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   527
  NS_LOG_FUNCTION (this << packet << hdr << params << listener);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   528
  /* m_currentPacket is not NULL because someone started
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   529
   * a transmission and was interrupted before one of:
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   530
   *   - ctsTimeout
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   531
   *   - sendDataAfterCTS
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   532
   * expired. This means that one of these timers is still
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   533
   * running. They are all cancelled below anyway by the 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   534
   * call to CancelAllEvents (because of at least one
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   535
   * of these two timer) which will trigger a call to the
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   536
   * previous listener's cancel method.
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   537
   *
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   538
   * This typically happens because the high-priority 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   539
   * QapScheduler has taken access to the channel from
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   540
   * one of the Edca of the QAP.
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   541
   */
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
   542
  m_currentPacket = packet->Copy ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   543
  m_currentHdr = *hdr;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   544
  CancelAllEvents ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   545
  m_listener = listener;
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   546
  m_txParams = params;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   547
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
   548
  //NS_ASSERT (m_phy->IsStateIdle ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   549
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
   550
  NS_LOG_DEBUG ("startTx size="<< GetSize (m_currentPacket, &m_currentHdr) << 
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   551
            ", to=" << m_currentHdr.GetAddr1()<<", listener="<<m_listener);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   552
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   553
  if (m_txParams.MustSendRts ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   554
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   555
      SendRtsForPacket ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   556
    } 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   557
  else 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   558
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   559
      SendDataPacket ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   560
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   561
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   562
  /* When this method completes, we have taken ownership of the medium. */
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
   563
  NS_ASSERT (m_phy->IsStateTx ());  
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   564
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   565
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   566
void
3899
804d92c1f7c3 constify
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   567
MacLow::ReceiveError (Ptr<const Packet> packet, double rxSnr)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   568
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   569
  NS_LOG_FUNCTION (this << packet << rxSnr);
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
   570
  NS_LOG_DEBUG ("rx failed ");
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   571
  if (m_txParams.MustWaitFastAck ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   572
    {
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
   573
      NS_ASSERT (m_fastAckFailedTimeoutEvent.IsExpired ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   574
      m_fastAckFailedTimeoutEvent = Simulator::Schedule (GetSifs (), 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   575
                                                         &MacLow::FastAckFailedTimeout, this);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   576
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   577
  return;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   578
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   579
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   580
void 
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   581
MacLow::NotifySwitchingStartNow (Time duration)
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   582
{
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   583
  NS_LOG_DEBUG ("switching channel. Cancelling MAC pending events"); 
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   584
  m_stationManager->Reset();
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   585
  CancelAllEvents(); 
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   586
  if (m_navCounterResetCtsMissed.IsRunning ())
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   587
    {
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   588
      m_navCounterResetCtsMissed.Cancel();
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   589
    }
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   590
  m_lastNavStart = Simulator::Now (); 
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   591
  m_lastNavDuration = Seconds (0);
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   592
  m_currentPacket = 0;
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   593
  m_listener = 0;
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   594
}
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   595
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   596
void 
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
   597
MacLow::ReceiveOk (Ptr<Packet> packet, double rxSnr, WifiMode txMode, WifiPreamble preamble)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   598
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   599
  NS_LOG_FUNCTION (this << packet << rxSnr << txMode << preamble);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   600
  /* A packet is received from the PHY.
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   601
   * When we have handled this packet,
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   602
   * we handle any packet present in the
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   603
   * packet queue.
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   604
   */
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   605
  WifiMacHeader hdr;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
   606
  packet->RemoveHeader (hdr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   607
  
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   608
  bool isPrevNavZero = IsNavZero ();
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
   609
  NS_LOG_DEBUG ("duration/id=" << hdr.GetDuration ());
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   610
  NotifyNav (hdr, txMode, preamble);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   611
  if (hdr.IsRts ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   612
    {
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   613
      /* see section 9.2.5.7 802.11-1999
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   614
       * A STA that is addressed by an RTS frame shall transmit a CTS frame after a SIFS 
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   615
       * period if the NAV at the STA receiving the RTS frame indicates that the medium is 
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   616
       * idle. If the NAV at the STA receiving the RTS indicates the medium is not idle, 
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   617
       * that STA shall not respond to the RTS frame.
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   618
       */
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   619
      if (isPrevNavZero &&
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   620
          hdr.GetAddr1 () == m_self) 
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   621
        {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
   622
          NS_LOG_DEBUG ("rx RTS from=" << hdr.GetAddr2 () << ", schedule CTS");
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
   623
          NS_ASSERT (m_sendCtsEvent.IsExpired ());
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   624
          WifiRemoteStation *station = GetStation (hdr.GetAddr2 ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   625
          station->ReportRxOk (rxSnr, txMode);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   626
          m_sendCtsEvent = Simulator::Schedule (GetSifs (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   627
                                                &MacLow::SendCtsAfterRts, this,
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   628
                                                hdr.GetAddr2 (), 
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   629
                                                hdr.GetDuration (),
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   630
                                                txMode,
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   631
                                                rxSnr);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   632
        } 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   633
      else 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   634
        {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
   635
          NS_LOG_DEBUG ("rx RTS from=" << hdr.GetAddr2 () << ", cannot schedule CTS");
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   636
        }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   637
    } 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   638
  else if (hdr.IsCts () &&
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   639
           hdr.GetAddr1 () == m_self &&
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   640
           m_ctsTimeoutEvent.IsRunning () &&
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
   641
           m_currentPacket != 0) 
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   642
    {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
   643
      NS_LOG_DEBUG ("receive cts from="<<m_currentHdr.GetAddr1 ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   644
      SnrTag tag;
4502
07d34c0d8d18 new tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4264
diff changeset
   645
      packet->RemovePacketTag (tag);
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   646
      WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   647
      station->ReportRxOk (rxSnr, txMode);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   648
      station->ReportRtsOk (rxSnr, txMode, tag.Get ());
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   649
      
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   650
      m_ctsTimeoutEvent.Cancel ();
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
   651
      NotifyCtsTimeoutResetNow ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   652
      m_listener->GotCts (rxSnr, txMode);
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
   653
      NS_ASSERT (m_sendDataEvent.IsExpired ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   654
      m_sendDataEvent = Simulator::Schedule (GetSifs (), 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   655
                                             &MacLow::SendDataAfterCts, this, 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   656
                                             hdr.GetAddr1 (),
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   657
                                             hdr.GetDuration (),
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   658
                                             txMode);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   659
    } 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   660
  else if (hdr.IsAck () &&
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   661
           hdr.GetAddr1 () == m_self &&
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   662
           (m_normalAckTimeoutEvent.IsRunning () || 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   663
            m_fastAckTimeoutEvent.IsRunning () ||
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   664
            m_superFastAckTimeoutEvent.IsRunning ()) &&
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   665
           m_txParams.MustWaitAck ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   666
    {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
   667
      NS_LOG_DEBUG ("receive ack from="<<m_currentHdr.GetAddr1 ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   668
      SnrTag tag;
4502
07d34c0d8d18 new tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4264
diff changeset
   669
      packet->RemovePacketTag (tag);
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   670
      WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   671
      station->ReportRxOk (rxSnr, txMode);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   672
      station->ReportDataOk (rxSnr, txMode, tag.Get ());
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   673
      bool gotAck = false;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   674
      if (m_txParams.MustWaitNormalAck () &&
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   675
          m_normalAckTimeoutEvent.IsRunning ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   676
        {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   677
          m_normalAckTimeoutEvent.Cancel ();
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
   678
          NotifyAckTimeoutResetNow ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   679
          gotAck = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   680
        }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   681
      if (m_txParams.MustWaitFastAck () &&
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   682
          m_fastAckTimeoutEvent.IsRunning ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   683
        {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   684
          m_fastAckTimeoutEvent.Cancel ();
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
   685
          NotifyAckTimeoutResetNow ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   686
          gotAck = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   687
        }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   688
      if (gotAck) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   689
        {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   690
          m_listener->GotAck (rxSnr, txMode);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   691
        }
4670
98aac83e4416 coding style
Mirko Banchi <mk.banchi@gmail.com>
parents: 4556
diff changeset
   692
      if (m_txParams.HasNextPacket ()) 
98aac83e4416 coding style
Mirko Banchi <mk.banchi@gmail.com>
parents: 4556
diff changeset
   693
        {
98aac83e4416 coding style
Mirko Banchi <mk.banchi@gmail.com>
parents: 4556
diff changeset
   694
          m_waitSifsEvent = Simulator::Schedule (GetSifs (), 
4671
a99a57f697de coding style
Mirko Banchi <mk.banchi@gmail.com>
parents: 4670
diff changeset
   695
                                                 &MacLow::WaitSifsAfterEndTx, this);
4670
98aac83e4416 coding style
Mirko Banchi <mk.banchi@gmail.com>
parents: 4556
diff changeset
   696
        }
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   697
    } 
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   698
  else if (hdr.IsBlockAck () && hdr.GetAddr1 () == m_self &&
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   699
          (m_txParams.MustWaitBasicBlockAck () || m_txParams.MustWaitCompressedBlockAck ())) 
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   700
          //m_blockAckTimeoutEvent.IsRunning ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   701
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   702
      NS_LOG_DEBUG ("got block ack from "<<hdr.GetAddr2 ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   703
      CtrlBAckResponseHeader blockAck;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   704
      packet->RemoveHeader (blockAck);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   705
      //m_blockAckTimeoutEvent.Cancel ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   706
      m_listener->GotBlockAck (&blockAck, hdr.GetAddr2 ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   707
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   708
  else if (hdr.IsBlockAckReq () && hdr.GetAddr1 () == m_self)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   709
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   710
      CtrlBAckRequestHeader blockAckReq;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   711
      packet->RemoveHeader (blockAckReq);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   712
      if (!blockAckReq.IsMultiTid ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   713
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   714
          AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), blockAckReq.GetTidInfo ()));
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   715
          if (it != m_bAckAgreements.end ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   716
            {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   717
              NS_ASSERT (m_sendAckEvent.IsExpired ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   718
              if ((*it).second.first.IsImmediateBlockAck ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   719
                {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   720
                  NS_LOG_DEBUG ("rx blockAckRequest/sendImmediateBlockAck from="<< hdr.GetAddr2 ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   721
                  m_sendAckEvent = Simulator::Schedule (GetSifs (),
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   722
                                                        &MacLow::SendBlockAckAfterBlockAckRequest, this,
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   723
                                                        blockAckReq,
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   724
                                                        hdr.GetAddr2 (), 
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   725
                                                        hdr.GetDuration (),
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   726
                                                        txMode);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   727
                }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   728
              else
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   729
                {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   730
                  NS_FATAL_ERROR ("Delayed block ack not supported.");
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   731
                }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   732
            }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   733
          else
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   734
            {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   735
              NS_LOG_DEBUG ("There's not a valid agreement for this block ack request.");
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   736
            }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   737
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   738
      else
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   739
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   740
          NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   741
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   742
    }
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   743
  else if (hdr.IsCtl ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   744
    {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
   745
      NS_LOG_DEBUG ("rx drop " << hdr.GetTypeString ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   746
    } 
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   747
  else if (hdr.GetAddr1 () == m_self) 
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   748
    {
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   749
      WifiRemoteStation *station = GetStation (hdr.GetAddr2 ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   750
      station->ReportRxOk (rxSnr, txMode);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   751
      
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   752
      if (hdr.IsQosData () && StoreMpduIfNeeded (packet, hdr)) 
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   753
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   754
          /* From section 9.10.4 in IEEE802.11:
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   755
             Upon the receipt of a QoS data frame from the originator for which
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   756
             the Block Ack agreement exists, the recipient shall buffer the MSDU
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   757
             regardless of the value of the Ack Policy subfield within the 
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   758
             QoS Control field of the QoS data frame. */
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   759
          if (hdr.IsQosAck ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   760
            {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   761
              AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   762
              RxCompleteBufferedPacketsWithSmallerSequence (it->second.first.GetStartingSequence (),
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   763
                                                            hdr.GetAddr2 (), hdr.GetQosTid ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   764
              RxCompleteBufferedPackets (hdr.GetAddr2 (), hdr.GetQosTid ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   765
              NS_ASSERT (m_sendAckEvent.IsExpired ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   766
              m_sendAckEvent = Simulator::Schedule (GetSifs (),
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   767
                                                    &MacLow::SendAckAfterData, this,
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   768
                                                    hdr.GetAddr2 (), 
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   769
                                                    hdr.GetDuration (),
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   770
                                                    txMode,
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   771
                                                    rxSnr);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   772
            }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   773
          return;  
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   774
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   775
      else if (hdr.IsQosData () && hdr.IsQosBlockAck ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   776
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   777
          /* This happens if a packet with ack policy Block Ack is received and a block ack
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   778
             agreement for that packet doesn't exist.
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   779
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   780
             From section 11.5.3 in IEEE802.11e:
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   781
             When a recipient does not have an active Block ack for a TID, but receives
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   782
             data MPDUs with the Ack Policy subfield set to Block Ack, it shall discard
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   783
             them [...]. */
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   784
          return;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   785
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   786
      else if (hdr.IsQosData () && hdr.IsQosNoAck ()) 
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   787
        {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
   788
          NS_LOG_DEBUG ("rx unicast/noAck from="<<hdr.GetAddr2 ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   789
        } 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   790
      else if (hdr.IsData () || hdr.IsMgt ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   791
        {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
   792
          NS_LOG_DEBUG ("rx unicast/sendAck from=" << hdr.GetAddr2 ());
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
   793
          NS_ASSERT (m_sendAckEvent.IsExpired ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   794
          m_sendAckEvent = Simulator::Schedule (GetSifs (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   795
                                                &MacLow::SendAckAfterData, this,
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   796
                                                hdr.GetAddr2 (), 
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   797
                                                hdr.GetDuration (),
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   798
                                                txMode,
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   799
                                                rxSnr);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   800
        }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   801
      goto rxPacket;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   802
    } 
4079
210d64d11998 add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4003
diff changeset
   803
  else if (hdr.GetAddr1 ().IsGroup ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   804
    {
4079
210d64d11998 add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4003
diff changeset
   805
      if (hdr.IsData () || hdr.IsMgt ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   806
        {
4079
210d64d11998 add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4003
diff changeset
   807
          NS_LOG_DEBUG ("rx group from=" << hdr.GetAddr2 ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   808
          goto rxPacket;
4079
210d64d11998 add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4003
diff changeset
   809
        }
210d64d11998 add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4003
diff changeset
   810
      else
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   811
        {
4079
210d64d11998 add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4003
diff changeset
   812
          // DROP
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   813
        }
4079
210d64d11998 add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4003
diff changeset
   814
    }
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   815
  else 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   816
    {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
   817
      //NS_LOG_DEBUG_VERBOSE ("rx not-for-me from %d", GetSource (packet));
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   818
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   819
  return;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   820
 rxPacket:
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   821
  WifiMacTrailer fcs;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
   822
  packet->RemoveTrailer (fcs);
1964
041240a915f8 build and link
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1928
diff changeset
   823
  m_rxCallback (packet, &hdr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   824
  return;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   825
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   826
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   827
uint32_t 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   828
MacLow::GetAckSize (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   829
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   830
  WifiMacHeader ack;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   831
  ack.SetType (WIFI_MAC_CTL_ACK);
1996
454a63cf6549 cts, rts, and ack sizes must take into account fcs padding
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1993
diff changeset
   832
  return ack.GetSize () + 4;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   833
}
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   834
uint32_t
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   835
MacLow::GetBlockAckSize (enum BlockAckType type) const
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   836
{
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   837
  WifiMacHeader hdr;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   838
  hdr.SetType (WIFI_MAC_CTL_BACKRESP);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   839
  CtrlBAckResponseHeader blockAck;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   840
  if (type == BASIC_BLOCK_ACK)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   841
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   842
      blockAck.SetType (BASIC_BLOCK_ACK);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   843
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   844
  else if (type == COMPRESSED_BLOCK_ACK)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   845
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   846
      blockAck.SetType (COMPRESSED_BLOCK_ACK);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   847
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   848
  else if (type == MULTI_TID_BLOCK_ACK)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   849
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   850
      //Not implemented
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   851
      NS_ASSERT (false);  
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   852
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   853
  return hdr.GetSize () + blockAck.GetSerializedSize () + 4; 
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   854
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   855
uint32_t 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   856
MacLow::GetRtsSize (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   857
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   858
  WifiMacHeader rts;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   859
  rts.SetType (WIFI_MAC_CTL_RTS);
1996
454a63cf6549 cts, rts, and ack sizes must take into account fcs padding
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1993
diff changeset
   860
  return rts.GetSize () + 4;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   861
}
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   862
Time
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   863
MacLow::GetAckDuration (Mac48Address to, WifiMode dataTxMode) const
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   864
{
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   865
  WifiMode ackMode = GetAckTxModeForData (to, dataTxMode);
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   866
  return m_phy->CalculateTxDuration (GetAckSize (), ackMode, WIFI_PREAMBLE_LONG);
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   867
}
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   868
Time
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   869
MacLow::GetBlockAckDuration (Mac48Address to, WifiMode blockAckReqTxMode, enum BlockAckType type) const
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   870
{
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   871
  //WifiMode blockAckMode = GetBlockAckTxModeForBlockAckReq (to, blockAckReqTxMode);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   872
  return m_phy->CalculateTxDuration (GetBlockAckSize (type), blockAckReqTxMode, WIFI_PREAMBLE_LONG);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   873
}
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   874
Time
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   875
MacLow::GetCtsDuration (Mac48Address to, WifiMode rtsTxMode) const
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   876
{
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   877
  WifiMode ctsMode = GetCtsTxModeForRts (to, rtsTxMode);
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   878
  return m_phy->CalculateTxDuration (GetCtsSize (), ctsMode, WIFI_PREAMBLE_LONG);
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
   879
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   880
uint32_t 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   881
MacLow::GetCtsSize (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   882
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   883
  WifiMacHeader cts;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   884
  cts.SetType (WIFI_MAC_CTL_CTS);
1996
454a63cf6549 cts, rts, and ack sizes must take into account fcs padding
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1993
diff changeset
   885
  return cts.GetSize () + 4;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   886
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   887
uint32_t 
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   888
MacLow::GetSize (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   889
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   890
  WifiMacTrailer fcs;
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   891
  return packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   892
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   893
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   894
WifiMode
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   895
MacLow::GetRtsTxMode (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   896
{
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   897
  Mac48Address to = hdr->GetAddr1 ();
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   898
  return GetStation (to)->GetRtsMode (packet);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   899
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   900
WifiMode
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   901
MacLow::GetDataTxMode (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   902
{
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   903
  Mac48Address to = hdr->GetAddr1 ();
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   904
  WifiMacTrailer fcs;
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   905
  uint32_t size =  packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   906
  return GetStation (to)->GetDataMode (packet, size);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   907
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   908
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   909
WifiMode
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   910
MacLow::GetCtsTxModeForRts (Mac48Address to, WifiMode rtsTxMode) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   911
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   912
  return GetStation (to)->GetCtsMode (rtsTxMode);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   913
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   914
WifiMode
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   915
MacLow::GetAckTxModeForData (Mac48Address to, WifiMode dataTxMode) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   916
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   917
  return GetStation (to)->GetAckMode (dataTxMode);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   918
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   919
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   920
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   921
Time
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   922
MacLow::CalculateOverallTxTime (Ptr<const Packet> packet,
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5189
diff changeset
   923
                                const WifiMacHeader* hdr, 
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5189
diff changeset
   924
                                const MacLowTransmissionParameters& params) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   925
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   926
  Time txTime = Seconds (0);
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   927
  WifiMode rtsMode = GetRtsTxMode (packet, hdr);
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   928
  WifiMode dataMode = GetDataTxMode (packet, hdr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   929
  if (params.MustSendRts ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   930
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   931
      txTime += m_phy->CalculateTxDuration (GetRtsSize (), rtsMode, WIFI_PREAMBLE_LONG);
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   932
      txTime += GetCtsDuration (hdr->GetAddr1 (), rtsMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   933
      txTime += GetSifs () * Scalar (2);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   934
    }
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   935
  uint32_t dataSize = GetSize (packet, hdr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   936
  txTime += m_phy->CalculateTxDuration (dataSize, dataMode, WIFI_PREAMBLE_LONG);
1996
454a63cf6549 cts, rts, and ack sizes must take into account fcs padding
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1993
diff changeset
   937
  if (params.MustWaitAck ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   938
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   939
      txTime += GetSifs ();
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   940
      txTime += GetAckDuration (hdr->GetAddr1 (), dataMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   941
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   942
  return txTime;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   943
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   944
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   945
Time
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   946
MacLow::CalculateTransmissionTime (Ptr<const Packet> packet,
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5189
diff changeset
   947
                                   const WifiMacHeader* hdr, 
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5189
diff changeset
   948
                                   const MacLowTransmissionParameters& params) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   949
{
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   950
  Time txTime = CalculateOverallTxTime (packet, hdr, params);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   951
  if (params.HasNextPacket ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   952
    {
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
   953
      WifiMode dataMode = GetDataTxMode (packet, hdr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   954
      txTime += GetSifs ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   955
      txTime += m_phy->CalculateTxDuration (params.GetNextPacketSize (), dataMode, WIFI_PREAMBLE_LONG);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   956
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   957
  return txTime;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   958
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   959
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   960
void
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   961
MacLow::NotifyNav (const WifiMacHeader &hdr, WifiMode txMode, WifiPreamble preamble)
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   962
{
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   963
  NS_ASSERT (m_lastNavStart <= Simulator::Now ());
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   964
  Time duration = hdr.GetDuration ();
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   965
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   966
  if (hdr.IsCfpoll () &&
3600
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   967
      hdr.GetAddr2 () == m_bssid) 
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   968
    {
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   969
      // see section 9.3.2.2 802.11-1999
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   970
      DoNavResetNow (duration);
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   971
      return;
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   972
    }
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   973
  // XXX Note that we should also handle CF_END specially here
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   974
  // but we don't for now because we do not generate them.
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   975
  else if (hdr.GetAddr1 () != m_self)
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   976
    {
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   977
      // see section 9.2.5.4 802.11-1999
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   978
      bool navUpdated = DoNavStartNow (duration);
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   979
      if (hdr.IsRts () && navUpdated)
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   980
        {
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   981
          /**
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   982
           * A STA that used information from an RTS frame as the most recent basis to update its NAV setting 
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   983
           * is permitted to reset its NAV if no PHY-RXSTART.indication is detected from the PHY during a 
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   984
           * period with a duration of (2 * aSIFSTime) + (CTS_Time) + (2 * aSlotTime) starting at the 
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   985
           * PHY-RXEND.indication corresponding to the detection of the RTS frame. The “CTS_Time” shall 
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   986
           * be calculated using the length of the CTS frame and the data rate at which the RTS frame 
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   987
           * used for the most recent NAV update was received.
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   988
           */
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   989
          WifiMacHeader cts;
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   990
          cts.SetType (WIFI_MAC_CTL_CTS);
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   991
          Time navCounterResetCtsMissedDelay = 
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   992
            m_phy->CalculateTxDuration (cts.GetSerializedSize (), txMode, preamble) +
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   993
            Scalar (2) * GetSifs () + Scalar (2) * GetSlotTime ();
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   994
          m_navCounterResetCtsMissed = Simulator::Schedule (navCounterResetCtsMissedDelay,
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   995
                                                            &MacLow::NavCounterResetCtsMissed, this,
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   996
                                                            Simulator::Now ());
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   997
        }
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   998
    }
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   999
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1000
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1001
void
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1002
MacLow::NavCounterResetCtsMissed (Time rtsEndRxTime)
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1003
{
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1004
  if (m_phy->GetLastRxStartTime () > rtsEndRxTime)
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1005
    {
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1006
      DoNavResetNow (Seconds (0.0));
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1007
    }
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1008
}
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1009
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1010
void
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1011
MacLow::DoNavResetNow (Time duration)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1012
{
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1013
  for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) 
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1014
    {
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1015
      (*i)->NavReset (duration);
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1016
    }
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1017
  m_lastNavStart = Simulator::Now ();
4514
d7e974543905 Backed out changeset d21a2eafb84d
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4512
diff changeset
  1018
  m_lastNavStart = duration;
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1019
}
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1020
bool
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1021
MacLow::DoNavStartNow (Time duration)
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1022
{
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1023
  for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) 
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1024
    {
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1025
      (*i)->NavStart (duration);
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1026
    }
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1027
  Time newNavEnd = Simulator::Now () + duration;
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1028
  Time oldNavEnd = m_lastNavStart + m_lastNavDuration;
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1029
  if (newNavEnd > oldNavEnd)
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1030
    {
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1031
      m_lastNavStart = Simulator::Now ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1032
      m_lastNavDuration = duration;
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1033
      return true;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1034
    }
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1035
  return false;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1036
}
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1037
void
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1038
MacLow::NotifyAckTimeoutStartNow (Time duration)
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1039
{
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1040
  for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) 
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1041
    {
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1042
      (*i)->AckTimeoutStart (duration);
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1043
    }
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1044
}
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1045
void
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1046
MacLow::NotifyAckTimeoutResetNow ()
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1047
{
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1048
  for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) 
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1049
    {
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1050
      (*i)->AckTimeoutReset ();
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1051
    }
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1052
}
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1053
void
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1054
MacLow::NotifyCtsTimeoutStartNow (Time duration)
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1055
{
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1056
  for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) 
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1057
    {
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1058
      (*i)->CtsTimeoutStart (duration);
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1059
    }
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1060
}
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1061
void
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1062
MacLow::NotifyCtsTimeoutResetNow ()
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1063
{
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1064
  for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++) 
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1065
    {
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1066
      (*i)->CtsTimeoutReset ();
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1067
    }
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1068
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1069
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1070
void
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5189
diff changeset
  1071
MacLow::ForwardDown (Ptr<const Packet> packet, const WifiMacHeader* hdr, 
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1072
                     WifiMode txMode)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1073
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1074
  NS_LOG_FUNCTION (this << packet << hdr << txMode);
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1075
  NS_LOG_DEBUG ("send " << hdr->GetTypeString () <<
2023
df3bd08f1173 simplify logging output
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2022
diff changeset
  1076
            ", to=" << hdr->GetAddr1 () <<
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1077
            ", size=" << packet->GetSize () <<
2023
df3bd08f1173 simplify logging output
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2022
diff changeset
  1078
            ", mode=" << txMode <<
df3bd08f1173 simplify logging output
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2022
diff changeset
  1079
            ", duration=" << hdr->GetDuration () <<
df3bd08f1173 simplify logging output
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2022
diff changeset
  1080
            ", seq=0x"<< std::hex << m_currentHdr.GetSequenceControl () << std::dec);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1081
  m_phy->SendPacket (packet, txMode, WIFI_PREAMBLE_LONG, 0);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1082
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1083
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1084
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1085
MacLow::CtsTimeout (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1086
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1087
  NS_LOG_FUNCTION (this);
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1088
  NS_LOG_DEBUG ("cts timeout");
2136
46315cd94b6f add XXX for two bugs
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1089
  // XXX: should check that there was no rx start before now.
46315cd94b6f add XXX for two bugs
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1090
  // we should restart a new cts timeout now until the expected
46315cd94b6f add XXX for two bugs
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1091
  // end of rx if there was a rx start before now.
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
  1092
  WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1093
  station->ReportRtsFailed ();
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1094
  m_currentPacket = 0;
2088
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1095
  MacLowTransmissionListener *listener = m_listener;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1096
  m_listener = 0;
2088
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1097
  listener->MissedCts ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1098
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1099
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1100
MacLow::NormalAckTimeout (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1101
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1102
  NS_LOG_FUNCTION (this);
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1103
  NS_LOG_DEBUG ("normal ack timeout");
2136
46315cd94b6f add XXX for two bugs
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1104
  // XXX: should check that there was no rx start before now.
46315cd94b6f add XXX for two bugs
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1105
  // we should restart a new ack timeout now until the expected
46315cd94b6f add XXX for two bugs
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1106
  // end of rx if there was a rx start before now.
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
  1107
  WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1108
  station->ReportDataFailed ();
2088
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1109
  MacLowTransmissionListener *listener = m_listener;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1110
  m_listener = 0;
2088
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1111
  listener->MissedAck ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1112
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1113
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1114
MacLow::FastAckTimeout (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1115
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1116
  NS_LOG_FUNCTION (this);
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
  1117
  WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1118
  station->ReportDataFailed ();
2088
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1119
  MacLowTransmissionListener *listener = m_listener;
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1120
  m_listener = 0;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1121
  if (m_phy->IsStateIdle ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1122
    {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1123
      NS_LOG_DEBUG ("fast Ack idle missed");
2088
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1124
      listener->MissedAck ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1125
    }
2088
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1126
  else
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1127
    {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1128
      NS_LOG_DEBUG ("fast Ack ok");
2088
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1129
    }
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1130
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1131
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1132
MacLow::SuperFastAckTimeout ()
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1133
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1134
  NS_LOG_FUNCTION (this);
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
  1135
  WifiRemoteStation *station = GetStation (m_currentHdr.GetAddr1 ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1136
  station->ReportDataFailed ();
2088
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1137
  MacLowTransmissionListener *listener = m_listener;
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1138
  m_listener = 0;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1139
  if (m_phy->IsStateIdle ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1140
    {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1141
      NS_LOG_DEBUG ("super fast Ack failed");
2088
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1142
      listener->MissedAck ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1143
    } 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1144
  else 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1145
    {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1146
      NS_LOG_DEBUG ("super fast Ack ok");
2088
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1147
      listener->GotAck (0.0, WifiMode ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1148
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1149
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1150
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1151
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1152
MacLow::SendRtsForPacket (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1153
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1154
  NS_LOG_FUNCTION (this);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1155
  /* send an RTS for this packet. */
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1156
  WifiMacHeader rts;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1157
  rts.SetType (WIFI_MAC_CTL_RTS);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1158
  rts.SetDsNotFrom ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1159
  rts.SetDsNotTo ();
3659
653395340b5c should set retry bit in rts and acks.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3658
diff changeset
  1160
  rts.SetNoRetry ();
2793
10a571d9a9f7 initialize no more fragment flag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2547
diff changeset
  1161
  rts.SetNoMoreFragments ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1162
  rts.SetAddr1 (m_currentHdr.GetAddr1 ());
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
  1163
  rts.SetAddr2 (m_self);
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1164
  WifiMode rtsTxMode = GetRtsTxMode (m_currentPacket, &m_currentHdr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1165
  Time duration = Seconds (0);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1166
  if (m_txParams.HasDurationId ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1167
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1168
      duration += m_txParams.GetDurationId ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1169
    } 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1170
  else 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1171
    {
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1172
      WifiMode dataTxMode = GetDataTxMode (m_currentPacket, &m_currentHdr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1173
      duration += GetSifs ();
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1174
      duration += GetCtsDuration (m_currentHdr.GetAddr1 (), rtsTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1175
      duration += GetSifs ();
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1176
      duration += m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), 
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1177
                                              dataTxMode, WIFI_PREAMBLE_LONG);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1178
      duration += GetSifs ();
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1179
      duration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1180
    }
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1181
  rts.SetDuration (duration);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1182
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1183
  Time txDuration = m_phy->CalculateTxDuration (GetRtsSize (), rtsTxMode, WIFI_PREAMBLE_LONG);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1184
  Time timerDelay = txDuration + GetCtsTimeout ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1185
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
  1186
  NS_ASSERT (m_ctsTimeoutEvent.IsExpired ());
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1187
  NotifyCtsTimeoutStartNow (timerDelay);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1188
  m_ctsTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::CtsTimeout, this);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1189
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1190
  Ptr<Packet> packet = Create<Packet> ();
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1191
  packet->AddHeader (rts);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1192
  WifiMacTrailer fcs;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1193
  packet->AddTrailer (fcs);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1194
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1195
  ForwardDown (packet, &rts, rtsTxMode);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1196
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1197
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1198
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1199
MacLow::StartDataTxTimers (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1200
{
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1201
  WifiMode dataTxMode = GetDataTxMode (m_currentPacket, &m_currentHdr);
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1202
  Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxMode, WIFI_PREAMBLE_LONG);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1203
  if (m_txParams.MustWaitNormalAck ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1204
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1205
      Time timerDelay = txDuration + GetAckTimeout ();
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
  1206
      NS_ASSERT (m_normalAckTimeoutEvent.IsExpired ());
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1207
      NotifyAckTimeoutStartNow (timerDelay);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1208
      m_normalAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::NormalAckTimeout, this);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1209
    } 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1210
  else if (m_txParams.MustWaitFastAck ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1211
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1212
      Time timerDelay = txDuration + GetPifs ();
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
  1213
      NS_ASSERT (m_fastAckTimeoutEvent.IsExpired ());
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1214
      NotifyAckTimeoutStartNow (timerDelay);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1215
      m_fastAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::FastAckTimeout, this);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1216
    } 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1217
  else if (m_txParams.MustWaitSuperFastAck ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1218
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1219
      Time timerDelay = txDuration + GetPifs ();
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
  1220
      NS_ASSERT (m_superFastAckTimeoutEvent.IsExpired ());
4509
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1221
      NotifyAckTimeoutStartNow (timerDelay);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1222
      m_superFastAckTimeoutEvent = Simulator::Schedule (timerDelay, 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1223
                                                        &MacLow::SuperFastAckTimeout, this);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1224
    } 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1225
  else if (m_txParams.HasNextPacket ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1226
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1227
      Time delay = txDuration + GetSifs ();
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
  1228
      NS_ASSERT (m_waitSifsEvent.IsExpired ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1229
      m_waitSifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1230
    } 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1231
  else 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1232
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1233
      // since we do not expect any timer to be triggered.
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1234
      m_listener = 0;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1235
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1236
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1237
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1238
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1239
MacLow::SendDataPacket (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1240
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1241
  NS_LOG_FUNCTION (this);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1242
  /* send this packet directly. No RTS is needed. */
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1243
  StartDataTxTimers ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1244
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1245
  WifiMode dataTxMode = GetDataTxMode (m_currentPacket, &m_currentHdr);
2163
03fe5e8740dc fix a small style issue
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
  1246
  Time duration = Seconds (0.0);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1247
  if (m_txParams.HasDurationId ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1248
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1249
      duration += m_txParams.GetDurationId ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1250
    } 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1251
  else 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1252
    {
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1253
      if (m_txParams.MustWaitBasicBlockAck ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1254
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1255
          duration += GetSifs ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1256
          duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), dataTxMode, BASIC_BLOCK_ACK);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1257
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1258
      else if (m_txParams.MustWaitCompressedBlockAck ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1259
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1260
          duration += GetSifs ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1261
          duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), dataTxMode, COMPRESSED_BLOCK_ACK);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1262
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1263
      else if (m_txParams.MustWaitAck ()) 
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1264
        {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1265
          duration += GetSifs ();
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1266
          duration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1267
        }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1268
      if (m_txParams.HasNextPacket ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1269
        {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1270
          duration += GetSifs ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1271
          duration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (), 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1272
                                                  dataTxMode, WIFI_PREAMBLE_LONG);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1273
          if (m_txParams.MustWaitAck ()) 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1274
            {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1275
              duration += GetSifs ();
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1276
              duration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1277
            }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1278
        }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1279
    }
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1280
  m_currentHdr.SetDuration (duration);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1281
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1282
  m_currentPacket->AddHeader (m_currentHdr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1283
  WifiMacTrailer fcs;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1284
  m_currentPacket->AddTrailer (fcs);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1285
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1286
  ForwardDown (m_currentPacket, &m_currentHdr, dataTxMode);
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1287
  m_currentPacket = 0;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1288
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1289
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1290
bool 
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1291
MacLow::IsNavZero (void) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1292
{
2177
d2d60d000963 the check was not really inverted after all. Damned.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2176
diff changeset
  1293
  if (m_lastNavStart + m_lastNavDuration < Simulator::Now ()) 
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1294
    {
2172
eb1adef495b6 the bool check was inverted. reported by Federico Maguolo.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2163
diff changeset
  1295
      return true;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1296
    } 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1297
  else 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1298
    {
2172
eb1adef495b6 the bool check was inverted. reported by Federico Maguolo.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2163
diff changeset
  1299
      return false;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1300
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1301
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1302
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
  1303
WifiRemoteStation *
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1304
MacLow::GetStation (Mac48Address ad) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1305
{
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
  1306
  return m_stationManager->Lookup (ad);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1307
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1308
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1309
void
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1310
MacLow::SendCtsAfterRts (Mac48Address source, Time duration, WifiMode rtsTxMode, double rtsSnr)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1311
{
3746
524b07b47f32 improve debugging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3659
diff changeset
  1312
  NS_LOG_FUNCTION (this << source << duration << rtsTxMode << rtsSnr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1313
  /* send a CTS when you receive a RTS 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1314
   * right after SIFS.
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1315
   */
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1316
  WifiMode ctsTxMode = GetCtsTxModeForRts (source, rtsTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1317
  WifiMacHeader cts;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1318
  cts.SetType (WIFI_MAC_CTL_CTS);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1319
  cts.SetDsNotFrom ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1320
  cts.SetDsNotTo ();
2793
10a571d9a9f7 initialize no more fragment flag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2547
diff changeset
  1321
  cts.SetNoMoreFragments ();
3659
653395340b5c should set retry bit in rts and acks.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3658
diff changeset
  1322
  cts.SetNoRetry ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1323
  cts.SetAddr1 (source);
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1324
  duration -= GetCtsDuration (source, rtsTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1325
  duration -= GetSifs ();
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1326
  NS_ASSERT (duration >= MicroSeconds (0));
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1327
  cts.SetDuration (duration);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1328
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1329
  Ptr<Packet> packet = Create<Packet> ();
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1330
  packet->AddHeader (cts);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1331
  WifiMacTrailer fcs;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1332
  packet->AddTrailer (fcs);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1333
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1334
  struct SnrTag tag;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1335
  tag.Set (rtsSnr);
4502
07d34c0d8d18 new tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4264
diff changeset
  1336
  packet->AddPacketTag (tag);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1337
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1338
  ForwardDown (packet, &cts, ctsTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1339
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1340
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1341
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1342
MacLow::SendDataAfterCts (Mac48Address source, Time duration, WifiMode txMode)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1343
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1344
  NS_LOG_FUNCTION (this);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1345
  /* send the third step in a 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1346
   * RTS/CTS/DATA/ACK hanshake 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1347
   */
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1348
  NS_ASSERT (m_currentPacket != 0);
2176
8a8305b75bed make sure we never set a negative duration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2172
diff changeset
  1349
  StartDataTxTimers ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1350
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1351
  WifiMode dataTxMode = GetDataTxMode (m_currentPacket, &m_currentHdr);
2176
8a8305b75bed make sure we never set a negative duration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2172
diff changeset
  1352
  Time newDuration = Seconds (0);
8a8305b75bed make sure we never set a negative duration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2172
diff changeset
  1353
  newDuration += GetSifs ();
8a8305b75bed make sure we never set a negative duration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2172
diff changeset
  1354
  newDuration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxMode);
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1355
  Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), 
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1356
                                                dataTxMode, WIFI_PREAMBLE_LONG);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1357
  duration -= txDuration;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1358
  duration -= GetSifs ();
2176
8a8305b75bed make sure we never set a negative duration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2172
diff changeset
  1359
8a8305b75bed make sure we never set a negative duration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2172
diff changeset
  1360
  duration = std::max (duration, newDuration);
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1361
  NS_ASSERT (duration >= MicroSeconds (0));
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1362
  m_currentHdr.SetDuration (duration);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1363
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1364
  m_currentPacket->AddHeader (m_currentHdr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1365
  WifiMacTrailer fcs;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1366
  m_currentPacket->AddTrailer (fcs);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1367
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1368
  ForwardDown (m_currentPacket, &m_currentHdr, dataTxMode);
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1369
  m_currentPacket = 0;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1370
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1371
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1372
void 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1373
MacLow::WaitSifsAfterEndTx (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1374
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1375
  m_listener->StartNext ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1376
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1377
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1378
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1379
MacLow::FastAckFailedTimeout (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1380
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1381
  NS_LOG_FUNCTION (this);
2088
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1382
  MacLowTransmissionListener *listener = m_listener;
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1383
  m_listener = 0;
a651a0131bfe make sure that m_listener is not reset to zero _after_ calling a user-provided callback. This allows the user-provided callback to set the m_listener member to a new value if it wants to start a new transmission
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2054
diff changeset
  1384
  listener->MissedAck ();
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1385
  NS_LOG_DEBUG ("fast Ack busy but missed");
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1386
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1387
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1388
void
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1389
MacLow::SendAckAfterData (Mac48Address source, Time duration, WifiMode dataTxMode, double dataSnr)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1390
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1391
  NS_LOG_FUNCTION (this);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1392
  /* send an ACK when you receive 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1393
   * a packet after SIFS. 
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1394
   */
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1395
  WifiMode ackTxMode = GetAckTxModeForData (source, dataTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1396
  WifiMacHeader ack;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1397
  ack.SetType (WIFI_MAC_CTL_ACK);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1398
  ack.SetDsNotFrom ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1399
  ack.SetDsNotTo ();
3658
f44b66348690 should set retry bit in acks.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3601
diff changeset
  1400
  ack.SetNoRetry ();
2793
10a571d9a9f7 initialize no more fragment flag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2547
diff changeset
  1401
  ack.SetNoMoreFragments ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1402
  ack.SetAddr1 (source);
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1403
  duration -= GetAckDuration (source, dataTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1404
  duration -= GetSifs ();
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1405
  NS_ASSERT (duration >= MicroSeconds (0));
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1406
  ack.SetDuration (duration);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1407
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1408
  Ptr<Packet> packet = Create<Packet> ();
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1409
  packet->AddHeader (ack);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1410
  WifiMacTrailer fcs;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1411
  packet->AddTrailer (fcs);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1412
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1413
  struct SnrTag tag;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1414
  tag.Set (dataSnr);
4502
07d34c0d8d18 new tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4264
diff changeset
  1415
  packet->AddPacketTag (tag);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1416
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1417
  ForwardDown (packet, &ack, ackTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1418
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1419
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1420
bool
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1421
MacLow::StoreMpduIfNeeded (Ptr<Packet> packet, WifiMacHeader hdr)
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1422
{
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1423
  AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1424
  if (it != m_bAckAgreements.end ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1425
   {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1426
     WifiMacTrailer fcs;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1427
     packet->RemoveTrailer (fcs);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1428
     BufferedPacket bufferedPacket (packet, hdr);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1429
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1430
     uint16_t endSequence = ((*it).second.first.GetStartingSequence () + 2047) % 4096;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1431
     uint16_t mappedSeqControl = QosUtilsMapSeqControlToUniqueInteger (hdr.GetSequenceControl () ,endSequence);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1432
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1433
     BufferedPacketI i = (*it).second.second.begin ();
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1434
     for (; i != (*it).second.second.end () &&
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1435
            QosUtilsMapSeqControlToUniqueInteger ((*i).second.GetSequenceControl (), endSequence) < mappedSeqControl; i++);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1436
     (*it).second.second.insert (i, bufferedPacket);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1437
     return true;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1438
   }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1439
  return false;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1440
}
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1441
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1442
void
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1443
MacLow::CreateBlockAckAgreement (const MgtAddBaResponseHeader *respHdr, Mac48Address originator,
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1444
                                 uint16_t startingSeq)
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1445
{
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1446
  BlockAckAgreement agreement (originator, respHdr->GetTid ());
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1447
  if (respHdr->IsImmediateBlockAck ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1448
    {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1449
      agreement.SetImmediateBlockAck ();
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1450
    }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1451
  else
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1452
    {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1453
      agreement.SetDelayedBlockAck ();
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1454
    }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1455
  agreement.SetAmsduSupport (respHdr->IsAmsduSupported ());
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1456
  agreement.SetBufferSize (respHdr->GetBufferSize ());
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1457
  agreement.SetTimeout (respHdr->GetTimeout ());
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1458
  agreement.SetStartingSequence (startingSeq);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1459
  
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1460
  std::list<BufferedPacket> buffer (0);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1461
  AgreementKey key (originator, respHdr->GetTid ());
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1462
  AgreementValue value (agreement, buffer);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1463
  m_bAckAgreements.insert (std::make_pair (key, value));
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1464
}
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1465
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1466
void
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1467
MacLow::DestroyBlockAckAgreement (Mac48Address originator, uint8_t tid)
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1468
{
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1469
  AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1470
  if (it != m_bAckAgreements.end ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1471
    {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1472
      RxCompleteBufferedPacketsWithSmallerSequence (it->second.first.GetStartingSequence (), originator, tid);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1473
      RxCompleteBufferedPackets (originator, tid);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1474
      m_bAckAgreements.erase (it);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1475
    }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1476
}
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1477
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1478
void
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1479
MacLow::RxCompleteBufferedPacketsWithSmallerSequence (uint16_t seq, Mac48Address originator, uint8_t tid)
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1480
{
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1481
  AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1482
  if (it != m_bAckAgreements.end ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1483
    {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1484
      BufferedPacketI i = (*it).second.second.begin ();
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1485
      uint16_t endSequence = ((*it).second.first.GetStartingSequence () + 2047) % 4096;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1486
      uint16_t mappedStart = QosUtilsMapSeqControlToUniqueInteger (seq, endSequence);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1487
      uint16_t guard = (*it).second.first.GetStartingSequence ();
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1488
      BufferedPacketI last = (*it).second.second.begin ();
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1489
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1490
      for (; i != (*it).second.second.end () &&
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1491
             QosUtilsMapSeqControlToUniqueInteger ((*i).second.GetSequenceNumber (), endSequence) < mappedStart;)
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1492
        {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1493
          while (i != (*it).second.second.end () && guard == (*i).second.GetSequenceControl ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1494
            {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1495
              if (!(*i).second.IsMoreFragments ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1496
                {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1497
                  while (last != i)
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1498
                    {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1499
                      m_rxCallback ((*last).first, &(*last).second);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1500
                      last++;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1501
                    }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1502
                  m_rxCallback ((*last).first, &(*last).second);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1503
                  last++;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1504
                }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1505
              guard = (*i).second.IsMoreFragments () ? (guard + 1) : ((guard + 16) & 0xfff0);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1506
            }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1507
          /* go to next packet */
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1508
          while (i != (*it).second.second.end () && ((guard >> 4) & 0x0fff) == (*i).second.GetSequenceNumber ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1509
            {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1510
              i++;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1511
            }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1512
          if (i != (*it).second.second.end ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1513
            {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1514
              guard = (*i).second.GetSequenceControl () & 0xfff0;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1515
              last = i;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1516
            }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1517
        }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1518
      (*it).second.second.erase ((*it).second.second.begin (), i);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1519
    }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1520
}
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1521
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1522
void
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1523
MacLow::RxCompleteBufferedPackets (Mac48Address originator, uint8_t tid)
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1524
{
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1525
  AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1526
  if (it != m_bAckAgreements.end ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1527
    {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1528
      uint16_t startingSeqCtrl = ((*it).second.first.GetStartingSequence ()<<4) & 0xfff0;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1529
      uint16_t guard = startingSeqCtrl;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1530
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1531
      BufferedPacketI lastComplete = (*it).second.second.begin ();
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1532
      BufferedPacketI i = (*it).second.second.begin ();
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1533
      for (;i != (*it).second.second.end() && guard == (*i).second.GetSequenceControl (); i++)
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1534
        {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1535
          if (!(*i).second.IsMoreFragments ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1536
            {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1537
              while (lastComplete != i)
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1538
                {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1539
                  m_rxCallback ((*lastComplete).first, &(*lastComplete).second);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1540
                  lastComplete++;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1541
                }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1542
               m_rxCallback ((*lastComplete).first, &(*lastComplete).second);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1543
               lastComplete++;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1544
            }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1545
          guard = (*i).second.IsMoreFragments () ? (guard + 1) : ((guard + 16) & 0xfff0);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1546
        }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1547
      (*it).second.first.SetStartingSequence ((guard>>4)&0x0fff);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1548
      /* All packets already forwarded to WifiMac must be removed from buffer: 
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1549
      [begin (), lastComplete) */
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1550
      (*it).second.second.erase ((*it).second.second.begin (), lastComplete);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1551
    }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1552
}
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  1553
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1554
void
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1555
MacLow::SendBlockAckResponse (const CtrlBAckResponseHeader* blockAck, Mac48Address originator, bool immediate,
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1556
                              Time duration, WifiMode blockAckReqTxMode)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1557
{
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1558
  Ptr<Packet> packet = Create<Packet> ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1559
  packet->AddHeader (*blockAck);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1560
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1561
  WifiMacHeader hdr;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1562
  hdr.SetType (WIFI_MAC_CTL_BACKRESP);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1563
  hdr.SetAddr1 (originator);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1564
  hdr.SetAddr2 (GetAddress ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1565
  hdr.SetDsNotFrom ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1566
  hdr.SetDsNotTo ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1567
  hdr.SetNoRetry ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1568
  hdr.SetNoMoreFragments ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1569
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1570
  m_currentPacket = packet;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1571
  m_currentHdr = hdr;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1572
  if (immediate)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1573
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1574
      m_txParams.DisableAck ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1575
      duration -= GetSifs ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1576
      /* from section 9.6 in IEEE802.11e:
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1577
         The BlockAck control frame shall be sent at the same rate and modulation class as
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1578
         the BlockAckReq frame if it is sent in response to a BlockAckReq frame.*/
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1579
      if (blockAck->IsBasic ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1580
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1581
          duration -= GetBlockAckDuration (originator, blockAckReqTxMode, BASIC_BLOCK_ACK);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1582
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1583
      else if (blockAck->IsCompressed ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1584
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1585
          duration -= GetBlockAckDuration (originator, blockAckReqTxMode, COMPRESSED_BLOCK_ACK);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1586
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1587
      else if (blockAck->IsMultiTid ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1588
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1589
          NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1590
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1591
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1592
  else
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1593
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1594
      m_txParams.EnableAck ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1595
      duration += GetSifs ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1596
      duration += GetAckDuration (originator, blockAckReqTxMode);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1597
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1598
  m_txParams.DisableNextData ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1599
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1600
  StartDataTxTimers ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1601
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1602
  NS_ASSERT (duration >= MicroSeconds (0));
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1603
  hdr.SetDuration (duration);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1604
  //here should be present a control about immediate or delayed block ack
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1605
  //for now we assume immediate
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1606
  packet->AddHeader (hdr);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1607
  WifiMacTrailer fcs;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1608
  packet->AddTrailer (fcs);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1609
  ForwardDown (packet, &hdr, blockAckReqTxMode);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1610
  m_currentPacket = 0;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1611
}
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1612
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1613
void
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1614
MacLow::SendBlockAckAfterBlockAckRequest (const CtrlBAckRequestHeader reqHdr, Mac48Address originator,
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1615
                                          Time duration, WifiMode blockAckReqTxMode)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1616
{
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1617
  NS_LOG_FUNCTION (this);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1618
  CtrlBAckResponseHeader blockAck;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1619
  uint8_t tid;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1620
  bool immediate = false;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1621
  if (!reqHdr.IsMultiTid ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1622
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1623
      blockAck.SetStartingSequence (reqHdr.GetStartingSequence ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1624
      blockAck.SetTidInfo (reqHdr.GetTidInfo ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1625
      
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1626
      tid = reqHdr.GetTidInfo ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1627
      AgreementsI it;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1628
      it = m_bAckAgreements.find (std::make_pair (originator, tid));
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1629
      if (it != m_bAckAgreements.end ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1630
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1631
          immediate = (*it).second.first.IsImmediateBlockAck ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1632
          uint16_t startingSeqCtrl = reqHdr.GetStartingSequenceControl ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1633
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1634
          /* All packets with smaller sequence than starting sequence control must be passed up to Wifimac 
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1635
           * See 9.10.3 in IEEE8022.11e standard.
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1636
           */
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1637
          RxCompleteBufferedPacketsWithSmallerSequence ((startingSeqCtrl>>4)&0xfff0, originator, tid);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1638
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1639
          std::list<BufferedPacket>::iterator i = (*it).second.second.begin ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1640
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1641
          /* For more details about next operations see section 9.10.4 of IEEE802.11e standard */
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1642
          if (reqHdr.IsBasic ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1643
            {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1644
              blockAck.SetType (BASIC_BLOCK_ACK);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1645
              uint16_t guard = startingSeqCtrl;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1646
              std::list<BufferedPacket>::iterator lastComplete = (*it).second.second.begin ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1647
              for (; i != (*it).second.second.end () && guard == (*i).second.GetSequenceControl (); i++)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1648
                {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1649
                  blockAck.SetReceivedFragment ((*i).second.GetSequenceNumber (),
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1650
                                                (*i).second.GetFragmentNumber ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1651
                   /* Section 9.10.4 in IEEE802.11n: the recipient shall pass up to WifiMac the 
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1652
                    * MSDUs and A-MSDUs starting with the starting sequence number 
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1653
                    * sequentially until there is an incomplete MSDU or A-MSDU in the buffer */
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1654
                  if (!(*i).second.IsMoreFragments ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1655
                    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1656
                      while (lastComplete != i)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1657
                        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1658
                          m_rxCallback ((*lastComplete).first, &(*lastComplete).second);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1659
                          lastComplete++;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1660
                        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1661
                      m_rxCallback ((*lastComplete).first, &(*lastComplete).second);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1662
                      lastComplete++;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1663
                    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1664
                  guard = (*i).second.IsMoreFragments () ? (guard + 1) : (guard + 16) & 0xfff0;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1665
                }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1666
              (*it).second.first.SetStartingSequence ((guard>>4)&0x0fff);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1667
              /* All packets already forwarded to WifiMac must be removed from buffer: 
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1668
                 [begin (), lastComplete) */
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1669
              (*it).second.second.erase ((*it).second.second.begin (), lastComplete);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1670
              for (i = lastComplete; i != (*it).second.second.end (); i++)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1671
                { 
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1672
                  blockAck.SetReceivedFragment ((*i).second.GetSequenceNumber (),
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1673
                                                (*i).second.GetFragmentNumber ());  
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1674
                }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1675
            }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1676
          else if (reqHdr.IsCompressed ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1677
            {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1678
              blockAck.SetType (COMPRESSED_BLOCK_ACK);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1679
              uint16_t guard = startingSeqCtrl;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1680
              std::list<BufferedPacket>::iterator lastComplete = (*it).second.second.begin ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1681
              for (; i != (*it).second.second.end () && guard == (*i).second.GetSequenceControl (); i++)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1682
                {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1683
                  if (!(*i).second.IsMoreFragments ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1684
                    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1685
                      blockAck.SetReceivedPacket ((*i).second.GetSequenceNumber ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1686
                      while (lastComplete != i)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1687
                        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1688
                          m_rxCallback ((*lastComplete).first, &(*lastComplete).second);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1689
                          lastComplete++;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1690
                        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1691
                      m_rxCallback ((*lastComplete).first, &(*lastComplete).second);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1692
                      lastComplete++;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1693
                    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1694
                  guard = (*i).second.IsMoreFragments () ? (guard + 1) : (guard + 16) & 0xfff0;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1695
                }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1696
              (*it).second.first.SetStartingSequence ((guard>>4)&0x0fff);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1697
              /* All packets already forwarded to WifiMac must be removed from buffer:
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1698
                 [begin (), lastcomplete) */
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1699
              (*it).second.second.erase ((*it).second.second.begin (), lastComplete);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1700
              i = lastComplete;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1701
              if (i != (*it).second.second.end ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1702
                {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1703
                  guard = (*i).second.GetSequenceControl () & 0xfff0;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1704
                }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1705
              for (; i != (*it).second.second.end ();)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1706
                {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1707
                  for (; i != (*it).second.second.end () && guard == (*i).second.GetSequenceControl (); i++)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1708
                    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1709
                      if (!(*i).second.IsMoreFragments ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1710
                        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1711
                          guard = (guard + 16) & 0xfff0;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1712
                          blockAck.SetReceivedPacket ((*i).second.GetSequenceNumber ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1713
                        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1714
                      else
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1715
                        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1716
                          guard += 1;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1717
                        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1718
                    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1719
                  while (i != (*it).second.second.end () && ((guard >> 4) & 0x0fff) == (*i).second.GetSequenceNumber ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1720
                    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1721
                      i++;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1722
                    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1723
                  if (i != (*it).second.second.end ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1724
                    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1725
                      guard = (*i).second.GetSequenceControl () & 0xfff0;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1726
                    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1727
                }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1728
            }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1729
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1730
      else
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1731
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1732
          NS_LOG_DEBUG ("there's not a valid block ack agreement with "<<originator);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1733
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1734
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1735
  else
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1736
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1737
      NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1738
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1739
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1740
  SendBlockAckResponse (&blockAck, originator, immediate, duration, blockAckReqTxMode);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1741
}
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1742
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1743
} // namespace ns3