24 #include "ns3/packet.h" 
   25 #include "ns3/simulator.h" 
   26 #include "ns3/ipv6-route.h" 
   27 #include "ns3/net-device.h" 
   28 #include "ns3/names.h" 
   43     .SetGroupName (
"Internet")
 
   67   for (i = 0; i < 
m_ipv6->GetNInterfaces (); i++)
 
   87   *os << 
"Node: " << 
m_ipv6->GetObject<
Node> ()->GetId ()
 
   89       << 
"Ipv6StaticRouting table" << std::endl;
 
   93       *os << 
"Destination                    Next Hop                   Flag Met Ref Use If" << std::endl;
 
   96           std::ostringstream dest, gw, mask, flags;
 
   99           *os << std::setiosflags (std::ios::left) << std::setw (31) << dest.str ();
 
  101           *os << std::setiosflags (std::ios::left) << std::setw (27) << gw.str ();
 
  111           *os << std::setiosflags (std::ios::left) << std::setw (5) << flags.str ();
 
  112           *os << std::setiosflags (std::ios::left) << std::setw (4) << 
GetMetric (j);
 
  132   NS_LOG_FUNCTION (
this << dst << nextHop << interface << prefixToUse << metric);
 
  135       NS_LOG_WARN (
"Ipv6StaticRouting::AddHostRouteTo - Next hop should be link-local");
 
  149   NS_LOG_FUNCTION (
this << network << networkPrefix << nextHop << interface << metric);
 
  157   NS_LOG_FUNCTION (
this << network << networkPrefix << nextHop << interface << prefixToUse << metric);
 
  160       NS_LOG_WARN (
"Ipv6StaticRouting::AddNetworkRouteTo - Next hop should be link-local");
 
  286   uint16_t longestMask = 0;
 
  287   uint32_t shortestMetric = 0xffffffff;
 
  292       NS_ASSERT_MSG (interface, 
"Try to send on link-local multicast address, and no interface index is given!");
 
  293       rtentry = Create<Ipv6Route> ();
 
  294       rtentry->SetSource (
m_ipv6->SourceAddressSelection (
m_ipv6->GetInterfaceForDevice (interface), dst));
 
  295       rtentry->SetDestination (dst);
 
  297       rtentry->SetOutputDevice (interface);
 
  304       uint32_t metric = it->second;
 
  309       NS_LOG_LOGIC (
"Searching for route to " << dst << 
", mask length " << maskLen << 
", metric " << metric);
 
  313           NS_LOG_LOGIC (
"Found global network route " << *j << 
", mask length " << maskLen << 
", metric " << metric);
 
  318               if (maskLen < longestMask)
 
  324               if (maskLen > longestMask)
 
  326                   shortestMetric = 0xffffffff;
 
  329               longestMask = maskLen;
 
  330               if (metric > shortestMetric)
 
  332                   NS_LOG_LOGIC (
"Equal mask length, but previous metric shorter, skipping");
 
  336               shortestMetric = metric;
 
  339               rtentry = Create<Ipv6Route> ();
 
  343                   rtentry->SetSource (
m_ipv6->SourceAddressSelection (interfaceIdx, route->
GetDest ()));
 
  351                   rtentry->SetSource (
m_ipv6->SourceAddressSelection (interfaceIdx, route->
GetGateway ()));
 
  354               rtentry->SetDestination (route->
GetDest ());
 
  356               rtentry->SetOutputDevice (
m_ipv6->GetNetDevice (interfaceIdx));
 
  363       NS_LOG_LOGIC (
"Matching route via " << rtentry->GetDestination () << 
" (Through " << rtentry->GetGateway () << 
") at the end");
 
  410           NS_LOG_LOGIC (
"Find source specific multicast route" << *i);
 
  418               mrtentry = Create<Ipv6MulticastRoute> ();
 
  419               mrtentry->SetGroup (route->
GetGroup ());
 
  420               mrtentry->SetOrigin (route->
GetOrigin ());
 
  446   uint32_t shortestMetric = 0xffffffff;
 
  452       uint32_t metric = it->second;
 
  462       if (metric > shortestMetric)
 
  466       shortestMetric = metric;
 
  588   uint32_t iif = 
