Enhancement 1393 - IPv6 Routing Helper RT Print functions

This commit is contained in:
Tommaso Pecorella committed 2012-03-17 23:23:56 +01:00
1 parent a07b61491a
commit b8caa20a8a
11 files changed
+194 -10

No files matched your search

+5 -1
View File
@@ -41,7 +41,7 @@ This file is a best-effort approach to solving this issue; we will do
our best but can guarantee that there will be things that fall through
the cracks, unfortunately. If you, as a user, can suggest improvements
to this file based on your experience, please contribute a patch or drop
us a note on ns-developers mailing list. </p>
us a note on ns-developers mailing list.</p>
<hr>
<h1>Changes from ns-3.13 to ns-3-dev</h1>
@@ -74,6 +74,10 @@ It now includes the destination IPv6 address of the end point which was
needed for TCP. This lead to a small change in the UDP and ICMPv6 L4
protocols as well.
</li>
<li>
Ipv6RoutingHelper can now print the IPv6 Routing Tables at specific
intervals or time. Exactly like Ipv4RoutingHelper do.
</li>
</ul>
<h2>Changes to build system:</h2>
+4 -1
View File
@@ -24,7 +24,10 @@ New user-visible features
- Dual-stacked IPv6 sockets are implemented. An IPv6 socket can accept an IPv4
connection, returning the senders address as an IPv4-mapped address
(IPV6_V6ONLY socket option is not implemented).
- Ipv6RoutingHelper is now in-line with Ipv4RoutingHelper concerning the RT
print functions. Various minor changes made in Ipv6RoutingProtocol and derived
classes to make this possible.
Bugs fixed
----------
- bug 1319 - Fix Ipv6RawSocketImpl Icmpv6 filter
@@ -18,6 +18,10 @@
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*/
#include "ns3/node.h"
#include "ns3/node-list.h"
#include "ns3/simulator.h"
#include "ns3/ipv6-routing-protocol.h"
#include "ipv6-routing-helper.h"
namespace ns3 {
@@ -26,4 +30,55 @@ Ipv6RoutingHelper::~Ipv6RoutingHelper ()
{
}
void
Ipv6RoutingHelper::PrintRoutingTableAllAt (Time printTime, Ptr<OutputStreamWrapper> stream) const
{
for (uint32_t i = 0; i < NodeList::GetNNodes (); i++)
{
Ptr<Node> node = NodeList::GetNode (i);
Simulator::Schedule (printTime, &Ipv6RoutingHelper::Print, this, node, stream);
}
}
void
Ipv6RoutingHelper::PrintRoutingTableAllEvery (Time printInterval, Ptr<OutputStreamWrapper> stream) const
{
for (uint32_t i = 0; i < NodeList::GetNNodes (); i++)
{
Ptr<Node> node = NodeList::GetNode (i);
Simulator::Schedule (printInterval, &Ipv6RoutingHelper::PrintEvery, this, printInterval, node, stream);
}
}
void
Ipv6RoutingHelper::PrintRoutingTableAt (Time printTime, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const
{
Simulator::Schedule (printTime, &Ipv6RoutingHelper::Print, this, node, stream);
}
void
Ipv6RoutingHelper::PrintRoutingTableEvery (Time printInterval,Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const
{
Simulator::Schedule (printInterval, &Ipv6RoutingHelper::PrintEvery, this, printInterval, node, stream);
}
void
Ipv6RoutingHelper::Print (Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const
{
Ptr<Ipv6> ipv6 = node->GetObject<Ipv6> ();
Ptr<Ipv6RoutingProtocol> rp = ipv6->GetRoutingProtocol ();
NS_ASSERT (rp);
rp->PrintRoutingTable (stream);
}
void
Ipv6RoutingHelper::PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const
{
Ptr<Ipv6> ipv6 = node->GetObject<Ipv6> ();
Ptr<Ipv6RoutingProtocol> rp = ipv6->GetRoutingProtocol ();
NS_ASSERT (rp);
rp->PrintRoutingTable (stream);
Simulator::Schedule (printInterval, &Ipv6RoutingHelper::PrintEvery, this, printInterval, node, stream);
}
} // namespace ns3
+52
View File
@@ -22,6 +22,8 @@
#define IPV6_ROUTING_HELPER_H
#include "ns3/ptr.h"
#include "ns3/nstime.h"
#include "ns3/output-stream-wrapper.h"
namespace ns3 {
@@ -61,6 +63,56 @@ public:
* \returns a newly-created routing protocol
*/
virtual Ptr<Ipv6RoutingProtocol> Create (Ptr<Node> node) const = 0;
/**
* \brief prints the routing tables of all nodes at a particular time.
* \param printTime the time at which the routing table is supposed to be printed.
* \param stream The output stream object to use
*
* This method calls the PrintRoutingTable() method of the
* Ipv6RoutingProtocol stored in the Ipv6 object, for all nodes at the
* specified time; the output format is routing protocol-specific.
*/
void PrintRoutingTableAllAt (Time printTime, Ptr<OutputStreamWrapper> stream) const;
/**
* \brief prints the routing tables of all nodes at regular intervals specified by user.
* \param printInterval the time interval for which the routing table is supposed to be printed.
* \param stream The output stream object to use
*
* This method calls the PrintRoutingTable() method of the
* Ipv6RoutingProtocol stored in the Ipv6 object, for all nodes at the
* specified time interval; the output format is routing protocol-specific.
*/
void PrintRoutingTableAllEvery (Time printInterval, Ptr<OutputStreamWrapper> stream) const;
/**
* \brief prints the routing tables of a node at a particular time.
* \param printTime the time at which the routing table is supposed to be printed.
* \param node The node ptr for which we need the routing table to be printed
* \param stream The output stream object to use
*
* This method calls the PrintRoutingTable() method of the
* Ipv6RoutingProtocol stored in the Ipv6 object, for the selected node
* at the specified time; the output format is routing protocol-specific.
*/
void PrintRoutingTableAt (Time printTime, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
/**
* \brief prints the routing tables of a node at regular intervals specified by user.
* \param printInterval the time interval for which the routing table is supposed to be printed.
* \param node The node ptr for which we need the routing table to be printed
* \param stream The output stream object to use
*
* This method calls the PrintRoutingTable() method of the
* Ipv6RoutingProtocol stored in the Ipv6 object, for the selected node
* at the specified interval; the output format is routing protocol-specific.
*/
void PrintRoutingTableEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
private:
void Print (Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
void PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
};
} // namespace ns3
@@ -142,6 +142,11 @@ public:
*/
virtual void SetIpv4 (Ptr<Ipv4> ipv4) = 0;
/**
* \brief Print the Routing Table entries
*
* \param stream the ostream the Routing table is printed to
*/
virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const = 0;
};
+18
View File
@@ -23,6 +23,7 @@
#include "ns3/node.h"
#include "ns3/ipv6-static-routing.h"
#include "ipv6-list-routing.h"
#include "ns3/simulator.h"
NS_LOG_COMPONENT_DEFINE ("Ipv6ListRouting");
@@ -269,6 +270,23 @@ void Ipv6ListRouting::NotifyRemoveRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6A
}
}
void
Ipv6ListRouting::PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const
{
NS_LOG_FUNCTION (this);
*stream->GetStream () << "Node: " << m_ipv6->GetObject<Node> ()->GetId ()
<< " Time: " << Simulator::Now ().GetSeconds () << "s "
<< "Ipv6ListRouting table" << std::endl;
for (Ipv6RoutingProtocolList::const_iterator i = m_routingProtocols.begin ();
i != m_routingProtocols.end (); i++)
{
*stream->GetStream () << " Priority: " << (*i).first << " Protocol: " << (*i).second->GetInstanceTypeId () << std::endl;
(*i).second->PrintRoutingTable (stream);
}
*stream->GetStream () << std::endl;
}
void
Ipv6ListRouting::SetIpv6 (Ptr<Ipv6> ipv6)
{
+7
View File
@@ -104,6 +104,13 @@ public:
virtual void NotifyRemoveRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse = Ipv6Address::GetZero ());
virtual void SetIpv6 (Ptr<Ipv6> ipv6);
/**
* \brief Print the Routing Table entries
*
* \param stream the ostream the Routing table is printed to
*/
virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const;
protected:
/**
* \brief Dispose this object.
@@ -29,6 +29,7 @@
#include "ipv6-header.h"
#include "ipv6-interface-address.h"
#include "ipv6.h"
#include "ns3/output-stream-wrapper.h"
namespace ns3 {
@@ -171,6 +172,13 @@ public:
* \param ipv6 the ipv6 object this routing protocol is being associated with
*/
virtual void SetIpv6 (Ptr<Ipv6> ipv6) = 0;
/**
* \brief Print the Routing Table entries
*
* \param stream the ostream the Routing table is printed to
*/
virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const = 0;
};
} // namespace ns3
+28 -5
View File
@@ -18,8 +18,11 @@
* Author: Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
*/
#include <iomanip>
#include "ns3/log.h"
#include "ns3/node.h"
#include "ns3/packet.h"
#include "ns3/simulator.h"
#include "ns3/ipv6-route.h"
#include "ns3/net-device.h"
@@ -71,6 +74,26 @@ void Ipv6StaticRouting::SetIpv6 (Ptr<Ipv6> ipv6)
}
}
// Formatted like output of "route -n" command
void
Ipv6StaticRouting::PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const
{
NS_LOG_FUNCTION (this);
std::ostream* os = stream->GetStream ();
if (GetNRoutes () > 0)
{
*os << "Node: " << m_ipv6->GetObject<Node> ()->GetId ()
<< " Time: " << Simulator::Now ().GetSeconds () << "s "
<< "Ipv6StaticRouting table" << std::endl;
for (uint32_t j = 0; j < GetNRoutes (); j++)
{
Ipv6RoutingTableEntry route = GetRoute (j);
*os << route << std::endl;
}
}
}
void Ipv6StaticRouting::AddHostRouteTo (Ipv6Address dst, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse, uint32_t metric)
{
NS_LOG_FUNCTION (this << dst << nextHop << interface << prefixToUse << metric);
@@ -369,7 +392,7 @@ Ptr<Ipv6MulticastRoute> Ipv6StaticRouting::LookupStatic (Ipv6Address origin, Ipv
return mrtentry;
}
uint32_t Ipv6StaticRouting::GetNRoutes ()
uint32_t Ipv6StaticRouting::GetNRoutes () const
{
return m_networkRoutes.size ();
}
@@ -412,12 +435,12 @@ Ipv6RoutingTableEntry Ipv6StaticRouting::GetDefaultRoute ()
}
}
Ipv6RoutingTableEntry Ipv6StaticRouting::GetRoute (uint32_t index)
Ipv6RoutingTableEntry Ipv6StaticRouting::GetRoute (uint32_t index) const
{
NS_LOG_FUNCTION (this << index);
uint32_t tmp = 0;
for (NetworkRoutesI it = m_networkRoutes.begin (); it != m_networkRoutes.end (); it++)
for (NetworkRoutesCI it = m_networkRoutes.begin (); it != m_networkRoutes.end (); it++)
{
if (tmp == index)
{
@@ -430,12 +453,12 @@ Ipv6RoutingTableEntry Ipv6StaticRouting::GetRoute (uint32_t index)
return 0;
}
uint32_t Ipv6StaticRouting::GetMetric (uint32_t index)
uint32_t Ipv6StaticRouting::GetMetric (uint32_t index) const
{
NS_LOG_FUNCTION_NOARGS ();
uint32_t tmp = 0;
for (NetworkRoutesI it = m_networkRoutes.begin (); it != m_networkRoutes.end (); it++)
for (NetworkRoutesCI it = m_networkRoutes.begin (); it != m_networkRoutes.end (); it++)
{
if (tmp == index)
{
+10 -3
View File
@@ -132,7 +132,7 @@ public:
* \brief Get the number or entries in the routing table.
* \return number of entries
*/
uint32_t GetNRoutes ();
uint32_t GetNRoutes () const;
/**
* \brief Get the default route.
@@ -147,14 +147,14 @@ public:
* \param i index
* \return the route whose index is i
*/
Ipv6RoutingTableEntry GetRoute (uint32_t i);
Ipv6RoutingTableEntry GetRoute (uint32_t i) const;
/**
* \brief Get a metric for route from the static unicast routing table.
* \param index The index (into the routing table) of the route to retrieve.
* \return If route is set, the metric is returned. If not, an infinity metric (0xffffffff) is returned
*/
uint32_t GetMetric (uint32_t index);
uint32_t GetMetric (uint32_t index) const;
/**
* \brief Remove a route from the routing table.
@@ -236,6 +236,13 @@ public:
virtual void NotifyRemoveRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse = Ipv6Address::GetZero ());
virtual void SetIpv6 (Ptr<Ipv6> ipv6);
/**
* \brief Print the Routing Table entries
*
* \param stream the ostream the Routing table is printed to
*/
virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const;
protected:
/**
* \brief Dispose this object.
@@ -38,6 +38,7 @@ public:
GetZero ()) {}
void NotifyRemoveRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse) {}
void SetIpv6 (Ptr<Ipv6> ipv6) {}
virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const {};
};
class Ipv6BRouting : public Ipv6RoutingProtocol {
@@ -54,6 +55,7 @@ public:
GetZero ()) {}
void NotifyRemoveRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse) {}
void SetIpv6 (Ptr<Ipv6> ipv6) {}
virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const {};
};
class Ipv6ListRoutingNegativeTestCase : public TestCase