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/object-vector.h"
56 #include "ns3/ipv4-address.h"
57 #include "ns3/ipv4-header.h"
58 #include "ns3/ipv4-l3-protocol.h"
59 #include "ns3/ipv4-route.h"
60 #include "ns3/trace-source-accessor.h"
61 #include "ns3/icmpv4-l4-protocol.h"
62 #include "ns3/adhoc-wifi-mac.h"
63 #include "ns3/wifi-net-device.h"
64 #include "ns3/inet-socket-address.h"
65 #include "ns3/udp-l4-protocol.h"
66 #include "ns3/udp-socket-factory.h"
67 #include "ns3/tcp-socket-factory.h"
68 #include "ns3/llc-snap-header.h"
69 #include "ns3/arp-header.h"
110 .AddConstructor<DsrRouting> ()
111 .AddAttribute (
"RouteCache",
"The route cache for saving routes from route discovery process.",
115 MakePointerChecker<RouteCache> ())
116 .AddAttribute (
"RreqTable",
"The request table to manage route requests.",
120 MakePointerChecker<RreqTable> ())
121 .AddAttribute (
"PassiveBuffer",
"The passive buffer to manage promisucously received passive ack.",
125 MakePointerChecker<PassiveBuffer> ())
126 .AddAttribute (
"MaxSendBuffLen",
"Maximum number of packets that can be stored in send buffer.",
129 MakeUintegerChecker<uint32_t> ())
130 .AddAttribute (
"MaxSendBuffTime",
"Maximum time packets can be queued in the send buffer .",
134 .AddAttribute (
"MaxMaintLen",
"Maximum number of packets that can be stored in maintenance buffer.",
137 MakeUintegerChecker<uint32_t> ())
138 .AddAttribute (
"MaxMaintTime",
"Maximum time packets can be queued in maintenance buffer.",
142 .AddAttribute (
"MaxCacheLen",
"Maximum number of route entries that can be stored in route cache.",
145 MakeUintegerChecker<uint32_t> ())
146 .AddAttribute (
"RouteCacheTimeout",
"Maximum time the route cache can be queued in route cache.",
150 .AddAttribute (
"MaxEntriesEachDst",
"Maximum number of route entries for a single destination to respond.",
153 MakeUintegerChecker<uint32_t> ())
154 .AddAttribute (
"SendBuffInterval",
"How often to check send buffer for packet with route.",
158 .AddAttribute (
"NodeTraversalTime",
"The time it takes to traverse two neighboring nodes.",
162 .AddAttribute (
"RreqRetries",
"Maximum number of retransmissions for request discovery of a route.",
165 MakeUintegerChecker<uint32_t> ())
166 .AddAttribute (
"MaintenanceRetries",
"Maximum number of retransmissions for data packets from maintenance buffer.",
169 MakeUintegerChecker<uint32_t> ())
170 .AddAttribute (
"RequestTableSize",
"Maximum number of request entries in the request table, set this as the number of nodes in the simulation.",
173 MakeUintegerChecker<uint32_t> ())
174 .AddAttribute (
"RequestIdSize",
"Maximum number of request source Ids in the request table.",
177 MakeUintegerChecker<uint32_t> ())
178 .AddAttribute (
"UniqueRequestIdSize",
"Maximum number of request Ids in the request table for a single destination.",
181 MakeUintegerChecker<uint32_t> ())
182 .AddAttribute (
"NonPropRequestTimeout",
"The timeout value for non-propagation request.",
186 .AddAttribute (
"DiscoveryHopLimit",
"The max discovery hop limit for route requests.",
189 MakeUintegerChecker<uint32_t> ())
190 .AddAttribute (
"MaxSalvageCount",
"The max salvage count for a single data packet.",
193 MakeUintegerChecker<uint8_t> ())
194 .AddAttribute (
"BlacklistTimeout",
"The time for a neighbor to stay in blacklist.",
198 .AddAttribute (
"GratReplyHoldoff",
"The time for gratuitous reply entry to expire.",
202 .AddAttribute (
"BroadcastJitter",
"The jitter time to avoid collision for broadcast packets.",
205 MakeUintegerChecker<uint32_t> ())
206 .AddAttribute (
"LinkAckTimeout",
"The time a packet in maintenance buffer wait for link acknowledgment.",
210 .AddAttribute (
"TryLinkAcks",
"The number of link acknowledgment to use.",
213 MakeUintegerChecker<uint32_t> ())
214 .AddAttribute (
"PassiveAckTimeout",
"The time a packet in maintenance buffer wait for passive acknowledgment.",
218 .AddAttribute (
"TryPassiveAcks",
"The number of passive acknowledgment to use.",
221 MakeUintegerChecker<uint32_t> ())
222 .AddAttribute (
"RequestPeriod",
"The base time interval between route requests.",
226 .AddAttribute (
"MaxRequestPeriod",
"The max time interval between route requests.",
230 .AddAttribute (
"GraReplyTableSize",
"The gratuitous reply table size.",
233 MakeUintegerChecker<uint32_t> ())
234 .AddAttribute (
"CacheType",
"Use Link Cache or use Path Cache",
237 MakeStringChecker ())
238 .AddAttribute (
"StabilityDecrFactor",
"The stability decrease factor for link cache",
241 MakeUintegerChecker<uint32_t> ())
242 .AddAttribute (
"StabilityIncrFactor",
"The stability increase factor for link cache",
245 MakeUintegerChecker<uint32_t> ())
246 .AddAttribute (
"InitStability",
"The initial stability factor for link cache",
250 .AddAttribute (
"MinLifeTime",
"The minimal life time for link cache",
254 .AddAttribute (
"UseExtends",
"The extension time for link cache",
258 .AddAttribute (
"EnableSubRoute",
"Enables saving of sub route when receiving route error messages, only available when using path route cache",
261 MakeBooleanChecker ())
262 .AddAttribute (
"RetransIncr",
"The increase time for retransmission timer when facing network congestion",
266 .AddAttribute (
"MaxNetworkQueueSize",
"The max number of packet to save in the network queue.",
269 MakeUintegerChecker<uint32_t> ())
270 .AddAttribute (
"MaxNetworkQueueDelay",
"The max time for a packet to stay in the network queue.",
274 .AddAttribute (
"NumPriorityQueues",
"The max number of packet to save in the network queue.",
277 MakeUintegerChecker<uint32_t> ())
278 .AddAttribute (
"LinkAcknowledgment",
"Enable Link layer acknowledgment mechanism",
281 MakeBooleanChecker ())
282 .AddTraceSource (
"Tx",
"Send DSR packet.",
284 .AddTraceSource (
"Drop",
"Drop DSR packet",
336 Ptr<Node> node = this->GetObject<Node> ();
339 m_ipv4 = this->GetObject<Ipv4L3Protocol> ();
368 std::pair<std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator,
bool> result_i =
m_priorityQueue.insert (std::make_pair (i, queue_i));
400 for (uint32_t i = 0; i <
m_ipv4->GetNInterfaces (); i++)
405 if (addr != loopback)
423 routeCache->ScheduleTimer ();
445 routeCache->AddArpCache (
m_ipv4->GetInterface (i)->GetArpCache ());
458 Config::Connect (
"NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyRxEnd",
471 Mac48Address nodeAddr = netDevice->GetMac()->GetAddress();
472 std::ostringstream oss;
481 NS_LOG_WARN (
"WifiMacTrailer left, skip this packet");
502 NS_LOG_WARN (
"arp header present, skip this packet");
518 Ipv4Address ourAddress = ipv4->GetAddress (1, 0).GetLocal ();
532 newEntry.SetSrc (sourceIp);
533 newEntry.SetDst (destinationIp);
535 newEntry.SetOurAdd (previousHop);
536 newEntry.SetNextHop (ourAddress);
540 dsr->CancelLinkPacketTimer (newEntry);
553 return n->
GetDevice (atoi (elements[3].c_str ()));
556 std::vector<std::string>
559 std::vector <std::string> elements;
561 while (pos1 != context.npos)
563 pos1 = context.find (
"/",pos1);
564 pos2 = context.find (
"/",pos1+1);
565 elements.push_back (context.substr (pos1+1,pos2-(pos1+1)));
577 for (uint32_t i = 0; i <
m_ipv4->GetNInterfaces (); i++)
587 mac->TraceDisconnectWithoutContext (
"TxErrHeader",
653 for (int32_t i = 0; i < nNodes; ++i)
657 int32_t ifIndex = ipv4->GetInterfaceForAddress (ipv4Address);
690 std::vector<Ipv4Address> nodelist = rt.
GetVector ();
698 m_routeCache->DeleteAllRoutesIncludeLink (errorSrc, unreachNode, node);
708 return m_rreqTable->FindSourceEntry (src, dst,
id);
716 for (int32_t i = 0; i < nNodes; ++i)
722 if (netDevice->GetAddress () ==
address)
724 return ipv4->GetAddress (1, 0).GetLocal ();
743 for (std::vector<Ipv4Address>::const_iterator i = vec.begin (); i != vec.end (); ++i)
755 if (vec.size () == 2)
763 if (ipv4Address == vec.back ())
765 NS_LOG_DEBUG (
"We have reached to the final destination " << ipv4Address <<
" " << vec.back ());
768 for (std::vector<Ipv4Address>::const_iterator i = vec.begin (); i != vec.end (); ++i)
770 if (ipv4Address == (*i))
804 for (int32_t i = 0; i < nNodes; ++i)
808 if (ipv4->GetAddress (1, 0).GetLocal () ==
address)
828 return ipv4->GetAddress (1, 0).GetLocal ();
873 newPacket->RemoveAtStart (offset);
877 newPacket->CopyData (buf,
sizeof(buf));
878 uint8_t numberAddress = (buf[1] - 2) / 4;
882 newPacket->RemoveHeader (sourceRoute);
886 newPacket->RemoveHeader (ackReq);
894 if (nextHop ==
"0.0.0.0")
900 bool findRoute =
m_routeCache->LookupRoute (destination, salvageRoute);
905 std::vector<Ipv4Address> nodeList = salvageRoute.
GetVector ();
945 if (nextHop != destination)
1007 NS_LOG_DEBUG (
"Here we try to find the data packet in the send buffer");
1010 bool findRoute =
m_routeCache->LookupRoute (destination, toDst);
1013 NS_LOG_INFO (
"We have found a route for the packet");
1016 uint8_t protocol = i->GetProtocol ();
1031 uint32_t size = copyP->
GetSize ();
1032 uint8_t *
data =
new uint8_t[size];
1035 uint8_t optionType = 0;
1036 optionType = *(
data);
1038 if (optionType == 3)
1042 uint8_t errorType = *(data + 2);
1058 std::vector<Ipv4Address> errorRoute = toDst.
GetVector ();
1066 uint8_t salvage = 0;
1070 if (nextHop ==
"0.0.0.0")
1077 uint8_t length = (sourceRoute.
GetLength () + newUnreach.GetLength ());
1087 newPacket->
AddHeader (dsrRoutingHeader);
1092 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1094 NS_LOG_LOGIC (
"Will be inserting into priority queue number: " << priority);
1119 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
1121 if (nextHop ==
"0.0.0.0")
1126 uint8_t salvage = 0;
1135 uint8_t length = sourceRoute.
GetLength ();
1148 networkKey.
m_ackId = newEntry.GetAckId ();
1149 networkKey.
m_ourAdd = newEntry.GetOurAdd ();
1150 networkKey.
m_nextHop = newEntry.GetNextHop ();
1151 networkKey.
m_source = newEntry.GetSrc ();
1156 passiveKey.
m_source = newEntry.GetSrc ();
1158 passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
1161 linkKey.
m_source = newEntry.GetSrc ();
1163 linkKey.
m_ourAdd = newEntry.GetOurAdd ();
1164 linkKey.
m_nextHop = newEntry.GetNextHop ();
1177 if (nextHop != destination)
1227 NS_LOG_INFO (
this << from << to << packetType << *p);
1234 uint32_t sourceId = dsrRoutingHeader.
GetSourceId ();
1242 uint32_t size = p->
GetSize ();
1243 uint8_t *
data =
new uint8_t[size];
1245 uint8_t optionType = 0;
1246 optionType = *(
data);
1250 if (optionType == 96)
1256 " overhearing packet PID: " << p->
GetUid () <<
1257 " from " << promiscSource <<
1259 " with source IP " << ipv4Header.
GetSource () <<
1261 " and packet : " << *dsrPacket);
1263 bool isPromisc =
true;
1264 dsrOption->Process (p, dsrPacket,
m_mainAddress, source, ipv4Header, nextHeader, isPromisc, promiscSource);
1278 NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)protocol);
1281 bool findRoute =
m_routeCache->LookupRoute (destination, toDst);
1286 <<
"s " <<
m_mainAddress <<
" there is no route for this packet, queue the packet");
1294 <<
"s Add packet PID: " << packet->
GetUid () <<
" to queue. Packet: " << *packet);
1316 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
1318 if (nextHop ==
"0.0.0.0")
1323 uint8_t salvage = 0;
1333 uint8_t length = sourceRoute.
GetLength ();
1341 source, destination, 0,
1348 networkKey.
m_ackId = newEntry.GetAckId ();
1349 networkKey.
m_ourAdd = newEntry.GetOurAdd ();
1350 networkKey.
m_nextHop = newEntry.GetNextHop ();
1351 networkKey.
m_source = newEntry.GetSrc ();
1356 passiveKey.
m_source = newEntry.GetSrc ();
1358 passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
1361 linkKey.
m_source = newEntry.GetSrc ();
1363 linkKey.
m_ourAdd = newEntry.GetOurAdd ();
1364 linkKey.
m_nextHop = newEntry.GetNextHop ();
1377 if (nextHop != destination)
1394 NS_LOG_FUNCTION (
this << errorHop << destination << originalDst << (uint32_t)salvage << (uint32_t)protocol);
1408 uint8_t rerrLength = rerrUnreachHeader.
GetLength ();
1411 bool findRoute =
m_routeCache->LookupRoute (destination, toDst);
1417 <<
"s " <<
m_mainAddress <<
" there is no route for this packet, queue the packet");
1421 newPacket->
AddHeader (dsrRoutingHeader);
1429 <<
"s Add packet PID: " << p->
GetUid () <<
" to queue. Packet: " << *p);
1433 NS_LOG_DEBUG (
"When there is no existing route request for " << destination <<
", initialize one");
1443 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
1445 if (nextHop ==
"0.0.0.0")
1459 uint8_t srLength = sourceRoute.
GetLength ();
1460 uint8_t length = (srLength + rerrLength);
1465 newPacket->
AddHeader (dsrRoutingHeader);
1473 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1475 NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
1500 NS_LOG_FUNCTION (
this << rerr << sourceRoute << nextHop << (uint32_t)protocol << route);
1504 dsrRoutingHeader.SetMessageType (1);
1509 dsrRoutingHeader.SetPayloadLength (uint16_t (length) + 4);
1510 dsrRoutingHeader.AddDsrOption (rerr);
1511 dsrRoutingHeader.AddDsrOption (sourceRoute);
1518 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1520 NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
1544 NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)protocol << route);
1549 NS_LOG_INFO (
"Drop packet. Not handling ICMP packet for now");
1555 bool findRoute =
m_routeCache->LookupRoute (destination, toDst);
1560 <<
"s " <<
m_mainAddress <<
" there is no route for this packet, queue the packet");
1568 <<
"s Add packet PID: " << packet->
GetUid () <<
" to send buffer. Packet: " << *packet);
1580 NS_LOG_LOGIC (
"There is existing route request timer with request count " <<
m_rreqTable->GetRreqCnt (destination));
1594 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
1596 if (nextHop ==
"0.0.0.0")
1601 uint8_t salvage = 0;
1611 uint8_t length = sourceRoute.
GetLength ();
1621 source, destination, 0,
1627 networkKey.
m_ackId = newEntry.GetAckId ();
1628 networkKey.
m_ourAdd = newEntry.GetOurAdd ();
1629 networkKey.
m_nextHop = newEntry.GetNextHop ();
1630 networkKey.
m_source = newEntry.GetSrc ();
1635 passiveKey.
m_source = newEntry.GetSrc ();
1637 passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
1640 linkKey.
m_source = newEntry.GetSrc ();
1642 linkKey.
m_ourAdd = newEntry.GetOurAdd ();
1643 linkKey.
m_nextHop = newEntry.GetNextHop ();
1656 if (nextHop != destination)
1689 uint32_t sourceId = dsrRoutingHeader.
GetSourceId ();
1690 uint32_t destinationId = dsrRoutingHeader.
GetDestId ();
1697 uint8_t numberAddress = (buf[1] - 2) / 4;
1710 newDsrRoutingHeader.
SetDestId (destinationId);
1723 NS_LOG_FUNCTION (
this << packet << source << nextHop << (uint32_t)protocol);
1730 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1732 NS_LOG_INFO (
"Will be inserting into priority queue number: " << priority);
1760 uint32_t numPriorities;
1761 if (continueWithFirst)
1767 numPriorities = priority;
1772 std::map<uint32_t, Ptr<DsrNetworkQueue> >::iterator q =
m_priorityQueue.find (i);
1774 uint32_t queueSize = dsrNetworkQueue->GetSize ();
1777 if ((i == (m_numPriorityQueues - 1)) && continueWithFirst)
1788 uint32_t totalQueueSize = 0;
1791 NS_LOG_INFO (
"The size of the network queue for " << j->first <<
" is " << j->second->GetSize ());
1792 totalQueueSize += j->second->GetSize ();
1793 NS_LOG_INFO (
"The total network queue size is " << totalQueueSize);
1795 if (totalQueueSize > 5)
1801 dsrNetworkQueue->Dequeue (newEntry);
1804 NS_LOG_LOGIC (
"Packet sent by Dsr. Calling PriorityScheduler after some time");
1813 NS_LOG_LOGIC (
"Packet dropped by Dsr. Calling PriorityScheduler immediately");
1817 if ((i == (m_numPriorityQueues - 1)) && continueWithFirst)
1835 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1838 std::vector<DsrNetworkQueueEntry> newNetworkQueue = dsrNetworkQueue->GetQueue ();
1839 for (std::vector<DsrNetworkQueueEntry>::iterator i = newNetworkQueue.begin (); i != newNetworkQueue.end (); i++)
1844 if (nextHop == j->first.m_nextHop)
1846 NS_LOG_DEBUG (
"The network delay left is " << j->second.GetDelayLeft ());
1847 j->second.SetDelay (j->second.GetDelayLeft () +
m_retransIncr);
1875 NS_LOG_INFO (
"The nexthop address " << nextHop <<
" the source " << source <<
" the destination " << destination);
1881 NS_LOG_DEBUG (
"destination over here " << destination);
1894 uint8_t length = sourceRoute.
GetLength ();
1903 source, destination, 0,
1910 networkKey.
m_ackId = newEntry.GetAckId ();
1911 networkKey.
m_ourAdd = newEntry.GetOurAdd ();
1912 networkKey.
m_nextHop = newEntry.GetNextHop ();
1913 networkKey.
m_source = newEntry.GetSrc ();
1918 passiveKey.
m_source = newEntry.GetSrc ();
1920 passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
1923 linkKey.
m_source = newEntry.GetSrc ();
1925 linkKey.
m_ourAdd = newEntry.GetOurAdd ();
1926 linkKey.
m_nextHop = newEntry.GetNextHop ();
1939 if (nextHop != destination)
1954 NS_LOG_LOGIC (
"Schedule sending the next packet in send buffer");
1961 NS_LOG_LOGIC (
"All queued packets are out-dated for the destination in send buffer");
1979 uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset ();
1984 uint32_t size = copyP->
GetSize ();
1985 uint8_t *
data =
new uint8_t[size];
1988 uint8_t optionType = 0;
1989 optionType = *(
data);
1990 NS_LOG_DEBUG (
"The option type value in send packet " << (uint32_t)optionType);
1991 if (optionType == 3)
1997 uint8_t errorType = *(data + 2);
2001 NS_LOG_DEBUG (
"The packet is route error unreach packet");
2031 newPacket->
AddHeader (newRoutingHeader);
2036 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
2038 NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
2058 NS_LOG_LOGIC (
"Schedule sending the next packet in error buffer");
2066 NS_LOG_DEBUG (
"Packet not found in either the send or error buffer");
2072 uint16_t fragmentOffset, uint16_t identification,
bool saveEntry)
2074 NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)segsLeft);
2093 NS_LOG_DEBUG (
"We get the all equal for passive buffer here");
2098 mbEntry.
SetDst (destination);
2117 NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)segsLeft);
2125 newEntry.
SetSrc (source);
2126 newEntry.
SetDst (destination);
2156 <<
" source " << mb.
GetSrc () <<
" destination " << mb.
GetDst ()
2159 std::map<LinkKey, Timer>::const_iterator i =
2185 NS_LOG_INFO (
"Link acknowledgment received, remove same maintenance buffer entry");
2192 NS_LOG_FUNCTION (
this << (uint32_t)ackId << ipv4Header << realSrc << realDst);
2201 realSrc, realDst, ackId,
2223 <<
" source " << mb.
GetSrc () <<
" destination " << mb.
GetDst ()
2227 std::map<NetworkKey, Timer>::const_iterator i =
2252 NS_LOG_INFO (
"Remove same maintenance buffer entry based on network acknowledgment");
2270 std::map<PassiveKey, Timer>::const_iterator j =
2310 NS_LOG_INFO (
"Cancel the packet timer for next maintenance entry");
2317 NS_LOG_INFO (
"Maintenance buffer entry not found");
2324 NS_LOG_FUNCTION (
this << packet << source << dst << (uint32_t)protocol);
2337 newPacket->
CopyData (buf,
sizeof(buf));
2338 uint8_t numberAddress = (buf[1] - 2) / 4;
2348 bool findRoute =
m_routeCache->LookupRoute (dst, toDst);
2358 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
2360 if (nextHop ==
"0.0.0.0")
2376 uint8_t length = sourceRoute.
GetLength ();
2388 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
2390 NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
2414 NS_LOG_DEBUG (
"Will not salvage this packet, silently drop");
2472 NS_LOG_DEBUG (
"The passive acknowledgment option for data packet");
2489 NS_LOG_DEBUG (
"is the first retry or not " << isFirst);
2510 networkKey.m_ackId = newEntry.
GetAckId ();
2511 networkKey.m_ourAdd = newEntry.
GetOurAdd ();
2512 networkKey.m_nextHop = newEntry.
GetNextHop ();
2513 networkKey.m_source = newEntry.
GetSrc ();
2514 networkKey.m_destination = newEntry.
GetDst ();
2539 networkKey.m_ackId = mb.
GetAckId ();
2542 networkKey.m_source = mb.
GetSrc ();
2543 networkKey.m_destination = mb.
GetDst ();
2558 NS_LOG_DEBUG (
"The packet with dsr header " << dsrP->GetSize ());
2559 networkKey.m_ackId = mb.
GetAckId ();
2562 networkKey.m_source = mb.
GetSrc ();
2563 networkKey.m_destination = mb.
GetDst ();
2622 NS_LOG_DEBUG (
"We may need to send error messages now");
2633 uint8_t numberAddress = (buf[1] - 2) / 4;
2634 NS_LOG_DEBUG (
"The number of addresses " << (uint32_t)numberAddress);
2652 errorDst = address1;
2739 NS_LOG_LOGIC (
"Packet transmissions to " << nextHop <<
" has been attempted SendRetries times for " << networkKey.
m_ackId);
2748 uint8_t numberAddress = (buf[1] - 2) / 4;
2749 NS_LOG_DEBUG (
"The number of addresses " << (uint32_t)numberAddress);
2767 errorDst = address1;
2797 NS_LOG_FUNCTION (
this << packet << sourceRoute << source << nextHop << targetAddress << (uint32_t)protocol << route);
2802 dsrRoutingHeader.SetMessageType (2);
2803 dsrRoutingHeader.SetSourceId (
GetIDfromIP (source));
2804 dsrRoutingHeader.SetDestId (
GetIDfromIP (targetAddress));
2808 uint8_t length = sourceRoute.
GetLength ();
2809 dsrRoutingHeader.SetPayloadLength (uint16_t (length) + 2);
2810 dsrRoutingHeader.AddDsrOption (sourceRoute);
2816 source, targetAddress,
m_ackId,
2823 networkKey.
m_ackId = newEntry.GetAckId ();
2824 networkKey.
m_ourAdd = newEntry.GetOurAdd ();
2825 networkKey.
m_nextHop = newEntry.GetNextHop ();
2826 networkKey.
m_source = newEntry.GetSrc ();
2831 passiveKey.
m_source = newEntry.GetSrc ();
2833 passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
2836 linkKey.
m_source = newEntry.GetSrc ();
2838 linkKey.
m_ourAdd = newEntry.GetOurAdd ();
2839 linkKey.
m_nextHop = newEntry.GetNextHop ();
2852 if (nextHop != targetAddress)
2870 NS_LOG_FUNCTION (
this << source << destination << (uint32_t)protocol);
2891 uint8_t length = rreqHeader.
GetLength ();
2893 packet->AddHeader (dsrRoutingHeader);
2896 bool nonProp =
true;
2897 std::vector<Ipv4Address>
address;
2898 address.push_back (source);
2899 address.push_back (destination);
2931 std::vector<Ipv4Address> ip = toDst.GetVector ();
2943 if (nextHop ==
"0.0.0.0")
2961 NS_LOG_INFO (
"No route found, initiate route error request");
2978 rreqHeader.SetTarget (originalDst);
2984 uint8_t length = rreqHeader.GetLength () + rerr.
GetLength ();
2988 bool nonProp =
false;
2989 std::vector<Ipv4Address>
address;
2991 address.push_back (originalDst);
3002 NS_LOG_INFO (
"Only when there is no existing route request time when the initial route request is scheduled");
3008 NS_LOG_INFO (
"There is existing route request, find the existing route request entry");
3026 NS_LOG_DEBUG (
"Did not find the non-propagation timer");
3071 NS_LOG_FUNCTION (
this << packet << nonProp << requestId << (uint32_t)protocol);
3082 std::vector<Ipv4Address>
address;
3083 address.push_back (source);
3084 address.push_back (dst);
3106 std::vector<Ipv4Address>
address;
3107 address.push_back (source);
3108 address.push_back (dst);
3158 std::vector<Ipv4Address> ip = toDst.
GetVector ();
3169 NS_LOG_INFO (
"The nextHop address is " << nextHop);
3170 if (nextHop ==
"0.0.0.0")
3196 NS_LOG_DEBUG (
"Route not found. Drop packet with dst " << dst);
3208 NS_LOG_DEBUG (
"Check the route request entry " << source <<
" " << dst);
3225 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
3227 NS_LOG_LOGIC (
"Inserting into priority queue number: " << priority);
3271 std::vector<Ipv4Address>::iterator before = find (nodeList.begin (), nodeList.end (), srcAddress);
3272 for (std::vector<Ipv4Address>::iterator i = nodeList.begin (); i != before; ++i)
3277 std::vector<Ipv4Address>::iterator after = find (nodeList.begin (), nodeList.end (),
m_mainAddress);
3278 for (std::vector<Ipv4Address>::iterator j = after; j != nodeList.end (); ++j)
3304 newPacket->
AddHeader (dsrRoutingHeader);
3313 NS_LOG_INFO (
"The same gratuitous route reply has already sent");
3328 NS_LOG_INFO (
"The output device " << dev <<
" packet is: " << *packet);
3331 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
3333 NS_LOG_INFO (
"Inserting into priority queue number: " << priority);
3357 packet, source, nextHop, route);
3379 NS_LOG_FUNCTION (
this << ackId << destination << realSrc << realDst << (uint32_t)protocol << route);
3385 dsrRoutingHeader.SetMessageType (1);
3387 dsrRoutingHeader.SetDestId (
GetIDfromIP (destination));
3398 dsrRoutingHeader.SetPayloadLength (uint16_t (length) + 2);
3399 dsrRoutingHeader.AddDsrOption (ack);
3407 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
3410 NS_LOG_LOGIC (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
3444 uint32_t sourceId = dsrRoutingHeader.
GetSourceId ();
3446 NS_LOG_INFO (
"The source address " << source <<
" with source id " << sourceId);
3452 bool isPromisc =
false;
3463 uint32_t size = p->
GetSize ();
3464 uint8_t *
data =
new uint8_t[size];
3467 uint8_t optionType = 0;
3468 uint8_t optionLength = 0;
3469 uint8_t segmentsLeft = 0;
3471 optionType = *(
data);
3472 NS_LOG_LOGIC (
"The option type value " << (uint32_t)optionType <<
" with packet id " << p->
GetUid());
3475 if (optionType == 1)
3480 NS_LOG_INFO (
"Discard this packet due to unidirectional link");
3485 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3487 if (optionLength == 0)
3493 else if (optionType == 2)
3496 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3498 if (optionLength == 0)
3505 else if (optionType == 32)
3509 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3511 if (optionLength == 0)
3518 else if (optionType == 3)
3521 NS_LOG_INFO (
"The option type value " << (uint32_t)optionType);
3524 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3526 if (optionLength == 0)
3531 NS_LOG_INFO (
"The option Length " << (uint32_t)optionLength);
3534 else if (optionType == 96)
3537 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3538 segmentsLeft = *(data + 3);
3539 if (optionLength == 0)
3546 if (segmentsLeft == 0)
3558 nextProto->Receive (copy, ip, incomingInterface);
3585 NS_LOG_INFO (
"This is not the final destination, the packet has already been forward to next hop");
3595 uint8_t salvage = 0;
3657 if ((*i)->GetOptionNumber () == optionNumber)
bool Dequeue(Ipv4Address dst, ErrorBuffEntry &entry)
Return first found (the earliest) entry for given destination.
void SendRerrWhenBreaksLinkToNextHop(Ipv4Address nextHop, uint8_t protocol)
Send the route error message when the link breaks to the next hop.
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.
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.
keep track of time values and allow control of 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)
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)
void CancelLinkPacketTimer(MaintainBuffEntry &mb)
Cancel the link packet retransmission timer for a specific maintenance entry.
Packet addressed to someone else.
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.
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.
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
A packet is allocated a new uid when it is created empty or with zero-filled payload.
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)
NS_OBJECT_ENSURE_REGISTERED(NullMessageSimulatorImpl)
void DropPacketForErrLink(Ipv4Address source, Ipv4Address nextHop)
Remove all packets with the error link.
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
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)
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
Ipv4Address SearchNextHop(Ipv4Address ipv4Address, std::vector< Ipv4Address > &vec)
Get the next hop of the route.
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.
#define NS_FATAL_ERROR(msg)
fatal error handling
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.
bool IsRunning(void) const
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
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
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.
hold objects of type ns3::Time
void Schedule(void)
Schedule a new event using the currently-configured delay, function, and arguments.
void SendUnreachError(Ipv4Address errorHop, 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...
void SetGateway(Ipv4Address gw)
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
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)
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)
This method is invoked whenever two sets of objects are aggregated together.
Access to the Ipv4 forwarding table, interfaces, and configuration.
uint32_t GetSize()
Number of entries.
Ptr< Packet > Copy(void) const
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...
This policy cancels the event from the destructor of the Timer to verify that the event has already e...
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.
Ptr< dsr::DsrOptions > GetOption(int optionNumber)
Get the option corresponding to optionNumber.
uint16_t GetIDfromIP(Ipv4Address address)
Get the node id from ip address.
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.
uint32_t m_passiveRetries
of retries have been sent for passive acknowledgment
uint32_t m_maxNetworkSize
Maximum network queue size.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
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.
MaintainBuffer m_maintainBuffer
The declaration of maintain buffer.
L4 Protocol abstract base class.
static Time Now(void)
Return the "current simulation 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)
Verify if all the elements in the maintainence buffer entry is the same.
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)
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()
This method is invoked whenever two sets of objects are aggregated together.
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)
bool m_subRoute
Whether to save sub route or not.
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
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
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.
NS_LOG_COMPONENT_DEFINE("DsrRouting")
#define NS_LOG_ERROR(msg)
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.
PacketType
Packet types are used as they are in Linux.
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.
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
Doxygen introspection did not find any typical Config paths.
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)
Verify if all the elements in the maintainence buffer entry is the same.
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.