From 032d94d7f53d6636ab0d0c82e5ef6547cd6b8b80 Mon Sep 17 00:00:00 2001 From: Mirko Banchi Date: Wed, 3 Feb 2010 20:34:54 +0100 Subject: [PATCH] add a block ack example --- examples/wireless/wifi-blockack.cc | 141 +++++++++++++++++++++++++++++ examples/wireless/wscript | 3 + 2 files changed, 144 insertions(+) create mode 100644 examples/wireless/wifi-blockack.cc diff --git a/examples/wireless/wifi-blockack.cc b/examples/wireless/wifi-blockack.cc new file mode 100644 index 000000000..350cb3482 --- /dev/null +++ b/examples/wireless/wifi-blockack.cc @@ -0,0 +1,141 @@ +/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2009 MIRKO BANCHI + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Mirko Banchi + */ + +/** + * This is a simple example in order to show how 802.11n compressed block ack mechanism could be used. + * + * Network topology: + * + * Wifi 192.168.1.0 + * + * AP + * * * + * | | + * n1 n2 + * + * In this example a QoS sta sends UDP datagram packets to access point. On the access point + * there is no application installed so it replies to every packet with an ICMP frame. However + * our attention is on originator sta n1. We have set blockAckThreshold (mininum number of packets to use + * block ack) to 2 so if there are in the BestEffort queue more than 2 packets a block ack will be + * negotiated. We also set a timeout for block ack inactivity to 3 blocks of 1024 microseconds. This timer is + * reset when: + * - the originator receives a block ack frame. + * - the recipient receives a block ack request or a MPDU with ack policy Block Ack. + */ +#include "ns3/core-module.h" +#include "ns3/simulator-module.h" +#include "ns3/node-module.h" +#include "ns3/helper-module.h" +#include "ns3/global-routing-module.h" +#include "ns3/wifi-module.h" +#include "ns3/mobility-module.h" + +using namespace ns3; + +NS_LOG_COMPONENT_DEFINE ("Test-block-ack"); + +int main (int argc, char const* argv[]) +{ + LogComponentEnable ("EdcaTxopN", LOG_LEVEL_DEBUG); + LogComponentEnable ("BlockAckManager", LOG_LEVEL_INFO); + + Ptr sta = CreateObject (); + Ptr ap = CreateObject (); + + YansWifiChannelHelper channel = YansWifiChannelHelper::Default (); + YansWifiPhyHelper phy = YansWifiPhyHelper::Default (); + phy.SetChannel (channel.Create ()); + + WifiHelper wifi = WifiHelper::Default (); + QosWifiMacHelper mac = QosWifiMacHelper::Default (); + /* disable fragmentation */ + wifi.SetRemoteStationManager ("ns3::AarfWifiManager", "FragmentationThreshold", UintegerValue (2500)); + + Ssid ssid ("My-network"); + + mac.SetType ("ns3::QstaWifiMac", "Ssid" , SsidValue (ssid), "ActiveProbing", BooleanValue (false)); + NetDeviceContainer staDevice = wifi.Install (phy, mac, sta); + + mac.SetType ("ns3::QapWifiMac", "Ssid", SsidValue (ssid), "BeaconGeneration", BooleanValue (true), + "BeaconInterval", TimeValue (Seconds (2.5))); + NetDeviceContainer apDevice = wifi.Install (phy, mac, ap); + + /* setting blockack threshold for sta's BE queue */ + Config::Set ("/NodeList/0/DeviceList/0/Mac/BE_EdcaTxopN/BlockAckThreshold", UintegerValue (2)); + /* setting block inactivity timeout to 3*1024 = 3072 microseconds */ + //Config::Set ("/NodeList/0/DeviceList/0/Mac/BE_EdcaTxopN/BlockAckInactivityTimeout", UintegerValue (3)); + + /* Setting mobility model */ + MobilityHelper mobility; + + mobility.SetPositionAllocator ("ns3::GridPositionAllocator", + "MinX", DoubleValue (0.0), + "MinY", DoubleValue (0.0), + "DeltaX", DoubleValue (5.0), + "DeltaY", DoubleValue (10.0), + "GridWidth", UintegerValue (3), + "LayoutType", StringValue ("RowFirst")); + + mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel", + "Bounds", RectangleValue (Rectangle (-50, 50, -50, 50))); + mobility.Install (sta); + + mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); + mobility.Install (ap); + + /* Internet stack*/ + InternetStackHelper stack; + stack.Install (sta); + stack.Install (ap); + + Ipv4AddressHelper address; + + address.SetBase ("192.168.1.0", "255.255.255.0"); + Ipv4InterfaceContainer staIf; + Ipv4InterfaceContainer apIf; + staIf = address.Assign (staDevice); + apIf = address.Assign (apDevice); + + /* Setting applications */ + + uint16_t port = 9; + + DataRate dataRate ("1Mb/s"); + OnOffHelper onOff ("ns3::UdpSocketFactory", Address (InetSocketAddress (apIf.GetAddress (0), port))); + onOff.SetAttribute ("DataRate", DataRateValue (dataRate)); + onOff.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable (0.01))); + onOff.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable (8))); + onOff.SetAttribute ("PacketSize", UintegerValue (50)); + + ApplicationContainer staApps = onOff.Install (sta); + + staApps.Start (Seconds (1.0)); + staApps.Stop (Seconds (10.0)); + + Ipv4GlobalRoutingHelper::PopulateRoutingTables (); + + Simulator::Stop (Seconds (10.0)); + + phy.EnablePcap ("test-blockack-2", ap->GetId (), 0); + Simulator::Run (); + Simulator::Destroy (); + + return 0; +} diff --git a/examples/wireless/wscript b/examples/wireless/wscript index bcb45f2ab..241eb1e22 100644 --- a/examples/wireless/wscript +++ b/examples/wireless/wscript @@ -34,3 +34,6 @@ def build(bld): obj = bld.create_ns3_program('wifi-simple-interference', ['core', 'simulator', 'mobility', 'wifi']) obj.source = 'wifi-simple-interference.cc' + + obj = bld.create_ns3_program('wifi-blockack', ['core', 'simulator', 'mobility', 'wifi']) + obj.source = 'wifi-blockack.cc'