in simulation/src/internet/model/ripng.cc [1081:1159]
void RipNg::DoSendRouteUpdate (bool periodic)
{
NS_LOG_FUNCTION (this << (periodic ? " periodic" : " triggered"));
for (SocketListI iter = m_unicastSocketList.begin (); iter != m_unicastSocketList.end (); iter++ )
{
uint32_t interface = iter->second;
if (m_interfaceExclusions.find (interface) == m_interfaceExclusions.end ())
{
uint16_t mtu = m_ipv6->GetMtu (interface);
uint16_t maxRte = (mtu - Ipv6Header ().GetSerializedSize () - UdpHeader ().GetSerializedSize () - RipNgHeader ().GetSerializedSize ()) / RipNgRte ().GetSerializedSize ();
Ptr<Packet> p = Create<Packet> ();
SocketIpv6HopLimitTag tag;
tag.SetHopLimit (255);
p->AddPacketTag (tag);
RipNgHeader hdr;
hdr.SetCommand (RipNgHeader::RESPONSE);
for (RoutesI rtIter = m_routes.begin (); rtIter != m_routes.end (); rtIter++)
{
bool splitHorizoning = (rtIter->first->GetInterface () == interface);
Ipv6InterfaceAddress rtDestAddr = Ipv6InterfaceAddress(rtIter->first->GetDestNetwork (), rtIter->first->GetDestNetworkPrefix ());
NS_LOG_DEBUG ("Processing RT " << rtDestAddr << " " << int(rtIter->first->IsRouteChanged ()));
bool isGlobal = (rtDestAddr.GetScope () == Ipv6InterfaceAddress::GLOBAL);
bool isDefaultRoute = ((rtIter->first->GetDestNetwork () == Ipv6Address::GetAny ()) &&
(rtIter->first->GetDestNetworkPrefix () == Ipv6Prefix::GetZero ()) &&
(rtIter->first->GetInterface () != interface));
if ((isGlobal || isDefaultRoute) &&
(periodic || rtIter->first->IsRouteChanged ()))
{
RipNgRte rte;
rte.SetPrefix (rtIter->first->GetDestNetwork ());
rte.SetPrefixLen (rtIter->first->GetDestNetworkPrefix ().GetPrefixLength ());
if (m_splitHorizonStrategy == POISON_REVERSE && splitHorizoning)
{
rte.SetRouteMetric (m_linkDown);
}
else
{
rte.SetRouteMetric (rtIter->first->GetRouteMetric ());
}
rte.SetRouteTag (rtIter->first->GetRouteTag ());
if (m_splitHorizonStrategy == SPLIT_HORIZON && !splitHorizoning)
{
hdr.AddRte (rte);
}
else if (m_splitHorizonStrategy != SPLIT_HORIZON)
{
hdr.AddRte (rte);
}
}
if (hdr.GetRteNumber () == maxRte)
{
p->AddHeader (hdr);
NS_LOG_DEBUG ("SendTo: " << *p);
iter->first->SendTo (p, 0, Inet6SocketAddress (RIPNG_ALL_NODE, RIPNG_PORT));
p->RemoveHeader (hdr);
hdr.ClearRtes ();
}
}
if (hdr.GetRteNumber () > 0)
{
p->AddHeader (hdr);
NS_LOG_DEBUG ("SendTo: " << *p);
iter->first->SendTo (p, 0, Inet6SocketAddress (RIPNG_ALL_NODE, RIPNG_PORT));
}
}
}
for (RoutesI rtIter = m_routes.begin (); rtIter != m_routes.end (); rtIter++)
{
rtIter->first->SetRouteChanged (false);
}
}