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 std::ios oldState (
nullptr);
88 oldState.copyfmt (*os);
90 *os << std::resetiosflags (std::ios::adjustfield) << std::setiosflags (std::ios::left);
92 *os <<
"Node: " <<
m_ipv6->GetObject<
Node> ()->GetId ()
93 <<
", Time: " <<
Now().
As (unit)
94 <<
", Local time: " <<
m_ipv6->GetObject<
Node> ()->GetLocalTime ().As (unit)
95 <<
", Ipv6StaticRouting table" << std::endl;
99 *os <<
"Destination Next Hop Flag Met Ref Use If" << std::endl;
102 std::ostringstream dest, gw, mask, flags;
105 *os << std::setw (31) << dest.str ();
107 *os << std::setw (27) << gw.str ();
117 *os << std::setw (5) << flags.str ();
136 (*os).copyfmt (oldState);
141 NS_LOG_FUNCTION (
this << dst << nextHop << interface << prefixToUse << metric);
144 NS_LOG_WARN (
"Ipv6StaticRouting::AddHostRouteTo - Next hop should be link-local");
158 NS_LOG_FUNCTION (
this << network << networkPrefix << nextHop << interface << metric);
171 NS_LOG_FUNCTION (
this << network << networkPrefix << nextHop << interface << prefixToUse << metric);
174 NS_LOG_WARN (
"Ipv6StaticRouting::AddNetworkRouteTo - Next hop should be link-local");
326 uint16_t longestMask = 0;
327 uint32_t shortestMetric = 0xffffffff;
332 NS_ASSERT_MSG (interface,
"Try to send on link-local multicast address, and no interface index is given!");
333 rtentry = Create<Ipv6Route> ();
334 rtentry->SetSource (
m_ipv6->SourceAddressSelection (
m_ipv6->GetInterfaceForDevice (interface), dst));
335 rtentry->SetDestination (dst);
337 rtentry->SetOutputDevice (interface);
344 uint32_t metric = it->second;
349 NS_LOG_LOGIC (
"Searching for route to " << dst <<
", mask length " << maskLen <<
", metric " << metric);
353 NS_LOG_LOGIC (
"Found global network route " << *j <<
", mask length " << maskLen <<
", metric " << metric);
358 if (maskLen < longestMask)
364 if (maskLen > longestMask)
366 shortestMetric = 0xffffffff;
369 longestMask = maskLen;
370 if (metric > shortestMetric)
372 NS_LOG_LOGIC (
"Equal mask length, but previous metric shorter, skipping");
376 shortestMetric = metric;
379 rtentry = Create<Ipv6Route> ();
383 rtentry->SetSource (
m_ipv6->SourceAddressSelection (interfaceIdx, route->
GetDest ()));
391 rtentry->SetSource (
m_ipv6->SourceAddressSelection (interfaceIdx, route->
GetGateway ()));
394 rtentry->SetDestination (route->
GetDest ());
396 rtentry->SetOutputDevice (
m_ipv6->GetNetDevice (interfaceIdx));
407 NS_LOG_LOGIC (
"Matching route via " << rtentry->GetDestination () <<
" (Through " << rtentry->GetGateway () <<
") at the end");
454 NS_LOG_LOGIC (
"Find source specific multicast route" << *i);
462 mrtentry = Create<Ipv6MulticastRoute> ();
463 mrtentry->SetGroup (route->
GetGroup ());
464 mrtentry->SetOrigin (route->
GetOrigin ());
490 uint32_t shortestMetric = 0xffffffff;
496 uint32_t metric = it->second;
506 if (metric > shortestMetric)
510 shortestMetric = metric;
632 uint32_t iif =
m_ipv6->GetInterfaceForDevice (idev);
646 mcb (idev, mrtentry, p, header);
657 if (
m_ipv6->IsForwarding (iif) ==
false)
659 NS_LOG_LOGIC (
"Forwarding disabled for this interface");
672 NS_LOG_LOGIC (
"Found unicast destination- calling unicast callback");
673 ucb (idev, rtentry, p, header);
678 NS_LOG_LOGIC (
"Did not find unicast destination- returning false");
685 for (uint32_t j = 0; j <
m_ipv6->GetNAddresses (i); j++)
716 if (it->first->GetInterface () == i)
730 if (!
m_ipv6->IsUp (interface))
738 if (!
m_ipv6->IsUp (interface))
750 if (it->first->GetInterface () == interface
751 && it->first->IsNetwork ()
752 && it->first->GetDestNetwork () == networkAddress
753 && it->first->GetDestNetworkPrefix () == networkMask)
767 NS_LOG_INFO (
this << dst << mask << nextHop << interface << prefixToUse);
801 if (dst == entry && prefix == mask && rtentry->
GetInterface () == interface)
bool IsNull(void) const
Check for null implementation.
Describes an IPv6 address.
bool IsLinkLocal() const
If the IPv6 address is a link-local address (fe80::/64).
Ipv6Address CombinePrefix(Ipv6Prefix const &prefix) const
Combine this address with a prefix.
bool IsLinkLocalMulticast() const
If the IPv6 address is link-local multicast (ff02::/16).
static Ipv6Address GetZero()
Get the 0 (::) Ipv6Address.
bool IsMulticast() const
If the IPv6 address is multicast (ff00::/8).
bool IsAny() const
If the IPv6 address is the "Any" address.
static const uint32_t IF_ANY
Any interface magic number.
IPv6 address associated with an interface.
Ipv6Address GetAddress() const
Get the IPv6 address.
Ipv6Prefix GetPrefix() const
Get the IPv6 prefix.
bool GetOnLink() const
Get the on-link property.
static const uint32_t MAX_TTL
Maximum Time-To-Live (TTL).
A record of an IPv6 multicast route.
uint32_t GetInputInterface() const
Get the input interface address.
uint32_t GetOutputInterface(uint32_t n) const
Get a specified output interface.
Ipv6Address GetGroup() const
Get the group.
static Ipv6MulticastRoutingTableEntry CreateMulticastRoute(Ipv6Address origin, Ipv6Address group, uint32_t inputInterface, std::vector< uint32_t > outputInterfaces)
Create a multicast route.
uint32_t GetNOutputInterfaces() const
Get the number of output interfaces of this route.
Ipv6Address GetOrigin() const
Get the source of this route.
Describes an IPv6 prefix.
uint8_t GetPrefixLength() const
Get prefix length.
static Ipv6Prefix GetZero()
Get the zero prefix ( /0).
bool IsMatch(Ipv6Address a, Ipv6Address b) const
If the Address match the type.
static Ipv6Prefix GetOnes()
Get the "all-1" IPv6 mask (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff).
Abstract base class for IPv6 routing protocols.
A record of an IPv6 route.
Ipv6Address GetDest() const
Get the destination.
Ipv6Address GetDestNetwork() const
Get the destination network.
Ipv6Address GetPrefixToUse() const
Get the prefix to use (for multihomed link).
bool IsHost() const
Is the route entry correspond to a host ?
uint32_t GetInterface() const
Get the interface index.
Ipv6Prefix GetDestNetworkPrefix() const
Get the destination prefix.
static Ipv6RoutingTableEntry CreateNetworkRouteTo(Ipv6Address network, Ipv6Prefix networkPrefix, Ipv6Address nextHop, uint32_t interface)
Create a route to a network.
Ipv6Address GetGateway() const
Get the gateway.
bool IsGateway() const
Is it the gateway ?
Static routing protocol for IP version 6 stacks.
virtual void SetIpv6(Ptr< Ipv6 > ipv6)
Typically, invoked directly or indirectly from ns3::Ipv6::SetRoutingProtocol.
virtual void DoDispose()
Dispose this object.
Ipv6RoutingTableEntry GetRoute(uint32_t i) const
Get a specified route.
virtual void NotifyInterfaceDown(uint32_t interface)
Notify when specified interface goes DOWN.
void RemoveRoute(uint32_t i)
Remove a route from the routing table.
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)
static TypeId GetTypeId()
The interface Id associated with this class.
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.
Ptr< Ipv6Route > LookupStatic(Ipv6Address dest, Ptr< NetDevice >=0)
Lookup in the forwarding table for destination.
virtual ~Ipv6StaticRouting()
bool HasNetworkDest(Ipv6Address dest, uint32_t interfaceIndex)
If the destination is already present in network destination list.
bool LookupRoute(const Ipv6RoutingTableEntry &route, uint32_t metric)
Checks if a route is already present in the forwarding table.
std::list< Ipv6MulticastRoutingTableEntry * >::const_iterator MulticastRoutesCI
Const Iterator for container for the multicast routes.
virtual void NotifyInterfaceUp(uint32_t interface)
Notify when specified interface goes UP.
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.
void AddHostRouteTo(Ipv6Address dest, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse=Ipv6Address("::"), uint32_t metric=0)
Add route to host.
uint32_t GetNRoutes() const
Get the number or entries in the routing table.
Ipv6MulticastRoutingTableEntry GetMulticastRoute(uint32_t i) const
Get the specified multicast route.
virtual void NotifyAddRoute(Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse=Ipv6Address::GetZero())
Notify a new route.
std::list< std::pair< Ipv6RoutingTableEntry *, uint32_t > >::iterator NetworkRoutesI
Iterator for container for the network routes.
Ipv6RoutingTableEntry GetDefaultRoute()
Get the default route.
virtual void NotifyRemoveAddress(uint32_t interface, Ipv6InterfaceAddress address)
Notify when specified interface add an address.
virtual void NotifyAddAddress(uint32_t interface, Ipv6InterfaceAddress address)
Notify when specified interface add an address.
MulticastRoutes m_multicastRoutes
the forwarding table for multicast.
uint32_t GetNMulticastRoutes() const
Get the number of entries in the multicast routing table.
bool RemoveMulticastRoute(Ipv6Address origin, Ipv6Address group, uint32_t inputInterface)
Remove a static multicast route.
void AddNetworkRouteTo(Ipv6Address network, Ipv6Prefix networkPrefix, Ipv6Address nextHop, uint32_t interface, uint32_t metric=0)
Add route to network.
NetworkRoutes m_networkRoutes
the forwarding table for network.
void SetDefaultMulticastRoute(uint32_t outputInterface)
Set the default multicast route.
std::list< std::pair< Ipv6RoutingTableEntry *, uint32_t > >::const_iterator NetworkRoutesCI
Const Iterator for container for the network routes.
uint32_t GetMetric(uint32_t index) const
Get a metric for route from the static unicast routing table.
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S) const
Print the Routing Table entries.
Ptr< Ipv6 > m_ipv6
Ipv6 reference.
std::list< Ipv6MulticastRoutingTableEntry * >::iterator MulticastRoutesI
Iterator for container for the multicast routes.
virtual void NotifyRemoveRoute(Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse=Ipv6Address::GetZero())
Notify route removing.
void SetDefaultRoute(Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse=Ipv6Address("::"), uint32_t metric=0)
Set the default 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 DoDispose(void)
Destructor implementation.
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
Smart pointer class similar to boost::intrusive_ptr.
SocketErrno
Enumeration of the possible errors returned by a socket.
Unit
The unit to use to interpret a number representing time.
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Every class exported by the ns3 library is enclosed in the ns3 namespace.