src/wifi/model/mac-low.cc
author Peter D. Barnes, Jr. <barnes26@llnl.gov>
Tue, 09 Jun 2015 12:59:59 -0700
changeset 11432 d2656819dd54
parent 11420 ef4dc0386e71
child 11440 af3a3d5dcc21
permissions -rw-r--r--
Fix parents, group names, and missing constructors in GetTypeId definitions.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7385
10beb0e53130 standardize emacs c++ mode comments
Vedran Miletić <rivanvx@gmail.com>
parents: 7333
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
1922
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
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
     7
 * it under the terms of the GNU General Public License version 2 as
1922
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"
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5846
diff changeset
    29
#include "ns3/double.h"
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    31
#include "mac-low.h"
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    32
#include "wifi-phy.h"
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
#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
    34
#include "qos-utils.h"
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
    35
#include "edca-txop-n.h"
9234
310d371059d5 Bug 1566 - WiFi SNR tag improvements
Konstantinos Katsaros <dinos.katsaros@gmail.com>
parents: 9176
diff changeset
    36
#include "snr-tag.h"
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    37
#include "yans-wifi-phy.h"
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    38
#include "ampdu-tag.h"
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    39
#include "wifi-mac-queue.h"
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    40
#include "mpdu-aggregator.h"
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
    42
#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
    43
#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
    44
1993
e665fb7cea73 add time to debug output
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1990
diff changeset
    45
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    46
namespace ns3 {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    47
10968
2d29fee2b7b8 [Bug 1551] Redux: NS_LOG_COMPONENT_DEFINE inside or outside of ns3 namespace?
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10883
diff changeset
    48
NS_LOG_COMPONENT_DEFINE ("MacLow");
2d29fee2b7b8 [Bug 1551] Redux: NS_LOG_COMPONENT_DEFINE inside or outside of ns3 namespace?
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 10883
diff changeset
    49
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    50
MacLowTransmissionListener::MacLowTransmissionListener ()
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    51
{
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    52
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    53
MacLowTransmissionListener::~MacLowTransmissionListener ()
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    54
{
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    55
}
5955
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5954
diff changeset
    56
void
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    57
MacLowTransmissionListener::GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address source, WifiMode mode)
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    58
{
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    59
}
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
    60
void
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
    61
MacLowTransmissionListener::MissedBlockAck (void)
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    62
{
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    63
}
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
    64
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
    65
MacLowDcfListener::MacLowDcfListener ()
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    66
{
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    67
}
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
    68
MacLowDcfListener::~MacLowDcfListener ()
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    69
{
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    70
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
    72
MacLowAggregationCapableTransmissionListener::MacLowAggregationCapableTransmissionListener ()
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    73
{
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    74
}
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
    75
MacLowAggregationCapableTransmissionListener::~MacLowAggregationCapableTransmissionListener ()
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    76
{
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
    77
}
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
    78
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
    79
void MacLowAggregationCapableTransmissionListener::SetAmpdu (bool ampdu)
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    80
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    81
}
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
    82
void MacLowAggregationCapableTransmissionListener::CompleteTransfer(Mac48Address address, uint8_t tid)
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    83
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    84
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    85
void
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
    86
MacLowAggregationCapableTransmissionListener::CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp)
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    87
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    88
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    89
uint16_t 
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
    90
MacLowAggregationCapableTransmissionListener::GetNextSequenceNumberfor (WifiMacHeader *hdr)
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    91
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    92
 return 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    93
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    94
uint16_t 
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
    95
MacLowAggregationCapableTransmissionListener::PeekNextSequenceNumberfor (WifiMacHeader *hdr)
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    96
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    97
 return 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    98
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
    99
Ptr<const Packet> 
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   100
MacLowAggregationCapableTransmissionListener::PeekNextPacketInBaQueue (WifiMacHeader &header, Mac48Address recipient, uint8_t tid, Time *timestamp)
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   101
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   102
 return 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   103
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   104
void 
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   105
MacLowAggregationCapableTransmissionListener::RemoveFromBaQueue (uint8_t tid, Mac48Address recipient, uint16_t seqnumber)
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   106
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   107
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   108
uint32_t 
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   109
MacLowAggregationCapableTransmissionListener::GetNOutstandingPackets (Mac48Address recipient, uint8_t tid)
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   110
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   111
  return 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   112
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   113
uint32_t 
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   114
MacLowAggregationCapableTransmissionListener::GetNRetryNeededPackets (Mac48Address recipient, uint8_t tid) const
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   115
{
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   116
  return 0;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   117
}
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   118
Ptr<MsduAggregator>
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   119
MacLowAggregationCapableTransmissionListener::GetMsduAggregator (void) const
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   120
{
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   121
  return 0;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   122
}
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   123
Mac48Address
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   124
MacLowAggregationCapableTransmissionListener::GetSrcAddressForAggregation (const WifiMacHeader &hdr)
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   125
{
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   126
  return 0;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   127
}
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   128
Mac48Address
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
   129
