Does WaveNetDevice::SendX need time delay between subsequent calls in NS3 simulation?

44 Views Asked by At

Does WaveNetDevice::SendX need time delay between subsequent calls in NS3 simulation?

I'm trying to simulate WAVE network. The codes below has been made based on NS3 example,

  • use realtime scheduler
  • create nodes in a line every 10 meters
  • set wsmp receive callback and EXTENDED_ALTERNATING scheduler
  • send 4 wsmp packets originating from different nodes (with some time delay between calls)

In this test I found all packets can be received When I put delays longer than 50~100ms, but some packets cannot be received with less delay time. This situation may occur occasionally when nearby vehicles happen to send wsmp packet to each other at the same time, so I can't understand why some packets cannot be received in simple NS3 simulation above.

I'm looking forward to the advice of NS3 expert how to send-receive packets without loss in simulation.

Codes to be used in test:

#include "ns3/node.h"
#include "ns3/packet.h"
#include "ns3/simulator.h"
#include "ns3/node-container.h"
#include "ns3/net-device-container.h"
#include "ns3/yans-wifi-helper.h"
#include "ns3/mobility-helper.h"
#include "ns3/seq-ts-header.h"
#include "ns3/wave-net-device.h"
#include "ns3/wave-mac-helper.h"
#include "ns3/wave-helper.h"

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/mobility-module.h"

using namespace ns3;
NS_LOG_COMPONENT_DEFINE("wave-test");

const int nodeCount = 20;
const int sendDelay = 10;
//const int sendDelay = 30;
//const int sendDelay = 100;

class WaveTest
{
public:
    void Init()
    {
        m_nodes = NodeContainer();
        for (int i = 0; i < nodeCount; ++i)
            m_nodes.Create(1, i);

        MobilityHelper mobility;
        Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator>();

        positionAlloc->Add(Vector(0, 0, 0));
        for (int i = 1; i < nodeCount; ++i)
            positionAlloc->Add(Vector(0, i * 10, 0));

        mobility.SetPositionAllocator(positionAlloc);
        mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
        mobility.Install(m_nodes);

        YansWifiChannelHelper waveChannel = YansWifiChannelHelper::Default();
        YansWavePhyHelper wavePhy = YansWavePhyHelper::Default();
        wavePhy.SetChannel(waveChannel.Create());
        wavePhy.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11);

        DoubleValue dTxStart = 25, dTxEnd = 25;
        UintegerValue uTxLevel = 1;

        wavePhy.Set("TxPowerStart", dTxStart);
        wavePhy.Set("TxPowerEnd", dTxEnd);
        wavePhy.Set("TxPowerLevels", uTxLevel);

        QosWaveMacHelper waveMac = QosWaveMacHelper::Default();
        WaveHelper waveHelper = WaveHelper::Default();
        m_devices = waveHelper.Install(wavePhy, waveMac, m_nodes);

        const SchInfo schInfo = SchInfo(SCH1, false, EXTENDED_ALTERNATING);
        for (uint32_t i = 0; i != m_devices.GetN(); ++i)
        {
            Ptr<WaveNetDevice> device = DynamicCast<WaveNetDevice>(m_devices.Get(i));
            device->SetReceiveCallback(MakeCallback(&WaveTest::ReceiveWsmpPacket, this));
            Simulator::Schedule(Seconds(0.0), &WaveNetDevice::StartSch, device, schInfo);
        }
    }

    void Test()
    {
        printf("Delay : %d ms\n", sendDelay);
        new std::thread([this]()
        {
            uint8_t dummy[10] = { 0, };
            SendWsmpPacket(dummy, sizeof(dummy), SCH1, 1, 0);
            usleep(sendDelay * 1000);
            SendWsmpPacket(dummy, sizeof(dummy), SCH1, 2, 1);
            usleep(sendDelay * 1000);
            SendWsmpPacket(dummy, sizeof(dummy), SCH1, 3, 2);
            usleep(sendDelay * 1000);
            SendWsmpPacket(dummy, sizeof(dummy), SCH1, 4, 3);
        });
    }

