src/devices/wifi/edca-txop-n.cc
author Bruno Ranieri <Yrrsinn@googlemail.com>
Sat, 17 Apr 2010 12:02:53 +0200
changeset 6242 803b7efd0117
parent 6080 41ee42654550
child 6294 6cefb3c0696a
permissions -rw-r--r--
Bug 841 - Multicast transmission breaks with QoS Wifi
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"
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
    36
#include "block-ack-manager.h"
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    37
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    38
NS_LOG_COMPONENT_DEFINE ("EdcaTxopN");
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    39
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
    40
#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
    41
#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
    42
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    43
namespace ns3 {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    44
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    45
class EdcaTxopN::Dcf : public DcfState
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    46
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    47
public:
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    48
  Dcf (EdcaTxopN *txop)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    49
    : m_txop (txop)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    50
  {}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    51
private:
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    52
  virtual void DoNotifyAccessGranted (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    53
    m_txop->NotifyAccessGranted ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    54
  }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    55
  virtual void DoNotifyInternalCollision (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    56
    m_txop->NotifyInternalCollision ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    57
  }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    58
  virtual void DoNotifyCollision (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    59
    m_txop->NotifyCollision ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    60
  }
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
    61
  virtual void DoNotifyChannelSwitching (void) { 
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
    62
    m_txop->NotifyChannelSwitching ();
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
    63
  }
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    64
  EdcaTxopN *m_txop;
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    67
class EdcaTxopN::TransmissionListener : public MacLowTransmissionListener
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    68
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    69
public:
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    70
  TransmissionListener (EdcaTxopN *txop)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    71
    : MacLowTransmissionListener (),
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    72
      m_txop (txop) {}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    73
      
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    74
  virtual ~TransmissionListener () {}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    75
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    76
  virtual void GotCts (double snr, WifiMode txMode) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    77
    m_txop->GotCts (snr, txMode);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    78
  }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    79
  virtual void MissedCts (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    80
    m_txop->MissedCts ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    81
  }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    82
  virtual void GotAck (double snr, WifiMode txMode) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    83
    m_txop->GotAck (snr, txMode);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    84
  }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    85
  virtual void MissedAck (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    86
    m_txop->MissedAck ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    87
  }