MacLowAggregationCapableTransmissionListener::GetDestAddressForAggregation (const WifiMacHeader &hdr)
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   130
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   131
  return 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   132
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   133
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   134
MacLowTransmissionParameters::MacLowTransmissionParameters ()
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   135
  : m_nextSize (0),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   136
    m_waitAck (ACK_NONE),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   137
    m_sendRts (false),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   138
    m_overrideDurationId (Seconds (0))
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   139
{
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   140
}
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   141
void
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   142
MacLowTransmissionParameters::EnableNextData (uint32_t size)
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_nextSize = size;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   145
}
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   146
void
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   147
MacLowTransmissionParameters::DisableNextData (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_nextSize = 0;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
}
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   151
void
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   152
MacLowTransmissionParameters::EnableOverrideDurationId (Time durationId)
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_overrideDurationId = durationId;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   155
}
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   156
void
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   157
MacLowTransmissionParameters::DisableOverrideDurationId (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   158
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   159
  m_overrideDurationId = Seconds (0);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   160
}
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   161
void
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   162
MacLowTransmissionParameters::EnableSuperFastAck (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   163
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   164
  m_waitAck = ACK_SUPER_FAST;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   165
}
5954
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::EnableBasicBlockAck (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_BASIC;
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   170
}
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   171
void
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   172
MacLowTransmissionParameters::EnableCompressedBlockAck (void)
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   173
{
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   174
  m_waitAck = BLOCK_ACK_COMPRESSED;
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   175
}
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   176
void
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   177
MacLowTransmissionParameters::EnableMultiTidBlockAck (void)
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   178
{
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   179
  m_waitAck = BLOCK_ACK_MULTI_TID;
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   180
}
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   181
void
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   182
MacLowTransmissionParameters::EnableFastAck (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_FAST;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   185
}
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   186
void
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
MacLowTransmissionParameters::EnableAck (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_waitAck = ACK_NORMAL;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   190
}
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   191
void
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   192
MacLowTransmissionParameters::DisableAck (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_waitAck = ACK_NONE;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   195
}
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   196
void
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   197
MacLowTransmissionParameters::EnableRts (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   198
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   199
  m_sendRts = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   200
}
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   201
void
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   202
MacLowTransmissionParameters::DisableRts (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   204
  m_sendRts = false;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   205
}
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   206
bool
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   207
MacLowTransmissionParameters::MustWaitAck (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_NONE);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   210
}
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   211
bool
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   212
MacLowTransmissionParameters::MustWaitNormalAck (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_NORMAL);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   215
}
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   216
bool
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   217
MacLowTransmissionParameters::MustWaitFastAck (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   218
{
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
   219
  return (m_waitAck == ACK_FAST);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   220
}
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   221
bool
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   222
MacLowTransmissionParameters::MustWaitSuperFastAck (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   223
{
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
   224
  return (m_waitAck == ACK_SUPER_FAST);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   225
}
5954
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::MustWaitBasicBlockAck (void) const
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   228
{
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   229
  return (m_waitAck == BLOCK_ACK_BASIC) ? true : false;
5954
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   230
}
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   231
bool
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   232
MacLowTransmissionParameters::MustWaitCompressedBlockAck (void) const
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   233
{
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   234
  return (m_waitAck == BLOCK_ACK_COMPRESSED) ? true : false;
5954
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   235
}
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   236
bool
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   237
MacLowTransmissionParameters::MustWaitMultiTidBlockAck (void) const
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   238
{
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   239
  return (m_waitAck == BLOCK_ACK_MULTI_TID) ? true : false;
5954
2b9e06875b69 add support for block ack in MacLowTransmissionParameters
Mirko Banchi <mk.banchi@gmail.com>
parents: 5846
diff changeset
   240
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   241
bool
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   242
MacLowTransmissionParameters::MustSendRts (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   243
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   244
  return m_sendRts;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   245
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   246
bool
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   247
MacLowTransmissionParameters::HasDurationId (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   248
{
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
   249
  return (m_overrideDurationId != Seconds (0));
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   250
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   251
Time
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   252
MacLowTransmissionParameters::GetDurationId (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   253
{
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
   254
  NS_ASSERT (m_overrideDurationId != Seconds (0));
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   255
  return m_overrideDurationId;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   256
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   257
bool
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   258
MacLowTransmissionParameters::HasNextPacket (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   259
{
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
   260
  return (m_nextSize != 0);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   261
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   262
uint32_t
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   263
MacLowTransmissionParameters::GetNextPacketSize (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   264
{
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
   265
  NS_ASSERT (HasNextPacket ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   266
  return m_nextSize;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   267
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   268
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   269
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
   270
{
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   271
  os << "["
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7141
diff changeset
   272
  << "send rts=" << params.m_sendRts << ", "
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7141
diff changeset
   273
  << "next size=" << params.m_nextSize << ", "
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7141
diff changeset
   274
  << "dur=" << params.m_overrideDurationId << ", "
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7141
diff changeset
   275
  << "ack=";
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   276
  switch (params.m_waitAck)
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   277
    {
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   278
    case MacLowTransmissionParameters::ACK_NONE:
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   279
      os << "none";
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   280
      break;
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   281
    case MacLowTransmissionParameters::ACK_NORMAL:
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   282
      os << "normal";
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   283
      break;
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   284
    case MacLowTransmissionParameters::ACK_FAST:
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   285
      os << "fast";
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   286
      break;
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   287
    case MacLowTransmissionParameters::ACK_SUPER_FAST:
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   288
      os << "super-fast";
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   289
      break;
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   290
    case MacLowTransmissionParameters::BLOCK_ACK_BASIC:
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   291
      os << "basic-block-ack";
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   292
      break;
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   293
    case MacLowTransmissionParameters::BLOCK_ACK_COMPRESSED:
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   294
      os << "compressed-block-ack";
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   295
      break;
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   296
    case MacLowTransmissionParameters::BLOCK_ACK_MULTI_TID:
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   297
      os << "multi-tid-block-ack";
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   298
      break;
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   299
    }
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   300
  os << "]";
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   301
  return os;
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   302
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   303
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   304
10483
e3a02ed14587 [doxygen] wifi module
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 10459
diff changeset
   305
/**
e3a02ed14587 [doxygen] wifi module
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 10459
diff changeset
   306
 * Listener for PHY events. Forwards to MacLow
e3a02ed14587 [doxygen] wifi module
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 10459
diff changeset
   307
 */
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   308
class PhyMacLowListener : public ns3::WifiPhyListener
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   309
{
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   310
public:
10483
e3a02ed14587 [doxygen] wifi module
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 10459
diff changeset
   311
  /**
e3a02ed14587 [doxygen] wifi module
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 10459
diff changeset
   312
   * Create a PhyMacLowListener for the given MacLow.
e3a02ed14587 [doxygen] wifi module
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 10459
diff changeset
   313
   *
e3a02ed14587 [doxygen] wifi module
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 10459
diff changeset
   314
   * \param macLow
e3a02ed14587 [doxygen] wifi module
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 10459
diff changeset
   315
   */
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   316
  PhyMacLowListener (ns3::MacLow *macLow)
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   317
    : m_macLow (macLow)
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   318
  {
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   319
  }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   320
  virtual ~PhyMacLowListener ()
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   321
  {
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   322
  }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   323
  virtual void NotifyRxStart (Time duration)
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   324
  {
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   325
  }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   326
  virtual void NotifyRxEndOk (void)
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   327
  {
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   328
  }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   329
  virtual void NotifyRxEndError (void)
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   330
  {
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   331
  }
10883
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   332
  virtual void NotifyTxStart (Time duration, double txPowerDbm)
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   333
  {
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   334
  }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   335
  virtual void NotifyMaybeCcaBusyStart (Time duration)
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   336
  {
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   337
  }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   338
  virtual void NotifySwitchingStart (Time duration)
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   339
  {
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   340
    m_macLow->NotifySwitchingStartNow (duration);
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   341
  }
10883
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   342
  virtual void NotifySleep (void)
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   343
  {
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   344
    m_macLow->NotifySleepNow ();
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   345
  }
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   346
  virtual void NotifyWakeup (void)
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   347
  {
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   348
  }
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   349
private:
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   350
  ns3::MacLow *m_macLow;
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   351
};
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   352
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   353
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   354
MacLow::MacLow ()
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   355
  : m_normalAckTimeoutEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   356
    m_fastAckTimeoutEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   357
    m_superFastAckTimeoutEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   358
    m_fastAckFailedTimeoutEvent (),
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   359
    m_blockAckTimeoutEvent (),
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   360
    m_ctsTimeoutEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   361
    m_sendCtsEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   362
    m_sendAckEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   363
    m_sendDataEvent (),
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   364
    m_waitSifsEvent (),
9176
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
   365
    m_endTxNoAckEvent (),
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   366
    m_mpduAggregator (0),
2286
3704959cf153 ensure m_listener is initialized properly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2268
diff changeset
   367
    m_currentPacket (0),
10459
f2e90c12a44f base implementation of the IEEE 802.11p standard
Junling Bu <linlinjavaer@gmail.com>
parents: 10216
diff changeset
   368
    m_listener (0),
f2e90c12a44f base implementation of the IEEE 802.11p standard
Junling Bu <linlinjavaer@gmail.com>
parents: 10216
diff changeset
   369
    m_phyMacLowListener (0),
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   370
    m_ctsToSelfSupported (false),
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   371
    m_receivedAtLeastOneMpdu (false)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   372
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   373
  NS_LOG_FUNCTION (this);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   374
  m_lastNavDuration = Seconds (0);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   375
  m_lastNavStart = Seconds (0);
7333
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
   376
  m_promisc = false;
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   377
  m_ampdu = false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   378
  m_sentMpdus = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   379
  m_aggregateQueue = CreateObject<WifiMacQueue> ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   380
}
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
MacLow::~MacLow ()
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   383
{
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   384
  NS_LOG_FUNCTION (this);
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   385
}
2530
05f9cec44621 avoid memory leaks
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2524
diff changeset
   386
11432
d2656819dd54 Fix parents, group names, and missing constructors in GetTypeId definitions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 11420
diff changeset
   387
/* static */
d2656819dd54 Fix parents, group names, and missing constructors in GetTypeId definitions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 11420
diff changeset
   388
TypeId
d2656819dd54 Fix parents, group names, and missing constructors in GetTypeId definitions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 11420
diff changeset
   389
MacLow::GetTypeId (void)
d2656819dd54 Fix parents, group names, and missing constructors in GetTypeId definitions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 11420
diff changeset
   390
{
d2656819dd54 Fix parents, group names, and missing constructors in GetTypeId definitions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 11420
diff changeset
   391
  static TypeId tid = TypeId ("ns3::MacLow")
d2656819dd54 Fix parents, group names, and missing constructors in GetTypeId definitions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 11420
diff changeset
   392
    .SetParent<Object> ()
d2656819dd54 Fix parents, group names, and missing constructors in GetTypeId definitions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 11420
diff changeset
   393
    .SetGroupName ("Wifi")
d2656819dd54 Fix parents, group names, and missing constructors in GetTypeId definitions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 11420
diff changeset
   394
    .AddConstructor<MacLow> ()
d2656819dd54 Fix parents, group names, and missing constructors in GetTypeId definitions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 11420
diff changeset
   395
    ;
d2656819dd54 Fix parents, group names, and missing constructors in GetTypeId definitions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 11420
diff changeset
   396
  return tid;
d2656819dd54 Fix parents, group names, and missing constructors in GetTypeId definitions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 11420
diff changeset
   397
}
d2656819dd54 Fix parents, group names, and missing constructors in GetTypeId definitions.
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 11420
diff changeset
   398
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   399
void
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   400
MacLow::SetupPhyMacLowListener (Ptr<WifiPhy> phy)
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   401
{
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   402
  m_phyMacLowListener = new PhyMacLowListener (this);
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   403
  phy->RegisterListener (m_phyMacLowListener);
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   404
}
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   405
11159
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   406
void
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   407
MacLow::RemovePhyMacLowListener (Ptr<WifiPhy> phy)
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   408
{
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   409
  if (m_phyMacLowListener != 0 )
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   410
    {
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   411
      phy->UnregisterListener (m_phyMacLowListener);
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   412
      delete m_phyMacLowListener;
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   413
      m_phyMacLowListener = 0;
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   414
    }
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   415
}
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   416
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   417
void
2530
05f9cec44621 avoid memory leaks
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2524
diff changeset
   418
MacLow::DoDispose (void)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   419
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   420
  NS_LOG_FUNCTION (this);
5846
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   421
  m_normalAckTimeoutEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   422
  m_fastAckTimeoutEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   423
  m_superFastAckTimeoutEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   424
  m_fastAckFailedTimeoutEvent.Cancel ();
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   425
  m_blockAckTimeoutEvent.Cancel ();
5846
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   426
  m_ctsTimeoutEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   427
  m_sendCtsEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   428
  m_sendAckEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   429
  m_sendDataEvent.Cancel ();
f7a4e1b3f632 Bug 381: Wifi crashes on shutdown
fmoatamr
parents: 5819
diff changeset
   430
  m_waitSifsEvent.Cancel ();
9176
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
   431
  m_endTxNoAckEvent.Cancel ();
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   432
   m_waitRifsEvent.Cancel();
2054
ba8e810bae4c derive WifiPhy from Object and manage it with a Ptr<>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2024
diff changeset
   433
  m_phy = 0;
2530
05f9cec44621 avoid memory leaks
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2524
diff changeset
   434
  m_stationManager = 0;
10459
f2e90c12a44f base implementation of the IEEE 802.11p standard
Junling Bu <linlinjavaer@gmail.com>
parents: 10216
diff changeset
   435
  if (m_phyMacLowListener != 0)
f2e90c12a44f base implementation of the IEEE 802.11p standard
Junling Bu <linlinjavaer@gmail.com>
parents: 10216
diff changeset
   436
    {
f2e90c12a44f base implementation of the IEEE 802.11p standard
Junling Bu <linlinjavaer@gmail.com>
parents: 10216
diff changeset
   437
	  delete m_phyMacLowListener;
f2e90c12a44f base implementation of the IEEE 802.11p standard
Junling Bu <linlinjavaer@gmail.com>
parents: 10216
diff changeset
   438
	  m_phyMacLowListener = 0;
f2e90c12a44f base implementation of the IEEE 802.11p standard
Junling Bu <linlinjavaer@gmail.com>
parents: 10216
diff changeset
   439
    }
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   440
  m_mpduAggregator = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   441
  m_sentMpdus = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   442
  m_aggregateQueue = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   443
  m_ampdu = false;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   444
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   445
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   446
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   447
MacLow::CancelAllEvents (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   448
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   449
  NS_LOG_FUNCTION (this);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   450
  bool oneRunning = false;
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   451
  if (m_normalAckTimeoutEvent.IsRunning ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   452
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   453
      m_normalAckTimeoutEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   454
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   455
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   456
  if (m_fastAckTimeoutEvent.IsRunning ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   457
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   458
      m_fastAckTimeoutEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   459
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   460
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   461
  if (m_superFastAckTimeoutEvent.IsRunning ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   462
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   463
      m_superFastAckTimeoutEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   464
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   465
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   466
  if (m_fastAckFailedTimeoutEvent.IsRunning ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   467
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   468
      m_fastAckFailedTimeoutEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   469
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   470
    }
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   471
  if (m_blockAckTimeoutEvent.IsRunning ())
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   472
    {
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   473
      m_blockAckTimeoutEvent.Cancel ();
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   474
      oneRunning = true;
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   475
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   476
  if (m_ctsTimeoutEvent.IsRunning ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   477
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   478
      m_ctsTimeoutEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   479
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   480
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   481
  if (m_sendCtsEvent.IsRunning ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   482
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   483
      m_sendCtsEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   484
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   485
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   486
  if (m_sendAckEvent.IsRunning ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   487
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   488
      m_sendAckEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   489
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   490
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   491
  if (m_sendDataEvent.IsRunning ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   492
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   493
      m_sendDataEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   494
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   495
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   496
  if (m_waitSifsEvent.IsRunning ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   497
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   498
      m_waitSifsEvent.Cancel ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   499
      oneRunning = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   500
    }
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   501
  if (m_waitRifsEvent.IsRunning ())
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   502
    {
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   503
      m_waitRifsEvent.Cancel ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   504
      oneRunning = true;
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   505
    }
9176
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
   506
  if (m_endTxNoAckEvent.IsRunning ()) 
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
   507
    {
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
   508
      m_endTxNoAckEvent.Cancel ();
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
   509
      oneRunning = true;
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
   510
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   511
  if (oneRunning && m_listener != 0)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   512
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   513
      m_listener->Cancel ();
2286
3704959cf153 ensure m_listener is initialized properly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2268
diff changeset
   514
      m_listener = 0;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   515
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   516
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   517
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   518
void
2054
ba8e810bae4c derive WifiPhy from Object and manage it with a Ptr<>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2024
diff changeset
   519
MacLow::SetPhy (Ptr<WifiPhy> phy)
1922
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
  m_phy = phy;
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   522
  m_phy->SetReceiveOkCallback (MakeCallback (&MacLow::DeaggregateAmpduAndReceive, this));
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   523
  m_phy->SetReceiveErrorCallback (MakeCallback (&MacLow::ReceiveError, this));
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   524
  SetupPhyMacLowListener (phy);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   525
}
11159
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   526
Ptr<WifiPhy>
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   527
MacLow::GetPhy (void) const
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   528
{
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   529
  return m_phy;
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   530
}
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   531
void
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   532
MacLow::ResetPhy (void)
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   533
{
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   534
  m_phy->SetReceiveOkCallback (MakeNullCallback<void,Ptr<Packet>, double, WifiTxVector, enum WifiPreamble>  ());
11159
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   535
  m_phy->SetReceiveErrorCallback (MakeNullCallback<void,Ptr<const Packet>, double> ());
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   536
  RemovePhyMacLowListener (m_phy);
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   537
  m_phy = 0;
b744c32b69bc patch to support IEEE 1609.4 MAC extension in wave module
Junling Bu <linlinjavaer@gmail.com>
parents: 11083
diff changeset
   538
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   539
void
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   540
MacLow::SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> manager)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   541
{
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   542
  m_stationManager = manager;
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   543
}
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   544
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   545
void
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   546
MacLow::SetAddress (Mac48Address ad)
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   547
{
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   548
  m_self = ad;
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   549
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   550
void
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   551
MacLow::SetAckTimeout (Time ackTimeout)
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   552
{
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   553
  m_ackTimeout = ackTimeout;
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   554
}
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   555
void
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   556
MacLow::SetBasicBlockAckTimeout (Time blockAckTimeout)
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   557
{
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   558
  m_basicBlockAckTimeout = blockAckTimeout;
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   559
}
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   560
void
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   561
MacLow::SetCompressedBlockAckTimeout (Time blockAckTimeout)
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   562
{
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   563
  m_compressedBlockAckTimeout = blockAckTimeout;
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   564
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   565
void
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   566
MacLow::SetCtsToSelfSupported (bool enable)
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   567
{
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   568
  m_ctsToSelfSupported = enable;
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   569
}
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   570
bool
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   571
MacLow::GetCtsToSelfSupported () const
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   572
{
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   573
  return m_ctsToSelfSupported;
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   574
}
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   575
void
3597
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   576
MacLow::SetCtsTimeout (Time ctsTimeout)
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   577
{
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   578
  m_ctsTimeout = ctsTimeout;
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   579
}
3598
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   580
void
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   581
MacLow::SetSifs (Time sifs)
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   582
{
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   583
  m_sifs = sifs;
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   584
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   585
void
3599
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   586
MacLow::SetSlotTime (Time slotTime)
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   587
{
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   588
  m_slotTime = slotTime;
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   589
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   590
void
3599
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   591
MacLow::SetPifs (Time pifs)
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   592
{
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   593
  m_pifs = pifs;
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   594
}
3600
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   595
void
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   596
MacLow::SetRifs (Time rifs)
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   597
{
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   598
  m_rifs = rifs;
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   599
}
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   600
void
3600
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   601
MacLow::SetBssid (Mac48Address bssid)
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   602
{
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   603
  m_bssid = bssid;
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   604
}
7333
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
   605
void
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
   606
MacLow::SetPromisc (void)
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
   607
{
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
   608
  m_promisc = true;
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
   609
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   610
Mac48Address
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   611
MacLow::GetAddress (void) const
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   612
{
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   613
  return m_self;
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   614
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   615
Time
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   616
MacLow::GetAckTimeout (void) const
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   617
{
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   618
  return m_ackTimeout;
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   619
}
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   620
Time
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   621
MacLow::GetBasicBlockAckTimeout () const
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   622
{
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   623
  return m_basicBlockAckTimeout;
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   624
}
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   625
Time
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   626
MacLow::GetCompressedBlockAckTimeout () const
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   627
{
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   628
  return m_compressedBlockAckTimeout;
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   629
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   630
Time
3597
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   631
MacLow::GetCtsTimeout (void) const
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   632
{
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   633
  return m_ctsTimeout;
fe35e5be4b78 move cts timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3596
diff changeset
   634
}
3598
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   635
Time
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   636
MacLow::GetSifs (void) const
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   637
{
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   638
  return m_sifs;
7b209b3b6af2 move sifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3597
diff changeset
   639
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   640
Time
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   641
MacLow::GetRifs (void) const
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   642
{
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   643
  return m_rifs;
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   644
}
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   645
Time
3599
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   646
MacLow::GetSlotTime (void) const
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   647
{
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   648
  return m_slotTime;
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   649
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   650
Time
3599
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   651
MacLow::GetPifs (void) const
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   652
{
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   653
  return m_pifs;
721bd46c15f8 move slot and pifs down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3598
diff changeset
   654
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   655
Mac48Address
3600
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   656
MacLow::GetBssid (void) const
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   657
{
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   658
  return m_bssid;
5888dfe3f245 move GetBssid down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3599
diff changeset
   659
}
10459
f2e90c12a44f base implementation of the IEEE 802.11p standard
Junling Bu <linlinjavaer@gmail.com>
parents: 10216
diff changeset
   660
bool
f2e90c12a44f base implementation of the IEEE 802.11p standard
Junling Bu <linlinjavaer@gmail.com>
parents: 10216
diff changeset
   661
MacLow::IsPromisc (void) const
f2e90c12a44f base implementation of the IEEE 802.11p standard
Junling Bu <linlinjavaer@gmail.com>
parents: 10216
diff changeset
   662
{
f2e90c12a44f base implementation of the IEEE 802.11p standard
Junling Bu <linlinjavaer@gmail.com>
parents: 10216
diff changeset
   663
  return m_promisc;
f2e90c12a44f base implementation of the IEEE 802.11p standard
Junling Bu <linlinjavaer@gmail.com>
parents: 10216
diff changeset
   664
}
3596
6c39b712a535 move Address and ack timeout down to MacLow
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   665
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   666
void
2524
db72c0e7743e port wifi model to Attributes
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2508
diff changeset
   667
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
   668
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   669
  m_rxCallback = callback;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   670
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   671
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
   672
MacLow::RegisterDcfListener (MacLowDcfListener *listener)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   673
{
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
   674
  m_dcfListeners.push_back (listener);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   675
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   676
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   677
bool
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   678
MacLow::IsAmpdu (Ptr<const Packet> packet, const WifiMacHeader hdr)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   679
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   680
  uint32_t size, actualSize;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   681
  WifiMacTrailer fcs;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   682
  size = packet->GetSize () + hdr.GetSize () + fcs.GetSerializedSize ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   683
  Ptr<Packet> p = AggregateToAmpdu (packet, hdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   684
  actualSize = p->GetSize();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   685
  if (actualSize > size)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   686
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   687
      m_currentPacket = p;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   688
      return true;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   689
    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   690
  else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   691
      return false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   692
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   693
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   694
void
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   695
MacLow::StartTransmission (Ptr<const Packet> packet,
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   696
                           const WifiMacHeader* hdr,
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   697
                           MacLowTransmissionParameters params,
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   698
                           MacLowTransmissionListener *listener)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   699
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   700
  NS_LOG_FUNCTION (this << packet << hdr << params << listener);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   701
  /* m_currentPacket is not NULL because someone started
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   702
   * a transmission and was interrupted before one of:
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   703
   *   - ctsTimeout
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   704
   *   - sendDataAfterCTS
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   705
   * expired. This means that one of these timers is still
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   706
   * running. They are all cancelled below anyway by the
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   707
   * call to CancelAllEvents (because of at least one
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   708
   * 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
   709
   * previous listener's cancel method.
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   710
   *
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   711
   * This typically happens because the high-priority
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   712
   * QapScheduler has taken access to the channel from
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   713
   * one of the Edca of the QAP.
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   714
   */
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   715
  m_currentHdr = *hdr;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   716
  CancelAllEvents ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   717
  m_listener = listener;
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   718
  m_txParams = params;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   719
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
   720
  //NS_ASSERT (m_phy->IsStateIdle ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   721
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   722
  if(m_aggregateQueue->GetSize () == 0)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   723
  {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   724
    m_currentPacket = packet->Copy ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   725
    m_ampdu = IsAmpdu (m_currentPacket, m_currentHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   726
  }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   727
  else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   728
  {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   729
   /*m_aggregateQueue > 0 occurs when a RTS/CTS exchange failed before an A-MPDU transmission.
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   730
    *In that case, we transmit the same A-MPDU as previously.
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   731
    */
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   732
    m_sentMpdus = m_aggregateQueue->GetSize ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   733
    m_ampdu = true;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   734
  }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   735
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   736
  NS_LOG_DEBUG ("startTx size=" << GetSize (m_currentPacket, &m_currentHdr) <<
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   737
                ", to=" << m_currentHdr.GetAddr1 () << ", listener=" << m_listener);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   738
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   739
  if (m_ampdu)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   740
      m_txParams.EnableCompressedBlockAck ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   741
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   742
  if (m_txParams.MustSendRts ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   743
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   744
      SendRtsForPacket ();
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   745
    }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   746
  else
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   747
    {
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   748
     if (NeedCtsToSelf() && m_ctsToSelfSupported)
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   749
        {
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   750
          SendCtsToSelf();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   751
        }
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   752
      else
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   753
        {
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   754
          SendDataPacket ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   755
       }
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   756
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   757
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   758
  /* When this method completes, we have taken ownership of the medium. */
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   759
  NS_ASSERT (m_phy->IsStateTx ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   760
}
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   761
bool
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   762
MacLow::NeedCtsToSelf (void)
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   763
{
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   764
  WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   765
  return m_stationManager->NeedCtsToSelf (dataTxVector);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
   766
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   767
void
3899
804d92c1f7c3 constify
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3208
diff changeset
   768
MacLow::ReceiveError (Ptr<const Packet> packet, double rxSnr)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   769
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
   770
  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
   771
  NS_LOG_DEBUG ("rx failed ");
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   772
  AmpduTag ampdu;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   773
  Ptr<Packet> pkt = packet->Copy();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   774
  bool isInAmpdu = pkt->RemovePacketTag(ampdu);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   775
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   776
  if(isInAmpdu && m_receivedAtLeastOneMpdu && (ampdu.GetNoOfMpdus() == 1))
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   777
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   778
      MpduAggregator::DeaggregatedMpdus packets =  MpduAggregator::Deaggregate (pkt);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   779
      MpduAggregator::DeaggregatedMpdusCI n = packets.begin ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   780
      WifiMacHeader hdr;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   781
      (*n).first->PeekHeader(hdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   782
      if(hdr.IsQosData())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   783
        {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   784
          NS_LOG_DEBUG ("last a-mpdu subframe detected/sendImmediateBlockAck from=" << hdr.GetAddr2 ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   785
          m_sendAckEvent = Simulator::Schedule (GetSifs (),
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   786
                                                &MacLow::SendBlockAckAfterAmpdu, this,
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   787
                                                hdr.GetQosTid(),
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   788
                                                hdr.GetAddr2 (),
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   789
                                                hdr.GetDuration (),
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   790
                                                m_currentTxVector);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   791
        }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   792
      else if (hdr.IsBlockAckReq())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   793
        {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   794
 	  NS_LOG_DEBUG("last a-mpdu subframe is BAR");
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   795
  	}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   796
      m_receivedAtLeastOneMpdu = false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   797
    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   798
  else if (m_txParams.MustWaitFastAck ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   799
    {
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
   800
      NS_ASSERT (m_fastAckFailedTimeoutEvent.IsExpired ());
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   801
      m_fastAckFailedTimeoutEvent = Simulator::Schedule (GetSifs (),
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   802
                                                         &MacLow::FastAckFailedTimeout, this);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   803
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   804
  return;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   805
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   806
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   807
void
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   808
MacLow::NotifySwitchingStartNow (Time duration)
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   809
{
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   810
  NS_LOG_DEBUG ("switching channel. Cancelling MAC pending events");
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   811
  m_stationManager->Reset ();
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   812
  CancelAllEvents ();
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   813
  if (m_navCounterResetCtsMissed.IsRunning ())
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   814
    {
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   815
      m_navCounterResetCtsMissed.Cancel ();
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   816
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   817
  m_lastNavStart = Simulator::Now ();
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   818
  m_lastNavDuration = Seconds (0);
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   819
  m_currentPacket = 0;
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   820
  m_listener = 0;
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   821
}
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 5146
diff changeset
   822
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   823
void
10883
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   824
MacLow::NotifySleepNow (void)
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   825
{
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   826
  NS_LOG_DEBUG ("Device in sleep mode. Cancelling MAC pending events");
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   827
  CancelAllEvents ();
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   828
  if (m_navCounterResetCtsMissed.IsRunning ())
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   829
    {
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   830
      m_navCounterResetCtsMissed.Cancel ();
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   831
    }
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   832
  m_lastNavStart = Simulator::Now ();
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   833
  m_lastNavDuration = Seconds (0);
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   834
  m_currentPacket = 0;
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   835
  m_listener = 0;
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   836
}
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   837
d919e7194e23 add support for a Wifi sleep mode
Stefano Avallone <stefano.avallone@unina.it>
parents: 10483
diff changeset
   838
void
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   839
MacLow::ReceiveOk (Ptr<Packet> packet, double rxSnr, WifiTxVector txVector, WifiPreamble preamble, bool ampduSubframe)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   840
{
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   841
  NS_LOG_FUNCTION (this << packet << rxSnr << txVector.GetMode () << preamble);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   842
  /* A packet is received from the PHY.
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   843
   * When we have handled this packet,
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   844
   * we handle any packet present in the
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   845
   * packet queue.
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   846
   */
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   847
  WifiMacHeader hdr;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
   848
  packet->RemoveHeader (hdr);
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   849
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   850
  bool isPrevNavZero = IsNavZero ();
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
   851
  NS_LOG_DEBUG ("duration/id=" << hdr.GetDuration ());
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   852
  NotifyNav (packet, hdr, preamble);
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   853
  if (hdr.IsRts ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   854
    {
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   855
      /* see section 9.2.5.7 802.11-1999
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   856
       * A STA that is addressed by an RTS frame shall transmit a CTS frame after a SIFS
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   857
       * period if the NAV at the STA receiving the RTS frame indicates that the medium is
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   858
       * idle. If the NAV at the STA receiving the RTS indicates the medium is not idle,
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
   859
       * 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
   860
       */
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   861
      if (ampduSubframe)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   862
        {
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   863
           NS_FATAL_ERROR ("Received RTS as part of an A-MPDU");
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   864
        }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   865
      else
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   866
        {
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   867
          if (isPrevNavZero
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   868
              && hdr.GetAddr1 () == m_self)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   869
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   870
              NS_LOG_DEBUG ("rx RTS from=" << hdr.GetAddr2 () << ", schedule CTS");
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   871
              NS_ASSERT (m_sendCtsEvent.IsExpired ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   872
              m_stationManager->ReportRxOk (hdr.GetAddr2 (), &hdr,
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   873
                                            rxSnr, txVector.GetMode ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   874
              m_sendCtsEvent = Simulator::Schedule (GetSifs (),
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   875
                                                    &MacLow::SendCtsAfterRts, this,
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   876
                                                    hdr.GetAddr2 (),
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   877
                                                    hdr.GetDuration (),
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   878
                                                    txVector,
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   879
                                                    rxSnr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   880
            }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   881
          else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   882
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   883
              NS_LOG_DEBUG ("rx RTS from=" << hdr.GetAddr2 () << ", cannot schedule CTS");
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   884
            }
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   885
        }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   886
    }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   887
  else if (hdr.IsCts ()
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   888
           && hdr.GetAddr1 () == m_self
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   889
           && m_ctsTimeoutEvent.IsRunning ()
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   890
           && m_currentPacket != 0)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   891
    {
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   892
      if (ampduSubframe)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   893
        {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   894
          NS_FATAL_ERROR ("Received CTS as part of an A-MPDU");
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   895
        }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   896
      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
   897
      SnrTag tag;
4502
07d34c0d8d18 new tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4264
diff changeset
   898
      packet->RemovePacketTag (tag);
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5846
diff changeset
   899
      m_stationManager->ReportRxOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   900
                                    rxSnr, txVector.GetMode ());
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5846
diff changeset
   901
      m_stationManager->ReportRtsOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   902
                                     rxSnr, txVector.GetMode (), tag.Get ());
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
   903
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   904
      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
   905
      NotifyCtsTimeoutResetNow ();
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   906
      m_listener->GotCts (rxSnr, txVector.GetMode ());
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
   907
      NS_ASSERT (m_sendDataEvent.IsExpired ());
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   908
      m_sendDataEvent = Simulator::Schedule (GetSifs (),
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   909
                                             &MacLow::SendDataAfterCts, this,
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   910
                                             hdr.GetAddr1 (),
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   911
                                             hdr.GetDuration ());
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   912
    }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   913
  else if (hdr.IsAck ()
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   914
           && hdr.GetAddr1 () == m_self
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   915
           && (m_normalAckTimeoutEvent.IsRunning ()
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   916
               || m_fastAckTimeoutEvent.IsRunning ()
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   917
               || m_superFastAckTimeoutEvent.IsRunning ())
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   918
           && m_txParams.MustWaitAck ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   919
    {
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   920
      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
   921
      SnrTag tag;
4502
07d34c0d8d18 new tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4264
diff changeset
   922
      packet->RemovePacketTag (tag);
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5846
diff changeset
   923
      m_stationManager->ReportRxOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   924
                                    rxSnr, txVector.GetMode ());
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5846
diff changeset
   925
      m_stationManager->ReportDataOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   926
                                      rxSnr, txVector.GetMode (), tag.Get ());
11353
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
   927
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
   928
      FlushAggregateQueue();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   929
      bool gotAck = false;
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   930
      if (m_txParams.MustWaitNormalAck ()
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   931
          && m_normalAckTimeoutEvent.IsRunning ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   932
        {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   933
          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
   934
          NotifyAckTimeoutResetNow ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   935
          gotAck = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   936
        }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   937
      if (m_txParams.MustWaitFastAck ()
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   938
          && m_fastAckTimeoutEvent.IsRunning ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   939
        {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   940
          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
   941
          NotifyAckTimeoutResetNow ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   942
          gotAck = true;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   943
        }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   944
      if (gotAck)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   945
        {
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   946
          m_listener->GotAck (rxSnr, txVector.GetMode ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   947
        }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   948
      if (m_txParams.HasNextPacket ())
4670
98aac83e4416 coding style
Mirko Banchi <mk.banchi@gmail.com>
parents: 4556
diff changeset
   949
        {
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   950
          m_waitSifsEvent = Simulator::Schedule (GetSifs (),
4671
a99a57f697de coding style
Mirko Banchi <mk.banchi@gmail.com>
parents: 4670
diff changeset
   951
                                                 &MacLow::WaitSifsAfterEndTx, this);
4670
98aac83e4416 coding style
Mirko Banchi <mk.banchi@gmail.com>
parents: 4556
diff changeset
   952
        }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   953
    }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   954
  else if (hdr.IsBlockAck () && hdr.GetAddr1 () == m_self
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   955
           && (m_txParams.MustWaitBasicBlockAck () || m_txParams.MustWaitCompressedBlockAck ())
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   956
           && m_blockAckTimeoutEvent.IsRunning ())
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   957
    {
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   958
      NS_LOG_DEBUG ("got block ack from " << hdr.GetAddr2 ());
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   959
      CtrlBAckResponseHeader blockAck;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   960
      packet->RemoveHeader (blockAck);
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
   961
      m_blockAckTimeoutEvent.Cancel ();
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   962
      NotifyAckTimeoutResetNow ();
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   963
      m_listener->GotBlockAck (&blockAck, hdr.GetAddr2 (), txVector.GetMode ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   964
      m_sentMpdus = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
   965
      m_ampdu = false;
11353
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
   966
      FlushAggregateQueue();
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   967
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   968
  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
   969
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   970
      CtrlBAckRequestHeader blockAckReq;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   971
      packet->RemoveHeader (blockAckReq);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   972
      if (!blockAckReq.IsMultiTid ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   973
        {
6606
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
   974
          uint8_t tid = blockAckReq.GetTidInfo ();
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
   975
          AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), tid));
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   976
          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
   977
            {
6606
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
   978
              //Update block ack cache
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
   979
              BlockAckCachesI i = m_bAckCaches.find (std::make_pair (hdr.GetAddr2 (), tid));
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
   980
              NS_ASSERT (i != m_bAckCaches.end ());
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
   981
              (*i).second.UpdateWithBlockAckReq (blockAckReq.GetStartingSequence ());
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
   982
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   983
              NS_ASSERT (m_sendAckEvent.IsExpired ());
11083
96e983e7cd5d fix typos in wifi module
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11041
diff changeset
   984
              /* See section 11.5.3 in IEEE 802.11 for mean of this timer */
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   985
              ResetBlockAckInactivityTimerIfNeeded (it->second.first);
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   986
              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
   987
                {
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   988
                  NS_LOG_DEBUG ("rx blockAckRequest/sendImmediateBlockAck from=" << hdr.GetAddr2 ());
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   989
                  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
   990
                                                        &MacLow::SendBlockAckAfterBlockAckRequest, this,
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   991
                                                        blockAckReq,
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
   992
                                                        hdr.GetAddr2 (),
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   993
                                                        hdr.GetDuration (),
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
   994
                                                        txVector.GetMode ());
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   995
                }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   996
              else
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   997
                {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
   998
                  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
   999
                }
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1000
              m_receivedAtLeastOneMpdu = false;
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1001
            }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1002
          else
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1003
            {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1004
              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
  1005
            }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1006
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1007
      else
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1008
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1009
          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
  1010
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1011
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1012
  else if (hdr.IsCtl ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1013
    {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1014
      NS_LOG_DEBUG ("rx drop " << hdr.GetTypeString ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1015
      m_receivedAtLeastOneMpdu = false;
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1016
    }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1017
  else if (hdr.GetAddr1 () == m_self)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1018
    {
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5846
diff changeset
  1019
      m_stationManager->ReportRxOk (hdr.GetAddr2 (), &hdr,
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1020
                                    rxSnr, txVector.GetMode ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1021
      if (hdr.IsQosData () && ReceiveMpdu (packet, hdr))
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1022
        {
11083
96e983e7cd5d fix typos in wifi module
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11041
diff changeset
  1023
          /* From section 9.10.4 in IEEE 802.11:
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1024
             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
  1025
             the Block Ack agreement exists, the recipient shall buffer the MSDU
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  1026
             regardless of the value of the Ack Policy subfield within the
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1027
             QoS Control field of the QoS data frame. */;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1028
          if (hdr.IsQosAck () && !ampduSubframe)
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1029
            {
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1030
              NS_LOG_DEBUG ("rx QoS unicast/sendAck from=" << hdr.GetAddr2 ());
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1031
              AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1032
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1033
              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
  1034
                                                            hdr.GetAddr2 (), hdr.GetQosTid ());
6599
8c1a255c05a3 Rename MacLow::RxCompleteBufferedPacket to a more appropriate name
Mirko Banchi <mk.banchi@gmail.com>
parents: 6595
diff changeset
  1035
              RxCompleteBufferedPacketsUntilFirstLost (hdr.GetAddr2 (), hdr.GetQosTid ());
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1036
              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
  1037
              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
  1038
                                                    &MacLow::SendAckAfterData, this,
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1039
                                                    hdr.GetAddr2 (),
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1040
                                                    hdr.GetDuration (),
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1041
                                                    txVector.GetMode (),
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1042
                                                    rxSnr);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1043
              m_receivedAtLeastOneMpdu = false;
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1044
            }
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1045
          else if (hdr.IsQosBlockAck ())
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1046
            {
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1047
              AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
11083
96e983e7cd5d fix typos in wifi module
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11041
diff changeset
  1048
              /* See section 11.5.3 in IEEE 802.11 for mean of this timer */
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1049
              ResetBlockAckInactivityTimerIfNeeded (it->second.first);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1050
            }
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  1051
          return;
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1052
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1053
      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
  1054
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1055
          /* 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
  1056
             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
  1057
11083
96e983e7cd5d fix typos in wifi module
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11041
diff changeset
  1058
             From section 11.5.3 in IEEE 802.11e:
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1059
             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
  1060
             data MPDUs with the Ack Policy subfield set to Block Ack, it shall discard
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1061
             them and shall send a DELBA frame using the normal access
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1062
             mechanisms. */
6331
eee2eab36748 Bug 910: Replace AccessClass with 802.11-style AcIndex
Dean Armstrong <deanarm@gmail.com>
parents: 6304
diff changeset
  1063
          AcIndex ac = QosUtilsMapTidToAc (hdr.GetQosTid ());
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1064
          m_edcaListeners[ac]->BlockAckInactivityTimeout (hdr.GetAddr2 (), hdr.GetQosTid ());
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1065
          return;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1066
        }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1067
      else if (hdr.IsQosData () && hdr.IsQosNoAck ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1068
        {
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1069
           if (ampduSubframe)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1070
               {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1071
                 NS_LOG_DEBUG ("rx Ampdu with No Ack Policy from=" << hdr.GetAddr2 ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1072
               }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1073
             else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1074
               {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1075
                 NS_LOG_DEBUG ("rx unicast/noAck from=" << hdr.GetAddr2 ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1076
               }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1077
        }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1078
      else if (hdr.IsData () || hdr.IsMgt ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1079
        {
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1080
          if (hdr.IsMgt() && ampduSubframe)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1081
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1082
              NS_FATAL_ERROR ("Received management packet as part of an A-MPDU");
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1083
            }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1084
          else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1085
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1086
              NS_LOG_DEBUG ("rx unicast/sendAck from=" << hdr.GetAddr2 ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1087
              NS_ASSERT (m_sendAckEvent.IsExpired ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1088
              m_sendAckEvent = Simulator::Schedule (GetSifs (),
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1089
                                                    &MacLow::SendAckAfterData, this,
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1090
                                                    hdr.GetAddr2 (),
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1091
                                                    hdr.GetDuration (),
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1092
                                                    txVector.GetMode (),
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1093
                                                    rxSnr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1094
            }
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1095
        }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1096
      goto rxPacket;
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1097
    }
4079
210d64d11998 add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4003
diff changeset
  1098
  else if (hdr.GetAddr1 ().IsGroup ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1099
    {
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1100
      if (ampduSubframe)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1101
        {
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1102
          NS_FATAL_ERROR ("Received group addressed packet as part of an A-MPDU");
4079
210d64d11998 add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4003
diff changeset
  1103
        }
210d64d11998 add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4003
diff changeset
  1104
      else
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1105
        {
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1106
          if (hdr.IsData () || hdr.IsMgt ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1107
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1108
              NS_LOG_DEBUG ("rx group from=" << hdr.GetAddr2 ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1109
              m_receivedAtLeastOneMpdu = false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1110
              goto rxPacket;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1111
            }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1112
          else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1113
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1114
              // DROP
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1115
            }
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1116
        }
4079
210d64d11998 add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4003
diff changeset
  1117
    }
7333
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
  1118
  else if (m_promisc)
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
  1119
    {
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
  1120
      NS_ASSERT (hdr.GetAddr1 () != m_self);
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
  1121
      if (hdr.IsData ())
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
  1122
        {
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
  1123
          goto rxPacket;
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
  1124
        }
17b50c5b062c [Bug 827] promiscuous mode for wifi
Ruben Merz <ruben@net.t-labs.tu-berlin.de>
parents: 7252
diff changeset
  1125
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1126
  else
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
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_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
  1129
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1130
  return;
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  1131
rxPacket:
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1132
  WifiMacTrailer fcs;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1133
  packet->RemoveTrailer (fcs);
1964
041240a915f8 build and link
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1928
diff changeset
  1134
  m_rxCallback (packet, &hdr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1135
  return;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1136
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1137
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1138
uint8_t
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1139
MacLow::GetTid (Ptr<const Packet> packet, const WifiMacHeader hdr) const
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1140
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1141
  uint8_t tid = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1142
  if (hdr.IsQosData ()) 
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1143
    tid = hdr.GetQosTid ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1144
  else if (hdr.IsBlockAckReq ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1145
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1146
      CtrlBAckRequestHeader baReqHdr;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1147
      packet->PeekHeader (baReqHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1148
      tid = baReqHdr.GetTidInfo();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1149
     }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1150
  else if (hdr.IsBlockAck ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1151
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1152
      CtrlBAckResponseHeader baRespHdr;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1153
      packet->PeekHeader (baRespHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1154
      tid = baRespHdr.GetTidInfo ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1155
    }   
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1156
  return tid;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1157
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1158
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1159
uint32_t
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1160
MacLow::GetAckSize (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1161
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1162
  WifiMacHeader ack;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1163
  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
  1164
  return ack.GetSize () + 4;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1165
}
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1166
uint32_t
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1167
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
  1168
{
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1169
  WifiMacHeader hdr;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1170
  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
  1171
  CtrlBAckResponseHeader blockAck;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1172
  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
  1173
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1174
      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
  1175
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1176
  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
  1177
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1178
      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
  1179
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1180
  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
  1181
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1182
      //Not implemented
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  1183
      NS_ASSERT (false);
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1184
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1185
  return hdr.GetSize () + blockAck.GetSerializedSize () + 4;
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1186
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1187
uint32_t
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1188
MacLow::GetRtsSize (void) const
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1189
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1190
  WifiMacHeader rts;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1191
  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
  1192
  return rts.GetSize () + 4;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1193
}
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1194
Time
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1195
MacLow::GetAckDuration (Mac48Address to, WifiTxVector dataTxVector) const
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1196
{
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1197
  WifiTxVector ackTxVector = GetAckTxVectorForData (to, dataTxVector.GetMode ());
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1198
  return GetAckDuration (ackTxVector);
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1199
}
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1200
Time
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1201
MacLow::GetAckDuration (WifiTxVector ackTxVector) const
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1202
{
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1203
  NS_ASSERT (ackTxVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HT); // ACK should always use non-HT PPDU (HT PPDU cases not supported yet)
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1204
  return m_phy->CalculateTxDuration (GetAckSize (), ackTxVector, WIFI_PREAMBLE_LONG, m_phy->GetFrequency(), 0, 0);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1205
}
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1206
Time
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1207
MacLow::GetBlockAckDuration (Mac48Address to, WifiTxVector blockAckReqTxVector, enum BlockAckType type) const
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1208
{
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1209
  /*
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1210
   * For immediate Basic BlockAck we should transmit the frame with the same WifiMode
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1211
   * as the BlockAckReq.
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1212
   */
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1213
  WifiPreamble preamble;
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1214
  if (blockAckReqTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT && type == BASIC_BLOCK_ACK)
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1215
    preamble= WIFI_PREAMBLE_HT_MF;
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1216
  else
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1217
    preamble=WIFI_PREAMBLE_LONG;
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1218
  return m_phy->CalculateTxDuration (GetBlockAckSize (type), blockAckReqTxVector, preamble, m_phy->GetFrequency(), 0, 0);
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1219
}
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1220
Time
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1221
MacLow::GetCtsDuration (Mac48Address to, WifiTxVector rtsTxVector) const
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1222
{
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1223
  WifiTxVector ctsTxVector = GetCtsTxVectorForRts (to, rtsTxVector.GetMode ());
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1224
  return GetCtsDuration (ctsTxVector);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1225
}
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1226
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1227
Time
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1228
MacLow::GetCtsDuration (WifiTxVector ctsTxVector) const
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1229
{
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1230
  NS_ASSERT (ctsTxVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HT); // CTS should always use non-HT PPDU (HT PPDU cases not supported yet)
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1231
  return m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, WIFI_PREAMBLE_LONG, m_phy->GetFrequency(), 0, 0);
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1232
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1233
uint32_t
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1234
MacLow::GetCtsSize (void) const
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
  WifiMacHeader cts;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1237
  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
  1238
  return cts.GetSize () + 4;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1239
}
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1240
uint32_t
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1241
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
  1242
{
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1243
  uint32_t size;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1244
  WifiMacTrailer fcs;
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1245
  if (m_ampdu)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1246
     size = packet->GetSize ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1247
  else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1248
     size= packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1249
  return size;
1922
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
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1252
WifiTxVector
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1253
MacLow::GetCtsToSelfTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1254
{
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1255
  return m_stationManager->GetCtsToSelfTxVector (hdr, packet);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1256
}
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1257
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1258
WifiTxVector
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1259
MacLow::GetRtsTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1260
{
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1261
  Mac48Address to = hdr->GetAddr1 ();
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1262
  return m_stationManager->GetRtsTxVector (to, hdr, packet);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1263
}
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1264
WifiTxVector
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1265
MacLow::GetDataTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1266
{
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1267
  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
  1268
  WifiMacTrailer fcs;
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1269
  uint32_t size =  packet->GetSize ()+ hdr->GetSize () + fcs.GetSerializedSize ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1270
  //size is not used in anything!! will not worry about aggregation
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1271
  return m_stationManager->GetDataTxVector (to, hdr, packet, size);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1272
}
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1273
WifiTxVector
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1274
MacLow::GetCtsTxVector (Mac48Address to, WifiMode rtsTxMode) const
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1275
{
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1276
  return m_stationManager->GetCtsTxVector (to, rtsTxMode);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1277
}
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1278
WifiTxVector
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1279
MacLow::GetAckTxVector (Mac48Address to, WifiMode dataTxMode) const
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1280
{
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1281
  return m_stationManager->GetAckTxVector (to, dataTxMode);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1282
}
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1283
WifiTxVector
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1284
MacLow::GetBlockAckTxVector (Mac48Address to, WifiMode dataTxMode) const
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1285
{
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1286
  return m_stationManager->GetBlockAckTxVector (to, dataTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1287
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1288
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1289
WifiTxVector
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1290
MacLow::GetCtsTxVectorForRts (Mac48Address to, WifiMode rtsTxMode) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1291
{
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1292
  return GetCtsTxVector (to, rtsTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1293
}
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1294
WifiTxVector
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1295
MacLow::GetAckTxVectorForData (Mac48Address to, WifiMode dataTxMode) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1296
{
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1297
  return GetAckTxVector (to, dataTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1298
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1299
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
Time
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1302
MacLow::CalculateOverallTxTime (Ptr<const Packet> packet,
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1303
                                const WifiMacHeader* hdr,
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
  1304
                                const MacLowTransmissionParameters& params) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1305
{
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1306
  WifiPreamble preamble;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1307
  Time txTime = Seconds (0);
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1308
  if (params.MustSendRts ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1309
    {
10201
8bdf35df4bf1 avoid crash when packets sent by higher layer cause no RTS/CTS operation
Junling Bu <linlinjavaer@gmail.com>
parents: 10139
diff changeset
  1310
      WifiTxVector rtsTxVector = GetRtsTxVector (packet, hdr);
8bdf35df4bf1 avoid crash when packets sent by higher layer cause no RTS/CTS operation
Junling Bu <linlinjavaer@gmail.com>
parents: 10139
diff changeset
  1311
      //standard says RTS packets can have GF format sec 9.6.0e.1 page 110 bullet b 2
8bdf35df4bf1 avoid crash when packets sent by higher layer cause no RTS/CTS operation
Junling Bu <linlinjavaer@gmail.com>
parents: 10139
diff changeset
  1312
      if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
8bdf35df4bf1 avoid crash when packets sent by higher layer cause no RTS/CTS operation
Junling Bu <linlinjavaer@gmail.com>
parents: 10139
diff changeset
  1313
        {
8bdf35df4bf1 avoid crash when packets sent by higher layer cause no RTS/CTS operation
Junling Bu <linlinjavaer@gmail.com>
parents: 10139
diff changeset
  1314
          preamble = WIFI_PREAMBLE_HT_GF;
8bdf35df4bf1 avoid crash when packets sent by higher layer cause no RTS/CTS operation
Junling Bu <linlinjavaer@gmail.com>
parents: 10139
diff changeset
  1315
        }
8bdf35df4bf1 avoid crash when packets sent by higher layer cause no RTS/CTS operation
Junling Bu <linlinjavaer@gmail.com>
parents: 10139
diff changeset
  1316
      else
8bdf35df4bf1 avoid crash when packets sent by higher layer cause no RTS/CTS operation
Junling Bu <linlinjavaer@gmail.com>
parents: 10139
diff changeset
  1317
        {
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1318
          //Otherwise, RTS should always use non-HT PPDU (HT PPDU cases not supported yet)
10201
8bdf35df4bf1 avoid crash when packets sent by higher layer cause no RTS/CTS operation
Junling Bu <linlinjavaer@gmail.com>
parents: 10139
diff changeset
  1319
          preamble = WIFI_PREAMBLE_LONG;
8bdf35df4bf1 avoid crash when packets sent by higher layer cause no RTS/CTS operation
Junling Bu <linlinjavaer@gmail.com>
parents: 10139
diff changeset
  1320
        }
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1321
      txTime += m_phy->CalculateTxDuration (GetRtsSize (), rtsTxVector, preamble, m_phy->GetFrequency(), 0, 0);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1322
      txTime += GetCtsDuration (hdr->GetAddr1 (), rtsTxVector);
7044
f94b264549d1 introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7040
diff changeset
  1323
      txTime += Time (GetSifs () * 2);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1324
    }
10201
8bdf35df4bf1 avoid crash when packets sent by higher layer cause no RTS/CTS operation
Junling Bu <linlinjavaer@gmail.com>
parents: 10139
diff changeset
  1325
  WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
11420
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  1326
  if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1327
    preamble = WIFI_PREAMBLE_HT_GF;
11420
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  1328
  else if (dataTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  1329
    preamble = WIFI_PREAMBLE_HT_MF;
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  1330
  else
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1331
    preamble = 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
  1332
  uint32_t dataSize = GetSize (packet, hdr);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1333
  txTime += m_phy->CalculateTxDuration (dataSize, dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
1996
454a63cf6549 cts, rts, and ack sizes must take into account fcs padding
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1993
diff changeset
  1334
  if (params.MustWaitAck ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1335
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1336
      txTime += GetSifs ();
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1337
      txTime += GetAckDuration (hdr->GetAddr1 (), dataTxVector);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1338
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1339
  return txTime;
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
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1342
Time
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1343
MacLow::CalculateTransmissionTime (Ptr<const Packet> packet,
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1344
                                   const WifiMacHeader* hdr,
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
  1345
                                   const MacLowTransmissionParameters& params) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1346
{
2268
0e57ac711220 introduce a low latency parameter for rate control algorithms
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2177
diff changeset
  1347
  Time txTime = CalculateOverallTxTime (packet, hdr, params);
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1348
  if (params.HasNextPacket ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1349
    {
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1350
      WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1351
      WifiPreamble preamble;
11420
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  1352
      if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  1353
         preamble = WIFI_PREAMBLE_HT_GF;
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1354
      else if (dataTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
11420
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  1355
        preamble = WIFI_PREAMBLE_HT_MF;
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1356
      else
11420
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  1357
        preamble = WIFI_PREAMBLE_LONG;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1358
      txTime += GetSifs ();
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1359
      txTime += m_phy->CalculateTxDuration (params.GetNextPacketSize (), dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1360
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1361
  return txTime;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1362
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1363
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1364
void
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1365
MacLow::NotifyNav (Ptr<const Packet> packet,const WifiMacHeader &hdr, WifiPreamble preamble)
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1366
{
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1367
  NS_ASSERT (m_lastNavStart <= Simulator::Now ());
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1368
  Time duration = hdr.GetDuration ();
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1369
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1370
  if (hdr.IsCfpoll ()
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1371
      && hdr.GetAddr2 () == m_bssid)
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1372
    {
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1373
      // 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
  1374
      DoNavResetNow (duration);
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1375
      return;
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1376
    }
9894
ac4e52a91d5d Doxygenate todo's
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9238
diff changeset
  1377
  /// \todo We should also handle CF_END specially here
ac4e52a91d5d Doxygenate todo's
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9238
diff changeset
  1378
  /// 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
  1379
  else if (hdr.GetAddr1 () != m_self)
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1380
    {
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1381
      // 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
  1382
      bool navUpdated = DoNavStartNow (duration);
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1383
      if (hdr.IsRts () && navUpdated)
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1384
        {
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1385
          /**
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1386
           * A STA that used information from an RTS frame as the most recent basis to update its NAV setting
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1387
           * is permitted to reset its NAV if no PHY-RXSTART.indication is detected from the PHY during a
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1388
           * period with a duration of (2 * aSIFSTime) + (CTS_Time) + (2 * aSlotTime) starting at the
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1389
           * PHY-RXEND.indication corresponding to the detection of the RTS frame. The “CTS_Time” shall
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1390
           * be calculated using the length of the CTS frame and the data rate at which the RTS frame
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1391
           * 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
  1392
           */
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1393
          WifiMacHeader cts;
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1394
          cts.SetType (WIFI_MAC_CTL_CTS);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1395
          WifiTxVector txVector=GetRtsTxVector (packet, &hdr);
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1396
          Time navCounterResetCtsMissedDelay =
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1397
            m_phy->CalculateTxDuration (cts.GetSerializedSize (), txVector, preamble, m_phy->GetFrequency(), 0, 0) +
7044
f94b264549d1 introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 7040
diff changeset
  1398
            Time (2 * GetSifs ()) + Time (2 * GetSlotTime ());
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1399
          m_navCounterResetCtsMissed = Simulator::Schedule (navCounterResetCtsMissedDelay,
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1400
                                                            &MacLow::NavCounterResetCtsMissed, this,
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1401
                                                            Simulator::Now ());
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1402
        }
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1403
    }
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1404
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1405
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1406
void
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1407
MacLow::NavCounterResetCtsMissed (Time rtsEndRxTime)
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1408
{
10216
48e0bcbc4281 Bug 1691 - RTS/CTS NAV reset prematurely
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 10201
diff changeset
  1409
  if (m_phy->GetLastRxStartTime () < rtsEndRxTime)
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1410
    {
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1411
      DoNavResetNow (Seconds (0.0));
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1412
    }
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1413
}
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1414
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1415
void
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1416
MacLow::DoNavResetNow (Time duration)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1417
{
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1418
  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
  1419
    {
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1420
      (*i)->NavReset (duration);
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1421
    }
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1422
  m_lastNavStart = Simulator::Now ();
4514
d7e974543905 Backed out changeset d21a2eafb84d
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4512
diff changeset
  1423
  m_lastNavStart = duration;
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1424
}
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1425
bool
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1426
MacLow::DoNavStartNow (Time duration)
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1427
{
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1428
  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
  1429
    {
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1430
      (*i)->NavStart (duration);
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1431
    }
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1432
  Time newNavEnd = Simulator::Now () + duration;
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1433
  Time oldNavEnd = m_lastNavStart + m_lastNavDuration;
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1434
  if (newNavEnd > oldNavEnd)
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1435
    {
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1436
      m_lastNavStart = Simulator::Now ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1437
      m_lastNavDuration = duration;
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1438
      return true;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1439
    }
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1440
  return false;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1441
}
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
  1442
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
  1443
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
  1444
{
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1445
  for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++)
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
  1446
    {
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1447
      (*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
  1448
    }
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1449
}
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1450
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
  1451
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
  1452
{
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1453
  for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++)
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
  1454
    {
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1455
      (*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
  1456
    }
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1457
}
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1458
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
  1459
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
  1460
{
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1461
  for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++)
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
  1462
    {
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1463
      (*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
  1464
    }
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1465
}
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1466
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
  1467
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
  1468
{
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1469
  for (DcfListenersCI i = m_dcfListeners.begin (); i != m_dcfListeners.end (); i++)
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
  1470
    {
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1471
      (*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
  1472
    }
b2654e0f071d bug 556: DcfManager does not handle AckTimeout properly when there are multiple queues
Kirill V. Andreev <kirillano@yandex.ru>
parents: 4502
diff changeset
  1473
}
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1474
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1475
void
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1476
MacLow::ForwardDown (Ptr<const Packet> packet, const WifiMacHeader* hdr,
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1477
                     WifiTxVector txVector, WifiPreamble preamble)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1478
{
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1479
  NS_LOG_FUNCTION (this << packet << hdr << txVector);
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1480
  NS_LOG_DEBUG ("send " << hdr->GetTypeString () <<
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  1481
                ", to=" << hdr->GetAddr1 () <<
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  1482
                ", size=" << packet->GetSize () <<
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1483
                ", mode=" << txVector.GetMode  () <<
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  1484
                ", duration=" << hdr->GetDuration () <<
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1485
                ", seq=0x" << std::hex << m_currentHdr.GetSequenceControl () << std::dec);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1486
  if (!m_ampdu || hdr->IsRts ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1487
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1488
      m_phy->SendPacket (packet, txVector, preamble, 0);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1489
    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1490
  else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1491
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1492
      Ptr<Packet> newPacket;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1493
      Ptr <const Packet> dequeuedPacket;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1494
      WifiMacHeader newHdr;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1495
      WifiMacTrailer fcs;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1496
        uint32_t queueSize = m_aggregateQueue->GetSize ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1497
      bool last = false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1498
      uint8_t packetType = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1499
      //Add packet tag
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1500
      AmpduTag ampdutag;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1501
      ampdutag.SetAmpdu (true);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1502
      Time delay = Seconds (0);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1503
      for ( ; queueSize > 0; queueSize--)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1504
        {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1505
          dequeuedPacket = m_aggregateQueue->Dequeue (&newHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1506
          newPacket = dequeuedPacket->Copy ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1507
          newHdr.SetDuration (hdr->GetDuration ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1508
          newPacket->AddHeader (newHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1509
          newPacket->AddTrailer (fcs);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1510
          if (queueSize == 1)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1511
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1512
              last = true;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1513
              packetType = 2;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1514
            }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1515
          m_mpduAggregator->AddHeaderAndPad (newPacket, last);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1516
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1517
          ampdutag.SetNoOfMpdus(queueSize);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1518
          newPacket->AddPacketTag(ampdutag);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1519
          if (delay == Seconds (0))
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1520
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1521
              NS_LOG_DEBUG("Sending MPDU as part of A-MPDU");
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1522
              packetType = 1;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1523
              m_phy->SendPacket (newPacket, txVector, preamble, packetType);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1524
            }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1525
          else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1526
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1527
              Simulator::Schedule (delay, &MacLow::SendPacket, this, newPacket, txVector, preamble, packetType);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1528
            }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1529
          if(queueSize > 1)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1530
            delay = delay + m_phy->CalculateTxDuration (GetSize (newPacket, &newHdr), txVector, preamble, m_phy->GetFrequency(), packetType, 0);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1531
          preamble = WIFI_PREAMBLE_NONE;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1532
        }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1533
    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1534
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1535
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1536
void
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1537
MacLow::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1538
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1539
  NS_LOG_DEBUG("Sending MPDU as part of A-MPDU");
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1540
  m_phy->SendPacket (packet, txVector, preamble, packetType); 
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1541
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1542
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1543
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1544
MacLow::CtsTimeout (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1545
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1546
  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
  1547
  NS_LOG_DEBUG ("cts timeout");
9894
ac4e52a91d5d Doxygenate todo's
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9238
diff changeset
  1548
  /// \todo should check that there was no rx start before now.
ac4e52a91d5d Doxygenate todo's
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9238
diff changeset
  1549
  /// we should restart a new cts timeout now until the expected
ac4e52a91d5d Doxygenate todo's
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9238
diff changeset
  1550
  /// end of rx if there was a rx start before now.
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5846
diff changeset
  1551
  m_stationManager->ReportRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1552
  if(m_sentMpdus == 0)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1553
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1554
      m_currentPacket = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1555
    }
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
  1556
  MacLowTransmissionListener *listener = m_listener;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1557
  m_listener = 0;
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1558
  m_sentMpdus = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1559
  m_ampdu = false;
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
  1560
  listener->MissedCts ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1561
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1562
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1563
MacLow::NormalAckTimeout (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1564
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1565
  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
  1566
  NS_LOG_DEBUG ("normal ack timeout");
9894
ac4e52a91d5d Doxygenate todo's
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9238
diff changeset
  1567
  /// \todo should check that there was no rx start before now.
ac4e52a91d5d Doxygenate todo's
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9238
diff changeset
  1568
  /// we should restart a new ack timeout now until the expected
ac4e52a91d5d Doxygenate todo's
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9238
diff changeset
  1569
  /// end of rx if there was a rx start before now.
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5846
diff changeset
  1570
  m_stationManager->ReportDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
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
  1571
  MacLowTransmissionListener *listener = m_listener;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1572
  m_listener = 0;
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1573
  m_sentMpdus = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1574
  m_ampdu = false;
11353
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  1575
  FlushAggregateQueue();
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
  1576
  listener->MissedAck ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1577
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1578
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1579
MacLow::FastAckTimeout (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1580
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1581
  NS_LOG_FUNCTION (this);
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5846
diff changeset
  1582
  m_stationManager->ReportDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
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
  1583
  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
  1584
  m_listener = 0;
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1585
  if (m_phy->IsStateIdle ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1586
    {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1587
      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
  1588
      listener->MissedAck ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1589
    }
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
  1590
  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
  1591
    {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1592
      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
  1593
    }
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1594
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1595
void
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1596
MacLow::BlockAckTimeout (void)
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1597
{
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1598
  NS_LOG_FUNCTION (this);
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1599
  NS_LOG_DEBUG ("block ack timeout");
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  1600
6068
a2127017ecb4 merge with HEAD
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6065 5964
diff changeset
  1601
  m_stationManager->ReportDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1602
  MacLowTransmissionListener *listener = m_listener;
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1603
  m_listener = 0;
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1604
  m_sentMpdus = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1605
  m_ampdu = false;
11353
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  1606
  FlushAggregateQueue();
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1607
  listener->MissedBlockAck ();
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1608
}
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1609
void
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1610
MacLow::SuperFastAckTimeout ()
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1611
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1612
  NS_LOG_FUNCTION (this);
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5846
diff changeset
  1613
  m_stationManager->ReportDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
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
  1614
  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
  1615
  m_listener = 0;
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1616
  if (m_phy->IsStateIdle ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1617
    {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1618
      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
  1619
      listener->MissedAck ();
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1620
    }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1621
  else
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1622
    {
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  1623
      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
  1624
      listener->GotAck (0.0, WifiMode ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1625
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1626
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1627
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1628
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1629
MacLow::SendRtsForPacket (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1630
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1631
  NS_LOG_FUNCTION (this);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1632
  /* send an RTS for this packet. */
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1633
  WifiMacHeader rts;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1634
  rts.SetType (WIFI_MAC_CTL_RTS);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1635
  rts.SetDsNotFrom ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1636
  rts.SetDsNotTo ();
3659
653395340b5c should set retry bit in rts and acks.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3658
diff changeset
  1637
  rts.SetNoRetry ();
2793
10a571d9a9f7 initialize no more fragment flag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2547
diff changeset
  1638
  rts.SetNoMoreFragments ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1639
  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
  1640
  rts.SetAddr2 (m_self);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1641
  WifiTxVector rtsTxVector = GetRtsTxVector (m_currentPacket, &m_currentHdr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1642
  Time duration = Seconds (0);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1643
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1644
  WifiPreamble preamble;
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1645
  //standard says RTS packets can have GF format sec 9.6.0e.1 page 110 bullet b 2
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1646
  if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
11420
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  1647
    preamble = WIFI_PREAMBLE_HT_GF;
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1648
  else //Otherwise, RTS should always use non-HT PPDU (HT PPDU cases not supported yet)
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1649
    preamble = WIFI_PREAMBLE_LONG;
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1650
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1651
  if (m_txParams.HasDurationId ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1652
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1653
      duration += m_txParams.GetDurationId ();
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1654
    }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1655
  else
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1656
    {
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1657
      WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1658
      duration += GetSifs ();
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1659
      duration += GetCtsDuration (m_currentHdr.GetAddr1 (), rtsTxVector);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1660
      duration += GetSifs ();
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1661
      duration += m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr),
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1662
                                              dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1663
      duration += GetSifs ();
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1664
      if (m_txParams.MustWaitBasicBlockAck ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1665
        {
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1666
          WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2(), dataTxVector.GetMode  ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1667
          duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, BASIC_BLOCK_ACK);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1668
        }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1669
      else if (m_txParams.MustWaitCompressedBlockAck ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1670
        {
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1671
          WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2(), dataTxVector.GetMode  ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1672
          duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1673
        }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1674
      else if (m_txParams.MustWaitAck ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1675
        {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1676
          duration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1677
        }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1678
      if (m_txParams.HasNextPacket ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1679
        {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1680
          duration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (),
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1681
                                                  dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1682
          if (m_txParams.MustWaitAck ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1683
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1684
              duration += GetSifs ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1685
              duration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1686
            }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1687
        }
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1688
    }
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1689
  rts.SetDuration (duration);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1690
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1691
  Time txDuration = m_phy->CalculateTxDuration (GetRtsSize (), rtsTxVector, preamble, m_phy->GetFrequency(), 0, 0);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1692
  Time timerDelay = txDuration + GetCtsTimeout ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1693
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
  1694
  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
  1695
  NotifyCtsTimeoutStartNow (timerDelay);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1696
  m_ctsTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::CtsTimeout, this);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1697
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1698
  Ptr<Packet> packet = Create<Packet> ();
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1699
  packet->AddHeader (rts);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1700
  WifiMacTrailer fcs;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1701
  packet->AddTrailer (fcs);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1702
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1703
  ForwardDown (packet, &rts, rtsTxVector,preamble);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1704
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1705
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1706
void
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1707
MacLow::StartDataTxTimers (WifiTxVector dataTxVector)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1708
{
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1709
  WifiPreamble preamble;
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1710
 
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1711
  //Since it is data then it can have format = GF
11420
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  1712
  if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1713
    preamble = WIFI_PREAMBLE_HT_GF;
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1714
  else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1715
    preamble = WIFI_PREAMBLE_HT_MF;
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1716
  else
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1717
    preamble = WIFI_PREAMBLE_LONG;
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1718
 
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1719
  Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1720
  if (m_txParams.MustWaitNormalAck ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1721
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1722
      Time timerDelay = txDuration + GetAckTimeout ();
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
  1723
      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
  1724
      NotifyAckTimeoutStartNow (timerDelay);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1725
      m_normalAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::NormalAckTimeout, this);
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1726
    }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1727
  else if (m_txParams.MustWaitFastAck ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1728
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1729
      Time timerDelay = txDuration + GetPifs ();
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
  1730
      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
  1731
      NotifyAckTimeoutStartNow (timerDelay);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1732
      m_fastAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::FastAckTimeout, this);
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1733
    }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1734
  else if (m_txParams.MustWaitSuperFastAck ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1735
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1736
      Time timerDelay = txDuration + GetPifs ();
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1964
diff changeset
  1737
      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
  1738
      NotifyAckTimeoutStartNow (timerDelay);
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1739
      m_superFastAckTimeoutEvent = Simulator::Schedule (timerDelay,
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1740
                                                        &MacLow::SuperFastAckTimeout, this);
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1741
    }
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1742
  else if (m_txParams.MustWaitBasicBlockAck ())
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1743
    {
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1744
      Time timerDelay = txDuration + GetBasicBlockAckTimeout ();
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1745
      NS_ASSERT (m_blockAckTimeoutEvent.IsExpired ());
11033
2198f9c998cc bug 1970: Missing NotifyAckTimeoutStartNow in MacLow::StartDataTxTimers
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 10968
diff changeset
  1746
      NotifyAckTimeoutStartNow (timerDelay);
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1747
      m_blockAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::BlockAckTimeout, this);
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1748
    }
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1749
  else if (m_txParams.MustWaitCompressedBlockAck ())
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1750
    {
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1751
      Time timerDelay = txDuration + GetCompressedBlockAckTimeout ();
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1752
      NS_ASSERT (m_blockAckTimeoutEvent.IsExpired ());
11033
2198f9c998cc bug 1970: Missing NotifyAckTimeoutStartNow in MacLow::StartDataTxTimers
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 10968
diff changeset
  1753
      NotifyAckTimeoutStartNow (timerDelay);
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1754
      m_blockAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::BlockAckTimeout, this);
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5957
diff changeset
  1755
    }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1756
  else if (m_txParams.HasNextPacket ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1757
    {
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1758
     if (m_stationManager->HasHtSupported())
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1759
       {
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1760
          Time delay = txDuration + GetRifs ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1761
          NS_ASSERT (m_waitRifsEvent.IsExpired ());
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1762
          m_waitRifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this); 
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1763
       }
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1764
     else
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1765
       {
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1766
          Time delay = txDuration + GetSifs ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1767
          NS_ASSERT (m_waitSifsEvent.IsExpired ());
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1768
          m_waitSifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1769
       }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1770
    }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1771
  else
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1772
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1773
      // since we do not expect any timer to be triggered.
9176
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
  1774
      Simulator::Schedule(txDuration, &MacLow::EndTxNoAck, this);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1775
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1776
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1777
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1778
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1779
MacLow::SendDataPacket (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1780
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1781
  NS_LOG_FUNCTION (this);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1782
  /* send this packet directly. No RTS is needed. */
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1783
  WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1784
  WifiPreamble preamble;
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1785
          
11420
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  1786
  if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1787
     //In the future has to make sure that receiver has greenfield enabled
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1788
     preamble = WIFI_PREAMBLE_HT_GF;
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1789
  else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1790
    preamble = WIFI_PREAMBLE_HT_MF;
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1791
  else
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1792
     preamble = WIFI_PREAMBLE_LONG;
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1793
  
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1794
  StartDataTxTimers (dataTxVector);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1795
2163
03fe5e8740dc fix a small style issue
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
  1796
  Time duration = Seconds (0.0);
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1797
  if (m_txParams.HasDurationId ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1798
    {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1799
      duration += m_txParams.GetDurationId ();
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1800
    }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1801
  else
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1802
    {
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1803
      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
  1804
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1805
          duration += GetSifs ();
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1806
          WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1807
          duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, BASIC_BLOCK_ACK);
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1808
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1809
      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
  1810
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1811
          duration += GetSifs ();
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1812
          WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1813
          duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  1814
        }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1815
      else if (m_txParams.MustWaitAck ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1816
        {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1817
          duration += GetSifs ();
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1818
          duration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1819
        }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1820
      if (m_txParams.HasNextPacket ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1821
        {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1822
          duration += GetSifs ();
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1823
          duration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (),
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1824
                                                  dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1825
          if (m_txParams.MustWaitAck ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1826
            {
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1827
              duration += GetSifs ();
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1828
              duration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1829
            }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1830
        }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1831
    }
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1832
  m_currentHdr.SetDuration (duration);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1833
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1834
  if (!m_ampdu)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1835
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1836
      m_currentPacket->AddHeader (m_currentHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1837
      WifiMacTrailer fcs;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1838
      m_currentPacket->AddTrailer (fcs);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1839
    }
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1840
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1841
  ForwardDown (m_currentPacket, &m_currentHdr, dataTxVector, preamble);
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1842
  m_currentPacket = 0;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1843
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1844
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1845
bool
2146
40ad60ac9912 replace Dcf with DcfManager
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2088
diff changeset
  1846
MacLow::IsNavZero (void) const
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1847
{
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1848
  if (m_lastNavStart + m_lastNavDuration < Simulator::Now ())
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1849
    {
2172
eb1adef495b6 the bool check was inverted. reported by Federico Maguolo.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2163
diff changeset
  1850
      return true;
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1851
    }
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1852
  else
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1853
    {
2172
eb1adef495b6 the bool check was inverted. reported by Federico Maguolo.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2163
diff changeset
  1854
      return false;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1855
    }
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1856
}
11420
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  1857
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1858
void
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1859
MacLow::SendCtsToSelf (void)
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1860
{
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1861
  WifiMacHeader cts;
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1862
  cts.SetType (WIFI_MAC_CTL_CTS);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1863
  cts.SetDsNotFrom ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1864
  cts.SetDsNotTo ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1865
  cts.SetNoMoreFragments ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1866
  cts.SetNoRetry ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1867
  cts.SetAddr1 (m_self);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1868
 
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1869
  WifiTxVector ctsTxVector = GetCtsToSelfTxVector (m_currentPacket, &m_currentHdr);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1870
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1871
  WifiPreamble preamble;
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1872
  if (ctsTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1873
    preamble = WIFI_PREAMBLE_HT_MF;
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1874
  else
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1875
    preamble = WIFI_PREAMBLE_LONG;
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1876
  
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1877
  Time duration = Seconds (0);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1878
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1879
  if (m_txParams.HasDurationId ())
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1880
    {
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1881
      duration += m_txParams.GetDurationId ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1882
    }
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1883
  else
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1884
    {
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1885
      WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1886
      duration += GetSifs ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1887
      duration += m_phy->CalculateTxDuration (GetSize (m_currentPacket,&m_currentHdr),
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1888
                                              dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1889
      if (m_txParams.MustWaitBasicBlockAck ())
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1890
        {
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1891
          
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1892
          duration += GetSifs ();
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1893
          WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1894
          duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, BASIC_BLOCK_ACK);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1895
        }
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1896
      else if (m_txParams.MustWaitCompressedBlockAck ())
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1897
        {
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1898
          duration += GetSifs ();
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1899
          WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1900
          duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1901
        }
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1902
      else if (m_txParams.MustWaitAck ())
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1903
        {
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1904
          duration += GetSifs ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1905
          duration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1906
        }
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1907
      if (m_txParams.HasNextPacket ())
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1908
        {
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1909
          duration += GetSifs ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1910
          duration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (),
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1911
                                                  dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1912
          if (m_txParams.MustWaitCompressedBlockAck ())
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1913
            {
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1914
              duration += GetSifs ();
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1915
              WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1916
              duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1917
            }
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1918
          else if (m_txParams.MustWaitAck ())
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1919
            {
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1920
              duration += GetSifs ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1921
              duration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1922
            }
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1923
        }
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1924
    }
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1925
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1926
  cts.SetDuration (duration);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1927
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1928
  Ptr<Packet> packet = Create<Packet> ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1929
  packet->AddHeader (cts);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1930
  WifiMacTrailer fcs;
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1931
  packet->AddTrailer (fcs);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1932
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1933
  ForwardDown (packet, &cts, ctsTxVector,preamble);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1934
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  1935
  Time txDuration = m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, preamble, m_phy->GetFrequency(), 0, 0);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1936
  txDuration += GetSifs ();
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1937
  NS_ASSERT (m_sendDataEvent.IsExpired ());
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1938
  
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1939
  m_sendDataEvent = Simulator::Schedule (txDuration,
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1940
                                         &MacLow::SendDataAfterCts, this,
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1941
                                         cts.GetAddr1 (),
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1942
                                         duration);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1943
}
11420
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  1944
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1945
void
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1946
MacLow::SendCtsAfterRts (Mac48Address source, Time duration, WifiTxVector rtsTxVector, double rtsSnr)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1947
{
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1948
  NS_LOG_FUNCTION (this << source << duration << rtsTxVector.GetMode () << rtsSnr);
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1949
  /* send a CTS when you receive a RTS
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1950
   * right after SIFS.
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1951
   */
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1952
  WifiTxVector ctsTxVector = GetCtsTxVector (source, rtsTxVector.GetMode ());
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1953
  WifiMacHeader cts;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1954
  cts.SetType (WIFI_MAC_CTL_CTS);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1955
  cts.SetDsNotFrom ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1956
  cts.SetDsNotTo ();
2793
10a571d9a9f7 initialize no more fragment flag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2547
diff changeset
  1957
  cts.SetNoMoreFragments ();
3659
653395340b5c should set retry bit in rts and acks.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3658
diff changeset
  1958
  cts.SetNoRetry ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1959
  cts.SetAddr1 (source);
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1960
  duration -= GetCtsDuration (source, rtsTxVector);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1961
  duration -= GetSifs ();
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1962
  NS_ASSERT (duration >= MicroSeconds (0));
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  1963
  cts.SetDuration (duration);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1964
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1965
  Ptr<Packet> packet = Create<Packet> ();
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1966
  packet->AddHeader (cts);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1967
  WifiMacTrailer fcs;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1968
  packet->AddTrailer (fcs);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1969
6341
375d70f07323 fixed bug 923
Quincy Tse <quincy.tse@gmail.com>
parents: 6331
diff changeset
  1970
  SnrTag tag;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1971
  tag.Set (rtsSnr);
4502
07d34c0d8d18 new tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4264
diff changeset
  1972
  packet->AddPacketTag (tag);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1973
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1974
  //CTS should always use non-HT PPDU (HT PPDU cases not supported yet)
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1975
  ForwardDown (packet, &cts, ctsTxVector, WIFI_PREAMBLE_LONG);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1976
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1977
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1978
void
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  1979
MacLow::SendDataAfterCts (Mac48Address source, Time duration)
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1980
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  1981
  NS_LOG_FUNCTION (this);
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1982
  /* send the third step in a
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  1983
   * RTS/CTS/DATA/ACK hanshake
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  1984
   */
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  1985
  NS_ASSERT (m_currentPacket != 0);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1986
  WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  1987
  
11353
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  1988
  if (m_aggregateQueue->GetSize () != 0)
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  1989
  {
11360
b2777e7f5653 fix warning about signed/unsigned comparison
Tom Henderson <tomh@tomh.org>
parents: 11353
diff changeset
  1990
    for (std::vector<Item>::size_type i = 0; i != m_txPackets.size(); i++)
11353
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  1991
    {
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  1992
      uint8_t tid = GetTid (m_txPackets.at(i).packet, m_txPackets.at(i).hdr);
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  1993
      AcIndex ac = QosUtilsMapTidToAc (tid);
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  1994
      std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt= m_edcaListeners.find(ac);
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  1995
      
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  1996
      listenerIt->second->CompleteMpduTx (m_txPackets.at(i).packet, m_txPackets.at(i).hdr, m_txPackets.at(i).timestamp);
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  1997
    }
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  1998
    m_txPackets.clear ();
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  1999
  }
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2000
  
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  2001
  WifiPreamble preamble;       
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2002
  if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  2003
     //In the future has to make sure that receiver has greenfield enabled
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2004
     preamble = WIFI_PREAMBLE_HT_GF;
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2005
  else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2006
    preamble = WIFI_PREAMBLE_HT_MF;
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  2007
  else
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2008
     preamble = WIFI_PREAMBLE_LONG;
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  2009
  
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  2010
  StartDataTxTimers (dataTxVector);
2176
8a8305b75bed make sure we never set a negative duration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2172
diff changeset
  2011
  Time newDuration = Seconds (0);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2012
  if (m_txParams.MustWaitBasicBlockAck ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2013
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2014
      newDuration += GetSifs ();
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2015
      WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2016
      newDuration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, BASIC_BLOCK_ACK);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2017
    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2018
  else if (m_txParams.MustWaitCompressedBlockAck ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2019
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2020
      newDuration += GetSifs ();
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2021
      WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2022
      newDuration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2023
    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2024
  else if (m_txParams.MustWaitAck ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2025
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2026
      newDuration += GetSifs ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2027
      newDuration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2028
    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2029
  if (m_txParams.HasNextPacket ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2030
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2031
      newDuration += GetSifs ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2032
      newDuration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (), dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2033
      if (m_txParams.MustWaitCompressedBlockAck ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2034
        {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2035
           newDuration += GetSifs ();
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2036
           WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2037
           newDuration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2038
        }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2039
      else if (m_txParams.MustWaitAck ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2040
        {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2041
           newDuration += GetSifs ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2042
           newDuration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2043
        }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2044
    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2045
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2046
  Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr),dataTxVector, preamble, m_phy->GetFrequency(), 0, 0);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2047
  duration -= txDuration;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2048
  duration -= GetSifs ();
2176
8a8305b75bed make sure we never set a negative duration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2172
diff changeset
  2049
8a8305b75bed make sure we never set a negative duration
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2172
diff changeset
  2050
  duration = std::max (duration, newDuration);
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  2051
  NS_ASSERT (duration >= MicroSeconds (0));
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  2052
  m_currentHdr.SetDuration (duration);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2053
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2054
  if (!m_ampdu)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2055
  {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2056
    m_currentPacket->AddHeader (m_currentHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2057
    WifiMacTrailer fcs;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2058
    m_currentPacket->AddTrailer (fcs);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2059
  }
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2060
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  2061
  ForwardDown (m_currentPacket, &m_currentHdr, dataTxVector,preamble);
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  2062
  m_currentPacket = 0;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2063
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2064
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2065
void
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2066
MacLow::WaitSifsAfterEndTx (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2067
{
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2068
  m_listener->StartNext ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2069
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2070
9176
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
  2071
void 
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
  2072
MacLow::EndTxNoAck (void)
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
  2073
{
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
  2074
  MacLowTransmissionListener *listener = m_listener;
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
  2075
  m_listener = 0;
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
  2076
  listener->EndTxNoAck ();
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
  2077
}
41ab1e874804 Bug 555 - DCF immediate access fix
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 7385
diff changeset
  2078
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2079
void
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2080
MacLow::FastAckFailedTimeout (void)
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2081
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  2082
  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
  2083
  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
  2084
  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
  2085
  listener->MissedAck ();
4003
49a08376f196 bug 405: add more context to wifi logging
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3906
diff changeset
  2086
  NS_LOG_DEBUG ("fast Ack busy but missed");
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2087
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2088
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2089
void
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  2090
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
  2091
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2793
diff changeset
  2092
  NS_LOG_FUNCTION (this);
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2093
  /* send an ACK when you receive
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2094
   * a packet after SIFS.
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2095
   */
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  2096
  WifiTxVector ackTxVector = GetAckTxVector (source, dataTxMode);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2097
  WifiMacHeader ack;
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2098
  ack.SetType (WIFI_MAC_CTL_ACK);
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2099
  ack.SetDsNotFrom ();
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2100
  ack.SetDsNotTo ();
3658
f44b66348690 should set retry bit in acks.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3601
diff changeset
  2101
  ack.SetNoRetry ();
2793
10a571d9a9f7 initialize no more fragment flag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2547
diff changeset
  2102
  ack.SetNoMoreFragments ();
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2103
  ack.SetAddr1 (source);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  2104
  duration -= GetAckDuration (ackTxVector);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2105
  duration -= GetSifs ();
2022
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  2106
  NS_ASSERT (duration >= MicroSeconds (0));
33579d27ce2a try to simplify duration calculations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1996
diff changeset
  2107
  ack.SetDuration (duration);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2108
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  2109
  Ptr<Packet> packet = Create<Packet> ();
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  2110
  packet->AddHeader (ack);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2111
  WifiMacTrailer fcs;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2147
diff changeset
  2112
  packet->AddTrailer (fcs);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2113
6341
375d70f07323 fixed bug 923
Quincy Tse <quincy.tse@gmail.com>
parents: 6331
diff changeset
  2114
  SnrTag tag;
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2115
  tag.Set (dataSnr);
4502
07d34c0d8d18 new tags
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4264
diff changeset
  2116
  packet->AddPacketTag (tag);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2117
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2118
  //ACK should always use non-HT PPDU (HT PPDU cases not supported yet)
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2119
  ForwardDown (packet, &ack, ackTxVector, WIFI_PREAMBLE_LONG);
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2120
}
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2121
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2122
bool
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2123
MacLow::IsInWindow (uint16_t seq, uint16_t winstart, uint16_t winsize)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2124
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2125
  return ((seq - winstart+ 4096) % 4096) < winsize;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2126
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2127
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2128
bool 
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2129
MacLow::ReceiveMpdu (Ptr<Packet> packet, WifiMacHeader hdr)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2130
 {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2131
  if (m_stationManager->HasHtSupported ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2132
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2133
      Mac48Address originator = hdr.GetAddr2 ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2134
      uint8_t tid = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2135
      if (hdr.IsQosData ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2136
        tid = hdr.GetQosTid ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2137
      uint16_t seqNumber = hdr.GetSequenceNumber ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2138
      AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2139
      if (it != m_bAckAgreements.end ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2140
        {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2141
          //Implement HT immediate Block Ack support for HT Delayed Block Ack is not added yet
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2142
          if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence (), seqNumber))
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2143
            { 
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2144
              StoreMpduIfNeeded (packet, hdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2145
              if (!IsInWindow(hdr.GetSequenceNumber (), (*it).second.first.GetStartingSequence (), (*it).second.first.GetBufferSize ()))
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2146
                {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2147
                  uint16_t delta = (seqNumber - (*it).second.first.GetWinEnd()+ 4096) % 4096;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2148
                  if (delta > 1)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2149
                    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2150
                     (*it).second.first.SetWinEnd (seqNumber);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2151
                     int16_t winEnd = (*it).second.first.GetWinEnd ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2152
                     int16_t bufferSize = (*it).second.first.GetBufferSize ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2153
                     uint16_t sum = ((uint16_t)(std::abs(winEnd - bufferSize + 1))) % 4096;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2154
                     (*it).second.first.SetStartingSequence (sum);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2155
                     RxCompleteBufferedPacketsWithSmallerSequence ((*it).second.first.GetStartingSequence (), originator, tid);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2156
                   } 
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2157
               }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2158
              RxCompleteBufferedPacketsUntilFirstLost (originator, tid); //forwards up packets starting from winstart and set winstart to last +1
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2159
             (*it).second.first.SetWinEnd(((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize()-1)%4096);  
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2160
           }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2161
          return true;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2162
        }  
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2163
      return false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2164
    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2165
 else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2166
   return StoreMpduIfNeeded (packet,hdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2167
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2168
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2169
bool
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2170
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
  2171
{
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2172
  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
  2173
  if (it != m_bAckAgreements.end ())
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2174
    {
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2175
      WifiMacTrailer fcs;
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2176
      packet->RemoveTrailer (fcs);
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2177
      BufferedPacket bufferedPacket (packet, hdr);
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2178
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2179
      uint16_t endSequence = ((*it).second.first.GetStartingSequence () + 2047) % 4096;
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2180
      uint16_t mappedSeqControl = QosUtilsMapSeqControlToUniqueInteger (hdr.GetSequenceControl (), endSequence);
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2181
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2182
      BufferedPacketI i = (*it).second.second.begin ();
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2183
      for (; i != (*it).second.second.end ()
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2184
           && QosUtilsMapSeqControlToUniqueInteger ((*i).second.GetSequenceControl (), endSequence) < mappedSeqControl; i++)
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2185
        {
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2186
          ;
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2187
        }
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2188
      (*it).second.second.insert (i, bufferedPacket);
6606
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2189
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2190
      //Update block ack cache
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2191
      BlockAckCachesI j = m_bAckCaches.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2192
      NS_ASSERT (j != m_bAckCaches.end ());
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2193
      (*j).second.UpdateWithMpdu (&hdr);
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2194
      return true;
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2195
    }
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2196
  return false;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2197
}
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2198
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2199
void
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2200
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
  2201
                                 uint16_t startingSeq)
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2202
{
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2203
  uint8_t tid = respHdr->GetTid ();
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2204
  BlockAckAgreement agreement (originator, tid);
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2205
  if (respHdr->IsImmediateBlockAck ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2206
    {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2207
      agreement.SetImmediateBlockAck ();
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2208
    }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2209
  else
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2210
    {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2211
      agreement.SetDelayedBlockAck ();
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2212
    }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2213
  agreement.SetAmsduSupport (respHdr->IsAmsduSupported ());
6592
6ef5141e7bcf Packets that cannot be acknowledged in the block ack bitmap must not be transmitted
Mirko Banchi <mk.banchi@gmail.com>
parents: 6488
diff changeset
  2214
  agreement.SetBufferSize (respHdr->GetBufferSize () + 1);
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2215
  agreement.SetTimeout (respHdr->GetTimeout ());
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2216
  agreement.SetStartingSequence (startingSeq);
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2217
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2218
  std::list<BufferedPacket> buffer (0);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2219
  AgreementKey key (originator, respHdr->GetTid ());
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2220
  AgreementValue value (agreement, buffer);
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2221
  m_bAckAgreements.insert (std::make_pair (key, value));
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2222
6606
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2223
  BlockAckCache cache;
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2224
  cache.Init (startingSeq, respHdr->GetBufferSize () + 1);
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2225
  m_bAckCaches.insert (std::make_pair (key, cache));
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2226
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2227
  if (respHdr->GetTimeout () != 0)
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2228
    {
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2229
      AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, respHdr->GetTid ()));
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2230
      Time timeout = MicroSeconds (1024 * agreement.GetTimeout ());
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2231
6331
eee2eab36748 Bug 910: Replace AccessClass with 802.11-style AcIndex
Dean Armstrong <deanarm@gmail.com>
parents: 6304
diff changeset
  2232
      AcIndex ac = QosUtilsMapTidToAc (agreement.GetTid ());
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2233
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2234
      it->second.first.m_inactivityEvent = Simulator::Schedule (timeout,
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2235
                                                                &MacLowAggregationCapableTransmissionListener::BlockAckInactivityTimeout,
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2236
                                                                m_edcaListeners[ac],
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2237
                                                                originator, tid);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2238
    }
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2239
}
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2240
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2241
void
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2242
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
  2243
{
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2244
  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
  2245
  if (it != m_bAckAgreements.end ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2246
    {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2247
      RxCompleteBufferedPacketsWithSmallerSequence (it->second.first.GetStartingSequence (), originator, tid);
6599
8c1a255c05a3 Rename MacLow::RxCompleteBufferedPacket to a more appropriate name
Mirko Banchi <mk.banchi@gmail.com>
parents: 6595
diff changeset
  2248
      RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2249
      m_bAckAgreements.erase (it);
6606
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2250
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2251
      BlockAckCachesI i = m_bAckCaches.find (std::make_pair (originator, tid));
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2252
      NS_ASSERT (i != m_bAckCaches.end ());
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2253
      m_bAckCaches.erase (i);
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2254
    }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2255
}
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2256
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2257
void
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2258
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
  2259
{
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2260
  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
  2261
  if (it != m_bAckAgreements.end ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2262
    {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2263
      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
  2264
      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
  2265
      BufferedPacketI last = (*it).second.second.begin ();
11188
e010083f6592 fix possibly uninitialized variable warning
Tom Henderson <tomh@tomh.org>
parents: 11174
diff changeset
  2266
      uint16_t guard = 0;
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2267
      if (last != (*it).second.second.end ())
11188
e010083f6592 fix possibly uninitialized variable warning
Tom Henderson <tomh@tomh.org>
parents: 11174
diff changeset
  2268
        {
e010083f6592 fix possibly uninitialized variable warning
Tom Henderson <tomh@tomh.org>
parents: 11174
diff changeset
  2269
          guard = (*it).second.second.begin ()->second.GetSequenceControl () & 0xfff0;
e010083f6592 fix possibly uninitialized variable warning
Tom Henderson <tomh@tomh.org>
parents: 11174
diff changeset
  2270
        }
6304
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2271
      BufferedPacketI i = (*it).second.second.begin ();
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2272
      for (; i != (*it).second.second.end ()
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2273
           && QosUtilsMapSeqControlToUniqueInteger ((*i).second.GetSequenceNumber (), endSequence) < mappedStart;)
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2274
        {
6304
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2275
          if (guard == (*i).second.GetSequenceControl ())
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2276
            {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2277
              if (!(*i).second.IsMoreFragments ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2278
                {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2279
                  while (last != i)
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2280
                    {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2281
                      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
  2282
                      last++;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2283
                    }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2284
                  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
  2285
                  last++;
6304
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2286
                  /* go to next packet */
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2287
                  while (i != (*it).second.second.end () && ((guard >> 4) & 0x0fff) == (*i).second.GetSequenceNumber ())
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2288
                    {
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2289
                      i++;
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2290
                    }
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2291
                  if (i != (*it).second.second.end ())
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2292
                    {
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2293
                      guard = (*i).second.GetSequenceControl () & 0xfff0;
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2294
                      last = i;
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2295
                    }
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2296
                }
6304
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2297
              else
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2298
                {
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2299
                  guard++;
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2300
                }
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2301
            }
6304
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2302
          else
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2303
            {
6304
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2304
              /* go to next packet */
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2305
              while (i != (*it).second.second.end () && ((guard >> 4) & 0x0fff) == (*i).second.GetSequenceNumber ())
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2306
                {
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2307
                  i++;
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2308
                }
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2309
              if (i != (*it).second.second.end ())
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2310
                {
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2311
                  guard = (*i).second.GetSequenceControl () & 0xfff0;
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2312
                  last = i;
645b4e644c12 bug 842: ns-3-dev crashes using block ack (fixed)
Mirko Banchi <mk.banchi@gmail.com>
parents: 6068
diff changeset
  2313
                }
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2314
            }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2315
        }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2316
      (*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
  2317
    }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2318
}
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2319
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2320
void
6599
8c1a255c05a3 Rename MacLow::RxCompleteBufferedPacket to a more appropriate name
Mirko Banchi <mk.banchi@gmail.com>
parents: 6595
diff changeset
  2321
MacLow::RxCompleteBufferedPacketsUntilFirstLost (Mac48Address originator, uint8_t tid)
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2322
{
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2323
  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
  2324
  if (it != m_bAckAgreements.end ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2325
    {
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2326
      uint16_t startingSeqCtrl = ((*it).second.first.GetStartingSequence () << 4) & 0xfff0;
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2327
      uint16_t guard = startingSeqCtrl;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2328
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2329
      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
  2330
      BufferedPacketI i = (*it).second.second.begin ();
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2331
      for (; i != (*it).second.second.end () && guard == (*i).second.GetSequenceControl (); i++)
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2332
        {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2333
          if (!(*i).second.IsMoreFragments ())
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2334
            {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2335
              while (lastComplete != i)
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2336
                {
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2337
                  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
  2338
                  lastComplete++;
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2339
                }
6595
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2340
              m_rxCallback ((*lastComplete).first, &(*lastComplete).second);
3289a9d91620 run check-style on mac-low.h/cc
Mirko Banchi <mk.banchi@gmail.com>
parents: 6592
diff changeset
  2341
              lastComplete++;
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2342
            }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2343
          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
  2344
        }
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2345
      (*it).second.first.SetStartingSequence ((guard >> 4) & 0x0fff);
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2346
      /* All packets already forwarded to WifiMac must be removed from buffer:
5956
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2347
      [begin (), lastComplete) */
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2348
      (*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
  2349
    }
e9918be47f78 MacLow now buffers QoS MPDUs under Block Ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
  2350
}
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2351
void
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2352
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
  2353
                              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
  2354
{
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2355
  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
  2356
  packet->AddHeader (*blockAck);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2357
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2358
  WifiMacHeader hdr;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2359
  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
  2360
  hdr.SetAddr1 (originator);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2361
  hdr.SetAddr2 (GetAddress ());
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2362
  hdr.SetDsNotFrom ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2363
  hdr.SetDsNotTo ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2364
  hdr.SetNoRetry ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2365
  hdr.SetNoMoreFragments ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2366
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2367
  WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (originator, blockAckReqTxMode);
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  2368
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2369
  m_currentPacket = packet;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2370
  m_currentHdr = hdr;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2371
  if (immediate)
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2372
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2373
      m_txParams.DisableAck ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2374
      duration -= GetSifs ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2375
      if (blockAck->IsBasic ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2376
        {
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  2377
          duration -= GetBlockAckDuration (originator, blockAckReqTxVector, BASIC_BLOCK_ACK);
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2378
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2379
      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
  2380
        {
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  2381
          duration -= GetBlockAckDuration (originator, blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2382
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2383
      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
  2384
        {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2385
          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
  2386
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2387
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2388
  else
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2389
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2390
      m_txParams.EnableAck ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2391
      duration += GetSifs ();
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  2392
      duration += GetAckDuration (originator, blockAckReqTxVector);
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2393
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2394
  m_txParams.DisableNextData ();
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2395
9238
e6c89f14f09b Prevent EndTxNoAck after sending a Block ACK response
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 9234
diff changeset
  2396
  if (!immediate)
e6c89f14f09b Prevent EndTxNoAck after sending a Block ACK response
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 9234
diff changeset
  2397
    {
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2398
      StartDataTxTimers (blockAckReqTxVector);
9238
e6c89f14f09b Prevent EndTxNoAck after sending a Block ACK response
Daniel Lertpratchya <nikkipui@gmail.com>
parents: 9234
diff changeset
  2399
    }
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2400
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2401
  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
  2402
  hdr.SetDuration (duration);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2403
  //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
  2404
  //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
  2405
  packet->AddHeader (hdr);
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2406
  WifiMacTrailer fcs;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2407
  packet->AddTrailer (fcs);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2408
  WifiPreamble preamble;
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2409
  if (blockAckReqTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2410
    preamble = WIFI_PREAMBLE_HT_MF;
10139
17a71cd49da3 partial 802.11n support
Ghada Badawy <gbadawy@gmail.com>
parents: 9894
diff changeset
  2411
  else
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2412
    preamble = WIFI_PREAMBLE_LONG;
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2413
  ForwardDown (packet, &hdr, blockAckReqTxVector, preamble);
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2414
  m_currentPacket = 0;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2415
}
11420
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  2416
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2417
void 
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2418
MacLow::SendBlockAckAfterAmpdu (uint8_t tid, Mac48Address originator, Time duration, WifiTxVector blockAckReqTxVector)
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2419
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2420
  NS_LOG_FUNCTION (this);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2421
  CtrlBAckResponseHeader blockAck;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2422
  uint16_t seqNumber = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2423
  BlockAckCachesI i = m_bAckCaches.find (std::make_pair (originator, tid));
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2424
  NS_ASSERT (i != m_bAckCaches.end ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2425
  seqNumber = (*i).second.GetWinStart ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2426
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2427
  bool immediate = true;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2428
  AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2429
  blockAck.SetStartingSequence (seqNumber);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2430
  blockAck.SetTidInfo (tid);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2431
  immediate = (*it).second.first.IsImmediateBlockAck ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2432
  blockAck.SetType (COMPRESSED_BLOCK_ACK);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2433
  NS_LOG_DEBUG ("Got Implicit block Ack Req with seq " << seqNumber);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2434
  (*i).second.FillBlockAckBitmap (&blockAck);  
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2435
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2436
  SendBlockAckResponse (&blockAck, originator, immediate, duration, blockAckReqTxVector.GetMode  ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2437
}
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2438
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2439
void
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2440
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
  2441
                                          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
  2442
{
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2443
  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
  2444
  CtrlBAckResponseHeader blockAck;
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2445
  uint8_t tid = 0;
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2446
  bool immediate = false;
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2447
  if (!reqHdr.IsMultiTid ())
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2448
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2449
      tid = reqHdr.GetTidInfo ();
6606
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2450
      AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2451
      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
  2452
        {
6606
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2453
          blockAck.SetStartingSequence (reqHdr.GetStartingSequence ());
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2454
          blockAck.SetTidInfo (tid);
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2455
          immediate = (*it).second.first.IsImmediateBlockAck ();
6606
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2456
          if (reqHdr.IsBasic ())
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2457
            {
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2458
              blockAck.SetType (BASIC_BLOCK_ACK);
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2459
            }
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2460
          else if (reqHdr.IsCompressed ())
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2461
            {
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2462
              blockAck.SetType (COMPRESSED_BLOCK_ACK);
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2463
            }
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2464
          BlockAckCachesI i = m_bAckCaches.find (std::make_pair (originator, tid));
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2465
          NS_ASSERT (i != m_bAckCaches.end ());
2f2b67218332 Bug 981: use a cache to keep track of received MPDUs under block ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6599
diff changeset
  2466
          (*i).second.FillBlockAckBitmap (&blockAck);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2467
          NS_LOG_DEBUG ("Got block Ack Req with seq " << reqHdr.GetStartingSequence ());
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2468
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2469
          if (!m_stationManager->HasHtSupported())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2470
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2471
              /* All packets with smaller sequence than starting sequence control must be passed up to Wifimac
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2472
               * See 9.10.3 in IEEE 802.11e standard.
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2473
               */
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2474
              RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequence (), originator, tid);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2475
              RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2476
            }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2477
          else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2478
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2479
              if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence(), reqHdr.GetStartingSequence ()))
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2480
                { 
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2481
                  (*it).second.first.SetStartingSequence(reqHdr.GetStartingSequence ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2482
                  (*it).second.first.SetWinEnd(((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize()-1) % 4096);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2483
                  RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequence (), originator, tid);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2484
                  RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2485
                  (*it).second.first.SetWinEnd(((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize()-1) % 4096);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2486
                }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2487
            }
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2488
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2489
      else
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2490
        {
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2491
          NS_LOG_DEBUG ("there's not a valid block ack agreement with " << originator);
5957
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2492
        }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2493
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2494
  else
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2495
    {
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2496
      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
  2497
    }
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2498
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2499
  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
  2500
}
dd5ece55acb9 handle block ack and block ack request frames in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5956
diff changeset
  2501
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2502
void
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2503
MacLow::ResetBlockAckInactivityTimerIfNeeded (BlockAckAgreement &agreement)
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2504
{
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2505
  if (agreement.GetTimeout () != 0)
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2506
    {
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2507
      NS_ASSERT (agreement.m_inactivityEvent.IsRunning ());
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2508
      agreement.m_inactivityEvent.Cancel ();
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2509
      Time timeout = MicroSeconds (1024 * agreement.GetTimeout ());
6331
eee2eab36748 Bug 910: Replace AccessClass with 802.11-style AcIndex
Dean Armstrong <deanarm@gmail.com>
parents: 6304
diff changeset
  2510
      AcIndex ac = QosUtilsMapTidToAc (agreement.GetTid ());
eee2eab36748 Bug 910: Replace AccessClass with 802.11-style AcIndex
Dean Armstrong <deanarm@gmail.com>
parents: 6304
diff changeset
  2511
      //std::map<AcIndex, MacLowTransmissionListener*>::iterator it = m_edcaListeners.find (ac);
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2512
      //NS_ASSERT (it != m_edcaListeners.end ());
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2513
7141
072fb225b714 run check-style.py on src/wifi
Nicola Baldo <nicola@baldo.biz>
parents: 7045
diff changeset
  2514
      agreement.m_inactivityEvent = Simulator::Schedule (timeout,
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2515
                                                         &MacLowAggregationCapableTransmissionListener::BlockAckInactivityTimeout,
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2516
                                                         m_edcaListeners[ac],
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2517
                                                         agreement.GetPeer (),
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2518
                                                         agreement.GetTid ());
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2519
    }
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2520
}
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2521
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2522
void
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2523
MacLow::RegisterBlockAckListenerForAc (enum AcIndex ac, MacLowAggregationCapableTransmissionListener *listener)
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2524
{
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2525
  m_edcaListeners.insert (std::make_pair (ac, listener));
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2526
}
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  2527
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2528
void
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2529
MacLow::SetMpduAggregator (Ptr<MpduAggregator> aggregator)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2530
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2531
  m_mpduAggregator = aggregator;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2532
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2533
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2534
void
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2535
MacLow::DeaggregateAmpduAndReceive (Ptr<Packet> aggregatedPacket, double rxSnr, WifiTxVector txVector, WifiPreamble preamble)
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2536
{
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2537
  m_currentTxVector = txVector;
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2538
  AmpduTag ampdu;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2539
  bool normalAck = false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2540
  bool ampduSubframe = false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2541
  if (aggregatedPacket->RemovePacketTag(ampdu))
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2542
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2543
      ampduSubframe = true;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2544
      MpduAggregator::DeaggregatedMpdus packets =  MpduAggregator::Deaggregate (aggregatedPacket);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2545
      MpduAggregator::DeaggregatedMpdusCI n = packets.begin ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2546
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2547
      WifiMacHeader firsthdr;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2548
      (*n).first->PeekHeader(firsthdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2549
      NS_LOG_DEBUG ("duration/id=" << firsthdr.GetDuration ());
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2550
      NotifyNav ((*n).first, firsthdr, preamble);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2551
      if (firsthdr.GetAddr1 () == m_self)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2552
        {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2553
          m_receivedAtLeastOneMpdu = true;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2554
          if (firsthdr.IsAck () || firsthdr.IsBlockAck () || firsthdr.IsBlockAckReq ())
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2555
              ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2556
          else if (firsthdr.IsData () || firsthdr.IsQosData ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2557
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2558
              NS_LOG_DEBUG ("Deaagregate packet with sequence=" << firsthdr.GetSequenceNumber ());
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2559
              ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2560
              if (firsthdr.IsQosAck ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2561
                {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2562
                  NS_LOG_DEBUG ("Normal Ack");
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2563
                  normalAck = true;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2564
                }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2565
            } 
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2566
          else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2567
              NS_FATAL_ERROR ("Received A-MPDU with invalid first MPDU type");
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2568
        }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2569
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2570
      if (normalAck && (ampdu.GetNoOfMpdus () == 1))
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2571
        { 
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2572
          //send block Ack
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2573
          if (firsthdr.IsBlockAckReq ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2574
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2575
              NS_FATAL_ERROR ("Sending a BlockAckReq with QosPolicy equal to Normal Ack");
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2576
            }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2577
          uint8_t tid = firsthdr.GetQosTid ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2578
          AgreementsI it = m_bAckAgreements.find (std::make_pair (firsthdr.GetAddr2 (), tid));
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2579
          if (it != m_bAckAgreements.end ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2580
            { 
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2581
              NS_ASSERT (m_sendAckEvent.IsExpired ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2582
              /* See section 11.5.3 in IEEE 802.11 for mean of this timer */
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2583
              ResetBlockAckInactivityTimerIfNeeded (it->second.first);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2584
              NS_LOG_DEBUG ("rx A-MPDU/sendImmediateBlockAck from=" << firsthdr.GetAddr2 ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2585
              m_sendAckEvent = Simulator::Schedule (GetSifs (),
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2586
                                                    &MacLow::SendBlockAckAfterAmpdu, this,
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2587
                                                    firsthdr.GetQosTid(),
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2588
                                                    firsthdr.GetAddr2 (),
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2589
                                                    firsthdr.GetDuration (),
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2590
                                                    txVector);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2591
            } 
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2592
          else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2593
            { 
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2594
              NS_LOG_DEBUG ("There's not a valid agreement for this block ack request.");
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2595
            }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2596
          m_receivedAtLeastOneMpdu = false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2597
        }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2598
    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2599
  else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2600
    {     
11420
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  2601
          ReceiveOk (aggregatedPacket, rxSnr, txVector, preamble, ampduSubframe);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2602
    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2603
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2604
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2605
bool 
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2606
MacLow::StopMpduAggregation(Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2607
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2608
    WifiPreamble preamble;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2609
    WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2610
    if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2611
        preamble = WIFI_PREAMBLE_HT_GF;
11420
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  2612
    else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  2613
        preamble = WIFI_PREAMBLE_HT_MF;
ef4dc0386e71 postfix for commit 11384:935dc1cc08a4
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11398
diff changeset
  2614
    else
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2615
        preamble = WIFI_PREAMBLE_LONG;
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2616
    
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2617
    if (peekedPacket == 0)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2618
        return true;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2619
    
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2620
    //An HT STA shall not transmit a PPDU that has a duration that is greater than aPPDUMaxTime (10 milliseconds)
11384
935dc1cc08a4 Bug 2097 [wifi] - ACKs should be sent using legacy rates and preambles in 802.11n
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11360
diff changeset
  2621
    if(m_phy->CalculateTxDuration (aggregatedPacket->GetSize () + peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, dataTxVector, preamble, m_phy->GetFrequency(), 0, 0) > MilliSeconds(10))
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2622
        return true;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2623
    
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2624
    if (!m_mpduAggregator->CanBeAggregated (peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, aggregatedPacket, size))
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2625
        return true;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2626
    
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2627
    return false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2628
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2629
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2630
Ptr<Packet>
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2631
MacLow::AggregateToAmpdu (Ptr<const Packet> packet, const WifiMacHeader hdr)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2632
{
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2633
  NS_ASSERT (m_aggregateQueue->GetSize () == 0);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2634
  bool isAmpdu = false;
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2635
  Ptr<Packet> newPacket, tempPacket;
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2636
  WifiMacHeader peekedHdr;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2637
  newPacket = packet->Copy();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2638
  //missing hdr.IsAck() since we have no means of knowing the Tid of the Ack yet
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2639
  if (hdr.IsQosData() || hdr.IsBlockAck()|| hdr.IsBlockAckReq())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2640
    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2641
      Time tstamp;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2642
      uint8_t tid = GetTid (packet, hdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2643
      Ptr<WifiMacQueue> queue;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2644
      AcIndex ac = QosUtilsMapTidToAc (tid);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2645
      //since a blockack agreement always preceeds mpdu aggregation there should always exist blockAck listener
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2646
      std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt= m_edcaListeners.find(ac);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2647
      NS_ASSERT (listenerIt != m_edcaListeners.end ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2648
      queue = listenerIt->second->GetQueue();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2649
      
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2650
      if (!hdr.GetAddr1 ().IsBroadcast () && m_mpduAggregator!= 0)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2651
        {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2652
          //Have to make sure that their exist a block Ack agreement before sending an AMPDU (BlockAck Manager)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2653
          if (listenerIt->second->GetBlockAckAgreementExists (hdr.GetAddr1(), tid))
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2654
            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2655
              /* here is performed mpdu aggregation */
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2656
              /* MSDU aggregation happened in edca if the user asked for it so m_currentPacket may contains a normal packet or a A-MSDU*/
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2657
              Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2658
              peekedHdr = hdr;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2659
              uint16_t startingSequenceNumber = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2660
              uint16_t currentSequenceNumber = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2661
              uint8_t qosPolicy = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2662
              uint16_t blockAckSize = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2663
              bool aggregated = false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2664
              int i = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2665
              Ptr<Packet> aggPacket = newPacket->Copy ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2666
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2667
              if (!hdr.IsBlockAckReq())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2668
                {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2669
                  if (!hdr.IsBlockAck())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2670
                    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2671
                       startingSequenceNumber = peekedHdr.GetSequenceNumber();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2672
                       peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2673
                    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2674
                  currentSequenceNumber = peekedHdr.GetSequenceNumber();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2675
                  newPacket->AddHeader (peekedHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2676
                  WifiMacTrailer fcs;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2677
                  newPacket->AddTrailer (fcs);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2678
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2679
                  aggregated=m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2680
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2681
                  if (aggregated)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2682
                    {
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2683
                      NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<" to A-MPDU, packet size = " << newPacket->GetSize ()<< ", A-MPDU size = " << currentAggregatedPacket->GetSize ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2684
                      i++;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2685
                      m_sentMpdus++;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2686
                      m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2687
                    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2688
                } 
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2689
              else if (hdr.IsBlockAckReq())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2690
                {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2691
                  blockAckSize = packet->GetSize() + hdr.GetSize() + WIFI_MAC_FCS_LENGTH;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2692
                  qosPolicy = 3; //if the last subrame is block ack req then set ack policy of all frames to blockack
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2693
                  CtrlBAckRequestHeader blockAckReq;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2694
                  packet->PeekHeader (blockAckReq);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2695
                  startingSequenceNumber = blockAckReq.GetStartingSequence ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2696
                }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2697
              aggregated = false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2698
              bool retry = false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2699
              //looks for other packets to the same destination with the same Tid need to extend that to include MSDUs
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2700
              Ptr<const Packet> peekedPacket = listenerIt->second->PeekNextPacketInBaQueue (peekedHdr, peekedHdr.GetAddr1 (), tid, &tstamp);
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2701
              if (peekedPacket == 0)
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2702
                {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2703
                  peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid,
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2704
                                                             WifiMacHeader::ADDR1,
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2705
                                                             hdr.GetAddr1 (), &tstamp);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2706
                  currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2707
                    
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2708
                  /* here is performed MSDU aggregation (two-level aggregation) */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2709
                  if (peekedPacket != 0 && listenerIt->second->GetMsduAggregator () != 0)
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2710
                    {
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2711
                       tempPacket = PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2712
                       if (tempPacket != 0) //MSDU aggregation
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2713
                         peekedPacket = tempPacket->Copy();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2714
                    }
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2715
                }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2716
              else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2717
                {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2718
                  retry = true;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2719
                  currentSequenceNumber = peekedHdr.GetSequenceNumber(); 
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2720
                }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2721
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2722
               while (IsInWindow (currentSequenceNumber, startingSequenceNumber, 64) && !StopMpduAggregation (peekedPacket, peekedHdr, currentAggregatedPacket, blockAckSize))
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2723
                {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2724
                  //for now always send AMPDU with normal ACK
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2725
                  if (retry == false)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2726
                    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2727
                      currentSequenceNumber = listenerIt->second->GetNextSequenceNumberfor (&peekedHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2728
                      peekedHdr.SetSequenceNumber (currentSequenceNumber);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2729
                      peekedHdr.SetFragmentNumber (0);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2730
                      peekedHdr.SetNoMoreFragments ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2731
                      peekedHdr.SetNoRetry ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2732
                    }                      
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2733
                  if (qosPolicy == 0)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2734
                      peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2735
                  else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2736
                      peekedHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2737
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2738
                  newPacket = peekedPacket->Copy ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2739
                  Ptr<Packet> aggPacket = newPacket->Copy ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2740
                 
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2741
                  newPacket->AddHeader (peekedHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2742
                  WifiMacTrailer fcs;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2743
                  newPacket->AddTrailer (fcs);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2744
                  aggregated = m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2745
                  if (aggregated)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2746
                    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2747
                      m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2748
                      if (i == 1 && hdr.IsQosData ())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2749
                      {
11353
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2750
                        if (!m_txParams.MustSendRts ())
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2751
                        {
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2752
                           listenerIt->second->CompleteMpduTx (packet, hdr, tstamp);
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2753
                        }
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2754
                        else
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2755
                        {
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2756
                          InsertInTxQueue (packet, hdr, tstamp);
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2757
                        }
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2758
                      }
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2759
                      NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<" to A-MPDU, packet size = " << newPacket->GetSize ()<< ", A-MPDU size = " << currentAggregatedPacket->GetSize ());
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2760
                      i++;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2761
                      isAmpdu = true;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2762
                      m_sentMpdus++;
11353
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2763
                      if (!m_txParams.MustSendRts ())
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2764
                      {
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2765
                        listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2766
                      }
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2767
                      else
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2768
                      {
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2769
                        InsertInTxQueue (peekedPacket, peekedHdr, tstamp);
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2770
                      }
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2771
                      if (retry)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2772
                          listenerIt->second->RemoveFromBaQueue(tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ());
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2773
                      else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2774
                          queue->Remove (peekedPacket);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2775
                      newPacket = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2776
                    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2777
                  else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2778
                      break;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2779
                  if (retry == true)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2780
                    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2781
                      peekedPacket = listenerIt->second->PeekNextPacketInBaQueue(peekedHdr, hdr.GetAddr1(), tid, &tstamp);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2782
                      if (peekedPacket == 0)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2783
                        {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2784
                          //I reached the first packet that I added to this A-MPDU
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2785
                          retry = false;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2786
                          peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid,
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2787
                                                                     WifiMacHeader::ADDR1, hdr.GetAddr1 (), &tstamp);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2788
                          if (peekedPacket != 0)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2789
                            {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2790
                              //find what will the sequence number be so that we don't send more than 64 packets apart
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2791
                              currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2792
                              
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2793
                              if (listenerIt->second->GetMsduAggregator () != 0)
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2794
                              {
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2795
                                tempPacket = PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2796
                                if (tempPacket != 0) //MSDU aggregation
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2797
                                  peekedPacket = tempPacket->Copy();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2798
                              }
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2799
                            }   
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2800
                        }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2801
                      else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2802
                          currentSequenceNumber = peekedHdr.GetSequenceNumber();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2803
                    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2804
                  else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2805
                    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2806
                      peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid,
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2807
                                                                 WifiMacHeader::ADDR1, hdr.GetAddr1 (), &tstamp);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2808
                      if (peekedPacket != 0)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2809
                        {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2810
                          //find what will the sequence number be so that we don't send more than 64 packets apart
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2811
                          currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2812
                          
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2813
                          if (listenerIt->second->GetMsduAggregator () != 0 && IsInWindow (currentSequenceNumber, startingSequenceNumber, 64))
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2814
                          {
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2815
                            tempPacket = PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2816
                            if (tempPacket != 0) //MSDU aggregation
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2817
                              peekedPacket = tempPacket->Copy();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2818
                          }
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2819
                        }   
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2820
                    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2821
                }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2822
              if (isAmpdu)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2823
                {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2824
                  if (hdr.IsBlockAckReq())
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2825
                    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2826
                      newPacket = packet->Copy();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2827
                      peekedHdr = hdr;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2828
                      Ptr<Packet> aggPacket = newPacket->Copy();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2829
                      m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2830
                      newPacket->AddHeader (peekedHdr);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2831
                      WifiMacTrailer fcs;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2832
                      newPacket->AddTrailer (fcs);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2833
                      m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2834
                    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2835
                  if (qosPolicy==0)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2836
                    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2837
                         listenerIt->second->CompleteTransfer(hdr.GetAddr1 (),tid);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2838
                    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2839
                  //Add packet tag
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2840
                  AmpduTag ampdutag;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2841
                  ampdutag.SetAmpdu (true);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2842
                  ampdutag.SetNoOfMpdus(i);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2843
                  newPacket = currentAggregatedPacket;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2844
                  newPacket->AddPacketTag(ampdutag);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2845
                  currentAggregatedPacket = 0;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2846
                  NS_LOG_DEBUG ("tx unicast A-MPDU");
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2847
                  listenerIt->second->SetAmpdu(true);
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2848
                }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2849
              else
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2850
                {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2851
                  uint32_t queueSize = m_aggregateQueue->GetSize ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2852
                  NS_ASSERT (queueSize <= 2); //since it is not an A-MPDU then only 2 packets should have been added to the queue no more
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2853
                  if (queueSize >= 1)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2854
                    {
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2855
                      //remove any packets that we added to the aggregate queue
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2856
                      FlushAggregateQueue ();
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2857
                    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2858
                }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2859
            }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2860
        }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2861
    }
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2862
  return newPacket;
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2863
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2864
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2865
void
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2866
MacLow::FlushAggregateQueue (void)
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2867
{
11398
1c3de04836e3 remove tracing information about aggregate queue flushing when aggregate queue is empty
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11384
diff changeset
  2868
  if (m_aggregateQueue->GetSize () > 0)
1c3de04836e3 remove tracing information about aggregate queue flushing when aggregate queue is empty
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11384
diff changeset
  2869
  {
1c3de04836e3 remove tracing information about aggregate queue flushing when aggregate queue is empty
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11384
diff changeset
  2870
    NS_LOG_DEBUG("Flush aggregate queue");
1c3de04836e3 remove tracing information about aggregate queue flushing when aggregate queue is empty
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11384
diff changeset
  2871
    m_aggregateQueue->Flush ();
1c3de04836e3 remove tracing information about aggregate queue flushing when aggregate queue is empty
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11384
diff changeset
  2872
  }
11353
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2873
  m_txPackets.clear ();
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2874
}
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2875
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2876
void
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2877
MacLow::InsertInTxQueue (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp)
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2878
{
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2879
  Item item;
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2880
  
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2881
  item.packet = packet;
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2882
  item.hdr = hdr;
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2883
  item.timestamp = tStamp;
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2884
b03d1c0ada03 Bug 2075 [wifi] - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11352
diff changeset
  2885
  m_txPackets.push_back (item);
11174
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2886
}
780a43e4980c add MPDU aggregation (with contributions from Sebastien Deronne and Ioannis Selinis)
Ghada Badawy <gbadawy@gmail.com>
parents: 11159
diff changeset
  2887
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2888
Ptr<Packet>
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2889
MacLow::PerformMsduAggregation(Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize)
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2890
{
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2891
  bool msduAggregation = false;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2892
  bool isAmsdu = false;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2893
  Ptr<Packet> currentAmsduPacket = Create<Packet> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2894
  Ptr<Packet> tempPacket = Create<Packet> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2895
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2896
  Ptr<WifiMacQueue> queue;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2897
  AcIndex ac = QosUtilsMapTidToAc (GetTid (packet, *hdr));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2898
  std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt= m_edcaListeners.find(ac);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2899
  NS_ASSERT (listenerIt != m_edcaListeners.end ());
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2900
  queue = listenerIt->second->GetQueue();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2901
    
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2902
  listenerIt->second->GetMsduAggregator ()->Aggregate (packet, currentAmsduPacket,
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2903
                                               listenerIt->second->GetSrcAddressForAggregation (*hdr),
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2904
                                               listenerIt->second->GetDestAddressForAggregation (*hdr));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2905
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2906
  Ptr<const Packet> peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (),
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2907
                                                               WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2908
  while (peekedPacket != 0)
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2909
  {
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2910
    tempPacket = currentAmsduPacket;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2911
   
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2912
    msduAggregation = listenerIt->second->GetMsduAggregator ()->Aggregate (peekedPacket, tempPacket,
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2913
                                                        listenerIt->second->GetSrcAddressForAggregation (*hdr),
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2914
                                                        listenerIt->second->GetDestAddressForAggregation (*hdr));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2915
      
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2916
    if (msduAggregation && !StopMpduAggregation (tempPacket, *hdr, currentAmpduPacket, blockAckSize))
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2917
    {
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2918
      isAmsdu = true;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2919
      currentAmsduPacket = tempPacket;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2920
      queue->Remove (peekedPacket);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2921
    }
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2922
    else
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2923
    {
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2924
      break;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2925
    }
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2926
    peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (), WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2927
  }
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2928
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2929
  if (isAmsdu)
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2930
  {
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2931
    NS_LOG_DEBUG ("A-MSDU with size = " << currentAmsduPacket->GetSize ());
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2932
    hdr->SetQosAmsdu ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2933
    hdr->SetAddr3 (GetBssid ());
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2934
    return currentAmsduPacket;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2935
  }
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2936
  else
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2937
  {
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2938
    return 0;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2939
  }
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2940
}
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents: 11196
diff changeset
  2941
1922
dd18bc29fc3c add MacLow to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
  2942
} // namespace ns3