diff --git a/examples/wireless/simple-ht-hidden-stations.cc b/examples/wireless/simple-ht-hidden-stations.cc new file mode 100644 index 000000000..38c6af5b6 --- /dev/null +++ b/examples/wireless/simple-ht-hidden-stations.cc @@ -0,0 +1,179 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2015 Sébastien Deronne + * + * 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: Sébastien Deronne + */ + +#include "ns3/core-module.h" +#include "ns3/network-module.h" +#include "ns3/applications-module.h" +#include "ns3/wifi-module.h" +#include "ns3/mobility-module.h" +#include "ns3/ipv4-global-routing-helper.h" +#include "ns3/internet-module.h" + +// This example considers two hidden stations in an 802.11n network which supports MPDU aggregation. +// The user can specify whether RTS/CTS is used and can set the number of aggregated MPDUs. +// +// Example: ./waf --run "simple-ht-hidden-stations --enableRts=1 --nMpdus=8" +// +// Network topology: +// +// Wifi 192.168.1.0 +// +// AP +// * * * +// | | | +// n1 n2 n3 +// +// Packets in this simulation aren't marked with a QosTag so they are considered +// belonging to BestEffort Access Class (AC_BE). + +using namespace ns3; + +NS_LOG_COMPONENT_DEFINE ("SimplesHtHiddenStations"); + +int main (int argc, char *argv[]) +{ + uint32_t payloadSize = 1472; //bytes + uint64_t simulationTime = 10; //seconds + uint32_t nMpdus = 1; + bool enableRts = 0; + + CommandLine cmd; + cmd.AddValue("nMpdus", "Number of aggregated MPDUs", nMpdus); + cmd.AddValue("payloadSize", "Payload size in bytes", payloadSize); + cmd.AddValue("enableRts", "Enable RTS/CTS", enableRts); // 1: RTS/CTS enabled; 0: RTS/CTS disabled + cmd.AddValue("simulationTime", "Simulation time in seconds", simulationTime); + cmd.Parse (argc, argv); + + if(!enableRts) + Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("999999")); + else + Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("0")); + + Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("990000")); + + // Set the maximum wireless range to 5 meters in order to reproduce a hidden nodes scenario, i.e. the distance between hidden stations is larger than 5 meters + Config::SetDefault ("ns3::RangePropagationLossModel::MaxRange", DoubleValue (5)); + + NodeContainer wifiStaNodes; + wifiStaNodes.Create (2); + NodeContainer wifiApNode; + wifiApNode.Create(1); + + YansWifiChannelHelper channel = YansWifiChannelHelper::Default (); + channel.AddPropagationLoss ("ns3::RangePropagationLossModel"); //wireless range limited to 5 meters! + + YansWifiPhyHelper phy = YansWifiPhyHelper::Default (); + phy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO); + phy.SetChannel (channel.Create()); + + WifiHelper wifi = WifiHelper::Default (); + wifi.SetStandard (WIFI_PHY_STANDARD_80211n_5GHZ); + wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue("OfdmRate65MbpsBW20MHz"), "ControlMode", StringValue("OfdmRate6_5MbpsBW20MHz")); + HtWifiMacHelper mac = HtWifiMacHelper::Default (); + + Ssid ssid = Ssid ("simple-mpdu-aggregation"); + mac.SetType ("ns3::StaWifiMac", + "Ssid", SsidValue (ssid), + "ActiveProbing", BooleanValue (false)); + + if (nMpdus > 1) mac.SetBlockAckThresholdForAc (AC_BE, 2); //enable Block ACK when A-MPDU is enabled + + mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator", + "MaxAmpduSize", UintegerValue (nMpdus*(payloadSize+100))); //enable MPDU aggregation for AC_BE with a maximum aggregated size of nMpdus*(payloadSize+100) bytes, + //i.e. nMpdus aggregated packets in an A-MPDU + + NetDeviceContainer staDevices; + staDevices = wifi.Install (phy, mac, wifiStaNodes); + + mac.SetType ("ns3::ApWifiMac", + "Ssid", SsidValue (ssid), + "BeaconInterval", TimeValue (MicroSeconds(102400)), + "BeaconGeneration", BooleanValue (true)); + + if (nMpdus > 1) mac.SetBlockAckThresholdForAc (AC_BE, 2); //enable Block ACK when A-MPDU is enabled + + mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator", + "MaxAmpduSize", UintegerValue (nMpdus*(payloadSize+100))); //enable MPDU aggregation for AC_BE with a maximum aggregated size of nMpdus*(payloadSize+100) bytes, + //i.e. nMpdus aggregated packets in an A-MPDU + + NetDeviceContainer apDevice; + apDevice = wifi.Install (phy, mac, wifiApNode); + + // Setting mobility model + MobilityHelper mobility; + Ptr positionAlloc = CreateObject (); + + // AP is between the two stations, each station being located at 5 meters from the AP. + // The distance between the two stations is thus equal to 10 meters. + // Since the wireless range is limited to 5 meters, the two stations are hidden from each other. + positionAlloc->Add (Vector (5.0, 0.0, 0.0)); + positionAlloc->Add (Vector (0.0, 0.0, 0.0)); + positionAlloc->Add (Vector (10.0, 0.0, 0.0)); + mobility.SetPositionAllocator (positionAlloc); + + mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); + + mobility.Install (wifiApNode); + mobility.Install (wifiStaNodes); + + // Internet stack + InternetStackHelper stack; + stack.Install (wifiApNode); + stack.Install (wifiStaNodes); + + Ipv4AddressHelper address; + + address.SetBase ("192.168.1.0", "255.255.255.0"); + Ipv4InterfaceContainer StaInterface; + StaInterface = address.Assign (staDevices); + Ipv4InterfaceContainer ApInterface; + ApInterface = address.Assign (apDevice); + + // Setting applications + UdpServerHelper myServer (9); + ApplicationContainer serverApp = myServer.Install (wifiApNode); + serverApp.Start (Seconds (0.0)); + serverApp.Stop (Seconds (simulationTime+1)); + + UdpClientHelper myClient (ApInterface.GetAddress (0), 9); + myClient.SetAttribute ("MaxPackets", UintegerValue (4294967295u)); + myClient.SetAttribute ("Interval", TimeValue (Time ("0.00002"))); //packets/s + myClient.SetAttribute ("PacketSize", UintegerValue (payloadSize)); + + // Saturated UDP traffic from stations to AP + ApplicationContainer clientApp1 = myClient.Install (wifiStaNodes); + clientApp1.Start (Seconds (1.0)); + clientApp1.Stop (Seconds (simulationTime+1)); + + phy.EnablePcap ("SimpleHtHiddenStations_Ap", apDevice.Get (0)); + phy.EnablePcap ("SimpleHtHiddenStations_Sta1", staDevices.Get (0)); + phy.EnablePcap ("SimpleHtHiddenStations_Sta2", staDevices.Get (1)); + + Simulator::Stop (Seconds (simulationTime+1)); + + Simulator::Run (); + Simulator::Destroy (); + + uint32_t totalPacketsThrough = DynamicCast(serverApp.Get (0))->GetReceived (); + double throughput = totalPacketsThrough*payloadSize*8/(simulationTime*1000000.0); + std::cout << "Throughput: " << throughput << " Mbit/s" << '\n'; + + return 0; +} diff --git a/examples/wireless/wscript b/examples/wireless/wscript index 859456882..5b577f593 100644 --- a/examples/wireless/wscript +++ b/examples/wireless/wscript @@ -75,3 +75,6 @@ def build(bld): obj = bld.create_ns3_program('simple-two-level-aggregation', ['internet', 'mobility', 'wifi', 'applications']) obj.source = 'simple-two-level-aggregation.cc' + + obj = bld.create_ns3_program('simple-ht-hidden-stations', ['internet', 'mobility', 'wifi', 'applications']) + obj.source = 'simple-ht-hidden-stations.cc'