m_ipv6->GetInterfaceForDevice (idev);
 
  600           mcb (idev, mrtentry, p, header); 
 
  616   for (uint32_t j = 0; j < 
m_ipv6->GetNInterfaces (); j++)
 
  618       for (uint32_t i = 0; i < 
m_ipv6->GetNAddresses (j); i++)
 
  626                   NS_LOG_LOGIC (
"For me (destination " << addr << 
" match)");
 
  632               lcb (p, header, iif);
 
  639   if (
m_ipv6->IsForwarding (iif) == 
false)
 
  641       NS_LOG_LOGIC (
"Forwarding disabled for this interface");
 
  651       NS_LOG_LOGIC (
"Found unicast destination- calling unicast callback");
 
  652       ucb (idev, rtentry, p, header);  
 
  657       NS_LOG_LOGIC (
"Did not find unicast destination- returning false");
 
  664   for (uint32_t j = 0; j < 
m_ipv6->GetNAddresses (i); j++)
 
  677                                  m_ipv6->GetAddress (i, j).GetPrefix (), i);
 
  690       if (it->first->GetInterface () == i)
 
  704   if (!
m_ipv6->IsUp (interface))
 
  720   if (!
m_ipv6->IsUp (interface))
 
  732       if (it->first->GetInterface () == interface
 
  733           && it->first->IsNetwork ()
 
  734           && it->first->GetDestNetwork () == networkAddress
 
  735           && it->first->GetDestNetworkPrefix () == networkMask)
 
  749   NS_LOG_INFO (
this << dst << mask << nextHop << interface << prefixToUse);
 
  779           if (dst == entry && prefix == mask && rtentry->
GetInterface () == interface)
 
bool IsMatch(Ipv6Address a, Ipv6Address b) const 
If the Address match the type. 
 
bool IsAny() const 
If the IPv6 address is the "Any" address. 
 
static const uint32_t MAX_TTL
Maximum Time-To-Live (TTL). 
 
Smart pointer class similar to boost::intrusive_ptr. 
 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
 
Ipv6Address GetPrefixToUse() const 
Get the prefix to use (for multihomed link). 
 
virtual ~Ipv6StaticRouting()
 
SocketErrno
Enumeration of the possible errors returned by a socket. 
 
NetworkRoutes m_networkRoutes
the forwarding table for network. 
 
bool RemoveMulticastRoute(Ipv6Address origin, Ipv6Address group, uint32_t inputInterface)
Remove a static multicast route. 
 
bool IsLinkLocalMulticast() const 
If the IPv6 address is link-local multicast (ff02::/16). 
 
Ipv6Prefix GetDestNetworkPrefix() const 
Get the destination prefix. 
 
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system. 
 
static Ipv6RoutingTableEntry CreateNetworkRouteTo(Ipv6Address network, Ipv6Prefix networkPrefix, Ipv6Address nextHop, uint32_t interface)
Create a route to a network. 
 
virtual void NotifyRemoveRoute(Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse=Ipv6Address::GetZero())
Notify route removing. 
 
virtual void NotifyAddRoute(Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse=Ipv6Address::GetZero())
Notify a new route. 
 
A record of an IPv6 multicast route. 
 
virtual void SetIpv6(Ptr< Ipv6 > ipv6)
Typically, invoked directly or indirectly from ns3::Ipv6::SetRoutingProtocol. 
 
virtual Ptr< Ipv6Route > RouteOutput(Ptr< Packet > p, const Ipv6Header &header, Ptr< NetDevice > oif, Socket::SocketErrno &sockerr)
Query routing cache for an existing route, for an outbound packet. 
 
uint32_t GetInputInterface() const 
Get the input interface address. 
 
bool IsLinkLocal() const 
If the IPv6 address is a link-local address (fe80::/64). 
 
std::list< Ipv6MulticastRoutingTableEntry * >::const_iterator MulticastRoutesCI
Const Iterator for container for the multicast routes. 
 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
 
IPv6 address associated with an interface. 
 
bool IsEqual(const Ipv6Address &other) const 
Comparison operation between two Ipv6Addresses. 
 
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO. 
 
virtual void DoDispose(void)
Destructor implementation. 
 
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function. 
 
std::list< std::pair< Ipv6RoutingTableEntry *, uint32_t > >::iterator NetworkRoutesI
Iterator for container for the network routes. 
 
uint32_t GetNOutputInterfaces() const 
Get the number of output interfaces of this route. 
 
static Ipv6MulticastRoutingTableEntry CreateMulticastRoute(Ipv6Address origin, Ipv6Address group, uint32_t inputInterface, std::vector< uint32_t > outputInterfaces)
Create a multicast route. 
 
static Ipv6Prefix GetZero()
Get the zero prefix ( /0). 
 
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream) const 
Print the Routing Table entries. 
 
uint32_t GetNMulticastRoutes() const 
Get the number of entries in the multicast routing table. 
 
void AddHostRouteTo(Ipv6Address dest, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse=Ipv6Address("::"), uint32_t metric=0)
Add route to host. 
 
static TypeId GetTypeId()
The interface Id associated with this class. 
 
double GetSeconds(void) const 
Get an approximation of the time stored in this instance in the indicated unit. 
 
