24 #include "ns3/callback.h"
25 #include "ns3/abort.h"
27 #include "ns3/pcap-file.h"
28 #include "ns3/config.h"
29 #include "ns3/string.h"
30 #include "ns3/uinteger.h"
31 #include "ns3/double.h"
32 #include "ns3/data-rate.h"
33 #include "ns3/inet-socket-address.h"
34 #include "ns3/internet-stack-helper.h"
35 #include "ns3/ipv4-address-helper.h"
36 #include "ns3/tcp-socket-factory.h"
37 #include "ns3/yans-wifi-helper.h"
38 #include "ns3/propagation-loss-model.h"
39 #include "ns3/propagation-delay-model.h"
40 #include "ns3/yans-wifi-channel.h"
41 #include "ns3/yans-wifi-phy.h"
42 #include "ns3/wifi-net-device.h"
43 #include "ns3/mobility-helper.h"
44 #include "ns3/constant-position-mobility-model.h"
45 #include "ns3/nqos-wifi-mac-helper.h"
46 #include "ns3/simulator.h"
59 virtual void DoRun (
void);
61 static void GenerateTraffic (
Ptr<Socket> socket, uint32_t pktSize, uint32_t pktCount,
Time pktInterval);
62 void PrintEndSync (std::string context, uint32_t dataRate,
double snr,
double per);
63 double WifiSimpleInterference (std::string phyMode,
double Prss,
double Irss,
double delta, uint32_t PpacketSize,
71 WifiInterferenceTestCase::WifiInterferenceTestCase ()
72 :
TestCase (
"Test interference calculation when interfering frame exactly overlaps intended frame")
76 WifiInterferenceTestCase::~WifiInterferenceTestCase ()
80 static inline std::string
87 std::ostringstream oss;
88 oss <<
"Received one packet! Socket: " << iaddr.
GetIpv4 () <<
" port: " << iaddr.
GetPort ();
94 WifiInterferenceTestCase::ReceivePacket (
Ptr<Socket> socket)
100 WifiInterferenceTestCase::GenerateTraffic (
Ptr<Socket> socket, uint32_t pktSize, uint32_t pktCount,
Time pktInterval)
104 socket->
Send (Create<Packet> (pktSize));
105 Simulator::Schedule (pktInterval, &WifiInterferenceTestCase::GenerateTraffic, socket, pktSize, pktCount-1, pktInterval);
114 WifiInterferenceTestCase::PrintEndSync (std::string context, uint32_t dataRate,
double snr,
double per)
116 NS_LOG_UNCOND (
"EndSync: Received frame with dataRate=" << dataRate <<
", SNR=" << snr <<
", PER =" << per);
119 m_DataRate = dataRate;
123 WifiInterferenceTestCase::WifiSimpleInterference (std::string phyMode,
double Prss,
double Irss,
double delta, uint32_t PpacketSize, uint32_t IpacketSize,
bool verbose,
InternetStackHelper internet)
126 uint32_t numPackets = 1;
127 double interval = 1.0;
128 double startTime = 10.0;
129 double distanceToRx = 100.0;
142 Config::SetDefault (
"ns3::WifiRemoteStationManager::FragmentationThreshold",
StringValue (
"2200"));
144 Config::SetDefault (
"ns3::WifiRemoteStationManager::RtsCtsThreshold",
StringValue (
"2200"));
146 Config::SetDefault (
"ns3::WifiRemoteStationManager::NonUnicastMode",
176 wifiMac.
SetType (
"ns3::AdhocWifiMac");
190 positionAlloc->
Add (
Vector (0.0, 0.0, 0.0));
191 positionAlloc->
Add (
Vector (distanceToRx, 0.0, 0.0));
192 positionAlloc->
Add (
Vector (-1*distanceToRx, 0.0, 0.0));
202 ipv4.
SetBase (
"10.1.1.0",
"255.255.255.0");
205 TypeId tid = TypeId::LookupByName (
"ns3::UdpSocketFactory");
208 recvSink->
Bind (local);
219 interferer->
Connect (interferingAddr);
221 Config::Connect (
"/NodeList/0/DeviceList/0/$ns3::WifiNetDevice/Phy/$ns3::YansWifiPhy/EndSync",
MakeCallback (&WifiInterferenceTestCase::PrintEndSync,
this));
225 Simulator::ScheduleWithContext (source->
GetNode ()->
GetId (),
226 Seconds (startTime), &GenerateTraffic,
227 source, PpacketSize, numPackets, interPacketInterval);
229 Simulator::ScheduleWithContext (interferer->
GetNode ()->
GetId (),
230 Seconds (startTime + delta/1000000.0), &GenerateTraffic,
231 interferer, IpacketSize, numPackets, interPacketInterval);
234 Simulator::Destroy ();
243 std::string phyMode (
"DsssRate1Mbps");
247 uint32_t PpacketSize = 1000;
248 uint32_t IpacketSize = 1000;
249 bool verbose =
false;
250 double PER, PER1, PER2;
256 PER = WifiSimpleInterference (phyMode,Prss,Irss,delta,PpacketSize,IpacketSize,verbose,internet);
261 PER1 = WifiSimpleInterference (phyMode,Prss,Irss,delta,PpacketSize,IpacketSize,verbose,internet);
266 PER2 = WifiSimpleInterference (phyMode,Prss,Irss,delta,PpacketSize,IpacketSize,verbose,internet);
268 double PERDiff1 = PER - PER1;
270 double PERDiff2 = PER1 - PER2;
272 NS_TEST_ASSERT_MSG_EQ (PERDiff1, PERDiff2,
273 "The PER difference due to 1 microsecond difference in arrival shouldn't depend on absolute arrival");
282 WifiInterferenceTestSuite::WifiInterferenceTestSuite ()
283 :
TestSuite (
"ns3-wifi-interference", UNIT)
void AddPropagationLoss(std::string name, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
virtual void DoRun(void)
Implementation to actually run this test case.
Ipv4Address GetIpv4(void) const
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ptr< YansWifiChannel > Create(void) const
void SetRemoteStationManager(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
hold variables of type string
Make it easy to create and manage PHY objects for the yans model.
void SetType(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
#define NS_LOG_COMPONENT_DEFINE(name)
virtual int GetSockName(Address &address) const =0
void SetPcapDataLinkType(enum SupportedPcapDataLinkTypes dlt)
aggregate IP/TCP/UDP functionality to existing Nodes.
void Set(std::string name, const AttributeValue &v)
helps to create WifiNetDevice objects
NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer c) const
a polymophic address class
void SetChannel(Ptr< YansWifiChannel > channel)
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
holds a vector of ns3::NetDevice pointers
void SetStandard(enum WifiPhyStandard standard)
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read.
create non QoS-enabled MAC layers for a ns3::WifiNetDevice.
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
keep track of a set of node pointers.
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
void Install(std::string nodeName) const
#define NS_LOG_UNCOND(msg)
manage and create wifi channel objects for the yans model.
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual test case to this test suite.
Helper class used to assign positions and mobility models to nodes.
Ipv4 addresses are stored in host order in this class.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
uint32_t GetId(void) const
virtual Ptr< Node > GetNode(void) const =0
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
uint16_t GetPort(void) const
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
void SetPropagationDelay(std::string name, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
virtual int Close(void)=0
Close a socket.
Hold an floating point type.
a unique identifier for an interface.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.