src/devices/wifi/edca-txop-n.cc
author Mirko Banchi <mk.banchi@gmail.com>
Thu, 05 Aug 2010 15:32:06 +0200
changeset 6485 429560e899ab
parent 6477 55e4c70ff299
child 6592 6ef5141e7bcf
permissions -rw-r--r--
Bug 842 - During retransmission of a BAR i must wait for a Block ack response and not for a normal ack
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
     2
/*
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
     3
 * Copyright (c) 2006, 2009 INRIA
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
     4
 * Copyright (c) 2009 MIRKO BANCHI
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
     5
 *
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License version 2 as 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
     8
 * published by the Free Software Foundation;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
     9
 *
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    13
 * GNU General Public License for more details.
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    14
 *
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    16
 * along with this program; if not, write to the Free Software
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    17
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    18
 *
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    19
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    20
 * Author: Mirko Banchi <mk.banchi@gmail.com>
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    21
 */
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    22
#include "ns3/log.h"
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    23
#include "ns3/assert.h"
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    24
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    25
#include "edca-txop-n.h"
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    26
#include "mac-low.h"
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    27
#include "dcf-manager.h"
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    28
#include "mac-tx-middle.h"
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    29
#include "wifi-mac-trailer.h"
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    30
#include "wifi-mac.h"
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    31
#include "random-stream.h"
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    32
#include "wifi-mac-queue.h"
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    33
#include "msdu-aggregator.h"
5953
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
    34
#include "mgt-headers.h"
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
    35
#include "qos-blocked-destinations.h"
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    36
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    37
NS_LOG_COMPONENT_DEFINE ("EdcaTxopN");
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    38
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
    39
#undef NS_LOG_APPEND_CONTEXT
5999
ee04189aec1b [Bug 814] Check if m_low is not zero
Mirko Banchi <mk.banchi@gmail.com>
parents: 5976
diff changeset
    40
#define NS_LOG_APPEND_CONTEXT if (m_low != 0) {std::clog << "[mac=" << m_low->GetAddress () << "] ";}
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    41
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    42
namespace ns3 {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    43
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    44
class EdcaTxopN::Dcf : public DcfState
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    45
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    46
public:
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    47
  Dcf (EdcaTxopN *txop)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    48
    : m_txop (txop)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    49
  {}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    50
private:
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    51
  virtual void DoNotifyAccessGranted (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    52
    m_txop->NotifyAccessGranted ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    53
  }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    54
  virtual void DoNotifyInternalCollision (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    55
    m_txop->NotifyInternalCollision ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    56
  }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    57
  virtual void DoNotifyCollision (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    58
    m_txop->NotifyCollision ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    59
  }
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
    60
  virtual void DoNotifyChannelSwitching (void) { 
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
    61
    m_txop->NotifyChannelSwitching ();
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
    62
  }
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    63
  EdcaTxopN *m_txop;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    64
};
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    65
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    66
class EdcaTxopN::TransmissionListener : public MacLowTransmissionListener
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    67
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    68
public:
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    69
  TransmissionListener (EdcaTxopN *txop)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    70
    : MacLowTransmissionListener (),
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    71
      m_txop (txop) {}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    72
      
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    73
  virtual ~TransmissionListener () {}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    74
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    75
  virtual void GotCts (double snr, WifiMode txMode) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    76
    m_txop->GotCts (snr, txMode);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    77
  }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    78
  virtual void MissedCts (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    79
    m_txop->MissedCts ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    80
  }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    81
  virtual void GotAck (double snr, WifiMode txMode) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    82
    m_txop->GotAck (snr, txMode);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    83
  }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    84
  virtual void MissedAck (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    85
    m_txop->MissedAck ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    86
  }
