Tweaks to the collision tests

This commit is contained in:
Tommaso Pecorella
2014-04-08 14:58:28 +02:00
parent d486f26151
commit 92b2936c5d
4 changed files with 91 additions and 59 deletions

View File

@@ -90,6 +90,11 @@ MAC
###
The MAC at present implements the unslotted CSMA/CA variant, without beaconing.
The implemented MAC is similar to Contiki's NullMAC, i.e., a MAC without sleep
features. The radio is assiumed to be always active (receiving or transmitting).
Moreover, frame reception is disabled while performing the CCA.
The main API supported is the data transfer API
(McpsDataRequest/Indication/Confirm). CSMA/CA according to Stc 802.15.4-2006,
section 7.5.1.4 is supported. Frame reception and rejection

View File

@@ -180,7 +180,7 @@ LrWpanNetDevice::SetChannel (Ptr<SpectrumChannel> channel)
Ptr<LrWpanMac>
LrWpanNetDevice::GetMac (void) const
{
NS_LOG_FUNCTION (this);
// NS_LOG_FUNCTION (this);
return m_mac;
}

View File

@@ -24,6 +24,7 @@
#include "lr-wpan-spectrum-signal-parameters.h"
#include "lr-wpan-spectrum-value-helper.h"
#include "lr-wpan-error-model.h"
#include "lr-wpan-net-device.h"
#include <ns3/log.h>
#include <ns3/abort.h>
#include <ns3/simulator.h>
@@ -37,6 +38,10 @@
NS_LOG_COMPONENT_DEFINE ("LrWpanPhy");
#undef NS_LOG_APPEND_CONTEXT
#define NS_LOG_APPEND_CONTEXT \
std::clog << "[address " << DynamicCast<LrWpanNetDevice> (m_device)->GetMac ()->GetShortAddress () << "] ";
namespace ns3 {
NS_OBJECT_ENSURE_REGISTERED (LrWpanPhy);
@@ -251,6 +256,7 @@ LrWpanPhy::StartRx (Ptr<SpectrumSignalParameters> spectrumRxParams)
NS_LOG_FUNCTION (this << spectrumRxParams);
LrWpanSpectrumValueHelper psdHelper;
std::cout << Simulator::Now () << " StartRx " << this << std::endl;
Ptr<LrWpanSpectrumSignalParameters> lrWpanRxParams = DynamicCast<LrWpanSpectrumSignalParameters> (spectrumRxParams);
NS_ASSERT (lrWpanRxParams != 0);
@@ -325,6 +331,8 @@ LrWpanPhy::EndRx (Ptr<LrWpanSpectrumSignalParameters> params)
NS_LOG_FUNCTION (this);
NS_ASSERT (params != 0);
std::cout << Simulator::Now () << " EndRx " << this << " " << int(m_trxState) << " - ";
// Calculate whether packet was lost.
LrWpanSpectrumValueHelper psdHelper;
Ptr<LrWpanSpectrumSignalParameters> currentRxParams = m_currentRxPacket.first;
@@ -354,8 +362,13 @@ LrWpanPhy::EndRx (Ptr<LrWpanSpectrumSignalParameters> params)
if (m_random.GetValue () < per)
{
// The packet was destroyed, drop the packet after reception.
std::cout << "discarding " << sinr << " - " << per;
m_currentRxPacket.second = true;
}
else
{
std::cout << "processing " << sinr << " - " << per;
}
}
else
{
@@ -365,6 +378,8 @@ LrWpanPhy::EndRx (Ptr<LrWpanSpectrumSignalParameters> params)
}
}
std::cout << std::endl;
// Update the interference.
m_signal->RemoveSignal (params->psd);
m_rxLastUpdate = Simulator::Now ();
@@ -454,6 +469,7 @@ LrWpanPhy::PdDataRequest (const uint32_t psduLength, Ptr<Packet> p)
Ptr<PacketBurst> pb = CreateObject<PacketBurst> ();
pb->AddPacket (p);
txParams->packetBurst = pb;
std::cout << "** " << Simulator::Now () << " - StartTx " << this << std::endl;
m_channel->StartTx (txParams);
m_pdDataRequest = Simulator::Schedule (txParams->duration, &LrWpanPhy::EndTx, this);
ChangeTrxState (IEEE_802_15_4_PHY_BUSY_TX);
@@ -497,6 +513,7 @@ void
LrWpanPhy::PlmeCcaRequest (void)
{
NS_LOG_FUNCTION (this);
if (m_trxState == IEEE_802_15_4_PHY_RX_ON || m_trxState == IEEE_802_15_4_PHY_BUSY_RX)
{
//call StartRx or ED and then get updated m_rxTotalPower in EndCCA?
@@ -578,6 +595,8 @@ LrWpanPhy::PlmeSetTRXStateRequest (LrWpanPhyEnumeration state)
{
NS_LOG_FUNCTION (this << state);
// std::cout << Simulator::Now () << " PlmeSetTRXStateRequest " << int (state) << std::endl;
// Check valid states (Table 14)
NS_ABORT_IF ( (state != IEEE_802_15_4_PHY_RX_ON)
&& (state != IEEE_802_15_4_PHY_TRX_OFF)

View File

@@ -120,9 +120,9 @@ LrWpanCollisionTestCase::DoRun (void)
dev1->GetCsmaCa ()->SetMacMinBE (0);
dev2->GetCsmaCa ()->SetMacMinBE (0);
Ptr<Packet> p0 = Create<Packet> (50);
Ptr<Packet> p0 = Create<Packet> (20);
Ptr<Packet> p1 = Create<Packet> (60);
Ptr<Packet> p2 = Create<Packet> (120);
Ptr<Packet> p2 = Create<Packet> (100);
McpsDataRequestParams params;
params.m_srcAddrMode = SHORT_ADDR;
@@ -131,77 +131,85 @@ LrWpanCollisionTestCase::DoRun (void)
params.m_msduHandle = 0;
// params.m_txOptions = TX_OPTION_ACK;
// First case: concurrent tx and no ACKs
m_rxPackets = 0;
params.m_dstAddr = Mac16Address ("00:02");
Simulator::Schedule (Seconds (0.0),
&LrWpanMac::McpsDataRequest,
dev0->GetMac (), params, p0);
params.m_dstAddr = Mac16Address ("00:01");
Simulator::Schedule (Seconds (0.0),
&LrWpanMac::McpsDataRequest,
dev1->GetMac (), params, p1);
Simulator::Run ();
NS_TEST_EXPECT_MSG_EQ (m_rxPackets, 0, "Not received a packet (as expected)");
// Second case: concurrent tx and ACKs
m_rxPackets = 0;
params.m_txOptions = TX_OPTION_ACK;
params.m_dstAddr = Mac16Address ("00:02");
Simulator::Schedule (Seconds (0.0),
&LrWpanMac::McpsDataRequest,
dev0->GetMac (), params, p0);
params.m_dstAddr = Mac16Address ("00:01");
Simulator::Schedule (Seconds (0.0),
&LrWpanMac::McpsDataRequest,
dev1->GetMac (), params, p1);
Simulator::Run ();
NS_TEST_EXPECT_MSG_EQ (m_rxPackets, 1, "Received a packet (as expected)");
// // First case: concurrent tx and no ACKs
// std::cout << "*** First test " << std::endl;
// m_rxPackets = 0;
// params.m_dstAddr = Mac16Address ("00:02");
// Simulator::Schedule (Seconds (0.0),
// &LrWpanMac::McpsDataRequest,
// dev0->GetMac (), params, p0);
//
// params.m_dstAddr = Mac16Address ("00:01");
// Simulator::Schedule (Seconds (0.0),
// &LrWpanMac::McpsDataRequest,
// dev1->GetMac (), params, p1);
//
// Simulator::Run ();
//
// NS_TEST_EXPECT_MSG_EQ (m_rxPackets, 0, "Not received a packet (as expected)");
//
// // Second case: concurrent tx and ACKs
// std::cout << "*** Second test " << std::endl;
// m_rxPackets = 0;
// params.m_txOptions = TX_OPTION_ACK;
//
// params.m_dstAddr = Mac16Address ("00:02");
// Simulator::Schedule (Seconds (0.0),
// &LrWpanMac::McpsDataRequest,
// dev0->GetMac (), params, p0);
//
// params.m_dstAddr = Mac16Address ("00:01");
// Simulator::Schedule (Seconds (0.0),
// &LrWpanMac::McpsDataRequest,
// dev1->GetMac (), params, p1);
//
// Simulator::Run ();
//
// NS_TEST_EXPECT_MSG_EQ (m_rxPackets, 1, "Received a packet (as expected)");
// Third case: two concurrent tx and no ACKs
std::cout << "*** Third test " << Seconds (0.0) << " " << Seconds (0.0001) << std::endl;
m_rxPackets = 0;
params.m_txOptions = 0;
params.m_dstAddr = Mac16Address ("00:01");
Simulator::Schedule (Seconds (0.0),
&LrWpanMac::McpsDataRequest,
dev1->GetMac (), params, p2);
// LogComponentEnable("LrWpanMac",LOG_LEVEL_ALL);
// LogComponentEnable("LrWpanPhy",LOG_LEVEL_ALL);
// LogComponentEnableAll (LOG_PREFIX_TIME);
params.m_dstAddr = Mac16Address ("00:01");
Simulator::Schedule (Seconds (0.0),
Simulator::Schedule (Seconds (0.0001),
&LrWpanMac::McpsDataRequest,
dev2->GetMac (), params, p2);
params.m_dstAddr = Mac16Address ("00:01");
Simulator::Schedule (Seconds (0.0002),
&LrWpanMac::McpsDataRequest,
dev1->GetMac (), params, p0);
Simulator::Run ();
std::cout << "m_rxPackets = " << int(m_rxPackets) << std::endl;
NS_TEST_EXPECT_MSG_EQ (m_rxPackets, 0, "Received a packet (as expected)");
// Fourth case: two concurrent tx and ACKs
m_rxPackets = 0;
params.m_txOptions = TX_OPTION_ACK;
params.m_dstAddr = Mac16Address ("00:01");
Simulator::Schedule (Seconds (0.0),
&LrWpanMac::McpsDataRequest,
dev1->GetMac (), params, p0);
params.m_dstAddr = Mac16Address ("00:01");
Simulator::Schedule (Seconds (0.0),
&LrWpanMac::McpsDataRequest,
dev2->GetMac (), params, p1);
Simulator::Run ();
std::cout << "m_rxPackets = " << int(m_rxPackets) << std::endl;
NS_TEST_EXPECT_MSG_EQ (m_rxPackets, 2, "Received two packets (as expected)");
// // Fourth case: two concurrent tx and ACKs
// std::cout << "*** Fourth test " << std::endl;
// m_rxPackets = 0;
// params.m_txOptions = TX_OPTION_ACK;
//
// params.m_dstAddr = Mac16Address ("00:01");
// Simulator::Schedule (Seconds (0.0),
// &LrWpanMac::McpsDataRequest,
// dev1->GetMac (), params, p0);
//
// params.m_dstAddr = Mac16Address ("00:01");
// Simulator::Schedule (Seconds (0.0),
// &LrWpanMac::McpsDataRequest,
// dev2->GetMac (), params, p1);
//
// Simulator::Run ();
//
// std::cout << "m_rxPackets = " << int(m_rxPackets) << std::endl;
// NS_TEST_EXPECT_MSG_EQ (m_rxPackets, 2, "Received two packets (as expected)");
Simulator::Destroy ();
}