protected:
    void SendWsmpPacket(const uint8_t *data, uint32_t size, uint32_t channel, uint32_t seq, uint32_t node)
    {
        Ptr<WaveNetDevice> sender = DynamicCast<WaveNetDevice>(m_devices.Get(node));
        Vector pos = sender->GetNode()->GetObject<MobilityModel>()->GetPosition();

        const static uint16_t WSMP_PROT_NUMBER = 0x88DC;
        Mac48Address bssWildcard = Mac48Address::GetBroadcast();

        const TxInfo txInfo = TxInfo(channel);
        Ptr<Packet> p = Create<Packet>(data, size);

        SeqTsHeader seqTs;
        seqTs.SetSeq(seq);
        p->AddHeader(seqTs);
        sender->SendX(p, bssWildcard, WSMP_PROT_NUMBER, txInfo);
        printf("SEND : node %2u(%3.0f %3.0f) seq %2u\n", node, pos.x, pos.y, seq);
    }

    bool ReceiveWsmpPacket(Ptr<NetDevice> dev, Ptr<const Packet> pkt, uint16_t mode, const Address &sender)
    {
        SeqTsHeader seqTs;
        pkt->PeekHeader(seqTs);
        uint32_t seq = seqTs.GetSeq();

        Ptr<Packet> rcvPacket = pkt->Copy();
        rcvPacket->RemoveHeader(seqTs);
        uint32_t rcvNode = dev->GetNode()->GetSystemId();
        Vector pos = dev->GetNode()->GetObject<MobilityModel>()->GetPosition();

        uint32_t sendNode = -1;
        for (uint32_t i = 0; i != m_devices.GetN(); ++i)
        {
            Ptr<WaveNetDevice> device = DynamicCast<WaveNetDevice>(m_devices.Get(i));
            if (device->GetAddress() == sender)
            {
                sendNode = device->GetNode()->GetId();
                break;
            }
        }

        printf("RECV : node %2u(%3.0f %3.0f) seq %2u from %2u\n", rcvNode, pos.x, pos.y, seq, sendNode);
        return true;
    }

    NodeContainer m_nodes;
    NetDeviceContainer m_devices;
};

int main(int argc, char *argv[])
{
    GlobalValue::Bind("SimulatorImplementationType", StringValue("ns3::RealtimeSimulatorImpl"));

    WaveTest waveTest;
    waveTest.Init();
    waveTest.Test();

    Simulator::Run();
    Simulator::Destroy();

    return 0;
}

Result when delay=100

Delay : 100 ms
SEND : node  0(  0   0) seq  1
SEND : node  1(  0  10) seq  2
RECV : node  0(  0   0) seq  2 from  1
RECV : node  2(  0  20) seq  2 from  1
RECV : node  3(  0  30) seq  2 from  1
RECV : node  4(  0  40) seq  2 from  1
RECV : node  5(  0  50) seq  2 from  1
RECV : node  6(  0  60) seq  2 from  1
RECV : node  7(  0  70) seq  2 from  1
RECV : node  8(  0  80) seq  2 from  1
RECV : node  9(  0  90) seq  2 from  1
RECV : node 10(  0 100) seq  2 from  1
RECV : node 11(  0 110) seq  2 from  1
SEND : node  2(  0  20) seq  3
RECV : node  1(  0  10) seq  3 from  2
RECV : node  3(  0  30) seq  3 from  2
RECV : node  0(  0   0) seq  3 from  2
RECV : node  4(  0  40) seq  3 from  2
RECV : node  5(  0  50) seq  3 from  2
RECV : node  6(  0  60) seq  3 from  2
RECV : node  7(  0  70) seq  3 from  2
RECV : node  8(  0  80) seq  3 from  2
RECV : node  9(  0  90) seq  3 from  2
RECV : node 10(  0 100) seq  3 from  2
RECV : node 11(  0 110) seq  3 from  2
RECV : node 12(  0 120) seq  3 from  2
SEND : node  3(  0  30) seq  4
RECV : node  2(  0  20) seq  4 from  3
RECV : node  4(  0  40) seq  4 from  3
RECV : node  1(  0  10) seq  4 from  3
RECV : node  5(  0  50) seq  4 from  3
RECV : node  0(  0   0) seq  4 from  3
RECV : node  6(  0  60) seq  4 from  3
RECV : node  7(  0  70) seq  4 from  3
RECV : node  8(  0  80) seq  4 from  3
RECV : node  9(  0  90) seq  4 from  3
RECV : node 10(  0 100) seq  4 from  3
RECV : node 11(  0 110) seq  4 from  3
RECV : node 12(  0 120) seq  4 from  3
RECV : node 13(  0 130) seq  4 from  3

Result when delay=10

Delay : 10 ms
SEND : node  0(  0   0) seq  1
SEND : node  1(  0  10) seq  2
SEND : node  2(  0  20) seq  3
SEND : node  3(  0  30) seq  4
RECV : node  0(  0   0) seq  2 from  1
RECV : node  4(  0  40) seq  4 from  3
0

There are 0 best solutions below