|
A Discrete-Event Network Simulator
|
API
|
Go to the documentation of this file.
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"
71 #include "ns3/ipv6-interface.h"
112 .SetGroupName (
"Dsr")
114 .AddAttribute (
"RouteCache",
115 "The route cache for saving routes from "
116 "route discovery process.",
120 MakePointerChecker<DsrRouteCache> ())
121 .AddAttribute (
"RreqTable",
122 "The request table to manage route requests.",
126 MakePointerChecker<DsrRreqTable> ())
127 .AddAttribute (
"PassiveBuffer",
128 "The passive buffer to manage "
129 "promisucously received passive ack.",
133 MakePointerChecker<DsrPassiveBuffer> ())
134 .AddAttribute (
"MaxSendBuffLen",
135 "Maximum number of packets that can be stored "
139 MakeUintegerChecker<uint32_t> ())
140 .AddAttribute (
"MaxSendBuffTime",
141 "Maximum time packets can be queued in the send buffer .",
145 .AddAttribute (
"MaxMaintLen",
146 "Maximum number of packets that can be stored "
147 "in maintenance buffer.",
150 MakeUintegerChecker<uint32_t> ())
151 .AddAttribute (
"MaxMaintTime",
152 "Maximum time packets can be queued in maintenance buffer.",
156 .AddAttribute (
"MaxCacheLen",
157 "Maximum number of route entries that can be stored "
161 MakeUintegerChecker<uint32_t> ())
162 .AddAttribute (
"RouteCacheTimeout",
163 "Maximum time the route cache can be queued in "
168 .AddAttribute (
"MaxEntriesEachDst",
169 "Maximum number of route entries for a "
170 "single destination to respond.",
173 MakeUintegerChecker<uint32_t> ())
174 .AddAttribute (
"SendBuffInterval",
175 "How often to check send buffer for packet with route.",
179 .AddAttribute (
"NodeTraversalTime",
180 "The time it takes to traverse two neighboring nodes.",
184 .AddAttribute (
"RreqRetries",
185 "Maximum number of retransmissions for "
186 "request discovery of a route.",
189 MakeUintegerChecker<uint32_t> ())
190 .AddAttribute (
"MaintenanceRetries",
191 "Maximum number of retransmissions for "
192 "data packets from maintenance buffer.",
195 MakeUintegerChecker<uint32_t> ())
196 .AddAttribute (
"RequestTableSize",
197 "Maximum number of request entries in the request table, "
198 "set this as the number of nodes in the simulation.",
201 MakeUintegerChecker<uint32_t> ())
202 .AddAttribute (
"RequestIdSize",
203 "Maximum number of request source Ids in "
204 "the request table.",
207 MakeUintegerChecker<uint32_t> ())
208 .AddAttribute (
"UniqueRequestIdSize",
209 "Maximum number of request Ids in "
210 "the request table for a single destination.",
213 MakeUintegerChecker<uint32_t> ())
214 .AddAttribute (
"NonPropRequestTimeout",
215 "The timeout value for non-propagation request.",
219 .AddAttribute (
"DiscoveryHopLimit",
220 "The max discovery hop limit for route requests.",
223 MakeUintegerChecker<uint32_t> ())
224 .AddAttribute (
"MaxSalvageCount",
225 "The max salvage count for a single data packet.",
228 MakeUintegerChecker<uint8_t> ())
229 .AddAttribute (
"BlacklistTimeout",
230 "The time for a neighbor to stay in blacklist.",
234 .AddAttribute (
"GratReplyHoldoff",
235 "The time for gratuitous reply entry to expire.",
239 .AddAttribute (
"BroadcastJitter",
240 "The jitter time to avoid collision for broadcast packets.",
243 MakeUintegerChecker<uint32_t> ())
244 .AddAttribute (
"LinkAckTimeout",
245 "The time a packet in maintenance buffer wait for "
246 "link acknowledgment.",
250 .AddAttribute (
"TryLinkAcks",
251 "The number of link acknowledgment to use.",
254 MakeUintegerChecker<uint32_t> ())
255 .AddAttribute (
"PassiveAckTimeout",
256 "The time a packet in maintenance buffer wait for "
257 "passive acknowledgment.",
261 .AddAttribute (
"TryPassiveAcks",
262 "The number of passive acknowledgment to use.",
265 MakeUintegerChecker<uint32_t> ())
266 .AddAttribute (
"RequestPeriod",
267 "The base time interval between route requests.",
271 .AddAttribute (
"MaxRequestPeriod",
272 "The max time interval between route requests.",
276 .AddAttribute (
"GraReplyTableSize",
277 "The gratuitous reply table size.",
280 MakeUintegerChecker<uint32_t> ())
281 .AddAttribute (
"CacheType",
282 "Use Link Cache or use Path Cache",
286 .AddAttribute (
"StabilityDecrFactor",
287 "The stability decrease factor for link cache",
290 MakeUintegerChecker<uint32_t> ())
291 .AddAttribute (
"StabilityIncrFactor",
292 "The stability increase factor for link cache",
295 MakeUintegerChecker<uint32_t> ())
296 .AddAttribute (
"InitStability",
297 "The initial stability factor for link cache",
301 .AddAttribute (
"MinLifeTime",
302 "The minimal life time for link cache",
306 .AddAttribute (
"UseExtends",
307 "The extension time for link cache",
311 .AddAttribute (
"EnableSubRoute",
312 "Enables saving of sub route when receiving "
313 "route error messages, only available when "
314 "using path route cache",
318 .AddAttribute (
"RetransIncr",
319 "The increase time for retransmission timer "
320 "when facing network congestion",
324 .AddAttribute (
"MaxNetworkQueueSize",
325 "The max number of packet to save in the network queue.",
328 MakeUintegerChecker<uint32_t> ())
329 .AddAttribute (
"MaxNetworkQueueDelay",
330 "The max time for a packet to stay in the network queue.",
334 .AddAttribute (
"NumPriorityQueues",
335 "The max number of packet to save in the network queue.",
338 MakeUintegerChecker<uint32_t> ())
339 .AddAttribute (
"LinkAcknowledgment",
340 "Enable Link layer acknowledgment mechanism",
344 .AddTraceSource (
"Tx",
347 "ns3::dsr::DsrOptionSRHeader::TracedCallback")
348 .AddTraceSource (
"Drop",
351 "ns3::Packet::TracedCallback")
402 Ptr<Node> node = this->GetObject<Node> ();
405 m_ipv4 = this->GetObject<Ipv4L3Protocol> ();
434 std::pair<std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator,
bool> result_i =
m_priorityQueue.insert (std::make_pair (i, queue_i));
466 for (uint32_t i = 0; i <
m_ipv4->GetNInterfaces (); i++)
471 if (addr != loopback)
489 routeCache->ScheduleTimer ();
512 routeCache->AddArpCache (
m_ipv4->GetInterface (i)->GetArpCache ());
530 return n->GetDevice (atoi (elements[3].c_str ()));
533 std::vector<std::string>
536 std::vector <std::string> elements;
537 size_t pos1 = 0, pos2;
538 while (pos1 != context.npos)
540 pos1 = context.find (
"/",pos1);
541 pos2 = context.find (
"/",pos1 + 1);
542 elements.push_back (context.substr (pos1 + 1,pos2 - (pos1 + 1)));
553 for (uint32_t i = 0; i <
m_ipv4->GetNInterfaces (); i++)
566 adhoc->TraceDisconnectWithoutContext (
"TxErrHeader",
633 for (int32_t i = 0; i < nNodes; ++i)
637 int32_t ifIndex = ipv4->GetInterfaceForAddress (ipv4Address);
670 std::vector<Ipv4Address> nodelist = rt.
GetVector ();
678 m_routeCache->DeleteAllRoutesIncludeLink (errorSrc, unreachNode, node);
688 return m_rreqTable->FindSourceEntry (src, dst,
id);
696 for (int32_t i = 0; i < nNodes; ++i)
702 if (netDevice->GetAddress () ==
address)
704 return ipv4->GetAddress (1, 0).GetLocal ();
723 for (std::vector<Ipv4Address>::const_iterator i = vec.begin (); i != vec.end (); ++i)
735 if (vec.size () == 2)
743 if (ipv4Address == vec.back ())
745 NS_LOG_DEBUG (
"We have reached to the final destination " << ipv4Address <<
" " << vec.back ());
748 for (std::vector<Ipv4Address>::const_iterator i = vec.begin (); i != vec.end (); ++i)
750 if (ipv4Address == (*i))
784 for (int32_t i = 0; i < nNodes; ++i)
788 if (ipv4->GetAddress (1, 0).GetLocal () ==
address)
808 return ipv4->GetAddress (1, 0).GetLocal ();
842 NS_LOG_DEBUG (
"Here we try to find the data packet in the send buffer");
845 bool findRoute =
m_routeCache->LookupRoute (destination, toDst);
848 NS_LOG_INFO (
"We have found a route for the packet");
851 uint8_t protocol = i->GetProtocol ();
866 uint32_t size = copyP->
GetSize ();
867 uint8_t *
data =
new uint8_t[size];
870 uint8_t optionType = 0;
871 optionType = *(
data);
877 uint8_t errorType = *(
data + 2);
893 std::vector<Ipv4Address> errorRoute = toDst.
GetVector ();
905 if (nextHop ==
"0.0.0.0")
927 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
929 NS_LOG_LOGIC (
"Will be inserting into priority queue number: " << priority);
936 if (dsrNetworkQueue->Enqueue (newEntry))
942 NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
954 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
956 if (nextHop ==
"0.0.0.0")
970 uint8_t length = sourceRoute.
GetLength ();
1012 if (nextHop != destination)
1089 newEntry.
SetSrc (sourceIp);
1090 newEntry.
SetDst (destinationIp);
1099 dsr->CancelLinkPacketTimer (newEntry);
1106 NS_LOG_INFO (
this << from << to << packetType << *pktMinusIpHdr);
1118 uint32_t size = pktMinusIpHdr->
GetSize ();
1119 uint8_t *
data =
new uint8_t[size];
1121 uint8_t optionType = 0;
1122 optionType = *(
data);
1126 if (optionType == 96)
1132 " overhearing packet PID: " << pktMinusIpHdr->
GetUid () <<
1133 " from " << promiscSource <<
1135 " with source IP " << ipv4Header.
GetSource () <<
1137 " and packet : " << *pktMinusDsrHdr);
1139 bool isPromisc =
true;
1140 dsrOption->Process (pktMinusIpHdr, pktMinusDsrHdr,
m_mainAddress, source, ipv4Header, nextHeader, isPromisc, promiscSource);
1154 NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)protocol);
1157 bool findRoute =
m_routeCache->LookupRoute (destination, toDst);
1162 <<
" " <<
m_mainAddress <<
" there is no route for this packet, queue the packet");
1170 <<
" Add packet PID: " << packet->
GetUid () <<
" to queue. Packet: " << *packet);
1192 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
1194 if (nextHop ==
"0.0.0.0")
1199 uint8_t salvage = 0;
1209 uint8_t length = sourceRoute.
GetLength ();
1217 source, destination, 0,
1253 if (nextHop != destination)
1270 NS_LOG_FUNCTION (
this << unreachNode << destination << originalDst << (uint32_t)salvage << (uint32_t)protocol);
1284 uint8_t rerrLength = rerrUnreachHeader.
GetLength ();
1288 bool findRoute =
m_routeCache->LookupRoute (destination, toDst);
1295 NS_LOG_INFO (
"We are the error source, send request to original dst " << originalDst);
1302 <<
" " <<
m_mainAddress <<
" there is no route for this packet, queue the packet");
1306 newPacket->
AddHeader (dsrRoutingHeader);
1314 <<
" Add packet PID: " << p->
GetUid () <<
" to queue. Packet: " << *p);
1318 NS_LOG_DEBUG (
"When there is no existing route request for " << destination <<
", initialize one");
1329 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
1331 if (nextHop ==
"0.0.0.0")
1345 uint8_t srLength = sourceRoute.
GetLength ();
1346 uint8_t length = (srLength + rerrLength);
1351 newPacket->
AddHeader (dsrRoutingHeader);
1359 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1361 NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
1368 if (dsrNetworkQueue->Enqueue (newEntry))
1374 NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
1386 NS_LOG_FUNCTION (
this << rerr << sourceRoute << nextHop << (uint32_t)protocol << route);
1401 route->SetOutputDevice (dev);
1404 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1406 NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
1413 if (dsrNetworkQueue->Enqueue (newEntry))
1419 NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
1430 NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)protocol << route);
1435 NS_LOG_INFO (
"Drop packet. Not handling ICMP packet for now");
1441 bool findRoute =
m_routeCache->LookupRoute (destination, toDst);
1446 <<
" " <<
m_mainAddress <<
" there is no route for this packet, queue the packet");
1454 <<
" Add packet PID: " << packet->
GetUid () <<
" to send buffer. Packet: " << *packet);
1466 NS_LOG_LOGIC (
"There is existing route request timer with request count " <<
m_rreqTable->GetRreqCnt (destination));
1480 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
1482 if (nextHop ==
"0.0.0.0")
1487 uint8_t salvage = 0;
1497 uint8_t length = sourceRoute.
GetLength ();
1507 source, destination, 0,
1542 if (nextHop != destination)
1575 uint32_t sourceId = dsrRoutingHeader.
GetSourceId ();
1576 uint32_t destinationId = dsrRoutingHeader.
GetDestId ();
1583 uint8_t numberAddress = (buf[1] - 2) / 4;
1596 newDsrRoutingHeader.
SetDestId (destinationId);
1609 NS_LOG_FUNCTION (
this << packet << source << nextHop << (uint32_t)protocol);
1616 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1618 NS_LOG_INFO (
"Will be inserting into priority queue number: " << priority);
1625 if (dsrNetworkQueue->Enqueue (newEntry))
1631 NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
1646 uint32_t numPriorities;
1647 if (continueWithFirst)
1653 numPriorities = priority;
1658 std::map<uint32_t, Ptr<DsrNetworkQueue> >::iterator q =
m_priorityQueue.find (i);
1660 uint32_t queueSize = dsrNetworkQueue->GetSize ();
1674 uint32_t totalQueueSize = 0;
1677 NS_LOG_INFO (
"The size of the network queue for " << j->first <<
" is " << j->second->GetSize ());
1678 totalQueueSize += j->second->GetSize ();
1679 NS_LOG_INFO (
"The total network queue size is " << totalQueueSize);
1681 if (totalQueueSize > 5)
1687 dsrNetworkQueue->Dequeue (newEntry);
1690 NS_LOG_LOGIC (
"Packet sent by Dsr. Calling PriorityScheduler after some time");
1699 NS_LOG_LOGIC (
"Packet dropped by Dsr. Calling PriorityScheduler immediately");
1721 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1724 std::vector<DsrNetworkQueueEntry> newNetworkQueue = dsrNetworkQueue->GetQueue ();
1725 for (std::vector<DsrNetworkQueueEntry>::iterator i = newNetworkQueue.begin (); i != newNetworkQueue.end (); i++)
1730 if (nextHop == j->first.m_nextHop)
1732 NS_LOG_DEBUG (
"The network delay left is " << j->second.GetDelayLeft ());
1733 j->second.SetDelay (j->second.GetDelayLeft () +
m_retransIncr);
1761 NS_LOG_INFO (
"The nexthop address " << nextHop <<
" the source " << source <<
" the destination " << destination);
1767 NS_LOG_DEBUG (
"destination over here " << destination);
1786 uint8_t length = sourceRoute.
GetLength ();
1795 source, destination, 0,
1831 if (nextHop != destination)
1846 NS_LOG_LOGIC (
"Schedule sending the next packet in send buffer");
1853 NS_LOG_LOGIC (
"All queued packets are out-dated for the destination in send buffer");
1876 uint32_t size = copyP->
GetSize ();
1877 uint8_t *
data =
new uint8_t[size];
1880 uint8_t optionType = 0;
1881 optionType = *(
data);
1882 NS_LOG_DEBUG (
"The option type value in send packet " << (uint32_t)optionType);
1883 if (optionType == 3)
1889 uint8_t errorType = *(
data + 2);
1893 NS_LOG_DEBUG (
"The packet is route error unreach packet");
1923 newPacket->
AddHeader (newRoutingHeader);
1928 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1930 NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
1937 if (dsrNetworkQueue->Enqueue (newEntry))
1943 NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
1950 NS_LOG_LOGIC (
"Schedule sending the next packet in error buffer");
1958 NS_LOG_DEBUG (
"Packet not found in either the send or error buffer");
1964 uint16_t fragmentOffset, uint16_t identification,
bool saveEntry)
1985 NS_LOG_DEBUG (
"We get the all equal for passive buffer here");
1990 mbEntry.
SetDst (destination);
2017 newEntry.
SetSrc (source);
2018 newEntry.
SetDst (destination);
2035 NS_LOG_FUNCTION (
this << (uint32_t)ackId << ipv4Header << realSrc << realDst);
2044 realSrc, realDst, ackId,
2077 std::map<LinkKey, Timer>::const_iterator i =
2103 NS_LOG_INFO (
"Link acknowledgment received, remove same maintenance buffer entry");
2124 <<
" source " << mb.
GetSrc () <<
" destination " << mb.
GetDst ()
2128 std::map<NetworkKey, Timer>::const_iterator i =
2152 NS_LOG_INFO (
"Remove same maintenance buffer entry based on network acknowledgment");
2170 std::map<PassiveKey, Timer>::const_iterator j =
2197 std::vector<Ipv4Address> previousErrorDst;
2214 uint8_t numberAddress = (buf[1] - 2) / 4;
2215 NS_LOG_DEBUG (
"The number of addresses " << (uint32_t)numberAddress);
2231 errorDst = address1;
2238 if (std::find (previousErrorDst.begin (), previousErrorDst.end (), destination) == previousErrorDst.end ())
2240 NS_LOG_DEBUG (
"have not seen this dst before " << errorDst <<
" in " << previousErrorDst.size ());
2242 previousErrorDst.push_back (errorDst);
2254 NS_LOG_INFO (
"Cancel the packet timer for next maintenance entry");
2261 NS_LOG_INFO (
"Maintenance buffer entry not found");
2269 NS_LOG_FUNCTION (
this << packet << source << dst << (uint32_t)protocol);
2282 newPacket->
CopyData (buf,
sizeof(buf));
2283 uint8_t numberAddress = (buf[1] - 2) / 4;
2293 bool findRoute =
m_routeCache->LookupRoute (dst, toDst);
2303 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
2305 if (nextHop ==
"0.0.0.0")
2321 uint8_t length = sourceRoute.
GetLength ();
2333 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
2335 NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
2342 if (dsrNetworkQueue->Enqueue (newEntry))
2348 NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
2359 NS_LOG_DEBUG (
"Will not salvage this packet, silently drop");
2417 NS_LOG_DEBUG (
"The passive acknowledgment option for data packet");
2434 NS_LOG_DEBUG (
"is the first retry or not " << isFirst);
2565 NS_LOG_INFO (
"We need to send error messages now");
2672 NS_LOG_FUNCTION (
this << packet << sourceRoute << source << nextHop << targetAddress << (uint32_t)protocol << route);
2683 uint8_t length = sourceRoute.
GetLength ();
2691 source, targetAddress,
m_ackId,
2727 if (nextHop != targetAddress)
2745 NS_LOG_FUNCTION (
this << source << destination << (uint32_t)protocol);
2766 uint8_t length = rreqHeader.
GetLength ();
2771 bool nonProp =
true;
2772 std::vector<Ipv4Address>
address;
2774 address.push_back (destination);
2806 std::vector<Ipv4Address> ip = toDst.
GetVector ();
2818 if (nextHop ==
"0.0.0.0")
2836 NS_LOG_INFO (
"No route found, initiate route error request");
2863 bool nonProp =
false;
2864 std::vector<Ipv4Address>
address;
2866 address.push_back (originalDst);
2877 NS_LOG_INFO (
"Only when there is no existing route request time when the initial route request is scheduled");
2883 NS_LOG_INFO (
"There is existing route request, find the existing route request entry");
2901 NS_LOG_DEBUG (
"Did not find the non-propagation timer");
2944 NS_LOG_FUNCTION (
this << packet << nonProp << requestId << (uint32_t)protocol);
2955 std::vector<Ipv4Address>
address;
2978 std::vector<Ipv4Address>
address;
3030 std::vector<Ipv4Address> ip = toDst.
GetVector ();
3041 NS_LOG_INFO (
"The nextHop address is " << nextHop);
3042 if (nextHop ==
"0.0.0.0")
3068 NS_LOG_DEBUG (
"Route not found. Drop packet with dst " << dst);
3080 NS_LOG_DEBUG (
"Check the route request entry " << source <<
" " << dst);
3097 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
3099 NS_LOG_LOGIC (
"Inserting into priority queue number: " << priority);
3105 if (dsrNetworkQueue->Enqueue (newEntry))
3111 NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
3143 std::vector<Ipv4Address>::iterator before = find (nodeList.begin (), nodeList.end (), srcAddress);
3144 for (std::vector<Ipv4Address>::iterator i = nodeList.begin (); i != before; ++i)
3149 std::vector<Ipv4Address>::iterator after = find (nodeList.begin (), nodeList.end (),
m_mainAddress);
3150 for (std::vector<Ipv4Address>::iterator j = after; j != nodeList.end (); ++j)
3176 newPacket->
AddHeader (dsrRoutingHeader);
3185 NS_LOG_INFO (
"The same gratuitous route reply has already sent");
3199 route->SetOutputDevice (dev);
3200 NS_LOG_INFO (
"The output device " << dev <<
" packet is: " << *packet);
3203 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
3205 NS_LOG_INFO (
"Inserting into priority queue number: " << priority);
3211 if (dsrNetworkQueue->Enqueue (newEntry))
3217 NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
3229 packet, source, nextHop, route);
3251 NS_LOG_FUNCTION (
this << ackId << destination << realSrc << realDst << (uint32_t)protocol << route);
3276 route->SetOutputDevice (dev);
3279 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
3282 NS_LOG_LOGIC (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
3288 if (dsrNetworkQueue->Enqueue (newEntry))
3294 NS_LOG_INFO (
"Packet dropped as dsr network queue is full");
3316 uint32_t sourceId = dsrRoutingHeader.
GetSourceId ();
3318 NS_LOG_INFO (
"The source address " << source <<
" with source id " << sourceId);
3324 bool isPromisc =
false;
3335 uint32_t size = p->
GetSize ();
3336 uint8_t *
data =
new uint8_t[size];
3339 uint8_t optionType = 0;
3340 uint8_t optionLength = 0;
3341 uint8_t segmentsLeft = 0;
3343 optionType = *(
data);
3344 NS_LOG_LOGIC (
"The option type value " << (uint32_t)optionType <<
" with packet id " << p->
GetUid ());
3347 if (optionType == 1)
3352 NS_LOG_INFO (
"Discard this packet due to unidirectional link");
3357 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3359 if (optionLength == 0)
3365 else if (optionType == 2)
3368 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3370 if (optionLength == 0)
3377 else if (optionType == 32)
3381 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3383 if (optionLength == 0)
3390 else if (optionType == 3)
3393 NS_LOG_INFO (
"The option type value " << (uint32_t)optionType);
3396 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3398 if (optionLength == 0)
3403 NS_LOG_INFO (
"The option Length " << (uint32_t)optionLength);
3406 else if (optionType == 96)
3409 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3410 segmentsLeft = *(
data + 3);
3411 if (optionLength == 0)
3418 if (segmentsLeft == 0)
3423 Ptr<IpL4Protocol> nextProto = l3proto->GetProtocol (nextHeader);
3430 nextProto->Receive (copy, ip, incomingInterface);
3457 NS_LOG_INFO (
"This is not the final destination, the packet has already been forward to next hop");
3467 uint8_t salvage = 0;
3469 DsrOptionRerrUnsupportHeader rerrUnsupportHeader;
3470 rerrUnsupportHeader.SetErrorType (3);
3472 rerrUnsupportHeader.SetUnsupported (optionType);
3473 rerrUnsupportHeader.SetErrorDst (src);
3474 rerrUnsupportHeader.SetSalvage (salvage);
3487 Ipv6Header
const &ip,
3488 Ptr<Ipv6Interface> incomingInterface)
3490 NS_LOG_FUNCTION (
this << p << ip.GetSource () << ip.GetDestination () << incomingInterface);
3529 if ((*i)->GetOptionNumber () == optionNumber)
Time m_maxRequestPeriod
The max request period.
a unique identifier for an interface.
uint32_t m_maxSendBuffLen
The maximum number of packets that we allow a routing protocol to buffer.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
virtual void NotifyNewAggregate(void)
Notify all Objects aggregated to this one of a new Object being aggregated.
uint32_t m_maxEntriesEachDst
Max number of route entries to save for each destination.
Ptr< dsr::DsrRreqTable > m_rreqTable
A "drop-front" queue used by the routing layer to cache route request sent.
void PriorityScheduler(uint32_t priority, bool continueWithFirst)
This function is called to schedule sending packets from the network queue by priority.
Time m_maxCacheTime
Max time for caching the route cache entry.
DsrMaintainBuffer m_maintainBuffer
The declaration of maintain buffer.
Ipv4Address GetNextHopAddress() const
Get next hop address function.
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
DsrSendBuffer m_sendBuffer
The send buffer.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Ipv4Address m_source
source address
uint16_t GetIDfromIP(Ipv4Address address)
Get the node id from ip address.
DSR Passive Buffer Entry.
virtual ~DsrRouting()
Destructor.
uint32_t m_graReplyTableSize
Set the gratuitous reply table size.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
AttributeValue implementation for Boolean.
DsrErrorBuffer m_errorBuffer
The error buffer to save the error messages.
Ptr< Ipv4Route > m_ipv4Route
Ipv4 Route.
void SendBuffTimerExpire()
The send buffer timer expire.
uint32_t m_tryLinkAcks
Maximum number of packet transmission using link acknowledgment.
void AddDsrOption(DsrOptionHeader const &option)
Serialize the option, prepending pad1 or padn option as necessary.
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.
void ScheduleLinkPacketRetry(DsrMaintainBuffEntry &mb, uint8_t protocol)
Schedule the packet retransmission based on link-layer acknowledgment.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
void RouteRequestTimerExpire(Ptr< Packet > packet, std::vector< Ipv4Address > address, uint32_t requestId, uint8_t protocol)
Handle route discovery timer.
bool Dequeue(Ipv4Address dst, DsrMaintainBuffEntry &entry)
Return first found (the earliest) entry for given destination.
void AddHeader(const Header &header)
Add header to this packet.
uint32_t m_maxMaintainLen
Max # of entries for maintenance 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.
void NetworkScheduleTimerExpire(DsrMaintainBuffEntry &mb, uint8_t protocol)
This function deals with packet retransmission timer expire using network acknowledgment.
Ptr< const Packet > GetPacket() const
Get packet from entry.
The gratuitous table entries, it maintains the already sent gratuitous route reply entries.
static Time Now(void)
Return the current simulation virtual time.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
DsrRouteCacheEntry class for entries in the route cache.
void SetNextHop(Ipv4Address n)
Set next hop of entry.
bool IsNull(void) const
Check for null implementation.
bool LinkEqual(DsrMaintainBuffEntry &entry)
Verify if the maintain buffer entry is the same in every field for link ack.
uint16_t m_ackId
acknowledge ID
Ipv4Address m_ourAdd
local address
bool LookupRoute(Ipv4Address id, DsrRouteCacheEntry &rt)
Lookup route cache entry with destination address dst See also DsrRouteCache::LookupRoute.
void CancelPacketAllTimer(DsrMaintainBuffEntry &mb)
Cancel all the packet timers.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
uint32_t m_maxRreqId
The max number of request ids for a single destination.
uint32_t GetSize()
Number of entries.
bool Enqueue(DsrSendBuffEntry &entry)
Push entry in queue, if there is no entry with the same packet and destination address in queue.
Time m_nodeTraversalTime
Time estimated for packet to travel between two nodes.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Ipv4Address GetIPfromMAC(Mac48Address address)
Get the Ip address from mac address.
Time m_passiveAckTimeout
The timeout value for passive acknowledge.
void SetPacket(Ptr< const Packet > p)
Set packet function.
uint32_t m_tryPassiveAcks
Maximum number of packet transmission using passive acknowledgment.
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.
void SetSource(Ipv4Address s)
Set surce address function.
Wifi MAC high model for an ad-hoc Wifi MAC.
static uint32_t GetNNodes(void)
std::vector< std::string > GetElementsFromContext(std::string context)
Get the elements from the tracing context.
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
uint16_t AddAckReqHeader(Ptr< Packet > &packet, Ipv4Address nextHop)
This function is called to add ack request header for network acknowledgement.
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.
bool AddEntry(GraReplyEntry &graTableEntry)
Add a new gratuitous reply entry.
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.
Ipv4Address m_source
source address
std::vector< DsrSendBuffEntry > & GetBuffer()
Return a pointer to the internal queue.
Ipv4 addresses are stored in host order in this class.
uint32_t m_passiveRetries
Describes an IPv6 address.
Ipv4Address m_destination
destination address
Hold objects of type Ptr<T>.
void LinkScheduleTimerExpire(DsrMaintainBuffEntry &mb, uint8_t protocol)
This function deals with packet retransmission timer expire using link acknowledgment.
bool Enqueue(DsrMaintainBuffEntry &entry)
Push entry in queue, if there is no entry with the same packet and destination address in queue.
void SetSegsLeft(uint8_t segs)
Set segments left.
std::vector< Ipv4Address > m_finalRoute
The route cache.
bool Dequeue(Ipv4Address dst, DsrErrorBuffEntry &entry)
Return first found (the earliest) entry for given destination.
void SetTtl(uint8_t ttl)
Set the tag's TTL.
Ipv4Address SearchNextHop(Ipv4Address ipv4Address, std::vector< Ipv4Address > &vec)
Get the next hop of the route.
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
uint8_t m_segsLeft
segments left
Time m_linkAckTimeout
The timeout value for link acknowledge.
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
void SendInitialRequest(Ipv4Address source, Ipv4Address destination, uint8_t protocol)
Broadcast the route request packet in subnet.
void Cancel(void)
Cancel the currently-running event if there is one.
Ipv4Address m_mainAddress
Our own Ip address.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
void SetSegsLeft(uint8_t seg)
Set segments left.
bool AddRoute_Link(DsrRouteCacheEntry::IP_VECTOR nodelist, Ipv4Address source)
dd route link to cache See also DsrRouteCache::AddRoute_Link
IP_VECTOR GetVector() const
Get the IP vector.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
void CancelNetworkPacketTimer(DsrMaintainBuffEntry &mb)
Cancel the network packet retransmission timer for a specific maintenance entry.
Hold together all Wifi-related objects.
bool IsRunning(void) const
uint32_t m_maxCacheLen
Max # of cache entries for route cache.
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,...
A simple virtual Timer class.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
Ptr< dsr::DsrRouteCache > GetRouteCache() const
Get the route cache.
void SendGratuitousReply(Ipv4Address replyTo, Ipv4Address replyFrom, std::vector< Ipv4Address > &nodeList, uint8_t protocol)
Send the gratuitous reply.
void PrintVector(std::vector< Ipv4Address > &vec)
Print the route vector.
DSR Maintain Buffer Entry.
std::map< Ipv4Address, Timer > m_addressReqTimer
Map IP address + RREQ timer.
Access to the IPv4 forwarding table, interfaces, and configuration.
uint32_t m_numPriorityQueues
The number of priority queues used.
bool IsMulticast(void) const
Smart pointer class similar to boost::intrusive_ptr.
Time m_sendBuffInterval
how often to check send buffer
bool Find(Ipv4Address dst)
Check if a packet with destination dst exists in the queue.
Ipv4Address GetSourceAddress() const
Get source address function.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Ipv4Address GetNextHop() const
Get next hop of entry.
Time m_gratReplyHoldoff
The max gratuitous reply hold off time.
void SetErrorBufferTimeout(Time t)
Set error buffer timeout.
void SetPacket(Ptr< const Packet > p)
Set packet.
Ptr< const Packet > GetPacket() const
Get packet.
uint32_t m_stabilityDecrFactor
The initial decrease factor for link cache.
Ptr< dsr::DsrRreqTable > GetRequestTable() const
Get the request table.
bool IsLinkCache()
Checks if the link is cached in the route cache See also DsrRouteCache::IsLinkCache.
@ PACKET_OTHERHOST
Packet addressed to someone else.
void RemoveAtStart(uint32_t size)
Remove size bytes from the start of the current packet.
Time m_retransIncr
the increase time for retransmission timer when face network congestion
Ptr< Ipv4L3Protocol > m_ipv4
Ipv4l3Protocol.
virtual void NotifyNewAggregate()
Notify all Objects aggregated to this one of a new Object being aggregated.
void Resume(void)
Restart the timer to expire within the amount of time left saved during Suspend.
Ipv4Address GetSrc() const
Get source address.
Ipv4Address m_destination
destination address
Ipv4Address m_destination
destination address
Ipv4Address m_source
source address
Ptr< dsr::DsrPassiveBuffer > GetPassiveBuffer() const
Get the passive buffer.
a polymophic address class
std::vector< Ipv4Address > IP_VECTOR
Define the vector to hold Ip address.
Ptr< dsr::DsrPassiveBuffer > m_passiveBuffer
A "drop-front" queue used by the routing layer to cache route request sent.
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
Ptr< Node > GetNodeWithAddress(Ipv4Address ipv4Address)
Get the node with give ip address.
static Mac48Address ConvertFrom(const Address &address)
void ScheduleRreqRetry(Ptr< Packet > packet, std::vector< Ipv4Address > address, bool nonProp, uint32_t requestId, uint8_t protocol)
Schedule the route request retry.
void Schedule(void)
Schedule a new event using the currently-configured delay, function, and arguments.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
uint32_t GetSize()
Returns the number of entries in the queue.
static const uint8_t PROT_NUMBER
Define the dsr protocol number.
std::map< PassiveKey, Timer > m_passiveAckTimer
The timer for passive acknowledgment.
uint32_t m_requestId
The id assigned to each route request.
void SetGraTableSize(uint32_t g)
Set the gratuitous reply table size.
void SetPassiveBuffer(Ptr< dsr::DsrPassiveBuffer > r)
Set the node.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
uint32_t m_discoveryHopLimit
Maximum hops to go for route request.
void SetMaxQueueLen(uint32_t len)
Set maximum queue length.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
uint32_t m_maxMaintRexmt
Maximum number of retransmissions of data packets.
void SetNode(Ptr< Node > node)
Set the node.
uint8_t m_maxSalvageCount
Maximum # times to salvage a packet.
static TypeId GetTypeId()
Get the type identificator.
Time m_maxMaintainTime
Time out for maintenance buffer.
void SalvagePacket(Ptr< const Packet > packet, Ipv4Address source, Ipv4Address dst, uint8_t protocol)
Salvage the packet which has been transmitted for 3 times.
Ipv4Address GetDst() const
Get destination address.
virtual enum IpL4Protocol::RxStatus Receive(Ptr< Packet > p, Ipv4Header const &header, Ptr< Ipv4Interface > incomingInterface)
bool UpdateRouteEntry(Ipv4Address dst)
Update route cache entry if it has been recently used and successfully delivered the data packet.
bool AddRoute(DsrRouteCacheEntry &rt)
Add route cache entry if it doesn't yet exist in route cache See also DsrRouteCache::AddRoute.
Ptr< const AttributeChecker > MakeBooleanChecker(void)
Simulation virtual time values and global simulation resolution.
void CancelPassivePacketTimer(DsrMaintainBuffEntry &mb)
Cancel the passive packet retransmission timer for a specific maintenance entry.
void SetDownTarget6(IpL4Protocol::DownTargetCallback6 callback)
This method allows a caller to set the current down target callback set for this L4 protocol (IPv6 ca...
Time m_blacklistTimeout
The black list time out.
bool Dequeue(Ipv4Address dst, DsrSendBuffEntry &entry)
Return first found (the earliest) entry for the given destination.
@ CANCEL_ON_DESTROY
This policy cancels the event from the destructor of the Timer or from Suspend().
void PacketNewRoute(Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol)
When route vector corrupted, originate a new packet, normally not happening.
bool IsBroadcast(void) const
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
void SetSrc(Ipv4Address s)
Set source address.
Time m_minLifeTime
The min life time.
std::map< LinkKey, Timer > m_linkAckTimer
The timer for link acknowledgment.
void Insert(Ptr< dsr::DsrOptions > option)
Insert a new Dsr Option.
void SendPacket(Ptr< Packet > packet, Ipv4Address source, Ipv4Address nextHop, uint8_t protocol)
This function is called by when really sending out the packet.
DsrOptionList_t m_options
List of DSR Options supported.
uint32_t GetSize()
Number of entries.
Time m_initStability
The initial stability value for link cache.
bool FindAndUpdate(Ipv4Address replyTo, Ipv4Address replyFrom, Time gratReplyHoldoff)
Update the route entry if found.
static const uint16_t PROT_NUMBER
Protocol number (0x0800)
void SetFragmentOffset(uint16_t f)
Set fragment offset function.
L4 Protocol abstract base class.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
DsrGraReply m_graReply
The gratuitous route reply.
Ptr< Node > m_node
The node ptr.
void ScheduleNetworkPacketRetry(DsrMaintainBuffEntry &mb, bool isFirst, uint8_t protocol)
Schedule the packet retransmission based on network layer acknowledgment.
void SetDestination(Ipv4Address d)
Set destination address function.
Hold variables of type string.
uint8_t segsLeft
The segment left value from SR header.
uint32_t m_broadcastJitter
The max time to delay route request broadcast.
void SetRequestTable(Ptr< dsr::DsrRreqTable > r)
Set the node.
Time m_nonpropRequestTimeout
The non-propagation request timeout.
bool SendRealDown(DsrNetworkQueueEntry &newEntry)
This function is called to send packets down stack.
uint16_t m_ackId
The ack id assigned to each acknowledge.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
void DropPacketForErrLink(Ipv4Address source, Ipv4Address nextHop)
Remove all packets with the error link.
std::map< Ipv4Address, Timer > m_nonPropReqTimer
Map IP address + RREQ timer.
void AddPacketTag(const Tag &tag) const
Add a packet tag.
bool AllEqual(DsrMaintainBuffEntry &entry)
Verify if all the elements in the maintenance buffer entry is the same.
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.
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
void SetSendBufferTimeout(Time t)
Set the entry lifetime in the queue.
IpL4Protocol::DownTargetCallback GetDownTarget(void) const
This method allows a caller to get the current down target callback set for this L4 protocol (IPv4 ca...
Timer m_sendBuffTimer
The send buffer timer.
std::string m_cacheType
The type of route cache.
IpL4Protocol::DownTargetCallback m_downTarget
The callback for down layer.
bool FindSourceEntry(Ipv4Address src, Ipv4Address dst, uint16_t id)
Find the source request entry in the route request queue, return false if not found.
std::map< PassiveKey, uint32_t > m_passiveCnt
Map packet key + passive forward counts.
Ipv4Address m_broadcast
The broadcast IP address.
uint32_t m_stabilityIncrFactor
The initial increase factor for link cache.
Ptr< NetDevice > GetNetDeviceFromContext(std::string context)
Get the netdevice from the context.
void CancelPacketTimerNextHop(Ipv4Address nextHop, uint8_t protocol)
Cancel the packet retransmission timer for a all maintenance entries with nextHop address.
Time m_sendBufferTimeout
The maximum period of time that a routing protocol is allowed to buffer a packet for.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Ptr< dsr::DsrRouteCache > m_routeCache
A "drop-front" queue used by the routing layer to cache routes found.
void SetDownTarget(IpL4Protocol::DownTargetCallback callback)
This method allows a caller to set the current down target callback set for this L4 protocol (IPv4 ca...
Ipv4Address m_nextHop
next hop address
bool m_subRoute
Whether to save sub route or not.
Time m_maxNetworkDelay
Maximum network delay.
bool Find(Ipv4Address nextHop)
Finds whether a packet with next hop dst exists in the queue.
Time Seconds(double value)
Construct a Time in the indicated unit.
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
This class implements a tag that carries the socket-specific TTL of a packet to the IP layer.
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.
bool IsSuspended(void) const
bool m_linkAck
define if we use link acknowledgement or not
void SchedulePassivePacketRetry(DsrMaintainBuffEntry &mb, uint8_t protocol)
Schedule the packet retransmission based on passive acknowledgment.
void SetIdentification(uint16_t i)
Set identification function.
void CallCancelPacketTimer(uint16_t ackId, Ipv4Header const &ipv4Header, Ipv4Address realSrc, Ipv4Address realDst)
Call the cancel packet retransmission timer function.
AttributeValue implementation for Time.
std::map< NetworkKey, Timer > m_addressForwardTimer
Map network key + forward timer.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
TracedCallback< Ptr< const Packet > > m_dropTrace
The trace for drop, receive and send data packets.
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.
Time m_useExtends
The use extension of the life time for link cache.
Ptr< Node > GetNode() const
Get the node.
void SetAckId(uint16_t ackId)
Set acknowledge ID.
void CancelLinkPacketTimer(DsrMaintainBuffEntry &mb)
Cancel the link packet retransmission timer for a specific maintenance entry.
void DropPacketWithDst(Ipv4Address dst)
Remove all packets with destination IP address dst.
bool Find(Ipv4Address dst)
Finds whether a packet with destination dst exists in the queue.
void SetDst(Ipv4Address n)
Set destination address.
Ptr< Ipv4Route > GetIpv4Route() const
Get IP route function.
void SendErrorRequest(DsrOptionRerrUnreachHeader &rerr, uint8_t protocol)
Send the error request packet.
Ptr< const AttributeChecker > MakeStringChecker(void)
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
PacketType
Packet types are used as they are in Linux.
std::map< LinkKey, uint32_t > m_linkCnt
Map packet key + link forward counts.
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.
Hold an unsigned integer type.
uint32_t m_maxNetworkSize
Maximum network queue size.
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
void Scheduler(uint32_t priority)
This function is called to schedule sending packets from the network queue.
The maintenance buffer is responsible for maintaining packet next hop delivery The data packet is sav...
Ipv4Address m_ourAdd
local address
uint32_t m_requestTableSize
The max size of the request table size.
std::map< NetworkKey, uint32_t > m_addressForwardCnt
Map network key + forward counts.
uint32_t m_requestTableIds
The request table identifiers.
void SetMaxQueueLen(uint32_t len)
Set maximum queue length.
void SetMaxQueueLen(uint32_t len)
Set the maximum queue length.
bool PromiscEqual(DsrMaintainBuffEntry &entry)
Verify if the maintain buffer entry is the same in every field for promiscuous ack.
virtual void DoDispose(void)
Drop trace callback.
void Suspend(void)
Pause the timer and save the amount of time left until it was set to expire.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
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.
void ScheduleInterRequest(Ptr< Packet > packet)
Schedule the intermediate route request.
Ptr< Ipv4 > m_ip
The ip ptr.
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.
bool NetworkEqual(DsrMaintainBuffEntry &entry)
Verify if the maintain buffer entry is the same in every field for network ack.
Ptr< const Packet > GetPacket() const
Get packet function.
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,...
TracedCallback< const DsrOptionSRHeader & > m_txPacketTrace
packet trace callback
void CancelRreqTimer(Ipv4Address dst, bool isRemove)
Cancel the route request timer.
void SetExpireTime(Time exp)
Set expiration time.
void SetMaintainBufferTimeout(Time t)
Set maintain buffer timeout.
IpL4Protocol::DownTargetCallback6 GetDownTarget6(void) const
This method allows a caller to get the current down target callback set for this L4 protocol (IPv6 ca...
uint8_t GetSegsLeft() const
Get segments left.
Ptr< dsr::DsrOptions > GetOption(int optionNumber)
Get the option corresponding to optionNumber.
int GetProtocolNumber(void) const
Get the dsr protocol number.
Ipv4Address GetOurAdd() const
Get local address of entry.
void UseExtends(DsrRouteCacheEntry::IP_VECTOR rt)
Extends the lifetime of a route cache entry.
void Send(Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol, Ptr< Ipv4Route > route)
void SetRouteCache(Ptr< dsr::DsrRouteCache > r)
Set the route cache.
virtual void DoDispose(void)
Destructor implementation.
uint32_t GetPriority(DsrMessageType messageType)
Set the priority of the packet in network queue.
uint32_t GetDsrOptionsOffset()
Get the offset where the options begin, measured from the start of the extension header.
static EventId ScheduleNow(FUNC f, Ts &&... args)
Schedule an event to expire Now.
Time m_requestPeriod
The base time interval between route requests.
uint16_t m_ackId
acknowledge ID
void SetOurAdd(Ipv4Address us)
Set local address of entry.
static Ptr< Node > GetNode(uint32_t n)
Ptr< const AttributeAccessor > MakeStringAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ipv4Address m_nextHop
next hop
Ptr< const Packet > GetPacket() const
Get pointer to entry's packet.
bool Enqueue(DsrErrorBuffEntry &entry)
Push entry in queue, if there is no entry with the same packet and destination address in queue.
void DeleteAllRoutesIncludeLink(Ipv4Address errorSrc, Ipv4Address unreachNode, Ipv4Address node)
Delete all the routes which includes the link from next hop address that has just been notified as un...
uint32_t m_rreqRetries
Maximum number of retransmissions of RREQ with TTL = NetDiameter to discover a route.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
uint64_t GetUid(void) const
Returns the packet's Uid.
bool CancelPassiveTimer(Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, uint8_t segsLeft)
Cancel the passive timer.
uint16_t GetAckId() const
Get acknowledge ID.
void PassiveScheduleTimerExpire(DsrMaintainBuffEntry &mb, uint8_t protocol)
This function deals with packet retransmission timer expire using passive acknowledgment.
void IncreaseRetransTimer()
This function is called to increase the retransmission timer for data packet in the network queue.