Bug 1296 - Enhancement in Ipv[4,6]RoutingHelper

This commit is contained in:
Alexander Afanasyev
2013-07-09 22:49:30 +02:00
parent 4b09ce3268
commit f2cd231aec
5 changed files with 75 additions and 0 deletions

View File

@@ -26,6 +26,7 @@ New user-visible features
Bugs fixed
----------
- Bug 760 - IP address removal can be painful
- Bug 1296 - Enhancement in Ipv[4,6]RoutingHelper
- Bug 1390 - ICMPv6 Redirect are handled correctly only for /64 networks
- Bug 1643 - NdiscCache creation and existence checks
- Bug 1646 - ICMPv6 Redirect are sent from global address instead of link-local

View File

@@ -17,10 +17,12 @@
*
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*/
#include "ns3/node.h"
#include "ns3/node-list.h"
#include "ns3/simulator.h"
#include "ns3/ipv4-routing-protocol.h"
#include "ns3/ipv4-list-routing.h"
#include "ipv4-routing-helper.h"
namespace ns3 {
@@ -80,4 +82,27 @@ Ipv4RoutingHelper::PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStr
Simulator::Schedule (printInterval, &Ipv4RoutingHelper::PrintEvery, this, printInterval, node, stream);
}
template<class T>
Ptr<T> Ipv4RoutingHelper::GetRouting (Ptr<Ipv4RoutingProtocol> protocol)
{
Ptr<T> ret = DynamicCast<T> (protocol);
if (ret == 0)
{
// trying to check if protocol is a list routing
Ptr<Ipv4ListRouting> lrp = DynamicCast<Ipv4ListRouting> (protocol);
if (lrp != 0)
{
for (uint32_t i = 0; i < lrp->GetNRoutingProtocols (); i++)
{
int16_t priority;
ret = GetRouting<T> (lrp->GetRoutingProtocol (i, priority)); // potential recursion, if inside ListRouting is ListRouting
if (ret != 0)
break;
}
}
}
return ret;
}
} // namespace ns3

View File

@@ -17,6 +17,7 @@
*
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*/
#ifndef IPV4_ROUTING_HELPER_H
#define IPV4_ROUTING_HELPER_H
@@ -107,6 +108,18 @@ public:
*/
void PrintRoutingTableEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
/**
* \brief Request a specified routing protocol <T> from Ipv4RoutingProtocol protocol
*
* If protocol is Ipv4ListRouting, then protocol will be searched in the list,
* otherwise a simple DynamicCast will be performed
*
* \param protocol Smart pointer to Ipv4RoutingProtocol object
* \return a Smart Pointer to the requested protocol (zero if the protocol can't be found)
*/
template<class T>
static Ptr<T> GetRouting (Ptr<Ipv4RoutingProtocol> protocol);
private:
void Print (Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
void PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;

View File

@@ -22,6 +22,7 @@
#include "ns3/node-list.h"
#include "ns3/simulator.h"
#include "ns3/ipv6-routing-protocol.h"
#include "ns3/ipv6-list-routing.h"
#include "ipv6-routing-helper.h"
namespace ns3 {
@@ -81,4 +82,27 @@ Ipv6RoutingHelper::PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStr
Simulator::Schedule (printInterval, &Ipv6RoutingHelper::PrintEvery, this, printInterval, node, stream);
}
template<class T>
Ptr<T> Ipv6RoutingHelper::GetRouting (Ptr<Ipv6RoutingProtocol> protocol)
{
Ptr<T> ret = DynamicCast<T> (protocol);
if (ret == 0)
{
// trying to check if protocol is a list routing
Ptr<Ipv6ListRouting> lrp = DynamicCast<Ipv6ListRouting> (protocol);
if (lrp != 0)
{
for (uint32_t i = 0; i < lrp->GetNRoutingProtocols (); i++)
{
int16_t priority;
ret = GetRouting<T> (lrp->GetRoutingProtocol (i, priority)); // potential recursion, if inside ListRouting is ListRouting
if (ret != 0)
break;
}
}
}
return ret;
}
} // namespace ns3

View File

@@ -110,6 +110,18 @@ public:
*/
void PrintRoutingTableEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
/**
* \brief Request a specified routing protocol <T> from Ipv6RoutingProtocol protocol
*
* If protocol is Ipv6ListRouting, then protocol will be searched in the list,
* otherwise a simple DynamicCast will be performed
*
* \param protocol Smart pointer to Ipv6RoutingProtocol object
* \return a Smart Pointer to the requested protocol (zero if the protocol can't be found)
*/
template<class T>
static Ptr<T> GetRouting (Ptr<Ipv6RoutingProtocol> protocol);
private:
void Print (Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
void PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;