Ipv6Address GetDestNetwork() const 
Get the destination network. 
 
Ipv6Address GetAddress() const 
Get the IPv6 address. 
 
A record of an IPv6 route. 
 
Ptr< Ipv6 > m_ipv6
Ipv6 reference. 
 
uint32_t GetMetric(uint32_t index) const 
Get a metric for route from the static unicast routing table. 
 
virtual void NotifyInterfaceDown(uint32_t interface)
Notify when specified interface goes DOWN. 
 
Ptr< Ipv6Route > LookupStatic(Ipv6Address dest, Ptr< NetDevice >=0)
Lookup in the forwarding table for destination. 
 
static Ipv6Address GetZero()
Get the 0 (::) Ipv6Address. 
 
void AddMulticastRoute(Ipv6Address origin, Ipv6Address group, uint32_t inputInterface, std::vector< uint32_t > outputInterfaces)
Add a multicast route for a given multicast source and group. 
 
virtual void NotifyRemoveAddress(uint32_t interface, Ipv6InterfaceAddress address)
Notify when specified interface add an address. 
 
Ipv6Address GetOrigin() const 
Get the source of this route. 
 
bool IsHost() const 
Is the route entry correspond to a host ? 
 
void AddNetworkRouteTo(Ipv6Address network, Ipv6Prefix networkPrefix, Ipv6Address nextHop, uint32_t interface, uint32_t metric=0)
Add route to network. 
 
Ipv6Prefix GetPrefix() const 
Get the IPv6 prefix. 
 
virtual bool RouteInput(Ptr< const Packet > p, const Ipv6Header &header, Ptr< const NetDevice > idev, UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb)
Route an input packet (to be forwarded or locally delivered) 
 
virtual void NotifyInterfaceUp(uint32_t interface)
Notify when specified interface goes UP. 
 
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC. 
 
Introspection did not find any typical Config paths. 
 
uint32_t GetOutputInterface(uint32_t n) const 
Get a specified output interface. 
 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
 
static const uint32_t IF_ANY
Any interface magic number. 
 
Ipv6RoutingTableEntry GetDefaultRoute()
Get the default route. 
 
bool IsMulticast() const 
If the IPv6 address is multicast (ff00::/8). 
 
Ipv6Address GetGateway() const 
Get the gateway. 
 
static Time Now(void)
Return the current simulation virtual time. 
 
uint32_t GetInterface() const 
Get the interface index. 
 
Ipv6RoutingTableEntry GetRoute(uint32_t i) const 
Get a specified route. 
 
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
 
Describes an IPv6 address. 
 
void RemoveRoute(uint32_t i)
Remove a route from the routing table. 
 
void SetDefaultRoute(Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse=Ipv6Address("::"), uint32_t metric=0)
Set the default route. 
 
Ipv6Address GetGroup() const 
Get the group. 
 
static Ipv6Prefix GetOnes()
Get the "all-1" IPv6 mask (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff). 
 
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN. 
 
Ipv6Address GetDest() const 
Get the destination. 
 
virtual void DoDispose()
Dispose this object. 
 
void SetDefaultMulticastRoute(uint32_t outputInterface)
Set the default multicast route. 
 
static std::string FindName(Ptr< Object > object)
Given a pointer to an object, look to see if that object has a name associated with it and...
 
virtual void NotifyAddAddress(uint32_t interface, Ipv6InterfaceAddress address)
Notify when specified interface add an address. 
 
std::list< std::pair< Ipv6RoutingTableEntry *, uint32_t > >::const_iterator NetworkRoutesCI
Const Iterator for container for the network routes. 
 
Describes an IPv6 prefix. 
 
bool IsGateway() const 
Is it the gateway ? 
 
uint8_t GetPrefixLength() const 
Get prefix length. 
 
MulticastRoutes m_multicastRoutes
the forwarding table for multicast. 
 
uint32_t GetNRoutes() const 
Get the number or entries in the routing table. 
 
Ipv6MulticastRoutingTableEntry GetMulticastRoute(uint32_t i) const 
Get the specified multicast route. 
 
Ipv6Address CombinePrefix(Ipv6Prefix const &prefix)
Combine this address with a prefix. 
 
Abstract base class for Ipv6 routing protocols. 
 
a unique identifier for an interface. 
 
TypeId SetParent(TypeId tid)
Set the parent TypeId. 
 
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper. 
 
bool HasNetworkDest(Ipv6Address dest, uint32_t interfaceIndex)
If the destination is already present in network destination list. 
 
std::list< Ipv6MulticastRoutingTableEntry * >::iterator MulticastRoutesI
Iterator for container for the multicast routes.