applications: Add common class for sink applications
Proposed by Sharan Naribole
This commit is contained in:
@@ -15,6 +15,7 @@ build_lib(
|
||||
model/seq-ts-echo-header.cc
|
||||
model/seq-ts-header.cc
|
||||
model/seq-ts-size-header.cc
|
||||
model/sink-application.cc
|
||||
model/source-application.cc
|
||||
model/three-gpp-http-client.cc
|
||||
model/three-gpp-http-header.cc
|
||||
@@ -40,6 +41,7 @@ build_lib(
|
||||
model/seq-ts-echo-header.h
|
||||
model/seq-ts-header.h
|
||||
model/seq-ts-size-header.h
|
||||
model/sink-application.h
|
||||
model/source-application.h
|
||||
model/three-gpp-http-client.h
|
||||
model/three-gpp-http-header.h
|
||||
|
||||
85
src/applications/model/sink-application.cc
Normal file
85
src/applications/model/sink-application.cc
Normal file
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright (c) 2024 DERONNE SOFTWARE ENGINEERING
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-only
|
||||
*
|
||||
* Author: Sébastien Deronne <sebastien.deronne@gmail.com>
|
||||
*/
|
||||
|
||||
#include "sink-application.h"
|
||||
|
||||
#include "ns3/log.h"
|
||||
#include "ns3/uinteger.h"
|
||||
|
||||
namespace ns3
|
||||
{
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE("SinkApplication");
|
||||
|
||||
NS_OBJECT_ENSURE_REGISTERED(SinkApplication);
|
||||
|
||||
TypeId
|
||||
SinkApplication::GetTypeId()
|
||||
{
|
||||
static TypeId tid =
|
||||
TypeId("ns3::SinkApplication")
|
||||
.SetParent<Application>()
|
||||
.SetGroupName("Applications")
|
||||
.AddAttribute(
|
||||
"Local",
|
||||
"The Address on which to Bind the rx socket. "
|
||||
"If it is not specified, it will listen to any address.",
|
||||
AddressValue(),
|
||||
MakeAddressAccessor(&SinkApplication::SetLocal, &SinkApplication::GetLocal),
|
||||
MakeAddressChecker())
|
||||
.AddAttribute(
|
||||
"Port",
|
||||
"Port on which the application listens for incoming packets.",
|
||||
UintegerValue(INVALID_PORT),
|
||||
MakeUintegerAccessor(&SinkApplication::SetPort, &SinkApplication::GetPort),
|
||||
MakeUintegerChecker<uint32_t>());
|
||||
return tid;
|
||||
}
|
||||
|
||||
SinkApplication::SinkApplication(uint16_t defaultPort)
|
||||
: m_port{defaultPort}
|
||||
{
|
||||
NS_LOG_FUNCTION(this << defaultPort);
|
||||
}
|
||||
|
||||
SinkApplication::~SinkApplication()
|
||||
{
|
||||
NS_LOG_FUNCTION(this);
|
||||
}
|
||||
|
||||
void
|
||||
SinkApplication::SetLocal(const Address& addr)
|
||||
{
|
||||
NS_LOG_FUNCTION(this << addr);
|
||||
m_local = addr;
|
||||
}
|
||||
|
||||
Address
|
||||
SinkApplication::GetLocal() const
|
||||
{
|
||||
return m_local;
|
||||
}
|
||||
|
||||
void
|
||||
SinkApplication::SetPort(uint32_t port)
|
||||
{
|
||||
NS_LOG_FUNCTION(this << port);
|
||||
if (port == INVALID_PORT)
|
||||
{
|
||||
return;
|
||||
}
|
||||
m_port = port;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
SinkApplication::GetPort() const
|
||||
{
|
||||
return m_port;
|
||||
}
|
||||
|
||||
} // Namespace ns3
|
||||
89
src/applications/model/sink-application.h
Normal file
89
src/applications/model/sink-application.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2024 DERONNE SOFTWARE ENGINEERING
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-only
|
||||
*
|
||||
* Author: Sébastien Deronne <sebastien.deronne@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef SINK_APPLICATION_H
|
||||
#define SINK_APPLICATION_H
|
||||
|
||||
#include "ns3/address.h"
|
||||
#include "ns3/application.h"
|
||||
|
||||
#include <limits>
|
||||
|
||||
namespace ns3
|
||||
{
|
||||
|
||||
/**
|
||||
* \ingroup applications
|
||||
* \brief Base class for sink applications.
|
||||
*
|
||||
* This class can be used as a base class for sink applications.
|
||||
* A sink application is an application that is primarily used to only receive or echo packets.
|
||||
*
|
||||
* The main purpose of this base class application public API is to hold attributes for the local
|
||||
* (IPv4 or IPv6) address and port to bind to.
|
||||
*
|
||||
* There are three ways that the port value can be configured. First, and most typically, through
|
||||
* the use of a socket address (InetSocketAddress or Inet6SocketAddress) that is configured as the
|
||||
* Local address to bind to. Second, through direct configuration of the Port attribute. Third,
|
||||
* through the use of an optional constructor argument. If multiple of these port configuration
|
||||
* methods are used, it is up to subclass definition which one takes precedence; in the existing
|
||||
* subclasses in this directory, the port value configured in the Local socket address (if a socket
|
||||
* address is configured there) will take precedence.
|
||||
*/
|
||||
class SinkApplication : public Application
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief Get the type ID.
|
||||
* \return the object TypeId
|
||||
*/
|
||||
static TypeId GetTypeId();
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* \param defaultPort the default port number
|
||||
*/
|
||||
SinkApplication(uint16_t defaultPort = 0);
|
||||
~SinkApplication() override;
|
||||
|
||||
static constexpr uint32_t INVALID_PORT{std::numeric_limits<uint32_t>::max()}; //!< invalid port
|
||||
|
||||
protected:
|
||||
Address m_local; //!< Local address to bind to (address and port)
|
||||
uint32_t m_port; //!< Local port to bind to
|
||||
|
||||
private:
|
||||
/**
|
||||
* \brief set the local address
|
||||
* \param addr local address
|
||||
*/
|
||||
virtual void SetLocal(const Address& addr);
|
||||
|
||||
/**
|
||||
* \brief get the local address
|
||||
* \return the local address
|
||||
*/
|
||||
Address GetLocal() const;
|
||||
|
||||
/**
|
||||
* \brief set the server port
|
||||
* \param port server port
|
||||
*/
|
||||
virtual void SetPort(uint32_t port);
|
||||
|
||||
/**
|
||||
* \brief get the server port
|
||||
* \return the server port
|
||||
*/
|
||||
uint32_t GetPort() const;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* SINK_APPLICATION_H */
|
||||
Reference in New Issue
Block a user