diff -r 1204fcdb71c2 src/devices/wifi/wifi-test.cc --- a/src/devices/wifi/wifi-test.cc Mon Dec 20 22:05:44 2010 -0800 +++ b/src/devices/wifi/wifi-test.cc Tue Dec 21 19:00:55 2010 +0100 @@ -289,6 +289,123 @@ //----------------------------------------------------------------------------- +/** + * Make sure that when two broadcast packets are queued on the same + * device in a short succession no virtual collision occurs + * + */ +class Bug555Test : public TestCase +{ +public: + Bug555Test (); + + virtual bool DoRun (void); + + void Receive (Ptr, double x, WifiMode mode, enum WifiPreamble preamble); + +private: + void RunOne (void); + void CreateOne (Vector pos, Ptr channel); + void SendOnePacket (Ptr dev); + + ObjectFactory m_manager; + ObjectFactory m_mac; + ObjectFactory m_propDelay; + + unsigned int m_numReceivedPackets; +}; + +Bug555Test::Bug555Test () + : TestCase ("Bug555") +{ +} + +void +Bug555Test::SendOnePacket (Ptr dev) +{ + Ptr p = Create (1000); + dev->Send (p, dev->GetBroadcast (), 1); +} + +bool +Bug555Test::DoRun (void) +{ + m_mac.SetTypeId ("ns3::AdhocWifiMac"); + m_propDelay.SetTypeId ("ns3::ConstantSpeedPropagationDelayModel"); + m_manager.SetTypeId ("ns3::ConstantRateWifiManager"); + + Ptr channel = CreateObject (); + Ptr propDelay = m_propDelay.Create (); + Ptr propLoss = CreateObject (); + channel->SetPropagationDelayModel (propDelay); + channel->SetPropagationLossModel (propLoss); + + Ptr txNode = CreateObject (); + Ptr txDev = CreateObject (); + Ptr txMac = m_mac.Create (); + txMac->ConfigureStandard (WIFI_PHY_STANDARD_80211a); + Ptr txMobility = CreateObject (); + Ptr txPhy = CreateObject (); + Ptr txError = CreateObject (); + txPhy->SetErrorRateModel (txError); + txPhy->SetChannel (channel); + txPhy->SetDevice (txDev); + txPhy->SetMobility (txNode); + txPhy->ConfigureStandard (WIFI_PHY_STANDARD_80211a); + + txMobility->SetPosition (Vector (0.0, 0.0, 0.0)); + txNode->AggregateObject (txMobility); + txMac->SetAddress (Mac48Address::Allocate ()); + txDev->SetMac (txMac); + txDev->SetPhy (txPhy); + txDev->SetRemoteStationManager (m_manager.Create ()); + txNode->AddDevice (txDev); + + + Ptr rxNode = CreateObject (); + Ptr rxDev = CreateObject (); + Ptr rxMac = m_mac.Create (); + rxMac->ConfigureStandard (WIFI_PHY_STANDARD_80211a); + Ptr rxMobility = CreateObject (); + Ptr rxPhy = CreateObject (); + Ptr rxError = CreateObject (); + rxPhy->SetErrorRateModel (rxError); + rxPhy->SetChannel (channel); + rxPhy->SetDevice (rxDev); + rxPhy->SetMobility (rxNode); + rxPhy->ConfigureStandard (WIFI_PHY_STANDARD_80211a); + Ptr manager = m_manager.Create (); + rxMobility->SetPosition (Vector (0.0, 0.0, 0.0)); + rxNode->AggregateObject (rxMobility); + rxMac->SetAddress (Mac48Address::Allocate ()); + rxDev->SetMac (rxMac); + rxDev->SetPhy (rxPhy); + rxDev->SetRemoteStationManager (m_manager.Create ()); + rxNode->AddDevice (rxDev); + + + rxPhy->SetReceiveOkCallback (MakeCallback (&Bug555Test::Receive, this)); + + m_numReceivedPackets = 0; + Simulator::Schedule (Seconds (1.000000), &Bug555Test::SendOnePacket, this, txDev); + Simulator::Schedule (Seconds (1.000040), &Bug555Test::SendOnePacket, this, txDev); + + Simulator::Stop (Seconds (10.0)); + Simulator::Run (); + Simulator::Destroy (); + + return (m_numReceivedPackets != 2); +} + +void +Bug555Test:: Receive (Ptr, double x, WifiMode mode, enum WifiPreamble preamble) +{ + ++m_numReceivedPackets; +} + + +//----------------------------------------------------------------------------- + class WifiTestSuite : public TestSuite { public: @@ -301,6 +418,7 @@ AddTestCase (new WifiTest); AddTestCase (new QosUtilsIsOldPacketTest); AddTestCase (new InterferenceHelperSequenceTest); // Bug 991 + AddTestCase (new Bug555Test); } WifiTestSuite g_wifiTestSuite;