src/wifi/test/wifi-aggregation-test.cc
author Tom Henderson <tomh@tomh.org>
Wed, 06 May 2015 14:23:50 -0700
changeset 11388 e367c5bde0fa
parent 11352 a1f6f647d516
child 11450 9f4ae69f12b7
permissions -rw-r--r--
clear valgrind warnings for aggregation test
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"
11388
e367c5bde0fa clear valgrind warnings for aggregation test
Tom Henderson <tomh@tomh.org>
parents: 11352
diff changeset
    24
#include "ns3/simulator.h"
11352
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    25
#include "ns3/wifi-mac-queue.h"
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    26
#include "ns3/mac-low.h"
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    27
#include "ns3/edca-txop-n.h"
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    28
#include "ns3/yans-wifi-phy.h"
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    29
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    30
using namespace ns3;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    31
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    32
class TwoLevelAggregationTest : public TestCase
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    33
{
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    34
public:
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    35
  TwoLevelAggregationTest ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    36
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    37
private:
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    38
  virtual void DoRun (void);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    39
  Ptr<MacLow> m_low;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    40
  Ptr<YansWifiPhy> m_phy;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    41
  Ptr<EdcaTxopN> m_edca;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    42
  Ptr<WifiRemoteStationManager> m_manager;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    43
  ObjectFactory m_factory;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    44
  Ptr<MpduAggregator> m_mpduAggregator;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    45
  Ptr<MsduAggregator> m_msduAggregator;
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
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    48
TwoLevelAggregationTest::TwoLevelAggregationTest ()
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    49
  : TestCase ("Check the correctness of two-level aggregation operations")
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
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    53
void
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    54
TwoLevelAggregationTest::DoRun (void)
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
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    57
   * Create and configure phy layer.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    58
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    59
  m_phy = CreateObject<YansWifiPhy> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    60
  m_phy->ConfigureStandard (WIFI_PHY_STANDARD_80211n_5GHZ);
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
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    63
   * Create and configure manager.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    64
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    65
  m_factory = ObjectFactory ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    66
  m_factory.SetTypeId ("ns3::ConstantRateWifiManager");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    67
  m_factory.Set ("DataMode", StringValue ("OfdmRate65MbpsBW20MHz"));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    68
  m_manager = m_factory.Create<WifiRemoteStationManager> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    69
  m_manager->SetupPhy(m_phy);
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
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    72
   * Create and configure maclayer.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    73
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    74
  m_low = CreateObject<MacLow> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    75
  m_low->SetPhy(m_phy);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    76
  m_low->SetWifiRemoteStationManager (m_manager);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    77
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    78
  m_edca = CreateObject<EdcaTxopN> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    79
  m_edca->SetLow (m_low);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    80
  m_edca->SetAccessCategory (AC_BE);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    81
  m_edca->SetWifiRemoteStationManager (m_manager);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    82
  m_edca->CompleteConfig ();
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
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    85
   * Configure aggregation.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    86
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    87
  m_factory = ObjectFactory ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    88
  m_factory.SetTypeId ("ns3::MsduStandardAggregator");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    89
  m_factory.Set ("MaxAmsduSize", UintegerValue(4095));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    90
  m_msduAggregator = m_factory.Create<MsduAggregator> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    91
  m_edca->SetMsduAggregator (m_msduAggregator);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    92
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    93
  m_factory = ObjectFactory ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    94
  m_factory.SetTypeId ("ns3::MpduStandardAggregator");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    95
  m_factory.Set ("MaxAmpduSize", UintegerValue(65535));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    96
  m_mpduAggregator = m_factory.Create<MpduAggregator> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
    97
  m_low->SetMpduAggregator (m_mpduAggregator);
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
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   100
   * 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
   101
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   102
  Ptr<const Packet> pkt = Create<Packet> (1500);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   103
  Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   104
  WifiMacHeader hdr, peekedHdr;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   105
  hdr.SetAddr1 (Mac48Address ("00:00:00:00:00:01"));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   106
  hdr.SetAddr2 (Mac48Address ("00:00:00:00:00:02"));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   107
  hdr.SetType (WIFI_MAC_QOSDATA);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   108
  hdr.SetQosTid (0);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   109
  Time tstamp;
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
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   114
   * Test MSDU aggregation of two packets using MacLow::PerformMsduAggregation.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   115
   * It checks whether aggregation succeeded: 
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   116
   *      - returned packet should be different from 0;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   117
   *      - 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
   118
   *      - 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
   119
   */
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
  m_edca->GetEdcaQueue()->Enqueue(pkt, hdr);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   122
    
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   123
  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
   124
                                                                                WifiMacHeader::ADDR1,
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   125
                                                                                hdr.GetAddr1 (),
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   126
                                                                                &tstamp);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   127
  m_low->m_currentPacket = peekedPacket->Copy ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   128
  m_low->m_currentHdr = peekedHdr;
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   129
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   130
  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
   131
    
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   132
  bool result = (packet != 0);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   133
  NS_TEST_EXPECT_MSG_EQ (result, true, "aggregation failed");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   134
  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
   135
  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
   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
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   140
   * Aggregation is refused when the maximum size is reached.
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   141
   * 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
   142
   * 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
   143
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   144
  m_factory = ObjectFactory ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   145
  m_factory.SetTypeId ("ns3::MpduStandardAggregator");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   146
  m_factory.Set ("MaxAmpduSize", UintegerValue(0));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   147
  m_mpduAggregator = m_factory.Create<MpduAggregator> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   148
  m_low->SetMpduAggregator (m_mpduAggregator);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   149
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   150
  m_edca->GetEdcaQueue()->Enqueue(pkt, hdr);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   151
  packet = m_low->PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, 0);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   152
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   153
  result = (packet != 0);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   154
  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
   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
  /*
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   159
   * 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
   160
   * 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
   161
   * 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
   162
   */
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   163
  m_factory = ObjectFactory ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   164
  m_factory.SetTypeId ("ns3::MpduStandardAggregator");
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   165
  m_factory.Set ("MaxAmpduSize", UintegerValue(4095));
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   166
  m_mpduAggregator = m_factory.Create<MpduAggregator> ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   167
  m_low->SetMpduAggregator (m_mpduAggregator);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   168
    
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
  m_edca->GetEdcaQueue()->Remove(pkt);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   171
  packet = m_low->PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, 0);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   172
  
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   173
  result = (packet != 0);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   174
  NS_TEST_EXPECT_MSG_EQ (result, false, "aggregation failed to stop as queue is empty");
11388
e367c5bde0fa clear valgrind warnings for aggregation test
Tom Henderson <tomh@tomh.org>
parents: 11352
diff changeset
   175
  Simulator::Destroy ();
11352
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
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
class WifiAggregationTestSuite : public TestSuite
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   180
{
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   181
public:
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   182
  WifiAggregationTestSuite ();
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   183
};
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   184
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   185
WifiAggregationTestSuite::WifiAggregationTestSuite ()
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   186
  : TestSuite ("aggregation-wifi", UNIT)
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
  AddTestCase (new TwoLevelAggregationTest, TestCase::QUICK);
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   189
}
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   190
a1f6f647d516 add two-level aggregation
Sébastien Deronne <sebastien.deronne@gmail.com>
parents:
diff changeset
   191
static WifiAggregationTestSuite g_wifiAggregationTestSuite;