35 #include "ns3/inet-socket-address.h"
36 #include "ns3/trace-source-accessor.h"
37 #include "ns3/udp-socket-factory.h"
38 #include "ns3/wifi-net-device.h"
39 #include "ns3/boolean.h"
40 #include "ns3/double.h"
41 #include "ns3/uinteger.h"
80 return sizeof(int32_t);
98 os <<
"DeferredRouteOutputTag: output interface = " <<
oif;
105 static TypeId tid =
TypeId (
"ns3::dsdv::RoutingProtocol")
107 .AddConstructor<RoutingProtocol> ()
108 .AddAttribute (
"PeriodicUpdateInterval",
"Periodic interval between exchange of full routing tables among nodes. ",
112 .AddAttribute (
"SettlingTime",
"Minimum time an update is to be stored in adv table before sending out"
113 "in case of change in metric (in seconds)",
117 .AddAttribute (
"MaxQueueLen",
"Maximum number of packets that we allow a routing protocol to buffer.",
120 MakeUintegerChecker<uint32_t> ())
121 .AddAttribute (
"MaxQueuedPacketsPerDst",
"Maximum number of packets that we allow per destination to buffer.",
124 MakeUintegerChecker<uint32_t> ())
125 .AddAttribute (
"MaxQueueTime",
"Maximum time packets can be queued (in seconds)",
129 .AddAttribute (
"EnableBuffering",
"Enables buffering of data packets if no route to destination is available",
133 MakeBooleanChecker ())
134 .AddAttribute (
"EnableWST",
"Enables Weighted Settling Time for the updates before advertising",
138 MakeBooleanChecker ())
139 .AddAttribute (
"Holdtimes",
"Times the forwarding Interval to purge the route.",
142 MakeUintegerChecker<uint32_t> ())
143 .AddAttribute (
"WeightedFactor",
"WeightedFactor for the settling time if Weighted Settling Time is enabled",
146 MakeDoubleChecker<double> ())
147 .AddAttribute (
"EnableRouteAggregation",
"Enables Weighted Settling Time for the updates before advertising",
151 MakeBooleanChecker ())
152 .AddAttribute (
"RouteAggregationTime",
"Time to aggregate updates before sending them out (in seconds)",
200 m_advRoutingTable (),
202 m_periodicUpdateTimer (
Timer::CANCEL_ON_DESTROY)
218 iter->first->Close ();
264 std::map<Ipv4Address, RoutingTableEntry> removedAddresses;
269 <<
", Packet id: " << p->
GetUid () <<
", Destination address in Packet: " << dst);
272 for (std::map<Ipv4Address, RoutingTableEntry>::iterator rmItr = removedAddresses.begin ();
273 rmItr != removedAddresses.end (); ++rmItr)
275 rmItr->second.SetEntriesChanged (
true);
276 rmItr->second.SetSeqNo (rmItr->second.GetSeqNo () + 1);
279 if (!removedAddresses.empty ())
289 if (rt.GetHop () == 1)
291 route = rt.GetRoute ();
294 <<
" to neighboring destination "
312 <<
" to destination " << dst <<
" via "
313 << rt.GetNextHop ());
340 UnicastForwardCallback ucb,
357 UnicastForwardCallback ucb,
414 if (lcb.
IsNull () ==
false)
417 lcb (p, header, iif);
422 NS_LOG_ERROR (
"Unable to deliver packet locally due to null callback " << p->
GetUid () <<
" from " << origin);
432 ucb (route,packet,header);
446 if (lcb.
IsNull () ==
false)
449 lcb (p, header, iif);
453 NS_LOG_ERROR (
"Unable to deliver packet locally due to null callback " << p->
GetUid () <<
" from " << origin);
468 <<
" via nexthop neighbor " << toDst.
GetNextHop ());
469 ucb (route,p,header);
474 <<
" as there is no route to forward it.");
508 int32_t
interface =
m_ipv4->GetInterfaceForAddress (addr);
536 uint32_t packetSize = packet->GetSize ();
538 <<
" and packet id: " << packet->GetUid ());
540 for (; packetSize > 0; packetSize = packetSize - 12)
544 packet->RemoveHeader (dsdvHeader);
551 if (dsdvHeader.
GetDst () == interface.GetLocal ())
555 NS_LOG_DEBUG (
"Sent Dsdv update back to the same Destination, "
556 "with infinite metric. Time left to send fwd update: "
562 NS_LOG_DEBUG (
"Received update for my address. Discarding this.");
572 << sender <<
" to " << receiver <<
". Details are: Destination: " << dsdvHeader.
GetDst () <<
", Seq No: "
577 if (permanentTableVerifier ==
false)
600 NS_LOG_DEBUG (
"Discarding this update as this route is not present in "
601 "main routing table and received with infinite metric");
609 std::map<Ipv4Address, RoutingTableEntry> allRoutes;
611 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = allRoutes.begin (); i != allRoutes.end (); ++i)
613 NS_LOG_DEBUG (
"ADV table routes are:" << i->second.GetDestination ());
621 if (dsdvHeader.
GetDstSeqno () > advTableEntry.GetSeqNo ())
626 NS_LOG_DEBUG (
"Canceling the timer to update route with better seq number");
629 if (dsdvHeader.
GetHopCount () != advTableEntry.GetHop ())
631 advTableEntry.SetSeqNo (dsdvHeader.
GetDstSeqno ());
633 advTableEntry.SetFlag (
VALID);
634 advTableEntry.SetEntriesChanged (
true);
635 advTableEntry.SetNextHop (sender);
637 NS_LOG_DEBUG (
"Received update with better sequence number and changed metric.Waiting for WST");
639 advTableEntry.SetSettlingTime (tempSettlingtime);
641 <<
"s as there is no event running for this route");
652 advTableEntry.SetSeqNo (dsdvHeader.
GetDstSeqno ());
654 advTableEntry.SetFlag (
VALID);
655 advTableEntry.SetEntriesChanged (
true);
656 advTableEntry.SetNextHop (sender);
659 NS_LOG_DEBUG (
"Route with better sequence number and same metric received. Advertised without WST");
662 else if (dsdvHeader.
GetDstSeqno () == advTableEntry.GetSeqNo ())
664 if (dsdvHeader.
GetHopCount () < advTableEntry.GetHop ())
669 NS_LOG_DEBUG (
"Canceling any existing timer to update route with same sequence number "
670 "and better hop count");
672 advTableEntry.SetSeqNo (dsdvHeader.
GetDstSeqno ());
674 advTableEntry.SetFlag (
VALID);
675 advTableEntry.SetEntriesChanged (
true);
676 advTableEntry.SetNextHop (sender);
679 advTableEntry.SetSettlingTime (tempSettlingtime);
681 <<
" as there is no current event running for this route");
699 if (advTableEntry.GetNextHop () == sender)
707 NS_LOG_DEBUG (
"Received update with same seq number and "
708 "same/worst metric for, " << dsdvHeader.
GetDst () <<
". Discarding the update.");
718 NS_LOG_DEBUG (dsdvHeader.
GetDst () <<
" : Received update with old seq number. Discarding the update.");
723 NS_LOG_DEBUG (
"Route with infinite metric received for "
724 << dsdvHeader.
GetDst () <<
" from " << sender);
726 if (sender == advTableEntry.GetNextHop ())
728 NS_LOG_DEBUG (
"Triggering an update for this unreachable route:");
729 std::map<Ipv4Address, RoutingTableEntry> dstsWithNextHopSrc;
732 advTableEntry.SetSeqNo (dsdvHeader.
GetDstSeqno ());
733 advTableEntry.SetEntriesChanged (
true);
735 for (std::map<Ipv4Address, RoutingTableEntry>::iterator i = dstsWithNextHopSrc.begin (); i
736 != dstsWithNextHopSrc.end (); ++i)
738 i->second.SetSeqNo (i->second.GetSeqNo () + 1);
739 i->second.SetEntriesChanged (
true);
751 " : Discard this link break update as it was received from a different neighbor "
752 "and I can reach the destination");
757 std::map<Ipv4Address, RoutingTableEntry> allRoutes;
774 std::map<Ipv4Address, RoutingTableEntry> allRoutes;
783 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = allRoutes.begin (); i != allRoutes.end (); ++i)
785 NS_LOG_LOGIC (
"Destination: " << i->second.GetDestination ()
786 <<
" SeqNo:" << i->second.GetSeqNo () <<
" HopCount:"
787 << i->second.GetHop () + 1);
791 dsdvHeader.
SetDst (i->second.GetDestination ());
794 temp.SetFlag (
VALID);
795 temp.SetEntriesChanged (
false);
797 if (!(temp.GetSeqNo () % 2))
803 NS_LOG_DEBUG (
"Deleted this route from the advertised table");
809 NS_LOG_DEBUG (
"EventID " << event.GetUid () <<
" associated with "
810 << temp.GetDestination () <<
" has not expired, waiting in adv table");
820 NS_LOG_DEBUG (
"Adding my update as well to the packet");
835 <<
" with packet id : " << packet->
GetUid () <<
" and packet Size: " << packet->
GetSize ());
839 NS_LOG_FUNCTION (
"Update not sent as there are no updates to be triggered");
847 std::map<Ipv4Address, RoutingTableEntry> removedAddresses, allRoutes;
851 if (allRoutes.empty ())
862 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = allRoutes.begin (); i != allRoutes.end (); ++i)
865 if (i->second.GetHop () == 0)
869 dsdvHeader.
SetDstSeqno (i->second.GetSeqNo () + 2);
878 dsdvHeader.
SetDst (i->second.GetDestination ());
883 NS_LOG_DEBUG (
"Forwarding the update for " << i->first);
887 <<
", LifeTime: " << i->second.GetLifeTime ().GetSeconds ());
889 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator rmItr = removedAddresses.begin (); rmItr
890 != removedAddresses.end (); ++rmItr)
893 removedHeader.
SetDst (rmItr->second.GetDestination ());
894 removedHeader.
SetDstSeqno (rmItr->second.GetSeqNo () + 1);
895 removedHeader.
SetHopCount (rmItr->second.GetHop () + 1);
897 NS_LOG_DEBUG (
"Update for removed record is: Destination: " << removedHeader.
GetDst ()
901 socket->
Send (packet);
947 <<
" interface is up");
950 if (iface.GetLocal () ==
Ipv4Address (
"127.0.0.1"))
998 NS_LOG_FUNCTION (
this <<
" interface " << i <<
" address " << address);
1093 std::map<Ipv4Address, RoutingTableEntry> allRoutes;
1095 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = allRoutes.begin (); i != allRoutes.end (); ++i)
1105 <<
" to neighboring destination "
1138 NS_LOG_DEBUG (
"Output device doesn't match. Dropped.");
1146 ucb (route,p,header);
1174 NS_LOG_DEBUG (
"Calculated weightedTime:" << weightedTime.GetSeconds ());
1175 return weightedTime;
1184 NS_LOG_FUNCTION (
"Merging advertised table changes with main table before sending out periodic update");
1185 std::map<Ipv4Address, RoutingTableEntry> allRoutes;
1187 if (allRoutes.size () > 0)
1189 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = allRoutes.begin (); i != allRoutes.end (); ++i)
1205 NS_LOG_DEBUG (
"Event currently running. Cannot Merge Routing Tables");