/* * SPDX-License-Identifier: GPL-2.0-only */ #include "tutorial-app.h" #include "ns3/applications-module.h" using namespace ns3; TutorialApp::TutorialApp() : m_socket(nullptr), m_peer(), m_packetSize(0), m_nPackets(0), m_dataRate(0), m_sendEvent(), m_running(false), m_packetsSent(0) { } TutorialApp::~TutorialApp() { m_socket = nullptr; } /* static */ TypeId TutorialApp::GetTypeId() { static TypeId tid = TypeId("TutorialApp") .SetParent() .SetGroupName("Tutorial") .AddConstructor(); return tid; } void TutorialApp::Setup(Ptr socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate) { m_socket = socket; m_peer = address; m_packetSize = packetSize; m_nPackets = nPackets; m_dataRate = dataRate; } void TutorialApp::StartApplication() { m_running = true; m_packetsSent = 0; m_socket->Bind(); m_socket->Connect(m_peer); SendPacket(); } void TutorialApp::StopApplication() { m_running = false; if (m_sendEvent.IsPending()) { Simulator::Cancel(m_sendEvent); } if (m_socket) { m_socket->Close(); } } void TutorialApp::SendPacket() { Ptr packet = Create(m_packetSize); m_socket->Send(packet); if (++m_packetsSent < m_nPackets) { ScheduleTx(); } } void TutorialApp::ScheduleTx() { if (m_running) { Time tNext(Seconds(m_packetSize * 8 / static_cast(m_dataRate.GetBitRate()))); m_sendEvent = Simulator::Schedule(tNext, &TutorialApp::SendPacket, this); } }