32 #define NS_LOG_APPEND_CONTEXT                                   \ 
   33   if (GetObject<Node> ()) { std::clog << "[node " << GetObject<Node> ()->GetId () << "] "; } 
   42 #include "ns3/config.h" 
   44 #include "ns3/string.h" 
   47 #include "ns3/assert.h" 
   48 #include "ns3/uinteger.h" 
   49 #include "ns3/net-device.h" 
   50 #include "ns3/packet.h" 
   51 #include "ns3/boolean.h" 
   52 #include "ns3/node-list.h" 
   53 #include "ns3/double.h" 
   54 #include "ns3/pointer.h" 
   55 #include "ns3/timer.h" 
   56 #include "ns3/object-vector.h" 
   57 #include "ns3/ipv4-address.h" 
   58 #include "ns3/ipv4-header.h" 
   59 #include "ns3/ipv4-l3-protocol.h" 
   60 #include "ns3/ipv4-route.h" 
   61 #include "ns3/trace-source-accessor.h" 
   62 #include "ns3/icmpv4-l4-protocol.h" 
   63 #include "ns3/adhoc-wifi-mac.h" 
   64 #include "ns3/wifi-net-device.h" 
   65 #include "ns3/inet-socket-address.h" 
   66 #include "ns3/udp-l4-protocol.h" 
   67 #include "ns3/udp-socket-factory.h" 
   68 #include "ns3/tcp-socket-factory.h" 
   69 #include "ns3/llc-snap-header.h" 
   70 #include "ns3/arp-header.h" 
  111     .AddConstructor<DsrRouting> ()
 
  112     .AddAttribute (
"RouteCache",
 
  113                    "The route cache for saving routes from " 
  114                    "route discovery process.",
 
  118                    MakePointerChecker<RouteCache> ())
 
  119     .AddAttribute (
"RreqTable",
 
  120                    "The request table to manage route requests.",
 
  124                    MakePointerChecker<RreqTable> ())
 
  125     .AddAttribute (
"PassiveBuffer",
 
  126                    "The passive buffer to manage " 
  127                    "promisucously received passive ack.",
 
  131                    MakePointerChecker<PassiveBuffer> ())
 
  132     .AddAttribute (
"MaxSendBuffLen",
 
  133                    "Maximum number of packets that can be stored " 
  137                    MakeUintegerChecker<uint32_t> ())
 
  138     .AddAttribute (
"MaxSendBuffTime",
 
  139                    "Maximum time packets can be queued in the send buffer .",
 
  143     .AddAttribute (
"MaxMaintLen",
 
  144                    "Maximum number of packets that can be stored " 
  145                    "in maintenance buffer.",
 
  148                    MakeUintegerChecker<uint32_t> ())
 
  149     .AddAttribute (
"MaxMaintTime",
 
  150                    "Maximum time packets can be queued in maintenance buffer.",
 
  154     .AddAttribute (
"MaxCacheLen",
 
  155                    "Maximum number of route entries that can be stored " 
  159                    MakeUintegerChecker<uint32_t> ())
 
  160     .AddAttribute (
"RouteCacheTimeout",
 
  161                    "Maximum time the route cache can be queued in " 
  166     .AddAttribute (
"MaxEntriesEachDst",
 
  167                    "Maximum number of route entries for a " 
  168                    "single destination to respond.",
 
  171                    MakeUintegerChecker<uint32_t> ())
 
  172     .AddAttribute (
"SendBuffInterval",
 
  173                    "How often to check send buffer for packet with route.",
 
  177     .AddAttribute (
"NodeTraversalTime",
 
  178                    "The time it takes to traverse two neighboring nodes.",
 
  182     .AddAttribute (
"RreqRetries",
 
  183                    "Maximum number of retransmissions for " 
  184                    "request discovery of a route.",
 
  187                    MakeUintegerChecker<uint32_t> ())
 
  188     .AddAttribute (
"MaintenanceRetries",
 
  189                    "Maximum number of retransmissions for " 
  190                    "data packets from maintenance buffer.",
 
  193                    MakeUintegerChecker<uint32_t> ())
 
  194     .AddAttribute (
"RequestTableSize",
 
  195                    "Maximum number of request entries in the request table, " 
  196                    "set this as the number of nodes in the simulation.",
 
  199                    MakeUintegerChecker<uint32_t> ())
 
  200     .AddAttribute (
"RequestIdSize",
 
  201                    "Maximum number of request source Ids in " 
  202                    "the request table.",
 
  205                    MakeUintegerChecker<uint32_t> ())
 
  206     .AddAttribute (
"UniqueRequestIdSize",
 
  207                    "Maximum number of request Ids in " 
  208                    "the request table for a single destination.",
 
  211                    MakeUintegerChecker<uint32_t> ())
 
  212     .AddAttribute (
"NonPropRequestTimeout",
 
  213                    "The timeout value for non-propagation request.",
 
  217     .AddAttribute (
"DiscoveryHopLimit",
 
  218                    "The max discovery hop limit for route requests.",
 
  221                    MakeUintegerChecker<uint32_t> ())
 
  222     .AddAttribute (
"MaxSalvageCount",
 
  223                    "The max salvage count for a single data packet.",
 
  226                    MakeUintegerChecker<uint8_t> ())
 
  227     .AddAttribute (
"BlacklistTimeout",
 
  228                    "The time for a neighbor to stay in blacklist.",
 
  232     .AddAttribute (
"GratReplyHoldoff",
 
  233                    "The time for gratuitous reply entry to expire.",
 
  237     .AddAttribute (
"BroadcastJitter",
 
  238                    "The jitter time to avoid collision for broadcast packets.",
 
  241                    MakeUintegerChecker<uint32_t> ())
 
  242     .AddAttribute (
"LinkAckTimeout",
 
  243                    "The time a packet in maintenance buffer wait for " 
  244                    "link acknowledgment.",
 
  248     .AddAttribute (
"TryLinkAcks",
 
  249                    "The number of link acknowledgment to use.",
 
  252                    MakeUintegerChecker<uint32_t> ())
 
  253     .AddAttribute (
"PassiveAckTimeout",
 
  254                    "The time a packet in maintenance buffer wait for " 
  255                    "passive acknowledgment.",
 
  259     .AddAttribute (
"TryPassiveAcks",
 
  260                    "The number of passive acknowledgment to use.",
 
  263                    MakeUintegerChecker<uint32_t> ())
 
  264     .AddAttribute (
"RequestPeriod",
 
  265                    "The base time interval between route requests.",
 
  269     .AddAttribute (
"MaxRequestPeriod",
 
  270                    "The max time interval between route requests.",
 
  274     .AddAttribute (
"GraReplyTableSize",
 
  275                    "The gratuitous reply table size.",
 
  278                    MakeUintegerChecker<uint32_t> ())
 
  279     .AddAttribute (
"CacheType",
 
  280                    "Use Link Cache or use Path Cache",
 
  284     .AddAttribute (
"StabilityDecrFactor",
 
  285                    "The stability decrease factor for link cache",
 
  288                    MakeUintegerChecker<uint32_t> ())
 
  289     .AddAttribute (
"StabilityIncrFactor",
 
  290                    "The stability increase factor for link cache",
 
  293                    MakeUintegerChecker<uint32_t> ())
 
  294     .AddAttribute (
"InitStability",
 
  295                    "The initial stability factor for link cache",
 
  299     .AddAttribute (
"MinLifeTime",
 
  300                    "The minimal life time for link cache",
 
  304     .AddAttribute (
"UseExtends",
 
  305                    "The extension time for link cache",
 
  309     .AddAttribute (
"EnableSubRoute",
 
  310                    "Enables saving of sub route when receiving " 
  311                    "route error messages, only available when " 
  312                    "using path route cache",
 
  316     .AddAttribute (
"RetransIncr",
 
  317                    "The increase time for retransmission timer " 
  318                    "when facing network congestion",
 
  322     .AddAttribute (
"MaxNetworkQueueSize",
 
  323                    "The max number of packet to save in the network queue.",
 
  326                    MakeUintegerChecker<uint32_t> ())
 
  327     .AddAttribute (
"MaxNetworkQueueDelay",
 
  328                    "The max time for a packet to stay in the network queue.",
 
  332     .AddAttribute (
"NumPriorityQueues",
 
  333                    "The max number of packet to save in the network queue.",
 
  336                    MakeUintegerChecker<uint32_t> ())
 
  337     .AddAttribute (
"LinkAcknowledgment",
 
  338                    "Enable Link layer acknowledgment mechanism",
 
  342     .AddTraceSource (
"Tx",
 
  345                      "ns3::DsrOptionSRHeader::TracedCallback")
 
  346     .AddTraceSource (
"Drop",
 
  349                      "ns3::Packet::TracedCallback")
 
  400       Ptr<Node> node = this->GetObject<Node> ();
 
  403           m_ipv4 = this->GetObject<Ipv4L3Protocol> ();
 
  432       std::pair<std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator, 
bool> result_i = 
m_priorityQueue.insert (std::make_pair (i, queue_i));
 
  464       for (uint32_t i = 0; i < 
m_ipv4->GetNInterfaces (); i++)
 
  469           if (addr != loopback)
 
  487               routeCache->ScheduleTimer ();
 
  510               routeCache->AddArpCache (
m_ipv4->GetInterface (i)->GetArpCache ());
 
  523   Config::Connect (
"NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyRxEnd",
 
  536   Mac48Address nodeAddr = netDevice->GetMac()->GetAddress();
 
  537   std::ostringstream oss;
 
  583   Ipv4Address ourAddress = ipv4->GetAddress (1, 0).GetLocal ();
 
  597       newEntry.SetSrc (sourceIp);
 
  598       newEntry.SetDst (destinationIp);
 
  600       newEntry.SetOurAdd (previousHop);
 
  601       newEntry.SetNextHop (ourAddress);
 
  607       dsr->CancelLinkPacketTimer (newEntry);
 
  620   return n->
GetDevice (atoi (elements[3].c_str ()));
 
  623 std::vector<std::string>
 
  626   std::vector <std::string> elements;
 
  628   while (pos1 != context.npos)
 
  630     pos1 = context.find (
"/",pos1);
 
  631     pos2 = context.find (
"/",pos1+1);
 
  632     elements.push_back (context.substr (pos1+1,pos2-(pos1+1)));
 
  644   for (uint32_t i = 0; i < 
m_ipv4->GetNInterfaces (); i++)
 
  654               mac->TraceDisconnectWithoutContext (
"TxErrHeader",
 
  720   for (int32_t i = 0; i < nNodes; ++i)
 
  724       int32_t ifIndex = ipv4->GetInterfaceForAddress (ipv4Address);
 
  757   std::vector<Ipv4Address> nodelist = rt.
GetVector ();
 
  765   m_routeCache->DeleteAllRoutesIncludeLink (errorSrc, unreachNode, node);
 
  775   return m_rreqTable->FindSourceEntry (src, dst, 
id);
 
  783   for (int32_t i = 0; i < nNodes; ++i)
 
  789       if (netDevice->GetAddress () == 
address)
 
  791           return ipv4->GetAddress (1, 0).GetLocal ();
 
  810       for (std::vector<Ipv4Address>::const_iterator i = vec.begin (); i != vec.end (); ++i)
 
  822   if (vec.size () == 2)
 
  830       if (ipv4Address == vec.back ())
 
  832           NS_LOG_DEBUG (
"We have reached to the final destination " << ipv4Address << 
" " << vec.back ());
 
  835       for (std::vector<Ipv4Address>::const_iterator i = vec.begin (); i != vec.end (); ++i)
 
  837           if (ipv4Address == (*i))
 
  871   for (int32_t i = 0; i < nNodes; ++i)
 
  875       if (ipv4->GetAddress (1, 0).GetLocal () == 
address)
 
  895       return ipv4->GetAddress (1, 0).GetLocal ();
 
  929       NS_LOG_DEBUG (
"Here we try to find the data packet in the send buffer");
 
  932       bool findRoute = 
m_routeCache->LookupRoute (destination, toDst);
 
  935           NS_LOG_INFO (
"We have found a route for the packet");
 
  938           uint8_t protocol = i->GetProtocol ();
 
  953           uint32_t size = copyP->
GetSize ();
 
  954           uint8_t *
data = 
new uint8_t[size];
 
  957           uint8_t optionType = 0;
 
  958           optionType = *(
data);
 
  964               uint8_t errorType = *(data + 2);
 
  980                   std::vector<Ipv4Address> errorRoute = toDst.
GetVector ();
 
  992                   if (nextHop == 
"0.0.0.0")
 
  999                   uint8_t length = (sourceRoute.
GetLength () + newUnreach.GetLength ());
 
 1009                   newPacket->
AddHeader (dsrRoutingHeader); 
 
 1014                   std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = 
m_priorityQueue.find (priority);
 
 1016                   NS_LOG_LOGIC (
"Will be inserting into priority queue number: " << priority);
 
 1023                  if (dsrNetworkQueue->Enqueue (newEntry))
 
 1029                      NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
 
 1041               std::vector<Ipv4Address> nodeList = toDst.
GetVector (); 
 
 1043               if (nextHop == 
"0.0.0.0")
 
 1048               uint8_t salvage = 0;
 
 1057               uint8_t length = sourceRoute.
GetLength ();
 
 1070                   networkKey.
m_ackId = newEntry.GetAckId ();
 
 1071                   networkKey.
m_ourAdd = newEntry.GetOurAdd ();
 
 1072                   networkKey.
m_nextHop = newEntry.GetNextHop ();
 
 1073                   networkKey.
m_source = newEntry.GetSrc ();
 
 1078                   passiveKey.
m_source = newEntry.GetSrc ();
 
 1080                   passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
 
 1083                   linkKey.
m_source = newEntry.GetSrc ();
 
 1085                   linkKey.
m_ourAdd = newEntry.GetOurAdd ();
 
 1086                   linkKey.
m_nextHop = newEntry.GetNextHop ();
 
 1099                       if (nextHop != destination)
 
 1149           NS_LOG_INFO (
this << from << to << packetType << *p);
 
 1156           uint32_t sourceId = dsrRoutingHeader.
GetSourceId ();
 
 1164           uint32_t size = p->
GetSize ();
 
 1165           uint8_t *
data = 
new uint8_t[size];
 
 1167           uint8_t optionType = 0;
 
 1168           optionType = *(
data);
 
 1172           if (optionType == 96)        
 
 1178                             " overhearing packet PID: " << p->
GetUid () <<
 
 1179                             " from " << promiscSource <<
 
 1181                             " with source IP " << ipv4Header.
GetSource () <<
 
 1183                             " and packet : " << *dsrPacket);
 
 1185               bool isPromisc = 
true;                     
 
 1186               dsrOption->Process (p, dsrPacket, 
m_mainAddress, source, ipv4Header, nextHeader, isPromisc, promiscSource);
 
 1200   NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)protocol);
 
 1203   bool findRoute = 
m_routeCache->LookupRoute (destination, toDst);
 
 1208                    << 
"s " << 
m_mainAddress << 
" there is no route for this packet, queue the packet");
 
 1216                        << 
"s Add packet PID: " << packet->
GetUid () << 
" to queue. Packet: " << *packet);
 
 1238       std::vector<Ipv4Address> nodeList = toDst.
GetVector ();     
 
 1240       if (nextHop == 
"0.0.0.0")
 
 1245       uint8_t salvage = 0;
 
 1255       uint8_t length = sourceRoute.
GetLength ();
 
 1263                                                source,  destination,  0,
 
 1270           networkKey.
m_ackId = newEntry.GetAckId ();
 
 1271           networkKey.
m_ourAdd = newEntry.GetOurAdd ();
 
 1272           networkKey.
m_nextHop = newEntry.GetNextHop ();
 
 1273           networkKey.
m_source = newEntry.GetSrc ();
 
 1278           passiveKey.
m_source = newEntry.GetSrc ();
 
 1280           passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
 
 1283           linkKey.
m_source = newEntry.GetSrc ();
 
 1285           linkKey.
m_ourAdd = newEntry.GetOurAdd ();
 
 1286           linkKey.
m_nextHop = newEntry.GetNextHop ();
 
 1299               if (nextHop != destination)
 
 1316   NS_LOG_FUNCTION (
this << unreachNode << destination << originalDst << (uint32_t)salvage << (uint32_t)protocol);
 
 1330   uint8_t rerrLength = rerrUnreachHeader.
GetLength ();
 
 1334   bool findRoute = 
m_routeCache->LookupRoute (destination, toDst);
 
 1341         NS_LOG_INFO (
"We are the error source, send request to original dst " << originalDst);
 
 1348                      << 
"s " << 
m_mainAddress << 
" there is no route for this packet, queue the packet");
 
 1352         newPacket->
AddHeader (dsrRoutingHeader);
 
 1360                          << 
"s Add packet PID: " << p->
GetUid () << 
" to queue. Packet: " << *p);
 
 1364                 NS_LOG_DEBUG (
"When there is no existing route request for " << destination << 
", initialize one");
 
 1375       std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
 
 1377       if (nextHop == 
"0.0.0.0")
 
 1391       uint8_t srLength = sourceRoute.
GetLength ();
 
 1392       uint8_t length = (srLength + rerrLength);
 
 1397       newPacket->
AddHeader (dsrRoutingHeader);
 
 1405       std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = 
m_priorityQueue.find (priority);
 
 1407       NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue << 
" number: " << priority);
 
 1414      if (dsrNetworkQueue->Enqueue (newEntry))
 
 1420          NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
 
 1432   NS_LOG_FUNCTION (
this << rerr << sourceRoute << nextHop << (uint32_t)protocol << route);
 
 1436   dsrRoutingHeader.SetMessageType (1);
 
 1441   dsrRoutingHeader.SetPayloadLength (uint16_t (length) + 4);
 
 1442   dsrRoutingHeader.AddDsrOption (rerr);
 
 1443   dsrRoutingHeader.AddDsrOption (sourceRoute);
 
 1450   std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = 
m_priorityQueue.find (priority);
 
 1452   NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue << 
" number: " << priority);
 
 1459  if (dsrNetworkQueue->Enqueue (newEntry))
 
 1465      NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
 
 1476   NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)protocol << route);
 
 1481       NS_LOG_INFO (
"Drop packet. Not handling ICMP packet for now");
 
 1487       bool findRoute = 
m_routeCache->LookupRoute (destination, toDst);
 
 1492                        << 
"s " << 
m_mainAddress << 
" there is no route for this packet, queue the packet");
 
 1500                            << 
"s Add packet PID: " << packet->
GetUid () << 
" to send buffer. Packet: " << *packet);
 
 1512                   NS_LOG_LOGIC (
"There is existing route request timer with request count " << 
m_rreqTable->GetRreqCnt (destination));
 
 1526           std::vector<Ipv4Address> nodeList = toDst.
GetVector ();       
 
 1528           if (nextHop == 
"0.0.0.0")
 
 1533           uint8_t salvage = 0;
 
 1543           uint8_t length = sourceRoute.
GetLength ();
 
 1553                                                    source,  destination,  0,
 
 1559               networkKey.
m_ackId = newEntry.GetAckId ();
 
 1560               networkKey.
m_ourAdd = newEntry.GetOurAdd ();
 
 1561               networkKey.
m_nextHop = newEntry.GetNextHop ();
 
 1562               networkKey.
m_source = newEntry.GetSrc ();
 
 1567               passiveKey.
m_source = newEntry.GetSrc ();
 
 1569               passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
 
 1572               linkKey.
m_source = newEntry.GetSrc ();
 
 1574               linkKey.
m_ourAdd = newEntry.GetOurAdd ();
 
 1575               linkKey.
m_nextHop = newEntry.GetNextHop ();
 
 1588                   if (nextHop != destination)
 
 1621   uint32_t sourceId = dsrRoutingHeader.
GetSourceId ();
 
 1622   uint32_t destinationId = dsrRoutingHeader.
GetDestId ();
 
 1629   uint8_t numberAddress = (buf[1] - 2) / 4;
 
 1642   newDsrRoutingHeader.
SetDestId (destinationId);
 
 1655   NS_LOG_FUNCTION (
this << packet << source << nextHop << (uint32_t)protocol);
 
 1662   std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = 
m_priorityQueue.find (priority);
 
 1664   NS_LOG_INFO (
"Will be inserting into priority queue number: " << priority);
 
 1671  if (dsrNetworkQueue->Enqueue (newEntry))
 
 1677      NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
 
 1692   uint32_t numPriorities;
 
 1693   if (continueWithFirst)
 
 1699       numPriorities = priority;
 
 1704       std::map<uint32_t, Ptr<DsrNetworkQueue> >::iterator q = 
m_priorityQueue.find (i);
 
 1706       uint32_t queueSize = dsrNetworkQueue->GetSize ();
 
 1709           if ((i == (m_numPriorityQueues - 1)) && continueWithFirst)
 
 1720           uint32_t totalQueueSize = 0;
 
 1723               NS_LOG_INFO (
"The size of the network queue for " << j->first << 
" is " << j->second->GetSize ());
 
 1724               totalQueueSize += j->second->GetSize ();
 
 1725               NS_LOG_INFO (
"The total network queue size is " << totalQueueSize);
 
 1727           if (totalQueueSize > 5)
 
 1733           dsrNetworkQueue->Dequeue (newEntry);
 
 1736               NS_LOG_LOGIC (
"Packet sent by Dsr. Calling PriorityScheduler after some time");
 
 1745               NS_LOG_LOGIC (
"Packet dropped by Dsr. Calling PriorityScheduler immediately");
 
 1749           if ((i == (m_numPriorityQueues - 1)) && continueWithFirst)
 
 1767   std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = 
m_priorityQueue.find (priority);
 
 1770   std::vector<DsrNetworkQueueEntry> newNetworkQueue = dsrNetworkQueue->GetQueue ();
 
 1771   for (std::vector<DsrNetworkQueueEntry>::iterator i = newNetworkQueue.begin (); i != newNetworkQueue.end (); i++)
 
 1776           if (nextHop == j->first.m_nextHop)
 
 1778               NS_LOG_DEBUG (
"The network delay left is " << j->second.GetDelayLeft ());
 
 1779               j->second.SetDelay (j->second.GetDelayLeft () + 
m_retransIncr);
 
 1807   NS_LOG_INFO (
"The nexthop address " << nextHop << 
" the source " << source << 
" the destination " << destination);
 
 1813       NS_LOG_DEBUG (
"destination over here " << destination);
 
 1832           uint8_t length = sourceRoute.
GetLength ();
 
 1841                                        source,  destination,  0,
 
 1848               networkKey.
m_ackId = newEntry.GetAckId ();
 
 1849               networkKey.
m_ourAdd = newEntry.GetOurAdd ();
 
 1850               networkKey.
m_nextHop = newEntry.GetNextHop ();
 
 1851               networkKey.
m_source = newEntry.GetSrc ();
 
 1856               passiveKey.
m_source = newEntry.GetSrc ();
 
 1858               passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
 
 1861               linkKey.
m_source = newEntry.GetSrc ();
 
 1863               linkKey.
m_ourAdd = newEntry.GetOurAdd ();
 
 1864               linkKey.
m_nextHop = newEntry.GetNextHop ();
 
 1877                   if (nextHop != destination)
 
 1892               NS_LOG_LOGIC (
"Schedule sending the next packet in send buffer");
 
 1899           NS_LOG_LOGIC (
"All queued packets are out-dated for the destination in send buffer");
 
 1917           uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset ();
 
 1922           uint32_t size = copyP->
GetSize ();
 
 1923           uint8_t *
data = 
new uint8_t[size];
 
 1926           uint8_t optionType = 0;
 
 1927           optionType = *(
data);
 
 1928           NS_LOG_DEBUG (
"The option type value in send packet " << (uint32_t)optionType);
 
 1929           if (optionType == 3)
 
 1935               uint8_t errorType = *(data + 2);
 
 1939                   NS_LOG_DEBUG (
"The packet is route error unreach packet");
 
 1969                   newPacket->
AddHeader (newRoutingHeader);       
 
 1974                   std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = 
m_priorityQueue.find (priority);
 
 1976                   NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue << 
" number: " << priority);
 
 1983                  if (dsrNetworkQueue->Enqueue (newEntry))
 
 1989                      NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
 
 1996               NS_LOG_LOGIC (
"Schedule sending the next packet in error buffer");
 
 2004       NS_LOG_DEBUG (
"Packet not found in either the send or error buffer");
 
 2010                     uint16_t fragmentOffset, uint16_t identification, 
bool saveEntry)
 
 2012   NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)segsLeft);
 
 2031       NS_LOG_DEBUG (
"We get the all equal for passive buffer here");
 
 2036       mbEntry.
SetDst (destination);
 
 2055   NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)segsLeft);
 
 2063   newEntry.
SetSrc (source);
 
 2064   newEntry.
SetDst (destination);
 
 2081   NS_LOG_FUNCTION (
this << (uint32_t)ackId << ipv4Header << realSrc << realDst);
 
 2090                                            realSrc,  realDst,  ackId,
 
 2123   std::map<LinkKey, Timer>::const_iterator i =
 
 2150       NS_LOG_INFO (
"Link acknowledgment received, remove same maintenance buffer entry");
 
 2171                         << 
" source " << mb.
GetSrc () << 
" destination " << mb.
GetDst ()
 
 2175   std::map<NetworkKey, Timer>::const_iterator i =
 
 2200       NS_LOG_INFO (
"Remove same maintenance buffer entry based on network acknowledgment");
 
 2218   std::map<PassiveKey, Timer>::const_iterator j =
 
 2246   std::vector<Ipv4Address> previousErrorDst;
 
 2263       uint8_t numberAddress = (buf[1] - 2) / 4;
 
 2264       NS_LOG_DEBUG (
"The number of addresses " << (uint32_t)numberAddress);
 
 2280           errorDst = address1;
 
 2287       if (std::find(previousErrorDst.begin(), previousErrorDst.end(), destination)==previousErrorDst.end())
 
 2289         NS_LOG_DEBUG (
"have not seen this dst before " << errorDst << 
" in " << previousErrorDst.size());
 
 2291         previousErrorDst.push_back(errorDst);
 
 2303           NS_LOG_INFO (
"Cancel the packet timer for next maintenance entry");
 
 2310       NS_LOG_INFO (
"Maintenance buffer entry not found");
 
 2318   NS_LOG_FUNCTION (
this << packet << source << dst << (uint32_t)protocol);
 
 2331   newPacket->
CopyData (buf, 
sizeof(buf));
 
 2332   uint8_t numberAddress = (buf[1] - 2) / 4;
 
 2342   bool findRoute = 
m_routeCache->LookupRoute (dst, toDst);
 
 2352       std::vector<Ipv4Address> nodeList = toDst.
GetVector ();     
 
 2354       if (nextHop == 
"0.0.0.0")
 
 2370       uint8_t length = sourceRoute.
GetLength ();
 
 2382       std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = 
m_priorityQueue.find (priority);
 
 2384       NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue << 
" number: " << priority);
 
 2391      if (dsrNetworkQueue->Enqueue (newEntry))
 
 2397          NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
 
 2408       NS_LOG_DEBUG (
"Will not salvage this packet, silently drop");
 
 2466   NS_LOG_DEBUG (
"The passive acknowledgment option for data packet");
 
 2483   NS_LOG_DEBUG (
"is the first retry or not " << isFirst);
 
 2504       networkKey.m_ackId = newEntry.
GetAckId ();
 
 2505       networkKey.m_ourAdd = newEntry.
GetOurAdd ();
 
 2506       networkKey.m_nextHop = newEntry.
GetNextHop ();
 
 2507       networkKey.m_source = newEntry.
GetSrc ();
 
 2508       networkKey.m_destination = newEntry.
GetDst ();
 
 2533       networkKey.m_ackId = mb.
GetAckId ();
 
 2536       networkKey.m_source = mb.
GetSrc ();
 
 2537       networkKey.m_destination = mb.
GetDst ();
 
 2552       NS_LOG_DEBUG (
"The packet with dsr header " << dsrP->GetSize ());
 
 2553       networkKey.m_ackId = mb.
GetAckId ();
 
 2556       networkKey.m_source = mb.
GetSrc ();
 
 2557       networkKey.m_destination = mb.
GetDst ();
 
 2615       NS_LOG_INFO (
"We need to send error messages now");
 
 2723   NS_LOG_FUNCTION (
this << packet << sourceRoute << source << nextHop << targetAddress << (uint32_t)protocol << route);
 
 2728   dsrRoutingHeader.SetMessageType (2);
 
 2729   dsrRoutingHeader.SetSourceId (
GetIDfromIP (source));
 
 2730   dsrRoutingHeader.SetDestId (
GetIDfromIP (targetAddress));
 
 2734   uint8_t length = sourceRoute.
GetLength ();
 
 2735   dsrRoutingHeader.SetPayloadLength (uint16_t (length) + 2);
 
 2736   dsrRoutingHeader.AddDsrOption (sourceRoute);
 
 2742                                source,  targetAddress,  
m_ackId,
 
 2749       networkKey.
m_ackId = newEntry.GetAckId ();
 
 2750       networkKey.
m_ourAdd = newEntry.GetOurAdd ();
 
 2751       networkKey.
m_nextHop = newEntry.GetNextHop ();
 
 2752       networkKey.
m_source = newEntry.GetSrc ();
 
 2757       passiveKey.
m_source = newEntry.GetSrc ();
 
 2759       passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
 
 2762       linkKey.
m_source = newEntry.GetSrc ();
 
 2764       linkKey.
m_ourAdd = newEntry.GetOurAdd ();
 
 2765       linkKey.
m_nextHop = newEntry.GetNextHop ();
 
 2778           if (nextHop != targetAddress)
 
 2796   NS_LOG_FUNCTION (
this << source << destination << (uint32_t)protocol);
 
 2817   uint8_t length = rreqHeader.
GetLength ();
 
 2819   packet->AddHeader (dsrRoutingHeader);
 
 2822   bool nonProp = 
true;
 
 2823   std::vector<Ipv4Address> 
address;
 
 2824   address.push_back (source);
 
 2825   address.push_back (destination);
 
 2857       std::vector<Ipv4Address> ip = toDst.GetVector ();
 
 2869       if (nextHop == 
"0.0.0.0")
 
 2887       NS_LOG_INFO (
"No route found, initiate route error request");
 
 2904       rreqHeader.SetTarget (originalDst);
 
 2910       uint8_t length = rreqHeader.GetLength () + rerr.
GetLength ();
 
 2914       bool nonProp = 
false;
 
 2915       std::vector<Ipv4Address> 
address;
 
 2917       address.push_back (originalDst);
 
 2928           NS_LOG_INFO (
"Only when there is no existing route request time when the initial route request is scheduled");
 
 2934           NS_LOG_INFO (
"There is existing route request, find the existing route request entry");
 
 2952       NS_LOG_DEBUG (
"Did not find the non-propagation timer");
 
 2997   NS_LOG_FUNCTION (
this << packet << nonProp << requestId << (uint32_t)protocol);
 
 3008       std::vector<Ipv4Address> 
address;
 
 3009       address.push_back (source);
 
 3010       address.push_back (dst);
 
 3032       std::vector<Ipv4Address> 
address;
 
 3033       address.push_back (source);
 
 3034       address.push_back (dst);
 
 3084       std::vector<Ipv4Address> ip = toDst.
GetVector ();
 
 3095       NS_LOG_INFO (
"The nextHop address is " << nextHop);
 
 3096       if (nextHop == 
"0.0.0.0")
 
 3122       NS_LOG_DEBUG (
"Route not found. Drop packet with dst " << dst);
 
 3134       NS_LOG_DEBUG (
"Check the route request entry " << source << 
" " << dst);
 
 3151   std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = 
m_priorityQueue.find (priority);
 
 3153   NS_LOG_LOGIC (
"Inserting into priority queue number: " << priority);
 
 3159  if (dsrNetworkQueue->Enqueue (newEntry))
 
 3165      NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
 
 3197       std::vector<Ipv4Address>::iterator before = find (nodeList.begin (), nodeList.end (), srcAddress);
 
 3198       for (std::vector<Ipv4Address>::iterator i = nodeList.begin (); i != before; ++i)
 
 3203       std::vector<Ipv4Address>::iterator after = find (nodeList.begin (), nodeList.end (), 
m_mainAddress);
 
 3204       for (std::vector<Ipv4Address>::iterator j = after; j != nodeList.end (); ++j)
 
 3230       newPacket->
AddHeader (dsrRoutingHeader);
 
 3239       NS_LOG_INFO (
"The same gratuitous route reply has already sent");
 
 3254   NS_LOG_INFO (
"The output device " << dev << 
" packet is: " << *packet);
 
 3257   std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = 
m_priorityQueue.find (priority);
 
 3259   NS_LOG_INFO (
"Inserting into priority queue number: " << priority);
 
 3265  if (dsrNetworkQueue->Enqueue (newEntry))
 
 3271      NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
 
 3283                           packet, source, nextHop, route);
 
 3305   NS_LOG_FUNCTION (
this << ackId << destination << realSrc << realDst << (uint32_t)protocol << route);
 
 3311   dsrRoutingHeader.SetMessageType (1);
 
 3313   dsrRoutingHeader.SetDestId (
GetIDfromIP (destination));
 
 3324   dsrRoutingHeader.SetPayloadLength (uint16_t (length) + 2);
 
 3325   dsrRoutingHeader.AddDsrOption (ack);
 
 3333   std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = 
m_priorityQueue.find (priority);
 
 3336   NS_LOG_LOGIC (
"Will be inserting into priority queue " << dsrNetworkQueue << 
" number: " << priority);
 
 3342  if (dsrNetworkQueue->Enqueue (newEntry))
 
 3348      NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
 
 3370   uint32_t sourceId = dsrRoutingHeader.
GetSourceId ();
 
 3372   NS_LOG_INFO (
"The source address " << source << 
" with source id " << sourceId);
 
 3378   bool isPromisc = 
false;
 
 3389   uint32_t size = p->
GetSize ();
 
 3390   uint8_t *
data = 
new uint8_t[size];
 
 3393   uint8_t optionType = 0;
 
 3394   uint8_t optionLength = 0;
 
 3395   uint8_t segmentsLeft = 0;
 
 3397   optionType = *(
data);
 
 3398   NS_LOG_LOGIC (
"The option type value " << (uint32_t)optionType << 
" with packet id " << p->
GetUid());
 
 3401   if (optionType == 1)        
 
 3406           NS_LOG_INFO (
"Discard this packet due to unidirectional link");
 
 3411       optionLength = dsrOption->Process (p, packet, 
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
 
 3413       if (optionLength == 0)
 
 3419   else if (optionType == 2)
 
 3422       optionLength = dsrOption->Process (p, packet, 
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
 
 3424       if (optionLength == 0)
 
 3431   else if (optionType == 32)       
 
 3435       optionLength = dsrOption->Process (p, packet, 
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
 
 3437       if (optionLength == 0)
 
 3444   else if (optionType == 3)       
 
 3447       NS_LOG_INFO (
"The option type value " << (uint32_t)optionType);
 
 3450       optionLength = dsrOption->Process (p, packet, 
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
 
 3452       if (optionLength == 0)
 
 3457       NS_LOG_INFO (
"The option Length " << (uint32_t)optionLength);
 
 3460   else if (optionType == 96)       
 
 3463       optionLength = dsrOption->Process (p, packet, 
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
 
 3464       segmentsLeft = *(data + 3);
 
 3465       if (optionLength == 0)
 
 3472           if (segmentsLeft == 0)
 
 3484                     nextProto->Receive (copy, ip, incomingInterface);
 
 3511               NS_LOG_INFO (
"This is not the final destination, the packet has already been forward to next hop");
 
 3521       uint8_t salvage = 0;
 
 3583       if ((*i)->GetOptionNumber () == optionNumber)
 
bool Dequeue(Ipv4Address dst, ErrorBuffEntry &entry)
Return first found (the earliest) entry for given destination. 
uint32_t m_sendRetries
of retries have been sent for network acknowledgment
uint32_t m_stabilityDecrFactor
The initial decrease factor for link cache. 
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer. 
void SetExpireTime(Time exp)
bool NetworkEqual(MaintainBuffEntry &entry)
Verify if the maintain buffer entry is the same in every field for network ack. 
Ptr< const AttributeChecker > MakeStringChecker(void)
void SetDownTarget(IpL4Protocol::DownTargetCallback callback)
This method allows a caller to set the current down target callback set for this L4 protocol (IPv4 ca...
bool Find(Ipv4Address dst)
Check if a packet with destination dst exists in the queue. 
std::string m_cacheType
The type of route cache. 
Simulation virtual time values and global simulation resolution. 
void SetDst(Ipv4Address n)
uint32_t GetSize()
Number of entries. 
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 "...
void SetStream(int64_t stream)
Specifies the stream number for this RNG stream. 
bool PassiveEntryCheck(Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, uint8_t segsLeft, uint16_t fragmentOffset, uint16_t identification, bool saveEntry)
Find the same passive entry. 
void SetDestination(Ipv4Address d)
static uint32_t GetNNodes(void)
AttributeValue implementation for Boolean. 
void CancelLinkPacketTimer(MaintainBuffEntry &mb)
Cancel the link packet retransmission timer for a specific maintenance entry. 
virtual void DoDispose(void)
Drop trace callback. 
uint32_t m_maxSendBuffLen
The maximum number of packets that we allow a routing protocol to buffer. 
void ScheduleInterRequest(Ptr< Packet > packet)
Schedule the intermediate route request. 
uint32_t m_stabilityIncrFactor
The initial increase factor for link cache. 
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system. 
void SendInitialRequest(Ipv4Address source, Ipv4Address destination, uint8_t protocol)
Broadcast the route request packet in subnet. 
bool AddRoute(RouteCacheEntry &rt)
functions used to direct to route cache 
Hold variables of type string. 
void SendBuffTimerExpire()
The send buffer timer expire. 
static Ptr< Node > GetNode(uint32_t n)
void Scheduler(uint32_t priority)
This function is called to schedule sending packets from the network queue. 
DSR Passive Buffer Entry. 
Ipv4Address m_destination
void SalvagePacket(Ptr< const Packet > packet, Ipv4Address source, Ipv4Address dst, uint8_t protocol)
Salvage the packet which has been transmitted for 3 times. 
Time m_sendBuffInterval
how often to check send buffer 
Time m_passiveAckTimeout
The timeout value for passive acknowledge. 
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
uint32_t m_discoveryHopLimit
Maximum hops to go for route request. 
uint32_t GetPriority(DsrMessageType messageType)
Set the priority of the packet in network queue. 
Ptr< Ipv4 > m_ip
The ip ptr. 
void AddPacketTag(const Tag &tag) const 
Add a packet tag. 
uint32_t m_linkRetries
of retries have been sent for link acknowledgment
TracedCallback< const DsrOptionSRHeader & > m_txPacketTrace
uint64_t GetUid(void) const 
Returns the packet's Uid. 
void SetErrorBufferTimeout(Time t)
bool Enqueue(ErrorBuffEntry &entry)
Push entry in queue, if there is no entry with the same packet and destination address in queue...
void NetworkScheduleTimerExpire(MaintainBuffEntry &mb, uint8_t protocol)
This function deals with packet retransmission timer expire using network acknowledgment. 
bool IsNull(void) const 
Check for null implementation. 
void DeleteAllRoutesIncludeLink(Ipv4Address errorSrc, Ipv4Address unreachNode, Ipv4Address node)
functions used to direct to route cache 
Time m_maxRequestPeriod
The max request period. 
void PrintVector(std::vector< Ipv4Address > &vec)
Print the route vector. 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
PacketType
Packet types are used as they are in Linux. 
void DropPacketForErrLink(Ipv4Address source, Ipv4Address nextHop)
Remove all packets with the error link. 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit. 
uint32_t m_maxEntriesEachDst
Max number of route entries to save for each destination. 
Ptr< dsr::RouteCache > m_routeCache
A "drop-front" queue used by the routing layer to cache routes found. 
uint32_t GetSize(void) const 
Returns the the size in bytes of the packet (including the zero-filled initial payload). 
void IncreaseRetransTimer()
This function is called to increase the retransmission timer for data packet in the network queue...
bool IsMulticast(void) const 
Ipv4Address m_mainAddress
Our own Ip address. 
virtual void DoDispose(void)
Destructor implementation. 
Ipv4Address SearchNextHop(Ipv4Address ipv4Address, std::vector< Ipv4Address > &vec)
Get the next hop of the route. 
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO. 
#define NS_FATAL_ERROR(msg)
Fatal error handling. 
bool IsLinkCache()
functions used to direct to route cache 
Time m_linkAckTimeout
The timeout value for link acknowledge. 
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function. 
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached. 
bool PromiscReceive(Ptr< NetDevice > device, Ptr< const Packet > packet, uint16_t protocol, const Address &from, const Address &to, NetDevice::PacketType packetType)
Promiscuous receive data packets destined to some other node. 
void Connect(std::string path, const CallbackBase &cb)
void SetPacket(Ptr< const Packet > p)
This class implements a tag that carries the socket-specific TTL of a packet to the IP layer...
uint32_t m_requestTableSize
The max size of the request table size. 
void ScheduleCachedReply(Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, Ptr< Ipv4Route > route, double hops)
Schedule the cached reply to a random start time to avoid possible route reply storm. 
uint32_t m_tryLinkAcks
Maximum number of packet transmission using link acknowledgment. 
bool AddRoute_Link(RouteCacheEntry::IP_VECTOR nodelist, Ipv4Address source)
functions used to direct to route cache 
Ipv4Address m_destination
void SetSrc(Ipv4Address s)
void ForwardErrPacket(DsrOptionRerrUnreachHeader &rerr, DsrOptionSRHeader &sourceRoute, Ipv4Address nextHop, uint8_t protocol, Ptr< Ipv4Route > route)
This function is responsible for forwarding error packets along the route. 
Time m_maxCacheTime
Max time for caching the route cache entry. 
std::vector< SendBuffEntry > & GetBuffer()
Return a pointer to the internal queue. 
Time m_gratReplyHoldoff
The max gratuitous reply hold off time. 
a polymophic address class 
Ptr< const Packet > GetPacket() const 
uint32_t m_maxMaintainLen
Max # of entries for maintainance buffer. 
void SendRequest(Ptr< Packet > packet, Ipv4Address source)
Forward the route request if the node is not the destination. 
Ipv4Address GetIPfromID(uint16_t id)
Get the ip address from id. 
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source. 
bool IsRunning(void) const 
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range. 
std::vector< Ipv4Address > m_finalRoute
The route cache. 
static TypeId GetTypeId()
Get the type identificator. 
void SetSource(Ipv4Address src)
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
uint32_t m_graReplyTableSize
Set the gratuitous reply table size. 
bool AllEqual(MaintainBuffEntry &entry)
Verify if all the elements in the maintainence buffer entry is the same. 
void SetSource(Ipv4Address s)
Ipv4Address m_destination
void ConnectCallbacks()
Connect the callback for the tracing event. 
Time m_maxNetworkDelay
Maximum network delay. 
double GetSeconds(void) const 
Get an approximation of the time stored in this instance in the indicated unit. 
uint16_t m_ackId
The ack id assigned to each acknowledge. 
uint32_t GetDsrOptionsOffset()
Get the offset where the options begin, measured from the start of the extension header. 
Ptr< dsr::RreqTable > GetRequestTable() const 
Get the request table. 
void RemoveAtStart(uint32_t size)
Remove size bytes from the start of the current packet. 
void LinkScheduleTimerExpire(MaintainBuffEntry &mb, uint8_t protocol)
This function deals with packet retransmission timer expire using link acknowledgment. 
Ipv4Address GetOurAdd() const 
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
bool LinkEqual(MaintainBuffEntry &entry)
Verify if the maintain buffer entry is the same in every field for link ack. 
void SetTtl(uint8_t ttl)
Set the tag's TTL. 
AttributeValue implementation for Time. 
void Schedule(void)
Schedule a new event using the currently-configured delay, function, and arguments. 
void SetGateway(Ipv4Address gw)
void SendUnreachError(Ipv4Address unreachNode, Ipv4Address destination, Ipv4Address originalDst, uint8_t salvage, uint8_t protocol)
This function is responsible for sending error packets in case of break link to next hop...
Hold an unsigned integer type. 
Time m_sendBufferTimeout
The maximum period of time that a routing protocol is allowed to buffer a packet for. 
int GetProtocolNumber(void) const 
Get the dsr protocol number. 
std::vector< Ipv4Address > IP_VECTOR
Define the vector to hold Ip address. 
Ipv4Address m_broadcast
The broadcast IP address. 
bool IsBroadcast(void) const 
uint32_t m_numPriorityQueues
The number of priority queues used. 
uint32_t m_broadcastJitter
The max time to delay route request broadcast. 
void SetNode(Ptr< Node > node)
Set the node. 
bool Find(Ipv4Address nextHop)
Finds whether a packet with destination dst exists in the queue. 
static const uint8_t PROT_NUMBER
Define the dsr protocol number. 
uint32_t m_requestId
The id assigned to each route request. 
Ptr< NetDevice > GetDevice(uint32_t index) const 
Retrieve the index-th NetDevice associated to this node. 
Ptr< dsr::RouteCache > GetRouteCache() const 
Get the route cache. 
Hold together all Wifi-related objects. 
bool PromiscEqual(MaintainBuffEntry &entry)
Verify if the maintain buffer entry is the same in every field for promiscuous ack. 
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Ptr< const Packet > GetPacket() const 
void SetDownTarget6(IpL4Protocol::DownTargetCallback6 callback)
This method allows a caller to set the current down target callback set for this L4 protocol (IPv6 ca...
Ptr< Ipv4L3Protocol > m_ipv4
Ipv4l3Protocol. 
void Send(Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol, Ptr< Ipv4Route > route)
uint32_t m_requestTableIds
The request table identifiers. 
void CancelNetworkPacketTimer(MaintainBuffEntry &mb)
Cancel the network packet retransmission timer for a specific maintenance entry. 
void SendReply(Ptr< Packet > packet, Ipv4Address source, Ipv4Address nextHop, Ptr< Ipv4Route > route)
Send the route reply back to the request originator with the cumulated route. 
void SetGraTableSize(uint32_t g)
Set the gratuitous reply table size. 
bool UpdateRouteEntry(Ipv4Address dst)
functions used to direct to route cache 
bool Dequeue(Ipv4Address dst, SendBuffEntry &entry)
Return first found (the earliest) entry for the given destination. 
Time m_minLifeTime
The min life time. 
Time m_useExtends
The use extension of the life time for link cache. 
void SetPacket(Ptr< const Packet > p)
GraReply m_graReply
The gratuitous route reply. 
void ScheduleInitialReply(Ptr< Packet > packet, Ipv4Address source, Ipv4Address nextHop, Ptr< Ipv4Route > route)
this is a generating the initial route reply from the destination address, a random delay time [0...
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC. 
Time m_blacklistTimeout
The black list time out. 
Ipv4Address GetSrc() const 
uint16_t GetAckId() const 
void SetPassiveBuffer(Ptr< dsr::PassiveBuffer > r)
Set the node. 
std::map< NetworkKey, Timer > m_addressForwardTimer
Map network key + forward timer. 
static Mac48Address ConvertFrom(const Address &address)
std::map< Ipv4Address, Timer > m_addressReqTimer
Map IP address + RREQ timer. 
virtual void NotifyNewAggregate(void)
Notify all Objects aggregated to this one of a new Object being aggregated. 
Access to the Ipv4 forwarding table, interfaces, and configuration. 
uint32_t GetSize()
Number of entries. 
Ptr< Packet > Copy(void) const 
performs a COW copy of the packet. 
uint32_t PeekHeader(Header &header) const 
Deserialize but does not remove the header from the internal buffer. 
void SendPacketFromBuffer(DsrOptionSRHeader const &sourceRoute, Ipv4Address nextHop, uint8_t protocol)
This function is responsible for sending out data packets when have route, if no route found...
uint8_t m_maxSalvageCount
Maximum # times to salvage a packet. 
Ipv4Address GetNextHopAddress() const 
Time m_initStability
The initial stability value for link cache. 
The maintenance buffer is responsible for maintaining packet next hop delivery The data packet is sav...
Time m_requestPeriod
The base time interval between route requests. 
Implement the Ipv4 layer. 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
Ptr< dsr::DsrOptions > GetOption(int optionNumber)
Get the option corresponding to optionNumber. 
uint16_t GetIDfromIP(Ipv4Address address)
Get the node id from ip address. 
Hold objects of type Ptr. 
Ptr< Node > m_node
The node ptr. 
bool Find(Ipv4Address dst)
Finds whether a packet with destination dst exists in the queue. 
void CallCancelPacketTimer(uint16_t ackId, Ipv4Header const &ipv4Header, Ipv4Address realSrc, Ipv4Address realDst)
Call the cancel packet retransmission timer function. 
void ScheduleNetworkPacketRetry(MaintainBuffEntry &mb, bool isFirst, uint8_t protocol)
Schedule the packet retransmission based on network layer acknowledgment. 
Ptr< const AttributeChecker > MakeBooleanChecker(void)
uint32_t m_passiveRetries
of retries have been sent for passive acknowledgment
uint32_t m_maxNetworkSize
Maximum network queue size. 
Packet addressed to someone else. 
Ptr< Ipv4Route > SetRoute(Ipv4Address nextHop, Ipv4Address srcAddress)
Set the route to use for data packets, used by the option headers when sending data/control packets...
void Send(Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol, Ptr< Ipv4Route > route)
This function is called by higher layer protocol when sending packets. 
uint32_t m_tryPassiveAcks
Maximum number of packet transmission using passive acknowledgment. 
Ptr< NetDevice > GetNetDeviceFromContext(std::string context)
Get the netdevice from the context. 
ErrorBuffer m_errorBuffer
The error buffer to save the error messages. 
uint32_t m_maxMaintRexmt
Maximum number of retransmissions of data packets. 
Ipv4Address GetDst() const 
void Resume(void)
Restart the timer to expire within the amount of time left saved during Suspend. 
Ptr< const Packet > GetPacket() const 
uint16_t AddAckReqHeader(Ptr< Packet > &packet, Ipv4Address nextHop)
This function is called to add ack request header for network acknowledgement. 
void PacketNewRoute(Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol)
When route vector corrupted, originate a new packet, normally not happening. 
void SetMaxQueueLen(uint32_t len)
Time m_retransIncr
the increase time for retransmission timer when face network congestion 
void ScheduleLinkPacketRetry(MaintainBuffEntry &mb, uint8_t protocol)
Schedule the packet retransmission based on link-layer acknowledgment. 
void ForwardPacket(Ptr< const Packet > packet, DsrOptionSRHeader &sourceRoute, Ipv4Header const &ipv4Header, Ipv4Address source, Ipv4Address destination, Ipv4Address targetAddress, uint8_t protocol, Ptr< Ipv4Route > route)
Forward the packet using the route saved in the source route option header. 
Ptr< dsr::PassiveBuffer > m_passiveBuffer
A "drop-front" queue used by the routing layer to cache route request sent. 
std::map< LinkKey, Timer > m_linkAckTimer
The timer for link acknowledgment. 
static EventId ScheduleNow(MEM mem_ptr, OBJ obj)
Schedule an event to expire Now. 
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
MaintainBuffer m_maintainBuffer
The declaration of maintain buffer. 
L4 Protocol abstract base class. 
static Time Now(void)
Return the current simulation virtual time. 
void SetOutputDevice(Ptr< NetDevice > outputDevice)
Equivalent in Linux to dst_entry.dev. 
void NotifyDataReceipt(std::string context, Ptr< const Packet > p)
Notify the data receipt. 
DSR Maintain Buffer Entry. 
void SendPacket(Ptr< Packet > packet, Ipv4Address source, Ipv4Address nextHop, uint8_t protocol)
This function is called by when really sending out the packet. 
void ScheduleRreqRetry(Ptr< Packet > packet, std::vector< Ipv4Address > address, bool nonProp, uint32_t requestId, uint8_t protocol)
Schedule the route request retry. 
IP_VECTOR GetVector() const 
void SetMaintainBufferTimeout(Time t)
IpL4Protocol::DownTargetCallback GetDownTarget(void) const 
This method allows a caller to get the current down target callback set for this L4 protocol (IPv4 ca...
uint32_t m_maxRreqId
The max number of request ids for a single destination. 
bool FindAndUpdate(Ipv4Address replyTo, Ipv4Address replyFrom, Time gratReplyHoldoff)
Update the route entry if found, create a new one if not. 
virtual enum IpL4Protocol::RxStatus Receive(Ptr< Packet > p, Ipv4Header const &header, Ptr< Ipv4Interface > incomingInterface)
Ptr< dsr::PassiveBuffer > GetPassiveBuffer() const 
Get the passive buffer. 
uint32_t m_maxCacheLen
Max # of cache entries for route cache. 
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
uint32_t GetSize()
Number of entries. 
bool Enqueue(MaintainBuffEntry &entry)
Push entry in queue, if there is no entry with the same packet and destination address in queue...
void CheckSendBuffer()
Check the send buffer of packets with route when send buffer timer expire. 
std::map< uint32_t, Ptr< dsr::DsrNetworkQueue > > m_priorityQueue
priority queues 
Ipv4Address GetSourceAddress() const 
Describes an IPv6 address. 
std::map< PassiveKey, uint32_t > m_passiveCnt
Map packet key + passive forward counts. 
Ptr< Ipv4Route > GetIpv4Route() const 
Ipv4 addresses are stored in host order in this class. 
virtual void NotifyNewAggregate()
Notify all Objects aggregated to this one of a new Object being aggregated. 
TracedCallback< Ptr< const Packet > > m_dropTrace
The trace for drop, receive and send data packets. 
Ptr< dsr::RreqTable > m_rreqTable
A "drop-front" queue used by the routing layer to cache route request sent. 
std::map< PassiveKey, Timer > m_passiveAckTimer
The timer for passive acknowledgment. 
void AddDsrOption(DsrOptionHeader const &option)
Serialize the option, prepending pad1 or padn option as necessary. 
void CancelPacketTimerNextHop(Ipv4Address nextHop, uint8_t protocol)
Cancel the packet retransmission timer for a all maintenance entries with nextHop address...
void SetSegsLeft(uint8_t segs)
Ptr< Ipv4Route > m_ipv4Route
Ipv4 Route. 
void SendAck(uint16_t ackId, Ipv4Address destination, Ipv4Address realSrc, Ipv4Address realDst, uint8_t protocol, Ptr< Ipv4Route > route)
Send network layer acknowledgment back to the earlier hop to notify the receipt of data packet...
Time m_nodeTraversalTime
Time estimated for packet to travel between two nodes. 
void SetRequestTable(Ptr< dsr::RreqTable > r)
Set the node. 
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG. 
bool m_subRoute
Whether to save sub route or not. 
Time Seconds(double value)
Construct a Time in the indicated unit. 
void Cancel(void)
Cancel the currently-running event if there is one. 
bool CancelPassiveTimer(Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, uint8_t segsLeft)
Cancel the passive timer. 
void Insert(Ptr< dsr::DsrOptions > option)
Insert a new Dsr Option. 
Ipv4Address GetIPfromMAC(Mac48Address address)
Get the Ip address from mac address. 
bool SendRealDown(DsrNetworkQueueEntry &newEntry)
This function is called to send packets down stack. 
void RouteRequestTimerExpire(Ptr< Packet > packet, std::vector< Ipv4Address > address, uint32_t requestId, uint8_t protocol)
Handle route discovery timer. 
uint32_t m_rreqRetries
Maximum number of retransmissions of RREQ with TTL = NetDiameter to discover a route. 
void SetSegsLeft(uint8_t seg)
void Suspend(void)
Cancel the timer and save the amount of time left until it was set to expire. 
Ptr< const Packet > GetPacket() const 
void PriorityScheduler(uint32_t priority, bool continueWithFirst)
This function is called to schedule sending packets from the network queue by priority. 
Timer m_sendBuffTimer
The send buffer timer. 
bool FindSourceEntry(Ipv4Address src, Ipv4Address dst, uint16_t id)
functions used to direct to route cache 
uint32_t CopyData(uint8_t *buffer, uint32_t size) const 
Copy the packet contents to a byte buffer. 
void DropPacketWithDst(Ipv4Address dst)
Remove all packets with destination IP address dst. 
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables. 
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit. 
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR. 
Ptr< Node > GetNodeWithAddress(Ipv4Address ipv4Address)
Get the node with give ip address. 
void SetRouteCache(Ptr< dsr::RouteCache > r)
Set the route cache. 
DsrOptionList_t m_options
List of DSR Options supported. 
bool Dequeue(Ipv4Address dst, MaintainBuffEntry &entry)
Return first found (the earliest) entry for given destination. 
void SendGratuitousReply(Ipv4Address replyTo, Ipv4Address replyFrom, std::vector< Ipv4Address > &nodeList, uint8_t protocol)
Send the gratuitous reply. 
void SetIdentification(uint16_t i)
void SendErrorRequest(DsrOptionRerrUnreachHeader &rerr, uint8_t protocol)
Send the error request packet. 
void SetSendBufferTimeout(Time t)
Set the entry lifetime in the queue. 
void CancelPacketAllTimer(MaintainBuffEntry &mb)
Cancel all the packet timers. 
Ptr< const AttributeAccessor > MakeStringAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Ptr< Node > GetNode() const 
Get the node. 
SendBuffer m_sendBuffer
The send buffer. 
std::map< LinkKey, uint32_t > m_linkCnt
Map packet key + link forward counts. 
bool LookupRoute(Ipv4Address id, RouteCacheEntry &rt)
functions used to direct to route cache 
bool IsSuspended(void) const 
void SetMaxQueueLen(uint32_t len)
Set the maximum queue length. 
bool AddEntry(GraReplyEntry &graTableEntry)
Add a new gratuitous reply entry. 
This policy cancels the event from the destructor of the Timer to verify that the event has already e...
IpL4Protocol::DownTargetCallback6 GetDownTarget6(void) const 
This method allows a caller to get the current down target callback set for this L4 protocol (IPv6 ca...
std::map< NetworkKey, uint32_t > m_addressForwardCnt
Map network key + forward counts. 
void SetFragmentOffset(uint16_t f)
Ptr< T > GetObject(void) const 
Get a pointer to the requested aggregated Object. 
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
a unique identifier for an interface. 
bool Enqueue(SendBuffEntry &entry)
Push entry in queue, if there is no entry with the same packet and destination address in queue...
Time m_nonpropRequestTimeout
The non-propagation request timeout. 
TypeId SetParent(TypeId tid)
std::map< Ipv4Address, Timer > m_nonPropReqTimer
Map IP address + RREQ timer. 
bool m_linkAck
define if we use link acknowledgement or not 
std::vector< std::string > GetElementsFromContext(std::string context)
Get the elements from the tracing context. 
void PassiveScheduleTimerExpire(MaintainBuffEntry &mb, uint8_t protocol)
This function deals with packet retransmission timer expire using passive acknowledgment. 
void AddHeader(const Header &header)
Add header to this packet. 
static const uint16_t PROT_NUMBER
Protocol number (0x0800) 
void CancelPassivePacketTimer(MaintainBuffEntry &mb)
Cancel the passive packet retransmission timer for a specific maintenance entry. 
void SetDestination(Ipv4Address dest)
void SetMaxQueueLen(uint32_t len)
IpL4Protocol::DownTargetCallback m_downTarget
The callback for down layer. 
uint8_t GetSegsLeft() const 
void SetAckId(uint16_t ackId)
void UseExtends(RouteCacheEntry::IP_VECTOR rt)
functions used to direct to route cache 
Ipv4Address GetNextHop() const 
Time m_maxMaintainTime
Time out for maintainance buffer. 
void CancelRreqTimer(Ipv4Address dst, bool isRemove)
Cancel the route request timer. 
virtual ~DsrRouting()
Destructor. 
void SchedulePassivePacketRetry(MaintainBuffEntry &mb, uint8_t protocol)
Schedule the packet retransmission based on passive acknowledgment.