5955
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
    88
  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
    89
    m_txop->GotBlockAck (blockAck, source);
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
    90
  }
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
    91
  virtual void MissedBlockAck (void) {
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
    92
    m_txop->MissedBlockAck ();
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
    93
  }
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    94
  virtual void StartNext (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    95
    m_txop->StartNext ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    96
  }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    97
  virtual void Cancel (void) {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
    98
    m_txop->Cancel ();
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   101
private:
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   102
  EdcaTxopN *m_txop;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   103
};
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   104
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   105
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
   106
{
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   107
public:
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   108
  BlockAckEventListener (EdcaTxopN *txop)
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   109
    : MacLowBlockAckEventListener (),
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   110
      m_txop (txop) {}
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   111
  virtual ~BlockAckEventListener () {}
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   112
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   113
  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
   114
    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
   115
  }
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   116
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   117
private:
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   118
  EdcaTxopN *m_txop;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   119
};
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   120
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   121
NS_OBJECT_ENSURE_REGISTERED (EdcaTxopN);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   122
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   123
TypeId
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   124
EdcaTxopN::GetTypeId (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   125
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   126
  static TypeId tid = TypeId ("ns3::EdcaTxopN")
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   127
    .SetParent<Object> ()
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   128
    .AddConstructor<EdcaTxopN> ()
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   129
    .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
   130
                                         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
   131
                   UintegerValue(0),
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   132
                   MakeUintegerAccessor (&EdcaTxopN::SetBlockAckThreshold,
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   133
                                         &EdcaTxopN::GetBlockAckThreshold),
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   134
                   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
   135
    .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
   136
                                                 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
   137
                                                 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
   138
                                                 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
   139
                   UintegerValue(0),
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   140
                   MakeUintegerAccessor (&EdcaTxopN::m_blockAckInactivityTimeout),
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   141
                   MakeUintegerChecker<uint16_t> ())
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   142
    ;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   143
  return tid;
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   146
EdcaTxopN::EdcaTxopN ()
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   147
  : m_manager (0),
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   148
    m_currentPacket(0),
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   149
    m_aggregator (0),
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   150
    m_blockAckType (COMPRESSED_BLOCK_ACK)
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   151
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   152
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   153
  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
   154
  m_blockAckListener = new EdcaTxopN::BlockAckEventListener (this);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   155
  m_dcf = new EdcaTxopN::Dcf (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   156
  m_queue = CreateObject<WifiMacQueue> ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   157
  m_rng = new RealRandomStream ();
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   158
  m_qosBlockedDestinations = new QosBlockedDestinations ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   159
  m_baManager = new BlockAckManager ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   160
  m_baManager->SetQueue (m_queue);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   161
  m_baManager->SetBlockAckType (m_blockAckType);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   162
  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
   163
  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
   164
  m_baManager->SetMaxPacketDelay (m_queue->GetMaxDelay ());
4408
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   167
EdcaTxopN::~EdcaTxopN ()
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   168
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   169
  NS_LOG_FUNCTION (this);
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   172
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   173
EdcaTxopN::DoDispose (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   174
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   175
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   176
  m_queue = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   177
  m_low = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   178
  m_stationManager = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   179
  delete m_transmissionListener;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   180
  delete m_dcf;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   181
  delete m_rng;
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   182
  delete m_qosBlockedDestinations;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   183
  delete m_baManager;
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   184
  delete m_blockAckListener;
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   185
  m_transmissionListener = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   186
  m_dcf = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   187
  m_rng = 0;
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   188
  m_qosBlockedDestinations = 0;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   189
  m_baManager = 0;
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   190
  m_blockAckListener = 0;
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   191
  m_txMiddle = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   192
  m_aggregator = 0;
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   195
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   196
EdcaTxopN::SetManager (DcfManager *manager)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   197
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   198
  NS_LOG_FUNCTION (this << manager);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   199
  m_manager = manager;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   200
  m_manager->Add (m_dcf);
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   203
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   204
EdcaTxopN::SetTxOkCallback (TxOk callback)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   205
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   206
  m_txOkCallback = callback;
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   209
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   210
EdcaTxopN::SetTxFailedCallback (TxFailed callback)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   211
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   212
  m_txFailedCallback = callback;
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   215
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   216
EdcaTxopN::SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> remoteManager)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   217
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   218
  NS_LOG_FUNCTION (this << remoteManager);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   219
  m_stationManager = remoteManager;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   220
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   221
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   222
EdcaTxopN::SetTypeOfStation (enum TypeOfStation type)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   223
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   224
  NS_LOG_FUNCTION (this << type);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   225
  m_typeOfStation = type;
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   228
enum TypeOfStation
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   229
EdcaTxopN::GetTypeOfStation (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   230
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   231
  return m_typeOfStation;
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   234
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   235
EdcaTxopN::SetMaxQueueSize (uint32_t size)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   236
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   237
  NS_LOG_FUNCTION (this << size);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   238
  m_queue->SetMaxSize (size);
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   241
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   242
EdcaTxopN::SetMaxQueueDelay (Time delay)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   243
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   244
  NS_LOG_FUNCTION (this << delay);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   245
  m_queue->SetMaxDelay (delay);
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   248
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   249
EdcaTxopN::SetMinCw (uint32_t minCw)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   250
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   251
  NS_LOG_FUNCTION (this << minCw);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   252
  m_dcf->SetCwMin (minCw);
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   255
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   256
EdcaTxopN::SetMaxCw (uint32_t maxCw)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   257
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   258
  NS_LOG_FUNCTION (this << maxCw);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   259
  m_dcf->SetCwMax (maxCw);
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   262
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   263
EdcaTxopN::SetAifsn (uint32_t aifsn)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   264
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   265
  NS_LOG_FUNCTION (this << aifsn);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   266
  m_dcf->SetAifsn (aifsn);
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   269
uint32_t 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   270
EdcaTxopN::GetMinCw (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   271
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   272
  return m_dcf->GetCwMin ();
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   275
uint32_t 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   276
EdcaTxopN::GetMaxCw (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   277
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   278
  return m_dcf->GetCwMax ();
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   281
uint32_t 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   282
EdcaTxopN::GetAifsn (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   283
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   284
  return m_dcf->GetAifsn ();
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   287
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   288
EdcaTxopN::SetTxMiddle (MacTxMiddle *txMiddle)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   289
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   290
  m_txMiddle = txMiddle;
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   293
Ptr<MacLow>
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   294
EdcaTxopN::Low (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   295
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   296
  return m_low;
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   299
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   300
EdcaTxopN::SetLow(Ptr<MacLow> low)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   301
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   302
  NS_LOG_FUNCTION (this << low);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   303
  m_low = low;
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   306
bool
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   307
EdcaTxopN::NeedsAccess (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   308
{
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   309
  return !m_queue->IsEmpty () || m_currentPacket != 0 || m_baManager->HasPackets ();
4408
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   312
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   313
EdcaTxopN::NotifyAccessGranted (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   314
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   315
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   316
  if (m_currentPacket == 0)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   317
    {
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   318
      if (m_queue->IsEmpty () && !m_baManager->HasPackets ())
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   319
        {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   320
          NS_LOG_DEBUG ("queue is empty");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   321
          return; 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   322
        }
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   323
      struct Bar bar;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   324
      if (m_baManager->HasBar (bar))
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   325
        {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   326
          SendBlockAckRequest (bar);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   327
          return;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   328
        }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   329
      /* 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
   330
      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
   331
      if (m_currentPacket == 0)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   332
        {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   333
          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
   334
            {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   335
              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
   336
              return;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   337
            }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   338
          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
   339
              m_blockAckThreshold > 0 &&
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   340
              !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
   341
              SetupBlockAckIfNeeded ())
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
              return;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   344
            }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   345
          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
   346
          NS_ASSERT (m_currentPacket != 0);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   347
          
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   348
          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
   349
          m_currentHdr.SetSequenceNumber (sequence);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   350
          m_currentHdr.SetFragmentNumber (0);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   351
          m_currentHdr.SetNoMoreFragments ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   352
          m_currentHdr.SetNoRetry ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   353
          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
   354
          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
   355
                    ", to="<<m_currentHdr.GetAddr1 ()<<
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   356
                    ", seq="<<m_currentHdr.GetSequenceControl ());
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   357
          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
   358
            {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   359
              VerifyBlockAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   360
            }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   361
        }
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   362
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   363
  MacLowTransmissionParameters params;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   364
  params.DisableOverrideDurationId ();
6242
803b7efd0117 Bug 841 - Multicast transmission breaks with QoS Wifi
Bruno Ranieri <Yrrsinn@googlemail.com>
parents: 6080
diff changeset
   365
  if (m_currentHdr.GetAddr1 ().IsGroup ()) 
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   366
    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   367
      params.DisableRts ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   368
      params.DisableAck ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   369
      params.DisableNextData ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   370
      m_low->StartTransmission (m_currentPacket,
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   371
                                &m_currentHdr,
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   372
                                params,
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   373
                                m_transmissionListener);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   374
      
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   375
      m_currentPacket = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   376
      m_dcf->ResetCw ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   377
      m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   378
      StartAccessIfNeeded ();
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   379
      NS_LOG_DEBUG ("tx broadcast");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   380
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   381
  else
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   382
    {
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   383
      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
   384
        {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   385
          params.DisableAck ();
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
      else
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   388
        {
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   389
          params.EnableAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   390
        }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   391
      if (NeedFragmentation () && ((m_currentHdr.IsQosData () && 
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   392
                                   !m_currentHdr.IsQosAmsdu ()) ||
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   393
                                   m_currentHdr.IsData ()) &&
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   394
                                  (m_blockAckThreshold == 0 ||
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   395
                                   m_blockAckType == BASIC_BLOCK_ACK))
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   396
        {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   397
          //With COMPRESSED_BLOCK_ACK fragmentation must be avoided.
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   398
          params.DisableRts ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   399
          WifiMacHeader hdr;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   400
          Ptr<Packet> fragment = GetFragmentPacket (&hdr);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   401
          if (IsLastFragment ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   402
            {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   403
              NS_LOG_DEBUG ("fragmenting last fragment size=" << fragment->GetSize ());
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   404
              params.DisableNextData ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   405
            } 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   406
          else 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   407
            {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   408
              NS_LOG_DEBUG ("fragmenting size=" << fragment->GetSize ());
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   409
              params.EnableNextData (GetNextFragmentSize ());
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   410
            }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   411
          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
   412
                                    m_transmissionListener);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   413
        }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   414
      else
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
          WifiMacHeader peekedHdr;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   417
          if (m_currentHdr.IsQosData () &&
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   418
              m_queue->PeekByTidAndAddress (&peekedHdr, m_currentHdr.GetQosTid (), 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   419
                                            WifiMacHeader::ADDR1, m_currentHdr.GetAddr1 ()) &&
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   420
              !m_currentHdr.GetAddr1 ().IsBroadcast () &&
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   421
              m_aggregator != 0 && !m_currentHdr.IsRetry ())
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   422
            {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   423
              /* here is performed aggregation */
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   424
              Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   425
              m_aggregator->Aggregate (m_currentPacket, currentAggregatedPacket,
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   426
                                       MapSrcAddressForAggregation (peekedHdr),
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   427
                                       MapDestAddressForAggregation (peekedHdr));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   428
              bool aggregated = false;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   429
              bool isAmsdu = false;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   430
              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
   431
                                                                             WifiMacHeader::ADDR1, 
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   432
                                                                             m_currentHdr.GetAddr1 ());
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   433
              while (peekedPacket != 0)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   434
                {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   435
                  aggregated = m_aggregator->Aggregate (peekedPacket, currentAggregatedPacket,
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   436
                                                        MapSrcAddressForAggregation (peekedHdr),
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   437
                                                        MapDestAddressForAggregation (peekedHdr));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   438
                  if (aggregated) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   439
                    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   440
                      isAmsdu = true;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   441
                      m_queue->Remove (peekedPacket);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   442
                    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   443
                  else
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
                      break;
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
                  peekedPacket = m_queue->PeekByTidAndAddress (&peekedHdr, m_currentHdr.GetQosTid (), 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   448
                                                               WifiMacHeader::ADDR1, m_currentHdr.GetAddr1 ());
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   449
                }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   450
              if (isAmsdu)
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
                  m_currentHdr.SetQosAmsdu ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   453
                  m_currentHdr.SetAddr3 (m_low->GetBssid ());
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   454
                  m_currentPacket = currentAggregatedPacket;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   455
                  currentAggregatedPacket = 0;
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   456
                  NS_LOG_DEBUG ("tx unicast A-MSDU");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   457
                }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   458
            }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   459
          if (NeedRts ())
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
              params.EnableRts ();
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   462
              NS_LOG_DEBUG ("tx unicast rts");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   463
            } 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   464
          else 
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
              params.DisableRts ();
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   467
              NS_LOG_DEBUG ("tx unicast");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   468
            }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   469
          params.DisableNextData ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   470
          m_low->StartTransmission (m_currentPacket, &m_currentHdr,
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   471
                                    params, m_transmissionListener);
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   472
          CompleteTx ();
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   473
        }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   474
    }
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
void EdcaTxopN::NotifyInternalCollision (void)
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
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   480
  NotifyCollision ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   481
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   482
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   483
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   484
EdcaTxopN::NotifyCollision (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   485
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   486
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   487
  m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   488
  RestartAccessIfNeeded ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   489
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   490
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   491
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   492
EdcaTxopN::GotCts (double snr, WifiMode txMode)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   493
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   494
  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
   495
  NS_LOG_DEBUG ("got cts");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   496
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   497
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   498
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   499
EdcaTxopN::MissedCts (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   500
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   501
  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
   502
  NS_LOG_DEBUG ("missed cts");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   503
  if (!NeedRtsRetransmission ())
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   504
    {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   505
      NS_LOG_DEBUG ("Cts Fail");
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   506
      m_stationManager->ReportFinalRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   507
      if (!m_txFailedCallback.IsNull ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   508
        {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   509
          m_txFailedCallback (m_currentHdr);
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
      // to reset the dcf.
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   512
      m_currentPacket = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   513
      m_dcf->ResetCw ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   514
    } 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   515
  else 
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
      m_dcf->UpdateFailedCw ();
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->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   520
  RestartAccessIfNeeded ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   521
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   522
5189
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   523
void 
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   524
EdcaTxopN::NotifyChannelSwitching (void)
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   525
{
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   526
  m_queue->Flush();
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   527
  m_currentPacket = 0;
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   528
}
8fcdf87a790a Channel switching support for Wifi
Ramon Bauza
parents: 4720
diff changeset
   529
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   530
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
   531
EdcaTxopN::Queue (Ptr<const Packet> packet, const WifiMacHeader &hdr)
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   532
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   533
  NS_LOG_FUNCTION (this << packet << &hdr);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   534
  WifiMacTrailer fcs;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   535
  uint32_t fullPacketSize = hdr.GetSerializedSize () + packet->GetSize () + fcs.GetSerializedSize ();
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   536
  m_stationManager->PrepareForQueue (hdr.GetAddr1 (), &hdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   537
                                     packet, fullPacketSize);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   538
  m_queue->Enqueue (packet, hdr);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   539
  StartAccessIfNeeded ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   540
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   541
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   542
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   543
EdcaTxopN::GotAck (double snr, WifiMode txMode)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   544
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   545
  NS_LOG_FUNCTION (this << snr << txMode);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   546
  if (!NeedFragmentation () ||
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   547
      IsLastFragment () ||
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   548
      m_currentHdr.IsQosAmsdu ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   549
    {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   550
      NS_LOG_DEBUG ("got ack. tx done.");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   551
      if (!m_txOkCallback.IsNull ())
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   552
        {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   553
           m_txOkCallback (m_currentHdr);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   554
        }
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   555
      
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   556
      if (m_currentHdr.IsAction ())
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
          WifiActionHeader actionHdr;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   559
          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
   560
          p->RemoveHeader (actionHdr);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   561
          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
   562
              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
   563
            {
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   564
              MgtDelBaHeader delBa;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   565
              p->PeekHeader (delBa);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   566
              if (delBa.IsByOriginator ())
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   567
                {
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   568
                  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
   569
                }
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   570
              else
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
                  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
   573
                }
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   574
            }
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   575
        }
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   576
      m_currentPacket = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   577
         
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   578
      m_dcf->ResetCw ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   579
      m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   580
      RestartAccessIfNeeded ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   581
    } 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   582
  else 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   583
    {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   584
      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
   585
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   586
}
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
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   589
EdcaTxopN::MissedAck (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   590
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   591
  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
   592
  NS_LOG_DEBUG ("missed ack");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   593
  if (!NeedDataRetransmission ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   594
    {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   595
      NS_LOG_DEBUG ("Ack Fail");
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   596
      m_stationManager->ReportFinalDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   597
      if (!m_txFailedCallback.IsNull ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   598
        {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   599
          m_txFailedCallback (m_currentHdr);
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
      // to reset the dcf.
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   602
      m_currentPacket = 0;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   603
      m_dcf->ResetCw ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   604
    } 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   605
  else 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   606
    {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   607
      NS_LOG_DEBUG ("Retransmit");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   608
      m_currentHdr.SetRetry ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   609
      m_dcf->UpdateFailedCw ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   610
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   611
  m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   612
  RestartAccessIfNeeded ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   613
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   614
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   615
void
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   616
EdcaTxopN::MissedBlockAck (void)
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   617
{
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   618
  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
   619
  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
   620
  //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
   621
  NS_LOG_DEBUG ("Retransmit block ack request");
5958
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   622
  m_currentHdr.SetRetry ();
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   623
  m_dcf->UpdateFailedCw ();
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   624
  
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   625
  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
   626
  RestartAccessIfNeeded ();
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   627
}
dd0accd82659 add block ack timeouts
Mirko Banchi <mk.banchi@gmail.com>
parents: 5955
diff changeset
   628
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   629
Ptr<MsduAggregator>
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   630
EdcaTxopN::GetMsduAggregator (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   631
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   632
  return m_aggregator;
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   635
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   636
EdcaTxopN::RestartAccessIfNeeded (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   637
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   638
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   639
  if ((m_currentPacket != 0 ||
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   640
       !m_queue->IsEmpty () || m_baManager->HasPackets ()) &&
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   641
       !m_dcf->IsAccessRequested ())
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   642
    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   643
      m_manager->RequestAccess (m_dcf);
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
}
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
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   648
EdcaTxopN::StartAccessIfNeeded (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   649
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   650
  NS_LOG_FUNCTION (this);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   651
  if (m_currentPacket == 0 &&
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   652
      (!m_queue->IsEmpty () || m_baManager->HasPackets ()) &&
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   653
      !m_dcf->IsAccessRequested ())
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   654
    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   655
      m_manager->RequestAccess (m_dcf);
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
}
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
bool
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   660
EdcaTxopN::NeedRts (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   661
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   662
  return m_stationManager->NeedRts (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   663
                                    m_currentPacket);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   664
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   665
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   666
bool
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   667
EdcaTxopN::NeedRtsRetransmission (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   668
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   669
  return m_stationManager->NeedRtsRetransmission (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   670
                                                  m_currentPacket);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   671
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   672
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   673
bool
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   674
EdcaTxopN::NeedDataRetransmission (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   675
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   676
  return m_stationManager->NeedDataRetransmission (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   677
                                                   m_currentPacket);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   678
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   679
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   680
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   681
EdcaTxopN::NextFragment (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   682
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   683
  m_fragmentNumber++;
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   686
void 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   687
EdcaTxopN::StartNext (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   688
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   689
  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
   690
  NS_LOG_DEBUG ("start next packet fragment");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   691
  /* this callback is used only for fragments. */
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   692
  NextFragment ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   693
  WifiMacHeader hdr;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   694
  Ptr<Packet> fragment = GetFragmentPacket (&hdr);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   695
  MacLowTransmissionParameters params;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   696
  params.EnableAck ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   697
  params.DisableRts ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   698
  params.DisableOverrideDurationId ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   699
  if (IsLastFragment ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   700
    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   701
      params.DisableNextData ();
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
  else 
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
      params.EnableNextData (GetNextFragmentSize ());
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
  Low ()->StartTransmission (fragment, &hdr, params, m_transmissionListener);
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
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   710
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   711
EdcaTxopN::Cancel (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   712
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   713
  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
   714
  NS_LOG_DEBUG ("transmission cancelled");
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   715
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   716
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   717
bool
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   718
EdcaTxopN::NeedFragmentation (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   719
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   720
  return m_stationManager->NeedFragmentation (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   721
                                              m_currentPacket);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   722
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   723
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   724
uint32_t
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   725
EdcaTxopN::GetFragmentSize (void)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   726
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   727
  return m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   728
                                            m_currentPacket, m_fragmentNumber);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   729
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   730
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   731
uint32_t
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   732
EdcaTxopN::GetNextFragmentSize (void) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   733
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   734
  return m_stationManager->GetFragmentSize (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   735
                                            m_currentPacket, m_fragmentNumber + 1);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   736
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   737
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   738
uint32_t
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   739
EdcaTxopN::GetFragmentOffset (void) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   740
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   741
  return m_stationManager->GetFragmentOffset (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   742
                                              m_currentPacket, m_fragmentNumber);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   743
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   744
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
bool
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   747
EdcaTxopN::IsLastFragment (void) const
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   748
{
6065
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   749
  return m_stationManager->IsLastFragment (m_currentHdr.GetAddr1 (), &m_currentHdr,
0f012e7d9128 bug 602
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 5819
diff changeset
   750
                                           m_currentPacket, m_fragmentNumber);
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   751
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   752
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   753
Ptr<Packet>
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   754
EdcaTxopN::GetFragmentPacket (WifiMacHeader *hdr)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   755
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   756
  *hdr = m_currentHdr;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   757
  hdr->SetFragmentNumber (m_fragmentNumber);
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   758
  uint32_t startOffset = GetFragmentOffset ();
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   759
  Ptr<Packet> fragment;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   760
  if (IsLastFragment ()) 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   761
    {
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   762
      hdr->SetNoMoreFragments ();
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
  else 
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
      hdr->SetMoreFragments ();
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
  fragment = m_currentPacket->CreateFragment (startOffset, 
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   769
                                              GetFragmentSize ());
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   770
  return fragment;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   771
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   772
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   773
void
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   774
EdcaTxopN::SetAccessClass (enum AccessClass ac)
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   775
{
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
   776
  m_ac = ac;
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
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   779
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
   780
EdcaTxopN::MapSrcAddressForAggregation (const WifiMacHeader &hdr)
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   781
{
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   782
  Mac48Address retval;
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   783
  if (m_typeOfStation == STA || m_typeOfStation == ADHOC_STA)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   784
    {
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   785
      retval = hdr.GetAddr2 ();
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   786
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   787
  else
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   788
    {
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   789
      retval = hdr.GetAddr3 ();
4408
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
  return retval;
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   792
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   793
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   794
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
   795
EdcaTxopN::MapDestAddressForAggregation (const WifiMacHeader &hdr)
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   796
{
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   797
  Mac48Address retval;
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   798
  if (m_typeOfStation == AP || m_typeOfStation == ADHOC_STA)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   799
    {
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   800
      retval = hdr.GetAddr1 ();
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   801
    }
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   802
  else
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   803
    {
4434
5e3d1c06662f Fix build on osx-ppc optimized gcc 4.0.1
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4408
diff changeset
   804
      retval = hdr.GetAddr3 ();
4408
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
  return retval;
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   807
}
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   808
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   809
void
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   810
EdcaTxopN::SetMsduAggregator (Ptr<MsduAggregator> aggr)
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   811
{
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   812
  m_aggregator = aggr;
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
   813
}
5906
509b5089a081 Revert bug 706 fix because it breaks the regression testing
Faker Moatamri <faker.moatamri@sophia.inria.fr>
parents: 5903
diff changeset
   814
5952
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   815
void
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   816
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
   817
{
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   818
  NS_LOG_FUNCTION (this << packet << &hdr);
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   819
  WifiMacTrailer fcs;
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   820
  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
   821
  m_stationManager->PrepareForQueue (hdr.GetAddr1 (), &hdr,
a2127017ecb4 merge with HEAD
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6065 5999
diff changeset
   822
                                     packet, fullPacketSize);
5952
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   823
  m_queue->PushFront (packet, hdr);
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   824
  StartAccessIfNeeded ();
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   825
}
0588b01cd77e WifiMacQueue now supports head pushing
Mirko Banchi <mk.banchi@gmail.com>
parents: 5906
diff changeset
   826
5953
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
   827
void
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
   828
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
   829
{
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
   830
  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
   831
  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
   832
  uint8_t tid = respHdr->GetTid ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   833
  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
   834
   {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   835
     if (respHdr->GetStatusCode ().IsSuccess ())
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   836
       {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   837
         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
   838
         m_baManager->UpdateAgreement (respHdr, recipient);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   839
       }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   840
     else
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   841
       {
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   842
         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
   843
         m_baManager->NotifyAgreementUnsuccessful (recipient, tid);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   844
       }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   845
    }
5953
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
   846
  RestartAccessIfNeeded ();
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
   847
}
9e400f6b8a2c handle wifi action frames in high MACs
Mirko Banchi <mk.banchi@gmail.com>
parents: 5952
diff changeset
   848
5955
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   849
void
5965
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   850
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
   851
{
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   852
  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
   853
  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
   854
  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
   855
}
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   856
4e64e751be07 add support to block ack tear down in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5964
diff changeset
   857
void
5955
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   858
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
   859
{
5976
dba5c9b69c3b use NS_LOG_APPEND_CONTEXT instead of MY_DEBUG macro
Mirko Banchi <mk.banchi@gmail.com>
parents: 5965
diff changeset
   860
  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
   861
  m_baManager->NotifyGotBlockAck (blockAck, recipient);
5955
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   862
  m_currentPacket = 0;
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   863
  m_dcf->ResetCw ();
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   864
  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
   865
  RestartAccessIfNeeded ();
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   866
}
10fbe045901e add support for block ack in MacLowTransmissionListener
Mirko Banchi <mk.banchi@gmail.com>
parents: 5953
diff changeset
   867
5963
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   868
void
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   869
EdcaTxopN::VerifyBlockAck (void)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   870
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   871
  NS_LOG_FUNCTION (this);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   872
  uint8_t tid = m_currentHdr.GetQosTid ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   873
  Mac48Address recipient = m_currentHdr.GetAddr1 ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   874
  uint16_t sequence = m_currentHdr.GetSequenceNumber ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   875
  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
   876
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   877
      m_baManager->SwitchToBlockAckIfNeeded (recipient, tid, sequence);
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
  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
   880
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   881
      m_currentHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
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
}
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
void
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   886
EdcaTxopN::CompleteTx (void)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   887
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   888
  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
   889
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   890
      if (!m_currentHdr.IsRetry ())
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
          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
   893
        }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   894
      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
   895
      //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
   896
      m_currentPacket = 0;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   897
      m_dcf->ResetCw ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   898
      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
   899
      StartAccessIfNeeded ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   900
    }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   901
}
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
bool
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   904
EdcaTxopN::SetupBlockAckIfNeeded ()
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   905
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   906
  uint8_t tid = m_currentHdr.GetQosTid ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   907
  Mac48Address recipient = m_currentHdr.GetAddr1 ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   908
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   909
  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
   910
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   911
  if (packets >= m_blockAckThreshold)
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
      /* Block ack setup */
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   914
      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
   915
      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
   916
      return true;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   917
    }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   918
  return false;
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
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   921
void
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   922
EdcaTxopN::SendBlockAckRequest (const struct Bar &bar)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   923
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   924
  NS_LOG_FUNCTION (this);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   925
  WifiMacHeader hdr;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   926
  hdr.SetType (WIFI_MAC_CTL_BACKREQ);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   927
  hdr.SetAddr1 (bar.recipient);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   928
  hdr.SetAddr2 (m_low->GetAddress ());
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   929
  hdr.SetAddr3 (m_low->GetBssid ());
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   930
  hdr.SetDsNotTo ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   931
  hdr.SetDsNotFrom ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   932
  hdr.SetNoRetry ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   933
  hdr.SetNoMoreFragments ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   934
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   935
  m_currentPacket = bar.bar;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   936
  m_currentHdr = hdr;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   937
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   938
  MacLowTransmissionParameters params;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   939
  params.DisableRts ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   940
  params.DisableNextData ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   941
  params.DisableOverrideDurationId ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   942
  if (bar.immediate)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   943
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   944
      if (m_blockAckType == BASIC_BLOCK_ACK)
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
          params.EnableBasicBlockAck ();
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
      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
   949
        {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   950
          params.EnableCompressedBlockAck ();
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
      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
   953
        {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   954
          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
   955
        }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   956
    }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   957
  else
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
      //Delayed block ack
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   960
      params.EnableAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   961
    }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   962
  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
   963
}
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   964
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   965
void
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   966
EdcaTxopN::CompleteConfig (void)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   967
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   968
  NS_LOG_FUNCTION (this);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   969
  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
   970
  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
   971
  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
   972
}
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   973
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   974
void
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   975
EdcaTxopN::SetBlockAckThreshold (uint8_t threshold)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   976
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   977
  m_blockAckThreshold = threshold;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   978
  m_baManager->SetBlockAckThreshold (threshold);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   979
}
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   980
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   981
uint8_t
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   982
EdcaTxopN::GetBlockAckThreshold (void) const
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   983
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   984
  return m_blockAckThreshold;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   985
}
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   986
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   987
void
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   988
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
   989
                             uint16_t timeout, bool immediateBAck)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   990
{
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   991
  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
   992
  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
   993
  WifiMacHeader hdr;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   994
  hdr.SetAction ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   995
  hdr.SetAddr1 (dest);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   996
  hdr.SetAddr2 (m_low->GetAddress ());
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   997
  hdr.SetAddr3 (m_low->GetAddress ());
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   998
  hdr.SetDsNotTo ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
   999
  hdr.SetDsNotFrom ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1000
  
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1001
  WifiActionHeader actionHdr;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1002
  WifiActionHeader::ActionValue action;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1003
  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
  1004
  actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1005
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1006
  Ptr<Packet> packet = Create<Packet> ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1007
  /*Setting ADDBARequest header*/
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1008
  MgtAddBaRequestHeader reqHdr;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1009
  reqHdr.SetAmsduSupport (true);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1010
  if (immediateBAck)
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1011
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1012
      reqHdr.SetImmediateBlockAck ();
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
  else
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1015
    {
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1016
      reqHdr.SetDelayedBlockAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1017
    }
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1018
  reqHdr.SetTid (tid);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1019
  /* 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
  1020
   * 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
  1021
   */
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1022
  reqHdr.SetBufferSize (0);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1023
  reqHdr.SetTimeout (timeout);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1024
  reqHdr.SetStartingSequence (startSeq);
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
  m_baManager->CreateAgreement (&reqHdr, dest);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1027
  
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1028
  packet->AddHeader (reqHdr);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1029
  packet->AddHeader (actionHdr);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1030
  
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1031
  m_currentPacket = packet;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1032
  m_currentHdr = hdr;
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
  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
  1035
  m_currentHdr.SetSequenceNumber (sequence);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1036
  m_currentHdr.SetFragmentNumber (0);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1037
  m_currentHdr.SetNoMoreFragments ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1038
  m_currentHdr.SetNoRetry ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1039
  
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1040
  MacLowTransmissionParameters params;
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1041
  params.EnableAck ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1042
  params.DisableRts ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1043
  params.DisableNextData ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1044
  params.DisableOverrideDurationId ();
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1045
  
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1046
  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
  1047
                            m_transmissionListener);
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1048
}
5f82c5a7068e add support to block ack in EdcaTxopN
Mirko Banchi <mk.banchi@gmail.com>
parents: 5958
diff changeset
  1049
5964
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1050
void
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1051
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
  1052
{
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1053
  WifiMacHeader hdr;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1054
  hdr.SetAction ();
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1055
  hdr.SetAddr1 (addr);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1056
  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
  1057
  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
  1058
  hdr.SetDsNotTo ();
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1059
  hdr.SetDsNotFrom ();
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
  MgtDelBaHeader delbaHdr;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1062
  delbaHdr.SetTid (tid);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1063
  if (byOriginator)
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1064
    {
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1065
      delbaHdr.SetByOriginator ();
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1066
    }
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1067
  else
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
      delbaHdr.SetByRecipient ();
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1070
    }
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1071
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1072
  WifiActionHeader actionHdr;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1073
  WifiActionHeader::ActionValue action;
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1074
  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
  1075
  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
  1076
  
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1077
  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
  1078
  packet->AddHeader (delbaHdr);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1079
  packet->AddHeader (actionHdr);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1080
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1081
  PushFront (packet, hdr);
8a59a619c30e add support to block ack tear down in MacLow
Mirko Banchi <mk.banchi@gmail.com>
parents: 5963
diff changeset
  1082
}
6080
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1083
void
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1084
EdcaTxopN::DoStart ()
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1085
{
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1086
  m_dcf->ResetCw ();
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1087
  m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1088
  ns3::Dcf::DoStart ();
41ee42654550 Bug 706
Kirill Andreev <andreev@iitp.ru>
parents: 6068
diff changeset
  1089
}
4408
76a169b3db3d add qos MACs
Mirko Banchi <mk.banchi@gmail.com>
parents:
diff changeset
  1090
} //namespace ns3