From 37190f5db8853fad5bd291c4ea9bd200650e8ad4 Mon Sep 17 00:00:00 2001 From: Tommaso Pecorella Date: Tue, 6 Dec 2022 13:05:37 -0800 Subject: [PATCH] internet-apps: Add PingHelper --- src/internet-apps/CMakeLists.txt | 2 + src/internet-apps/helper/ping-helper.cc | 85 +++++++++++++++++ src/internet-apps/helper/ping-helper.h | 116 ++++++++++++++++++++++++ 3 files changed, 203 insertions(+) create mode 100644 src/internet-apps/helper/ping-helper.cc create mode 100644 src/internet-apps/helper/ping-helper.h diff --git a/src/internet-apps/CMakeLists.txt b/src/internet-apps/CMakeLists.txt index 1defacf28..7ff47b6c5 100644 --- a/src/internet-apps/CMakeLists.txt +++ b/src/internet-apps/CMakeLists.txt @@ -2,6 +2,7 @@ build_lib( LIBNAME internet-apps SOURCE_FILES helper/dhcp-helper.cc + helper/ping-helper.cc helper/ping6-helper.cc helper/radvd-helper.cc helper/v4ping-helper.cc @@ -18,6 +19,7 @@ build_lib( model/v4traceroute.cc HEADER_FILES helper/dhcp-helper.h + helper/ping-helper.h helper/ping6-helper.h helper/radvd-helper.h helper/v4ping-helper.h diff --git a/src/internet-apps/helper/ping-helper.cc b/src/internet-apps/helper/ping-helper.cc new file mode 100644 index 000000000..2e601fd00 --- /dev/null +++ b/src/internet-apps/helper/ping-helper.cc @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2022 Universita' di Firenze, Italy + * Copyright (c) 2008-2009 Strasbourg University (original Ping6 helper) + * Copyright (c) 2008 INRIA (original v4Ping helper) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Tommaso Pecorella + * + * Derived from original v4Ping helper (author: Mathieu Lacage) + * Derived from original ping6 helper (author: Sebastien Vincent) + */ + +#include "ping-helper.h" + +#include "ns3/names.h" +#include "ns3/ping.h" + +namespace ns3 +{ + +PingHelper::PingHelper() +{ + m_factory.SetTypeId("ns3::Ping"); +} + +PingHelper::PingHelper(Address remote, Address local) +{ + m_factory.SetTypeId("ns3::Ping"); + m_factory.Set("Destination", AddressValue(remote)); + m_factory.Set("InterfaceAddress", AddressValue(local)); +} + +void +PingHelper::SetAttribute(std::string name, const AttributeValue& value) +{ + m_factory.Set(name, value); +} + +ApplicationContainer +PingHelper::Install(Ptr node) const +{ + return ApplicationContainer(InstallPriv(node)); +} + +ApplicationContainer +PingHelper::Install(std::string nodeName) const +{ + Ptr node = Names::Find(nodeName); + return ApplicationContainer(InstallPriv(node)); +} + +ApplicationContainer +PingHelper::Install(NodeContainer c) const +{ + ApplicationContainer apps; + for (NodeContainer::Iterator i = c.Begin(); i != c.End(); ++i) + { + apps.Add(InstallPriv(*i)); + } + + return apps; +} + +Ptr +PingHelper::InstallPriv(Ptr node) const +{ + Ptr app = m_factory.Create(); + node->AddApplication(app); + + return app; +} + +} // namespace ns3 diff --git a/src/internet-apps/helper/ping-helper.h b/src/internet-apps/helper/ping-helper.h new file mode 100644 index 000000000..c2cf4287e --- /dev/null +++ b/src/internet-apps/helper/ping-helper.h @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2022 Universita' di Firenze, Italy + * Copyright (c) 2008-2009 Strasbourg University (original Ping6 helper) + * Copyright (c) 2008 INRIA (original v4Ping helper) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Tommaso Pecorella + * + * Derived from original v4Ping helper (author: Mathieu Lacage) + * Derived from original ping6 helper (author: Sebastien Vincent) + */ + +#ifndef PING_HELPER_H +#define PING_HELPER_H + +#include "ns3/application-container.h" +#include "ns3/ipv4-address.h" +#include "ns3/ipv6-address.h" +#include "ns3/node-container.h" +#include "ns3/object-factory.h" +#include "ns3/ping.h" + +#include + +namespace ns3 +{ + +/** + * \ingroup ping + * \brief Create a ping application and associate it to a node + * + * This class creates one or multiple instances of ns3::Ping and associates + * it/them to one/multiple node(s). + */ +class PingHelper +{ + public: + /** + * Create a PingHelper which is used to make life easier for people wanting + * to use ping Applications. + */ + PingHelper(); + + /** + * Create a PingHelper which is used to make life easier for people wanting + * to use ping Applications. + * + * \param remote The address which should be pinged + * \param local The source address + */ + PingHelper(Address remote, Address local = Address()); + + /** + * Install a Ping application on each Node in the provided NodeContainer. + * + * \param nodes The NodeContainer containing all of the nodes to get a Ping + * application. + * + * \returns A list of Ping applications, one for each input node + */ + ApplicationContainer Install(NodeContainer nodes) const; + + /** + * Install a Ping application on the provided Node. The Node is specified + * directly by a Ptr + * + * \param node The node to install the Ping application on. + * + * \returns An ApplicationContainer holding the Ping application created. + */ + ApplicationContainer Install(Ptr node) const; + + /** + * Install a Ping application on the provided Node. The Node is specified + * by a string that must have previously been associated with a Node using the + * Object Name Service. + * + * \param nodeName The node to install the Ping application on. + * + * \returns An ApplicationContainer holding the Ping application created. + */ + ApplicationContainer Install(std::string nodeName) const; + + /** + * \brief Configure ping applications attribute + * \param name attribute's name + * \param value attribute's value + */ + void SetAttribute(std::string name, const AttributeValue& value); + + private: + /** + * \brief Do the actual application installation in the node + * \param node the node + * \returns a Smart pointer to the installed application + */ + Ptr InstallPriv(Ptr node) const; + /// Object factory + ObjectFactory m_factory; +}; + +} // namespace ns3 + +#endif /* PING_HELPER_H */