5955
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
    87
  virtual void GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address source) {
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
    88
    m_txop->GotBlockAck (blockAck, source);
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
    89
  }
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
    90
  virtual void MissedBlockAck (void) {
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
    91
    m_txop->MissedBlockAck ();
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
    92
  }
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    93
  virtual void StartNext (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    94
    m_txop->StartNext ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    95
  }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    96
  virtual void Cancel (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    97
    m_txop->Cancel ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    98
  }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    99
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   100
private:
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   101
  EdcaTxopN *m_txop;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   102
};
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   103
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   104
class EdcaTxopN::BlockAckEventListener : public MacLowBlockAckEventListener
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   105
{
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   106
public:
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   107
  BlockAckEventListener (EdcaTxopN *txop)
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   108
    : MacLowBlockAckEventListener (),
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   109
      m_txop (txop) {}
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   110
  virtual ~BlockAckEventListener () {}
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   111
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   112
  virtual void BlockAckInactivityTimeout (Mac48Address address, uint8_t tid) {
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   113
    m_txop->SendDelbaFrame (address, tid, false);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   114
  }
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   115
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   116
private:
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   117
  EdcaTxopN *m_txop;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   118
};
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   119
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   120
NS_OBJECT_ENSURE_REGISTERED (EdcaTxopN);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   121
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   122
TypeId
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   123
EdcaTxopN::GetTypeId (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   124
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   125
  static TypeId tid = TypeId ("ns3::EdcaTxopN")
6477
55e4c70ff299 fixed Bug 941 - Wifi Dcf attributes not reachable
Nicola Baldo <nbaldo@cttc.es>
parents: 6331
diff changeset
   126
    .SetParent (ns3::Dcf::GetTypeId ())
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   127
    .AddConstructor<EdcaTxopN> ()
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   128
    .AddAttribute ("BlockAckThreshold", "If number of packets in this queue reaches this value,\
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   129
                                         block ack mechanism is used. If this value is 0, block ack is never used.",
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   130
                   UintegerValue(0),
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   131
                   MakeUintegerAccessor (&EdcaTxopN::SetBlockAckThreshold,
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   132
                                         &EdcaTxopN::GetBlockAckThreshold),
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   133
                   MakeUintegerChecker<uint8_t> (0, 64))
5965
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   134
    .AddAttribute ("BlockAckInactivityTimeout", "Represents max time (blocks of 1024 micro seconds) allowed for block ack\
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   135
                                                 inactivity. If this value isn't equal to 0 a timer start after that a\
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   136
                                                 block ack setup is completed and will be reset every time that a block\
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   137
                                                 ack frame is received. If this value is 0, block ack inactivity timeout won't be used.",
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   138
                   UintegerValue(0),
6294
6cefb3c0696a add methods in QosWifiMacHelper for block ack parameters setup
Mirko Banchi <mk.banchi@gmail.com>
parents: 6242
diff changeset
   139
                   MakeUintegerAccessor (&EdcaTxopN::SetBlockAckInactivityTimeout),
5965
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   140
                   MakeUintegerChecker<uint16_t> ())
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   141
    ;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   142
  return tid;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   143
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   144
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   145
EdcaTxopN::EdcaTxopN ()
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   146
  : m_manager (0),
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   147
    m_currentPacket(0),
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   148
    m_aggregator (0),
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   149
    m_blockAckType (COMPRESSED_BLOCK_ACK)
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   150
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   151
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   152
  m_transmissionListener = new EdcaTxopN::TransmissionListener (this);
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   153
  m_blockAckListener = new EdcaTxopN::BlockAckEventListener (this);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   154
  m_dcf = new EdcaTxopN::Dcf (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   155
  m_queue = CreateObject<WifiMacQueue> ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   156
  m_rng = new RealRandomStream ();
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   157
  m_qosBlockedDestinations = new QosBlockedDestinations ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   158
  m_baManager = new BlockAckManager ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   159
  m_baManager->SetQueue (m_queue);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   160
  m_baManager->SetBlockAckType (m_blockAckType);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   161
  m_baManager->SetBlockDestinationCallback (MakeCallback (&QosBlockedDestinations::Block, m_qosBlockedDestinations));
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   162
  m_baManager->SetUnblockDestinationCallback (MakeCallback (&QosBlockedDestinations::Unblock, m_qosBlockedDestinations));
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   163
  m_baManager->SetMaxPacketDelay (m_queue->GetMaxDelay ());
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   164
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   165
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   166
EdcaTxopN::~EdcaTxopN ()
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   167
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   168
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   169
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   170
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   171
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   172
EdcaTxopN::DoDispose (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   173
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   174
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   175
  m_queue = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   176
  m_low = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   177
  m_stationManager = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   178
  delete m_transmissionListener;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   179
  delete m_dcf;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   180
  delete m_rng;
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   181
  delete m_qosBlockedDestinations;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   182
  delete m_baManager;
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   183
  delete m_blockAckListener;
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   184
  m_transmissionListener = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   185
  m_dcf = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   186
  m_rng = 0;
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   187
  m_qosBlockedDestinations = 0;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   188
  m_baManager = 0;
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   189
  m_blockAckListener = 0;
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   190
  m_txMiddle = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   191
  m_aggregator = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   192
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   193
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   194
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   195
EdcaTxopN::SetManager (DcfManager *manager)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   196
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   197
  NS_LOG_FUNCTION (this << manager);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   198
  m_manager = manager;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   199
  m_manager->Add (m_dcf);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   200
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   201
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   202
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   203
EdcaTxopN::SetTxOkCallback (TxOk callback)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   204
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   205
  m_txOkCallback = callback;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   206
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   207
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   208
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   209
EdcaTxopN::SetTxFailedCallback (TxFailed callback)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   210
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   211
  m_txFailedCallback = callback;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   212
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   213
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   214
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   215
EdcaTxopN::SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> remoteManager)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   216
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   217
  NS_LOG_FUNCTION (this << remoteManager);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   218
  m_stationManager = remoteManager;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   219
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   220
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   221
EdcaTxopN::SetTypeOfStation (enum TypeOfStation type)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   222
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   223
  NS_LOG_FUNCTION (this << type);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   224
  m_typeOfStation = type;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   225
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   226
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   227
enum TypeOfStation
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   228
EdcaTxopN::GetTypeOfStation (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   229
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   230
  return m_typeOfStation;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   231
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   232
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   233
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   234
EdcaTxopN::SetMaxQueueSize (uint32_t size)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   235
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   236
  NS_LOG_FUNCTION (this << size);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   237
  m_queue->SetMaxSize (size);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   238
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   239
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   240
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   241
EdcaTxopN::SetMaxQueueDelay (Time delay)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   242
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   243
  NS_LOG_FUNCTION (this << delay);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   244
  m_queue->SetMaxDelay (delay);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   245
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   246
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   247
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   248
EdcaTxopN::SetMinCw (uint32_t minCw)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   249
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   250
  NS_LOG_FUNCTION (this << minCw);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   251
  m_dcf->SetCwMin (minCw);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   252
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   253
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   254
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   255
EdcaTxopN::SetMaxCw (uint32_t maxCw)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   256
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   257
  NS_LOG_FUNCTION (this << maxCw);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   258
  m_dcf->SetCwMax (maxCw);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   259
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   260
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   261
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   262
EdcaTxopN::SetAifsn (uint32_t aifsn)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   263
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   264
  NS_LOG_FUNCTION (this << aifsn);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   265
  m_dcf->SetAifsn (aifsn);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   266
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   267
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   268
uint32_t 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   269
EdcaTxopN::GetMinCw (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   270
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   271
  return m_dcf->GetCwMin ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   272
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   273
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   274
uint32_t 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   275
EdcaTxopN::GetMaxCw (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   276
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   277
  return m_dcf->GetCwMax ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   278
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   279
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   280
uint32_t 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   281
EdcaTxopN::GetAifsn (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   282
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   283
  return m_dcf->GetAifsn ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   284
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   285
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   286
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   287
EdcaTxopN::SetTxMiddle (MacTxMiddle *txMiddle)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   288
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   289
  m_txMiddle = txMiddle;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   290
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   291
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   292
Ptr<MacLow>
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   293
EdcaTxopN::Low (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   294
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   295
  return m_low;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   296
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   297
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   298
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   299
EdcaTxopN::SetLow(Ptr<MacLow> low)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   300
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   301
  NS_LOG_FUNCTION (this << low);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   302
  m_low = low;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   303
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   304
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   305
bool
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   306
EdcaTxopN::NeedsAccess (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   307
{
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   308
  return !m_queue->IsEmpty () || m_currentPacket != 0 || m_baManager->HasPackets ();
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   309
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   310
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   311
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   312
EdcaTxopN::NotifyAccessGranted (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   313
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   314
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   315
  if (m_currentPacket == 0)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   316
    {
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   317
      if (m_queue->IsEmpty () && !m_baManager->HasPackets ())
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   318
        {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   319
          NS_LOG_DEBUG ("queue is empty");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   320
          return; 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   321
        }
6485
429560e899ab Bug 842 - During retransmission of a BAR i must wait for a Block ack response and not for a normal ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6477
diff changeset
   322
      if (m_baManager->HasBar (m_currentBar))
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   323
        {
6485
429560e899ab Bug 842 - During retransmission of a BAR i must wait for a Block ack response and not for a normal ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6477
diff changeset
   324
          SendBlockAckRequest (m_currentBar);
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   325
          return;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   326
        }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   327
      /* check if packets need retransmission are stored in BlockAckManager */
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   328
      m_currentPacket = m_baManager->GetNextPacket (m_currentHdr);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   329
      if (m_currentPacket == 0)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   330
        {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   331
          if (m_queue->PeekFirstAvailable (&m_currentHdr, m_currentPacketTimestamp, m_qosBlockedDestinations) == 0)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   332
            {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   333
              NS_LOG_DEBUG ("no available packets in the queue");
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   334
              return;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   335
            }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   336
          if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().IsBroadcast () &&
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   337
              m_blockAckThreshold > 0 &&
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   338
              !m_baManager->ExistsAgreement (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid ()) &&
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   339
              SetupBlockAckIfNeeded ())
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   340
            {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   341
              return;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   342
            }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   343
          m_currentPacket = m_queue->DequeueFirstAvailable (&m_currentHdr, m_currentPacketTimestamp, m_qosBlockedDestinations);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   344
          NS_ASSERT (m_currentPacket != 0);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   345
          
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   346
          uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_currentHdr);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   347
          m_currentHdr.SetSequenceNumber (sequence);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   348
          m_currentHdr.SetFragmentNumber (0);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   349
          m_currentHdr.SetNoMoreFragments ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   350
          m_currentHdr.SetNoRetry ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   351
          m_fragmentNumber = 0;
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   352
          NS_LOG_DEBUG ("dequeued size="<<m_currentPacket->GetSize ()<<
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   353
                    ", to="<<m_currentHdr.GetAddr1 ()<<
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   354
                    ", seq="<<m_currentHdr.GetSequenceControl ());
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   355
          if (m_currentHdr.IsQosData () && !m_currentHdr.GetAddr1 ().IsBroadcast ())
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   356
            {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   357
              VerifyBlockAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   358
            }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   359
        }
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   360
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   361
  MacLowTransmissionParameters params;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   362
  params.DisableOverrideDurationId ();
6242
803b7efd0117 Bug 841 - Multicast transmission breaks with QoS Wifi
Bruno Ranieri <Yrrsinn@googlemail.com>
parents: 6080
diff changeset
   363
  if (m_currentHdr.GetAddr1 ().IsGroup ()) 
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   364
    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   365
      params.DisableRts ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   366
      params.DisableAck ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   367
      params.DisableNextData ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   368
      m_low->StartTransmission (m_currentPacket,
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   369
                                &m_currentHdr,
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   370
                                params,
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   371
                                m_transmissionListener);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   372
      
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   373
      m_currentPacket = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   374
      m_dcf->ResetCw ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   375
      m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   376
      StartAccessIfNeeded ();
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   377
      NS_LOG_DEBUG ("tx broadcast");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   378
    }
6485
429560e899ab Bug 842 - During retransmission of a BAR i must wait for a Block ack response and not for a normal ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6477
diff changeset
   379
  else if (m_currentHdr.GetType() == WIFI_MAC_CTL_BACKREQ)
429560e899ab Bug 842 - During retransmission of a BAR i must wait for a Block ack response and not for a normal ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6477
diff changeset
   380
    {
429560e899ab Bug 842 - During retransmission of a BAR i must wait for a Block ack response and not for a normal ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6477
diff changeset
   381
      SendBlockAckRequest (m_currentBar);
429560e899ab Bug 842 - During retransmission of a BAR i must wait for a Block ack response and not for a normal ack
Mirko Banchi <mk.banchi@gmail.com>
parents: 6477
diff changeset
   382
    }
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   383
  else
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   384
    {
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   385
      if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ())
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   386
        {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   387
          params.DisableAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   388
        }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   389
      else
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   390
        {
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   391
          params.EnableAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   392
        }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   393
      if (NeedFragmentation () && ((m_currentHdr.IsQosData () && 
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   394
                                   !m_currentHdr.IsQosAmsdu ()) ||
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   395
                                   m_currentHdr.IsData ()) &&
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   396
                                  (m_blockAckThreshold == 0 ||
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   397
                                   m_blockAckType == BASIC_BLOCK_ACK))
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   398
        {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   399
          //With COMPRESSED_BLOCK_ACK fragmentation must be avoided.
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   400
          params.DisableRts ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   401
          WifiMacHeader hdr;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   402
          Ptr<Packet> fragment = GetFragmentPacket (&hdr);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   403
          if (IsLastFragment ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   404
            {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   405
              NS_LOG_DEBUG ("fragmenting last fragment size=" << fragment->GetSize ());
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   406
              params.DisableNextData ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   407
            } 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   408
          else 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   409
            {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   410
              NS_LOG_DEBUG ("fragmenting size=" << fragment->GetSize ());
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   411
              params.EnableNextData (GetNextFragmentSize ());
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   412
            }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   413
          m_low->StartTransmission (fragment, &hdr, params, 
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   414
                                    m_transmissionListener);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   415
        }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   416
      else
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   417
        {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   418
          WifiMacHeader peekedHdr;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   419
          if (m_currentHdr.IsQosData () &&
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   420
              m_queue->PeekByTidAndAddress (&peekedHdr, m_currentHdr.GetQosTid (), 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   421
                                            WifiMacHeader::ADDR1, m_currentHdr.GetAddr1 ()) &&
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   422
              !m_currentHdr.GetAddr1 ().IsBroadcast () &&
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   423
              m_aggregator != 0 && !m_currentHdr.IsRetry ())
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   424
            {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   425
              /* here is performed aggregation */
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   426
              Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   427
              m_aggregator->Aggregate (m_currentPacket, currentAggregatedPacket,
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   428
                                       MapSrcAddressForAggregation (peekedHdr),
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   429
                                       MapDestAddressForAggregation (peekedHdr));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   430
              bool aggregated = false;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   431
              bool isAmsdu = false;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   432
              Ptr<const Packet> peekedPacket = m_queue->PeekByTidAndAddress (&peekedHdr, m_currentHdr.GetQosTid (), 
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   433
                                                                             WifiMacHeader::ADDR1, 
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   434
                                                                             m_currentHdr.GetAddr1 ());
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   435
              while (peekedPacket != 0)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   436
                {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   437
                  aggregated = m_aggregator->Aggregate (peekedPacket, currentAggregatedPacket,
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   438
                                                        MapSrcAddressForAggregation (peekedHdr),
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   439
                                                        MapDestAddressForAggregation (peekedHdr));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   440
                  if (aggregated) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   441
                    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   442
                      isAmsdu = true;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   443
                      m_queue->Remove (peekedPacket);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   444
                    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   445
                  else
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   446
                    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   447
                      break;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   448
                    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   449
                  peekedPacket = m_queue->PeekByTidAndAddress (&peekedHdr, m_currentHdr.GetQosTid (), 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   450
                                                               WifiMacHeader::ADDR1, m_currentHdr.GetAddr1 ());
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   451
                }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   452
              if (isAmsdu)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   453
                {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   454
                  m_currentHdr.SetQosAmsdu ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   455
                  m_currentHdr.SetAddr3 (m_low->GetBssid ());
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   456
                  m_currentPacket = currentAggregatedPacket;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   457
                  currentAggregatedPacket = 0;
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   458
                  NS_LOG_DEBUG ("tx unicast A-MSDU");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   459
                }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   460
            }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   461
          if (NeedRts ())
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   462
            {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   463
              params.EnableRts ();
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   464
              NS_LOG_DEBUG ("tx unicast rts");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   465
            } 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   466
          else 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   467
            {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   468
              params.DisableRts ();
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   469
              NS_LOG_DEBUG ("tx unicast");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   470
            }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   471
          params.DisableNextData ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   472
          m_low->StartTransmission (m_currentPacket, &m_currentHdr,
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   473
                                    params, m_transmissionListener);
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   474
          CompleteTx ();
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   475
        }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   476
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   477
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   478
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   479
void EdcaTxopN::NotifyInternalCollision (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   480
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   481
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   482
  NotifyCollision ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   483
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   484
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   485
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   486
EdcaTxopN::NotifyCollision (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   487
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   488
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   489
  m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   490
  RestartAccessIfNeeded ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   491
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   492
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   493
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   494
EdcaTxopN::GotCts (double snr, WifiMode txMode)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   495
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   496
  NS_LOG_FUNCTION (this << snr << txMode);
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   497
  NS_LOG_DEBUG ("got cts");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   498
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   499
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   500
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   501
EdcaTxopN::MissedCts (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   502
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   503
  NS_LOG_FUNCTION (this);
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   504
  NS_LOG_DEBUG ("missed cts");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   505
  if (!NeedRtsRetransmission ())
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   506
    {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   507
      NS_LOG_DEBUG ("Cts Fail");
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   508
      m_stationManager->ReportFinalRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   509
      if (!m_txFailedCallback.IsNull ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   510
        {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   511
          m_txFailedCallback (m_currentHdr);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   512
        }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   513
      // to reset the dcf.
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   514
      m_currentPacket = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   515
      m_dcf->ResetCw ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   516
    } 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   517
  else 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   518
    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   519
      m_dcf->UpdateFailedCw ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   520
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   521
  m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   522
  RestartAccessIfNeeded ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   523
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   524
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   525
void 
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   526
EdcaTxopN::NotifyChannelSwitching (void)
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   527
{
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   528
  m_queue->Flush();
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   529
  m_currentPacket = 0;
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   530
}
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   531
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   532
void
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5189
diff changeset
   533
EdcaTxopN::Queue (Ptr<const Packet> packet, const WifiMacHeader &hdr)
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   534
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   535
  NS_LOG_FUNCTION (this << packet << &hdr);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   536
  WifiMacTrailer fcs;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   537
  uint32_t fullPacketSize = hdr.GetSerializedSize () + packet->GetSize () + fcs.GetSerializedSize ();
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   538
  m_stationManager->PrepareForQueue (hdr.GetAddr1 (), &hdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   539
                                     packet, fullPacketSize);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   540
  m_queue->Enqueue (packet, hdr);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   541
  StartAccessIfNeeded ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   542
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   543
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   544
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   545
EdcaTxopN::GotAck (double snr, WifiMode txMode)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   546
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   547
  NS_LOG_FUNCTION (this << snr << txMode);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   548
  if (!NeedFragmentation () ||
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   549
      IsLastFragment () ||
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   550
      m_currentHdr.IsQosAmsdu ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   551
    {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   552
      NS_LOG_DEBUG ("got ack. tx done.");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   553
      if (!m_txOkCallback.IsNull ())
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   554
        {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   555
           m_txOkCallback (m_currentHdr);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   556
        }
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   557
      
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   558
      if (m_currentHdr.IsAction ())
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   559
        {
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   560
          WifiActionHeader actionHdr;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   561
          Ptr<Packet> p = m_currentPacket->Copy ();
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   562
          p->RemoveHeader (actionHdr);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   563
          if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK &&
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   564
              actionHdr.GetAction ().blockAck == WifiActionHeader::BLOCK_ACK_DELBA)
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   565
            {
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   566
              MgtDelBaHeader delBa;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   567
              p->PeekHeader (delBa);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   568
              if (delBa.IsByOriginator ())
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   569
                {
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   570
                  m_baManager->TearDownBlockAck (m_currentHdr.GetAddr1 (), delBa.GetTid ());
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   571
                }
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   572
              else
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   573
                {
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   574
                  m_low->DestroyBlockAckAgreement (m_currentHdr.GetAddr1 (), delBa.GetTid ());
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   575
                }
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   576
            }
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   577
        }
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   578
      m_currentPacket = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   579
         
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   580
      m_dcf->ResetCw ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   581
      m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   582
      RestartAccessIfNeeded ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   583
    } 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   584
  else 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   585
    {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   586
      NS_LOG_DEBUG ("got ack. tx not done, size="<<m_currentPacket->GetSize ());
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   587
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   588
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   589
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   590
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   591
EdcaTxopN::MissedAck (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   592
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   593
  NS_LOG_FUNCTION (this);
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   594
  NS_LOG_DEBUG ("missed ack");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   595
  if (!NeedDataRetransmission ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   596
    {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   597
      NS_LOG_DEBUG ("Ack Fail");
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   598
      m_stationManager->ReportFinalDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   599
      if (!m_txFailedCallback.IsNull ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   600
        {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   601
          m_txFailedCallback (m_currentHdr);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   602
        }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   603
      // to reset the dcf.
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   604
      m_currentPacket = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   605
      m_dcf->ResetCw ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   606
    } 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   607
  else 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   608
    {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   609
      NS_LOG_DEBUG ("Retransmit");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   610
      m_currentHdr.SetRetry ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   611
      m_dcf->UpdateFailedCw ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   612
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   613
  m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   614
  RestartAccessIfNeeded ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   615
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   616
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   617
void
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   618
EdcaTxopN::MissedBlockAck (void)
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   619
{
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   620
  NS_LOG_FUNCTION (this);
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   621
  NS_LOG_DEBUG ("missed block ack");
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   622
  //should i report this to station addressed by ADDR1?
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   623
  NS_LOG_DEBUG ("Retransmit block ack request");
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   624
  m_currentHdr.SetRetry ();
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   625
  m_dcf->UpdateFailedCw ();
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   626
  
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   627
  m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   628
  RestartAccessIfNeeded ();
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   629
}
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   630
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   631
Ptr<MsduAggregator>
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   632
EdcaTxopN::GetMsduAggregator (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   633
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   634
  return m_aggregator;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   635
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   636
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   637
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   638
EdcaTxopN::RestartAccessIfNeeded (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   639
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   640
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   641
  if ((m_currentPacket != 0 ||
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   642
       !m_queue->IsEmpty () || m_baManager->HasPackets ()) &&
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   643
       !m_dcf->IsAccessRequested ())
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   644
    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   645
      m_manager->RequestAccess (m_dcf);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   646
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   647
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   648
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   649
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   650
EdcaTxopN::StartAccessIfNeeded (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   651
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   652
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   653
  if (m_currentPacket == 0 &&
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   654
      (!m_queue->IsEmpty () || m_baManager->HasPackets ()) &&
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   655
      !m_dcf->IsAccessRequested ())
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   656
    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   657
      m_manager->RequestAccess (m_dcf);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   658
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   659
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   660
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   661
bool
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   662
EdcaTxopN::NeedRts (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   663
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   664
  return m_stationManager->NeedRts (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   665
                                    m_currentPacket);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   666
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   667
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   668
bool
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   669
EdcaTxopN::NeedRtsRetransmission (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   670
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   671
  return m_stationManager->NeedRtsRetransmission (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   672
                                                  m_currentPacket);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   673
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   674
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   675
bool
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   676
EdcaTxopN::NeedDataRetransmission (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   677
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   678
  return m_stationManager->NeedDataRetransmission (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   679
                                                   m_currentPacket);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   680
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   681
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   682
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   683
EdcaTxopN::NextFragment (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   684
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   685
  m_fragmentNumber++;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   686
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   687
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   688
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   689
EdcaTxopN::StartNext (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   690
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   691
  NS_LOG_FUNCTION (this);
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   692
  NS_LOG_DEBUG ("start next packet fragment");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   693
  /* this callback is used only for fragments. */
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   694
  NextFragment ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   695
  WifiMacHeader hdr;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   696
  Ptr<Packet> fragment = GetFragmentPacket (&hdr);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   697
  MacLowTransmissionParameters params;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   698
  params.EnableAck ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   699
  params.DisableRts ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   700
  params.DisableOverrideDurationId ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   701
  if (IsLastFragment ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   702
    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   703
      params.DisableNextData ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   704
    } 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   705
  else 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   706
    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   707
      params.EnableNextData (GetNextFragmentSize ());
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   708
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   709
  Low ()->StartTransmission (fragment, &hdr, params, m_transmissionListener);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   710
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   711
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   712
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   713
EdcaTxopN::Cancel (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   714
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   715
  NS_LOG_FUNCTION (this);
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   716
  NS_LOG_DEBUG ("transmission cancelled");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   717
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   718
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   719
bool
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   720
EdcaTxopN::NeedFragmentation (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   721
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   722
  return m_stationManager->NeedFragmentation (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   723
                                              m_currentPacket);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   724
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   725
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   726
uint32_t
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   727
EdcaTxopN::GetFragmentSize (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   728
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   729
  return m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   730
                                            m_currentPacket, m_fragmentNumber);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   731
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   732
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   733
uint32_t
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   734
EdcaTxopN::GetNextFragmentSize (void) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   735
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   736
  return m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   737
                                            m_currentPacket, m_fragmentNumber + 1);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   738
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   739
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   740
uint32_t
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   741
EdcaTxopN::GetFragmentOffset (void) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   742
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   743
  return m_stationManager->GetFragmentOffset (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   744
                                              m_currentPacket, m_fragmentNumber);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   745
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   746
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   747
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   748
bool
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   749
EdcaTxopN::IsLastFragment (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   750
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   751
  return m_stationManager->IsLastFragment (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   752
                                           m_currentPacket, m_fragmentNumber);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   753
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   754
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   755
Ptr<Packet>
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   756
EdcaTxopN::GetFragmentPacket (WifiMacHeader *hdr)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   757
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   758
  *hdr = m_currentHdr;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   759
  hdr->SetFragmentNumber (m_fragmentNumber);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   760
  uint32_t startOffset = GetFragmentOffset ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   761
  Ptr<Packet> fragment;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   762
  if (IsLastFragment ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   763
    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   764
      hdr->SetNoMoreFragments ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   765
    } 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   766
  else 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   767
    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   768
      hdr->SetMoreFragments ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   769
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   770
  fragment = m_currentPacket->CreateFragment (startOffset, 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   771
                                              GetFragmentSize ());
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   772
  return fragment;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   773
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   774
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   775
void
6331
eee2eab36748 Bug 910: Replace AccessClass with 802.11-style AcIndex
Dean Armstrong <deanarm@gmail.com>
parents: 6294
diff changeset
   776
EdcaTxopN::SetAccessCategory (enum AcIndex ac)
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   777
{
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   778
  m_ac = ac;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   779
}
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   780
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   781
Mac48Address
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
   782
EdcaTxopN::MapSrcAddressForAggregation (const WifiMacHeader &hdr)
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   783
{
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   784
  Mac48Address retval;
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   785
  if (m_typeOfStation == STA || m_typeOfStation == ADHOC_STA)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   786
    {
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   787
      retval = hdr.GetAddr2 ();
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   788
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   789
  else
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   790
    {
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   791
      retval = hdr.GetAddr3 ();
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   792
    }
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   793
  return retval;
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   794
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   795
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   796
Mac48Address
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
   797
EdcaTxopN::MapDestAddressForAggregation (const WifiMacHeader &hdr)
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   798
{
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   799
  Mac48Address retval;
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   800
  if (m_typeOfStation == AP || m_typeOfStation == ADHOC_STA)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   801
    {
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   802
      retval = hdr.GetAddr1 ();
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   803
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   804
  else
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   805
    {
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   806
      retval = hdr.GetAddr3 ();
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   807
    }
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   808
  return retval;
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   809
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   810
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   811
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   812
EdcaTxopN::SetMsduAggregator (Ptr<MsduAggregator> aggr)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   813
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   814
  m_aggregator = aggr;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   815
}
5906
509b5089a081 Revert bug 706 fix because it breaks the regression testing
Faker Moatamri <faker.moatamri@sophia.inria.fr>
parents: 5903
diff changeset
   816
5952
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   817
void
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   818
EdcaTxopN::PushFront (Ptr<const Packet> packet, const WifiMacHeader &hdr)
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   819
{
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   820
  NS_LOG_FUNCTION (this << packet << &hdr);
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   821
  WifiMacTrailer fcs;
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   822
  uint32_t fullPacketSize = hdr.GetSerializedSize () + packet->GetSize () + fcs.GetSerializedSize ();
6068
a2127017ecb4 merge with HEAD
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6065 5999
diff changeset
   823
  m_stationManager->PrepareForQueue (hdr.GetAddr1 (), &hdr,
a2127017ecb4 merge with HEAD
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6065 5999
diff changeset
   824
                                     packet, fullPacketSize);
5952
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   825
  m_queue->PushFront (packet, hdr);
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   826
  StartAccessIfNeeded ();
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   827
}
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   828
5953
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
   829
void
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
   830
EdcaTxopN::GotAddBaResponse (const MgtAddBaResponseHeader *respHdr, Mac48Address recipient)
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
   831
{
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
   832
  NS_LOG_FUNCTION (this);
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   833
  NS_LOG_DEBUG ("received ADDBA response from "<<recipient);
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   834
  uint8_t tid = respHdr->GetTid ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   835
  if (m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::PENDING))
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   836
   {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   837
     if (respHdr->GetStatusCode ().IsSuccess ())
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   838
       {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   839
         NS_LOG_DEBUG ("block ack agreement established with "<<recipient);
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   840
         m_baManager->UpdateAgreement (respHdr, recipient);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   841
       }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   842
     else
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   843
       {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   844
         NS_LOG_DEBUG ("discard ADDBA response"<<recipient);
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   845
         m_baManager->NotifyAgreementUnsuccessful (recipient, tid);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   846
       }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   847
    }
5953
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
   848
  RestartAccessIfNeeded ();
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
   849
}
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
   850
5955
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   851
void
5965
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   852
EdcaTxopN::GotDelBaFrame (const MgtDelBaHeader *delBaHdr, Mac48Address recipient)
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   853
{
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   854
  NS_LOG_FUNCTION (this);
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   855
  NS_LOG_DEBUG ("received DELBA frame from="<<recipient);
5965
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   856
  m_baManager->TearDownBlockAck (recipient, delBaHdr->GetTid ());
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   857
}
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   858
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   859
void
5955
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   860
EdcaTxopN::GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address recipient)
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   861
{
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   862
  NS_LOG_DEBUG ("got block ack from="<<recipient);
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   863
  m_baManager->NotifyGotBlockAck (blockAck, recipient);
5955
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   864
  m_currentPacket = 0;
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   865
  m_dcf->ResetCw ();
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   866
  m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   867
  RestartAccessIfNeeded ();
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   868
}
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   869
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   870
void
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   871
EdcaTxopN::VerifyBlockAck (void)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   872
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   873
  NS_LOG_FUNCTION (this);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   874
  uint8_t tid = m_currentHdr.GetQosTid ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   875
  Mac48Address recipient = m_currentHdr.GetAddr1 ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   876
  uint16_t sequence = m_currentHdr.GetSequenceNumber ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   877
  if (m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::INACTIVE))
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   878
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   879
      m_baManager->SwitchToBlockAckIfNeeded (recipient, tid, sequence);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   880
    }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   881
  if (m_baManager->ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED))
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   882
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   883
      m_currentHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   884
    }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   885
}
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   886
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   887
void
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   888
EdcaTxopN::CompleteTx (void)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   889
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   890
  if (m_currentHdr.IsQosData () && m_currentHdr.IsQosBlockAck ())
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   891
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   892
      if (!m_currentHdr.IsRetry ())
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   893
        {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   894
          m_baManager->StorePacket (m_currentPacket, m_currentHdr, m_currentPacketTimestamp);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   895
        }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   896
      m_baManager->NotifyMpduTransmission (m_currentHdr.GetAddr1 (), m_currentHdr.GetQosTid ());
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   897
      //we are not waiting for an ack: transmission is completed
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   898
      m_currentPacket = 0;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   899
      m_dcf->ResetCw ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   900
      m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   901
      StartAccessIfNeeded ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   902
    }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   903
}
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   904
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   905
bool
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   906
EdcaTxopN::SetupBlockAckIfNeeded ()
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   907
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   908
  uint8_t tid = m_currentHdr.GetQosTid ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   909
  Mac48Address recipient = m_currentHdr.GetAddr1 ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   910
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   911
  uint32_t packets = m_queue->GetNPacketsByTidAndAddress (tid, WifiMacHeader::ADDR1, recipient);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   912
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   913
  if (packets >= m_blockAckThreshold)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   914
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   915
      /* Block ack setup */
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   916
      uint16_t startingSequence = m_txMiddle->GetNextSeqNumberByTidAndAddress (tid, recipient);
5965
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   917
      SendAddBaRequest (recipient, tid, startingSequence, m_blockAckInactivityTimeout, true);
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   918
      return true;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   919
    }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   920
  return false;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   921
}
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   922
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   923
void
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   924
EdcaTxopN::SendBlockAckRequest (const struct Bar &bar)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   925
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   926
  NS_LOG_FUNCTION (this);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   927
  WifiMacHeader hdr;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   928
  hdr.SetType (WIFI_MAC_CTL_BACKREQ);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   929
  hdr.SetAddr1 (bar.recipient);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   930
  hdr.SetAddr2 (m_low->GetAddress ());
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   931
  hdr.SetAddr3 (m_low->GetBssid ());
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   932
  hdr.SetDsNotTo ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   933
  hdr.SetDsNotFrom ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   934
  hdr.SetNoRetry ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   935
  hdr.SetNoMoreFragments ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   936
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   937
  m_currentPacket = bar.bar;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   938
  m_currentHdr = hdr;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   939
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   940
  MacLowTransmissionParameters params;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   941
  params.DisableRts ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   942
  params.DisableNextData ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   943
  params.DisableOverrideDurationId ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   944
  if (bar.immediate)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   945
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   946
      if (m_blockAckType == BASIC_BLOCK_ACK)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   947
        {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   948
          params.EnableBasicBlockAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   949
        }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   950
      else if (m_blockAckType == COMPRESSED_BLOCK_ACK)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   951
        {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   952
          params.EnableCompressedBlockAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   953
        }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   954
      else if (m_blockAckType == MULTI_TID_BLOCK_ACK)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   955
        {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   956
          NS_FATAL_ERROR ("Multi-tid block ack is not supported");
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   957
        }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   958
    }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   959
  else
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   960
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   961
      //Delayed block ack
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   962
      params.EnableAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   963
    }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   964
  m_low->StartTransmission (m_currentPacket, &m_currentHdr, params, m_transmissionListener);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   965
}
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   966
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   967
void
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   968
EdcaTxopN::CompleteConfig (void)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   969
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   970
  NS_LOG_FUNCTION (this);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   971
  m_baManager->SetTxMiddle (m_txMiddle);
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   972
  m_low->RegisterBlockAckListenerForAc (m_ac, m_blockAckListener);
5965
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   973
  m_baManager->SetBlockAckInactivityCallback (MakeCallback (&EdcaTxopN::SendDelbaFrame, this));
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   974
}
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   975
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   976
void
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   977
EdcaTxopN::SetBlockAckThreshold (uint8_t threshold)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   978
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   979
  m_blockAckThreshold = threshold;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   980
  m_baManager->SetBlockAckThreshold (threshold);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   981
}
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   982
6294
6cefb3c0696a add methods in QosWifiMacHelper for block ack parameters setup
Mirko Banchi <mk.banchi@gmail.com>
parents: 6242
diff changeset
   983
void
6cefb3c0696a add methods in QosWifiMacHelper for block ack parameters setup
Mirko Banchi <mk.banchi@gmail.com>
parents: 6242
diff changeset
   984
EdcaTxopN::SetBlockAckInactivityTimeout (uint16_t timeout)
6cefb3c0696a add methods in QosWifiMacHelper for block ack parameters setup
Mirko Banchi <mk.banchi@gmail.com>
parents: 6242
diff changeset
   985
{
6cefb3c0696a add methods in QosWifiMacHelper for block ack parameters setup
Mirko Banchi <mk.banchi@gmail.com>
parents: 6242
diff changeset
   986
  m_blockAckInactivityTimeout = timeout;
6cefb3c0696a add methods in QosWifiMacHelper for block ack parameters setup
Mirko Banchi <mk.banchi@gmail.com>
parents: 6242
diff changeset
   987
}
6cefb3c0696a add methods in QosWifiMacHelper for block ack parameters setup
Mirko Banchi <mk.banchi@gmail.com>
parents: 6242
diff changeset
   988
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   989
uint8_t
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   990
EdcaTxopN::GetBlockAckThreshold (void) const
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   991
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   992
  return m_blockAckThreshold;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   993
}
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   994
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   995
void
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   996
EdcaTxopN::SendAddBaRequest (Mac48Address dest, uint8_t tid, uint16_t startSeq, 
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   997
                             uint16_t timeout, bool immediateBAck)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   998
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   999
  NS_LOG_FUNCTION (this);
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
  1000
  NS_LOG_DEBUG ("sent ADDBA request to "<<dest);
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1001
  WifiMacHeader hdr;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1002
  hdr.SetAction ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1003
  hdr.SetAddr1 (dest);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1004
  hdr.SetAddr2 (m_low->GetAddress ());
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1005
  hdr.SetAddr3 (m_low->GetAddress ());
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1006
  hdr.SetDsNotTo ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1007
  hdr.SetDsNotFrom ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1008
  
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1009
  WifiActionHeader actionHdr;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1010
  WifiActionHeader::ActionValue action;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1011
  action.blockAck = WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1012
  actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1013
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1014
  Ptr<Packet> packet = Create<Packet> ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1015
  /*Setting ADDBARequest header*/
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1016
  MgtAddBaRequestHeader reqHdr;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1017
  reqHdr.SetAmsduSupport (true);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1018
  if (immediateBAck)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1019
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1020
      reqHdr.SetImmediateBlockAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1021
    }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1022
  else
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1023
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1024
      reqHdr.SetDelayedBlockAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1025
    }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1026
  reqHdr.SetTid (tid);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1027
  /* For now we don't use buffer size field in the ADDBA request frame. The recipient
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1028
   * will choose how many packets it can receive under block ack.
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1029
   */
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1030
  reqHdr.SetBufferSize (0);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1031
  reqHdr.SetTimeout (timeout);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1032
  reqHdr.SetStartingSequence (startSeq);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1033
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1034
  m_baManager->CreateAgreement (&reqHdr, dest);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1035
  
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1036
  packet->AddHeader (reqHdr);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1037
  packet->AddHeader (actionHdr);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1038
  
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1039
  m_currentPacket = packet;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1040
  m_currentHdr = hdr;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1041
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1042
  uint16_t sequence = m_txMiddle->GetNextSequenceNumberfor (&m_currentHdr);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1043
  m_currentHdr.SetSequenceNumber (sequence);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1044
  m_currentHdr.SetFragmentNumber (0);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1045
  m_currentHdr.SetNoMoreFragments ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1046
  m_currentHdr.SetNoRetry ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1047
  
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1048
  MacLowTransmissionParameters params;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1049
  params.EnableAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1050
  params.DisableRts ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1051
  params.DisableNextData ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1052
  params.DisableOverrideDurationId ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1053
  
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1054
  m_low->StartTransmission (m_currentPacket, &m_currentHdr, params, 
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1055
                            m_transmissionListener);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1056
}
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1057
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1058
void
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1059
EdcaTxopN::SendDelbaFrame (Mac48Address addr, uint8_t tid, bool byOriginator)
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1060
{
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1061
  WifiMacHeader hdr;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1062
  hdr.SetAction ();
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1063
  hdr.SetAddr1 (addr);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1064
  hdr.SetAddr2 (m_low->GetAddress ());
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1065
  hdr.SetAddr3 (m_low->GetAddress ());
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1066
  hdr.SetDsNotTo ();
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1067
  hdr.SetDsNotFrom ();
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1068
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1069
  MgtDelBaHeader delbaHdr;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1070
  delbaHdr.SetTid (tid);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1071
  if (byOriginator)
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1072
    {
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1073
      delbaHdr.SetByOriginator ();
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1074
    }
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1075
  else
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1076
    {
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1077
      delbaHdr.SetByRecipient ();
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1078
    }
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1079
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1080
  WifiActionHeader actionHdr;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1081
  WifiActionHeader::ActionValue action;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1082
  action.blockAck = WifiActionHeader::BLOCK_ACK_DELBA;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1083
  actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1084
  
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1085
  Ptr<Packet> packet = Create<Packet> ();
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1086
  packet->AddHeader (delbaHdr);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1087
  packet->AddHeader (actionHdr);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1088
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1089
  PushFront (packet, hdr);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1090
}
6080
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1091
void
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1092
EdcaTxopN::DoStart ()
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1093
{
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1094
  m_dcf->ResetCw ();
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1095
  m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1096
  ns3::Dcf::DoStart ();
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1097
}
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
  1098
} //namespace ns3