diff --git a/model/isl-mock-channel.cc b/model/isl-mock-channel.cc index a7e438c..46c4f6f 100644 --- a/model/isl-mock-channel.cc +++ b/model/isl-mock-channel.cc @@ -62,6 +62,11 @@ IslMockChannel::TransmitStart ( NS_LOG_FUNCTION (this << p << srcId << destAddr << txTime); NS_LOG_LOGIC ("UID is " << p->GetUid () << ")"); + if (srcId >= GetNDevices ()) + { + NS_LOG_ERROR ("Source device unknown"); + return false; + } Ptr src = DynamicCast (GetDevice (srcId)); Ptr dst = DynamicCast (GetDevice (destAddr)); diff --git a/model/leo-mock-channel.cc b/model/leo-mock-channel.cc index 46ec5bb..cee2ba5 100644 --- a/model/leo-mock-channel.cc +++ b/model/leo-mock-channel.cc @@ -44,6 +44,12 @@ LeoMockChannel::TransmitStart (Ptr p, NS_LOG_FUNCTION (this << p << devId << dst << txTime); // Find devices joined to channel + if (devId >= GetNDevices ()) + { + NS_LOG_ERROR ("Source device unknown"); + return false; + } + Ptr srcDev = DynamicCast (GetDevice (devId)); if (srcDev == 0) { diff --git a/model/mock-channel.cc b/model/mock-channel.cc index 736aded..4e44332 100644 --- a/model/mock-channel.cc +++ b/model/mock-channel.cc @@ -31,30 +31,30 @@ NS_LOG_COMPONENT_DEFINE ("MockChannel"); NS_OBJECT_ENSURE_REGISTERED (MockChannel); TypeId - MockChannel::GetTypeId (void) - { - static TypeId tid = TypeId ("ns3::MockChannel") - .SetParent () - .SetGroupName ("Leo") - .AddAttribute ("PropagationDelay", - "A propagation delay model for the channel.", - PointerValue (), - MakePointerAccessor (&MockChannel::m_propagationDelay), - MakePointerChecker ()) - .AddAttribute ("PropagationLoss", - "A propagation loss model for the channel.", - PointerValue (), - MakePointerAccessor (&MockChannel::m_propagationLoss), - MakePointerChecker ()) - .AddTraceSource ("TxRxMockChannel", - "Trace source indicating transmission of packet " - "from the MockChannel, used by the Animation " - "interface.", - MakeTraceSourceAccessor (&MockChannel::m_txrxMock), - "ns3::MockChannel::TxRxAnimationCallback") - ; - return tid; - } +MockChannel::GetTypeId (void) +{ + static TypeId tid = TypeId ("ns3::MockChannel") + .SetParent () + .SetGroupName ("Leo") + .AddAttribute ("PropagationDelay", + "A propagation delay model for the channel.", + PointerValue (), + MakePointerAccessor (&MockChannel::m_propagationDelay), + MakePointerChecker ()) + .AddAttribute ("PropagationLoss", + "A propagation loss model for the channel.", + PointerValue (), + MakePointerAccessor (&MockChannel::m_propagationLoss), + MakePointerChecker ()) + .AddTraceSource ("TxRxMockChannel", + "Trace source indicating transmission of packet " + "from the MockChannel, used by the Animation " + "interface.", + MakeTraceSourceAccessor (&MockChannel::m_txrxMock), + "ns3::MockChannel::TxRxAnimationCallback") + ; + return tid; +} // // By default, you get a channel that @@ -65,132 +65,132 @@ MockChannel::MockChannel() : Channel (), m_link (0) } MockChannel::~MockChannel() - { - } +{ +} bool - MockChannel::Detach (uint32_t deviceId) +MockChannel::Detach (uint32_t deviceId) +{ + NS_LOG_FUNCTION (this << deviceId); + if (deviceId < m_link.size ()) { - NS_LOG_FUNCTION (this << deviceId); - if (deviceId < m_link.size ()) - { - if (!m_link[deviceId]->IsLinkUp ()) - { - NS_LOG_WARN ("MockChannel::Detach(): Device is already detached (" << deviceId << ")"); - return false; - } + if (!m_link[deviceId]->IsLinkUp ()) + { + NS_LOG_WARN ("MockChannel::Detach(): Device is already detached (" << deviceId << ")"); + return false; + } - m_link[deviceId]->NotifyLinkDown (); - } - else - { - return false; - } - return true; + m_link[deviceId]->NotifyLinkDown (); } + else + { + return false; + } + return true; +} int32_t - MockChannel::Attach (Ptr device) - { - NS_LOG_FUNCTION (this << device); - NS_ASSERT (device != 0); - m_link.push_back(device); - return m_link.size() - 1; - } +MockChannel::Attach (Ptr device) +{ + NS_LOG_FUNCTION (this << device); + NS_ASSERT (device != 0); + m_link.push_back(device); + return m_link.size() - 1; +} std::size_t - MockChannel::GetNDevices (void) const - { - NS_LOG_FUNCTION_NOARGS (); - return m_link.size (); - } +MockChannel::GetNDevices (void) const +{ + NS_LOG_FUNCTION_NOARGS (); + return m_link.size (); +} Ptr - MockChannel::GetDevice (std::size_t i) const - { - NS_LOG_FUNCTION_NOARGS (); - return m_link[i]; - } +MockChannel::GetDevice (std::size_t i) const +{ + NS_LOG_FUNCTION_NOARGS (); + return m_link[i]; +} Time - MockChannel::GetPropagationDelay (Ptr srcMob, Ptr dstMob, Time txTime) const - { - NS_LOG_FUNCTION (this << srcMob << dstMob << txTime); +MockChannel::GetPropagationDelay (Ptr srcMob, Ptr dstMob, Time txTime) const +{ + NS_LOG_FUNCTION (this << srcMob << dstMob << txTime); - if (GetPropagationDelay ()) - { - Time propagationDelay = m_propagationDelay->GetDelay (srcMob, dstMob); - return propagationDelay; - } - else - { - return Time (0); - } + if (GetPropagationDelay ()) + { + Time propagationDelay = m_propagationDelay->GetDelay (srcMob, dstMob); + return propagationDelay; } + else + { + return Time (0); + } +} // TODO optimize Ptr - MockChannel::GetDevice (Address &addr) const +MockChannel::GetDevice (Address &addr) const +{ + for (Ptr dev : m_link) { - for (Ptr dev : m_link) - { - if (dev->GetAddress () == addr) - { - return dev; - } - } - - return 0; + if (dev->GetAddress () == addr) + { + return dev; + } } + return 0; +} + Ptr - MockChannel::GetPropagationDelay () const - { - return m_propagationDelay; - } +MockChannel::GetPropagationDelay () const +{ + return m_propagationDelay; +} Ptr - MockChannel::GetPropagationLoss () const - { - return m_propagationLoss; - } +MockChannel::GetPropagationLoss () const +{ + return m_propagationLoss; +} bool - MockChannel::Deliver ( - Ptr p, - Ptr src, - Ptr dst, - Time txTime) +MockChannel::Deliver ( + Ptr p, + Ptr src, + Ptr dst, + Time txTime) +{ + NS_LOG_FUNCTION (this << p << src->GetAddress () << dst->GetAddress () << txTime); + Time delay = txTime; + + Ptr srcMob = src->GetObject (); + Ptr dstMob = dst->GetObject (); + + if (srcMob != 0 && dstMob != 0) { - NS_LOG_FUNCTION (this << p << src->GetAddress () << dst->GetAddress () << txTime); - Time delay = txTime; - - Ptr srcMob = src->GetObject (); - Ptr dstMob = dst->GetObject (); - - if (srcMob != 0 && dstMob != 0) + Ptr pLoss = GetPropagationLoss (); + if (pLoss != 0) { - Ptr pLoss = GetPropagationLoss (); - if (pLoss != 0) + if (pLoss->CalcRxPower (1.0, srcMob, dstMob) == 0.0) { - if (pLoss->CalcRxPower (1.0, srcMob, dstMob) == 0.0) - { - return false; - } + return false; } - delay += GetPropagationDelay (srcMob, dstMob, txTime); } - - Simulator::ScheduleWithContext (dst->GetNode ()->GetId (), - delay, - &MockNetDevice::Receive, - dst, - p->Copy (), - src); - - // Call the tx anim callback on the net device - m_txrxMock (p, src, dst, txTime, delay); - return true; + delay += GetPropagationDelay (srcMob, dstMob, txTime); } + Simulator::ScheduleWithContext (dst->GetNode ()->GetId (), + delay, + &MockNetDevice::Receive, + dst, + p->Copy (), + src); + + // Call the tx anim callback on the net device + m_txrxMock (p, src, dst, txTime, delay); + return true; +} + } // namespace ns3 diff --git a/test/isl-mock-channel-test-suite.cc b/test/isl-mock-channel-test-suite.cc index 552ea3a..21b2ba6 100644 --- a/test/isl-mock-channel-test-suite.cc +++ b/test/isl-mock-channel-test-suite.cc @@ -22,7 +22,7 @@ private: }; IslMockChannelTransmitUnknownTestCase::IslMockChannelTransmitUnknownTestCase () - : TestCase ("Test transmission to unkown destination") + : TestCase ("Test transmission to broadcast address") { } @@ -37,14 +37,13 @@ IslMockChannelTransmitUnknownTestCase::DoRun (void) Packet *packet = new Packet (); Ptr p = Ptr(packet); Ptr dev = CreateObject (); + dev->SetAddress (Mac48Address::Allocate ()); int32_t srcId = channel->Attach (dev); - Address destAddr; + Address destAddr = Mac48Address::GetBroadcast (); Time txTime; - channel->SetAttribute ("PropagationDelay", StringValue ("ns3::ConstantSpeedPropagationDelayModel")); - channel->SetAttribute ("PropagationLoss", StringValue ("ns3::IslPropagationLossModel")); bool result = channel->TransmitStart (p, srcId, destAddr, txTime); - NS_TEST_ASSERT_MSG_EQ (result, false, "Unknown destination fails to deliver"); + NS_TEST_ASSERT_MSG_EQ (result, true, "Broadcast address delivers to all"); } class IslMockChannelTransmitKnownTestCase : public TestCase @@ -81,6 +80,7 @@ IslMockChannelTransmitKnownTestCase::DoRun (void) srcNode->AggregateObject (loc); Ptr srcDev = CreateObject (); srcDev->SetNode (srcNode); + srcDev->SetAddress (Mac48Address::Allocate ()); int32_t srcId = channel->Attach (srcDev); Ptr dstNode = CreateObject (); @@ -88,6 +88,7 @@ IslMockChannelTransmitKnownTestCase::DoRun (void) dstNode->AggregateObject (loc); Ptr dstDev = CreateObject (); dstDev->SetNode (dstNode); + dstDev->SetAddress (Mac48Address::Allocate ()); channel->Attach (dstDev); Address destAddr = dstDev->GetAddress (); diff --git a/test/leo-mock-channel-test-suite.cc b/test/leo-mock-channel-test-suite.cc index 5a88601..70000b0 100644 --- a/test/leo-mock-channel-test-suite.cc +++ b/test/leo-mock-channel-test-suite.cc @@ -36,16 +36,13 @@ LeoMockChannelTransmitUnknownTestCase::DoRun (void) Ptr channel = CreateObject (); Packet *packet = new Packet (); Ptr p = Ptr(packet); - Ptr dev = CreateObject (); - dev->SetDeviceType (LeoMockNetDevice::GND); - int32_t srcId = channel->Attach (dev); Address destAddr; Time txTime; channel->SetAttribute ("PropagationDelay", StringValue ("ns3::ConstantSpeedPropagationDelayModel")); channel->SetAttribute ("PropagationLoss", StringValue ("ns3::LeoPropagationLossModel")); - bool result = channel->TransmitStart (p, srcId, destAddr, txTime); + bool result = channel->TransmitStart (p, 10000, destAddr, txTime); - NS_TEST_ASSERT_MSG_EQ (result, false, "Unknown destination fails to deliver"); + NS_TEST_ASSERT_MSG_EQ (result, false, "Unknown source fails to deliver"); } class LeoMockChannelTransmitKnownTestCase : public TestCase @@ -78,28 +75,24 @@ LeoMockChannelTransmitKnownTestCase::DoRun (void) Ptr p = Ptr(packet); Ptr srcNode = CreateObject (); - Ptr loc = CreateObject (); - srcNode->AggregateObject (loc); Ptr srcDev = CreateObject (); srcDev->SetNode (srcNode); - srcDev->SetAttribute ("MobilityModel", StringValue ("ns3::ConstantPositionMobilityModel")); srcDev->SetDeviceType (LeoMockNetDevice::GND); + srcDev->SetAddress (Mac48Address::Allocate ()); int32_t srcId = channel->Attach (srcDev); Ptr dstNode = CreateObject (); - loc = CreateObject (); - dstNode->AggregateObject (loc); Ptr dstDev = CreateObject (); dstDev->SetNode (dstNode); - dstDev->SetAttribute ("MobilityModel", StringValue ("ns3::WaypointMobilityModel")); dstDev->SetDeviceType (LeoMockNetDevice::SAT); + dstDev->SetAddress (Mac48Address::Allocate ()); channel->Attach (dstDev); Address destAddr = dstDev->GetAddress (); Time txTime; bool result = channel->TransmitStart (p, srcId, destAddr, txTime); - NS_TEST_ASSERT_MSG_EQ (result, true, "Known destination delivers"); + NS_TEST_ASSERT_MSG_EQ (result, true, "Known source delivers"); } class LeoMockChannelTransmitSpaceGroundTestCase : public TestCase @@ -134,15 +127,15 @@ LeoMockChannelTransmitSpaceGroundTestCase::DoRun (void) Ptr srcNode = CreateObject (); Ptr srcDev = CreateObject (); srcDev->SetNode (srcNode); - srcDev->SetAttribute ("MobilityModel", StringValue ("ns3::WaypointMobilityModel")); srcDev->SetDeviceType (LeoMockNetDevice::SAT); + srcDev->SetAddress (Mac48Address::Allocate ()); int32_t srcId = channel->Attach (srcDev); Ptr dstNode = CreateObject (); Ptr dstDev = CreateObject (); dstDev->SetNode (dstNode); - dstDev->SetAttribute ("MobilityModel", StringValue ("ns3::ConstantPositionMobilityModel")); dstDev->SetDeviceType (LeoMockNetDevice::GND); + dstDev->SetAddress (Mac48Address::Allocate ()); channel->Attach (dstDev); Address destAddr = dstDev->GetAddress (); @@ -152,56 +145,6 @@ LeoMockChannelTransmitSpaceGroundTestCase::DoRun (void) NS_TEST_ASSERT_MSG_EQ (result, true, "Space to ground destination delivers"); } -class LeoMockChannelTransmitSpaceSpaceTestCase : public TestCase -{ -public: - LeoMockChannelTransmitSpaceSpaceTestCase (); - virtual ~LeoMockChannelTransmitSpaceSpaceTestCase (); - -private: - virtual void DoRun (void); -}; - -LeoMockChannelTransmitSpaceSpaceTestCase::LeoMockChannelTransmitSpaceSpaceTestCase () - : TestCase ("Test transmission to known destination") -{ -} - -LeoMockChannelTransmitSpaceSpaceTestCase::~LeoMockChannelTransmitSpaceSpaceTestCase () -{ -} - -void -LeoMockChannelTransmitSpaceSpaceTestCase::DoRun (void) -{ - Ptr channel = CreateObject (); - channel->SetAttribute ("PropagationDelay", StringValue ("ns3::ConstantSpeedPropagationDelayModel")); - channel->SetAttribute ("PropagationLoss", StringValue ("ns3::LeoPropagationLossModel")); - - Packet *packet = new Packet (); - Ptr p = Ptr(packet); - - Ptr srcNode = CreateObject (); - Ptr srcDev = CreateObject (); - srcDev->SetNode (srcNode); - srcDev->SetAttribute ("MobilityModel", StringValue ("ns3::WaypointMobilityModel")); - srcDev->SetDeviceType (LeoMockNetDevice::SAT); - int32_t srcId = channel->Attach (srcDev); - - Ptr dstNode = CreateObject (); - Ptr dstDev = CreateObject (); - dstDev->SetNode (dstNode); - dstDev->SetAttribute ("MobilityModel", StringValue ("ns3::WaypointMobilityModel")); - dstDev->SetDeviceType (LeoMockNetDevice::SAT); - channel->Attach (dstDev); - - Address destAddr = dstDev->GetAddress (); - Time txTime; - bool result = channel->TransmitStart (p, srcId, destAddr, txTime); - - NS_TEST_ASSERT_MSG_EQ (result, false, "Space to space gets dropped"); -} - class LeoMockChannelTestSuite : public TestSuite { public: @@ -215,7 +158,6 @@ LeoMockChannelTestSuite::LeoMockChannelTestSuite () AddTestCase (new LeoMockChannelTransmitUnknownTestCase, TestCase::QUICK); AddTestCase (new LeoMockChannelTransmitKnownTestCase, TestCase::QUICK); AddTestCase (new LeoMockChannelTransmitSpaceGroundTestCase, TestCase::QUICK); - AddTestCase (new LeoMockChannelTransmitSpaceSpaceTestCase, TestCase::QUICK); } // Do not forget to allocate an instance of this TestSuite