src/wifi/test/wifi-aggregation-test.cc
author Sébastien Deronne <sebastien.deronne@gmail.com>
Mon, 04 May 2015 23:55:32 +0200
changeset 11352 a1f6f647d516
child 11388 e367c5bde0fa
permissions -rw-r--r--
add two-level aggregation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
     2
/*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
     3
 * Copyright (c) 2015
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
     4
 *
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
     8
 *
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    12
 * GNU General Public License for more details.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    13
 *
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    17
 *
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    18
 * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    19
 */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    20
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    21
#include "ns3/string.h"
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    22
#include "ns3/test.h"
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    23
#include "ns3/object-factory.h"
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    24
#include "ns3/wifi-mac-queue.h"
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    25
#include "ns3/mac-low.h"
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    26
#include "ns3/edca-txop-n.h"
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    27
#include "ns3/yans-wifi-phy.h"
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    28
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    29
using namespace ns3;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    30
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    31
class TwoLevelAggregationTest : public TestCase
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    32
{
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    33
public:
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    34
  TwoLevelAggregationTest ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    35
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    36
private:
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    37
  virtual void DoRun (void);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    38
  Ptr<MacLow> m_low;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    39
  Ptr<YansWifiPhy> m_phy;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    40
  Ptr<EdcaTxopN> m_edca;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    41
  Ptr<WifiRemoteStationManager> m_manager;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    42
  ObjectFactory m_factory;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    43
  Ptr<MpduAggregator> m_mpduAggregator;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    44
  Ptr<MsduAggregator> m_msduAggregator;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    45
};
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    46
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    47
TwoLevelAggregationTest::TwoLevelAggregationTest ()
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    48
  : TestCase ("Check the correctness of two-level aggregation operations")
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    49
{
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    50
}
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    51
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    52
void
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    53
TwoLevelAggregationTest::DoRun (void)
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    54
{
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    55
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    56
   * Create and configure phy layer.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    57
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    58
  m_phy = CreateObject<YansWifiPhy> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    59
  m_phy->ConfigureStandard (WIFI_PHY_STANDARD_80211n_5GHZ);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    60
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    61
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    62
   * Create and configure manager.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    63
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    64
  m_factory = ObjectFactory ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    65
  m_factory.SetTypeId ("ns3::ConstantRateWifiManager");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    66
  m_factory.Set ("DataMode", StringValue ("OfdmRate65MbpsBW20MHz"));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    67
  m_manager = m_factory.Create<WifiRemoteStationManager> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    68
  m_manager->SetupPhy(m_phy);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    69
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    70
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    71
   * Create and configure maclayer.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    72
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    73
  m_low = CreateObject<MacLow> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    74
  m_low->SetPhy(m_phy);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    75
  m_low->SetWifiRemoteStationManager (m_manager);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    76
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    77
  m_edca = CreateObject<EdcaTxopN> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    78
  m_edca->SetLow (m_low);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    79
  m_edca->SetAccessCategory (AC_BE);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    80
  m_edca->SetWifiRemoteStationManager (m_manager);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    81
  m_edca->CompleteConfig ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    82
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    83
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    84
   * Configure aggregation.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    85
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    86
  m_factory = ObjectFactory ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    87
  m_factory.SetTypeId ("ns3::MsduStandardAggregator");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    88
  m_factory.Set ("MaxAmsduSize", UintegerValue(4095));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    89
  m_msduAggregator = m_factory.Create<MsduAggregator> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    90
  m_edca->SetMsduAggregator (m_msduAggregator);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    91
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    92
  m_factory = ObjectFactory ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    93
  m_factory.SetTypeId ("ns3::MpduStandardAggregator");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    94
  m_factory.Set ("MaxAmpduSize", UintegerValue(65535));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    95
  m_mpduAggregator = m_factory.Create<MpduAggregator> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    96
  m_low->SetMpduAggregator (m_mpduAggregator);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    97
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    98
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    99
   * Create dummy packets of 1500 bytes and fill mac header fields that will be used for the tests.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   100
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   101
  Ptr<const Packet> pkt = Create<Packet> (1500);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   102
  Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   103
  WifiMacHeader hdr, peekedHdr;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   104
  hdr.SetAddr1 (Mac48Address ("00:00:00:00:00:01"));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   105
  hdr.SetAddr2 (Mac48Address ("00:00:00:00:00:02"));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   106
  hdr.SetType (WIFI_MAC_QOSDATA);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   107
  hdr.SetQosTid (0);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   108
  Time tstamp;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   109
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   110
  //-----------------------------------------------------------------------------------------------------
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   111
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   112
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   113
   * Test MSDU aggregation of two packets using MacLow::PerformMsduAggregation.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   114
   * It checks whether aggregation succeeded: 
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   115
   *      - returned packet should be different from 0;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   116
   *      - A-MSDU frame size should be 3030 bytes (= 2 packets + headers + padding);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   117
   *      - one packet should be removed from the queue (the other packet is removed later in MacLow::AggregateToAmpdu) .
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   118
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   119
  m_edca->GetEdcaQueue()->Enqueue(pkt, hdr);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   120
  m_edca->GetEdcaQueue()->Enqueue(pkt, hdr);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   121
    
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   122
  Ptr<const Packet> peekedPacket = m_edca->GetEdcaQueue()->PeekByTidAndAddress (&peekedHdr, 0,
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   123
                                                                                WifiMacHeader::ADDR1,
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   124
                                                                                hdr.GetAddr1 (),
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   125
                                                                                &tstamp);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   126
  m_low->m_currentPacket = peekedPacket->Copy ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   127
  m_low->m_currentHdr = peekedHdr;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   128
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   129
  Ptr<Packet> packet = m_low->PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, 0);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   130
    
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   131
  bool result = (packet != 0);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   132
  NS_TEST_EXPECT_MSG_EQ (result, true, "aggregation failed");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   133
  NS_TEST_EXPECT_MSG_EQ (packet->GetSize(), 3030, "wrong packet size");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   134
  NS_TEST_EXPECT_MSG_EQ (m_edca->GetEdcaQueue()->GetSize(), 1, "removing packet from EDCA queue failed");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   135
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   136
  //-----------------------------------------------------------------------------------------------------
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   137
    
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   138
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   139
   * Aggregation is refused when the maximum size is reached.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   140
   * It checks whether MSDU aggregation has been rejected because the maximum MPDU size is set to 0 (returned packet should be equal to 0).
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   141
   * This test is needed to ensure that no packets are removed from the queue in MacLow::PerformMsduAggregation, since aggregation will no occur in MacLow::AggregateToAmpdu.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   142
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   143
  m_factory = ObjectFactory ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   144
  m_factory.SetTypeId ("ns3::MpduStandardAggregator");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   145
  m_factory.Set ("MaxAmpduSize", UintegerValue(0));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   146
  m_mpduAggregator = m_factory.Create<MpduAggregator> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   147
  m_low->SetMpduAggregator (m_mpduAggregator);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   148
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   149
  m_edca->GetEdcaQueue()->Enqueue(pkt, hdr);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   150
  packet = m_low->PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, 0);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   151
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   152
  result = (packet != 0);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   153
  NS_TEST_EXPECT_MSG_EQ (result, false, "maximum aggregated frame size check failed");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   154
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   155
  //-----------------------------------------------------------------------------------------------------
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   156
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   157
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   158
   * Aggregation does not occur zhen there is no more packets in the queue.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   159
   * It checks whether MSDU aggregation has been rejected because there is no packets ready in the queue (returned packet should be equal to 0).
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   160
   * This test is needed to ensure that there is no issue when the queue is empty.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   161
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   162
  m_factory = ObjectFactory ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   163
  m_factory.SetTypeId ("ns3::MpduStandardAggregator");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   164
  m_factory.Set ("MaxAmpduSize", UintegerValue(4095));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   165
  m_mpduAggregator = m_factory.Create<MpduAggregator> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   166
  m_low->SetMpduAggregator (m_mpduAggregator);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   167
    
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   168
  m_edca->GetEdcaQueue()->Remove(pkt);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   169
  m_edca->GetEdcaQueue()->Remove(pkt);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   170
  packet = m_low->PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, 0);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   171
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   172
  result = (packet != 0);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   173
  NS_TEST_EXPECT_MSG_EQ (result, false, "aggregation failed to stop as queue is empty");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   174
}
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   175
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   176
//-----------------------------------------------------------------------------
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   177
class WifiAggregationTestSuite : public TestSuite
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   178
{
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   179
public:
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   180
  WifiAggregationTestSuite ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   181
};
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   182
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   183
WifiAggregationTestSuite::WifiAggregationTestSuite ()
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   184
  : TestSuite ("aggregation-wifi", UNIT)
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   185
{
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   186
  AddTestCase (new TwoLevelAggregationTest, TestCase::QUICK);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   187
}
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   188
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   189
static WifiAggregationTestSuite g_wifiAggregationTestSuite;