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"
109 .AddConstructor<DsrRouting> ()
110 .AddAttribute (
"RouteCache",
"The route cache for saving routes from route discovery process.",
114 MakePointerChecker<RouteCache> ())
115 .AddAttribute (
"RreqTable",
"The request table to manage route requests.",
119 MakePointerChecker<RreqTable> ())
120 .AddAttribute (
"PassiveBuffer",
"The passive buffer to manage promisucously received passive ack.",
124 MakePointerChecker<PassiveBuffer> ())
125 .AddAttribute (
"MaxSendBuffLen",
"Maximum number of packets that can be stored in send buffer.",
128 MakeUintegerChecker<uint32_t> ())
129 .AddAttribute (
"MaxSendBuffTime",
"Maximum time packets can be queued in the send buffer .",
133 .AddAttribute (
"MaxMaintLen",
"Maximum number of packets that can be stored in maintenance buffer.",
136 MakeUintegerChecker<uint32_t> ())
137 .AddAttribute (
"MaxMaintTime",
"Maximum time packets can be queued in maintenance buffer.",
141 .AddAttribute (
"MaxCacheLen",
"Maximum number of route entries that can be stored in route cache.",
144 MakeUintegerChecker<uint32_t> ())
145 .AddAttribute (
"RouteCacheTimeout",
"Maximum time the route cache can be queued in route cache.",
149 .AddAttribute (
"MaxEntriesEachDst",
"Maximum number of route entries for a single destination to respond.",
152 MakeUintegerChecker<uint32_t> ())
153 .AddAttribute (
"SendBuffInterval",
"How often to check send buffer for packet with route.",
157 .AddAttribute (
"NodeTraversalTime",
"The time it takes to traverse two neighboring nodes.",
161 .AddAttribute (
"RreqRetries",
"Maximum number of retransmissions for request discovery of a route.",
164 MakeUintegerChecker<uint32_t> ())
165 .AddAttribute (
"MaintenanceRetries",
"Maximum number of retransmissions for data packets from maintenance buffer.",
168 MakeUintegerChecker<uint32_t> ())
169 .AddAttribute (
"RequestTableSize",
"Maximum number of request entries in the request table, set this as the number of nodes in the simulation.",
172 MakeUintegerChecker<uint32_t> ())
173 .AddAttribute (
"RequestIdSize",
"Maximum number of request source Ids in the request table.",
176 MakeUintegerChecker<uint32_t> ())
177 .AddAttribute (
"UniqueRequestIdSize",
"Maximum number of request Ids in the request table for a single destination.",
180 MakeUintegerChecker<uint32_t> ())
181 .AddAttribute (
"NonPropRequestTimeout",
"The timeout value for non-propagation request.",
185 .AddAttribute (
"DiscoveryHopLimit",
"The max discovery hop limit for route requests.",
188 MakeUintegerChecker<uint32_t> ())
189 .AddAttribute (
"MaxSalvageCount",
"The max salvage count for a single data packet.",
192 MakeUintegerChecker<uint8_t> ())
193 .AddAttribute (
"BlacklistTimeout",
"The time for a neighbor to stay in blacklist.",
197 .AddAttribute (
"GratReplyHoldoff",
"The time for gratuitous reply entry to expire.",
201 .AddAttribute (
"BroadcastJitter",
"The jitter time to avoid collision for broadcast packets.",
204 MakeUintegerChecker<uint32_t> ())
205 .AddAttribute (
"LinkAckTimeout",
"The time a packet in maintenance buffer wait for link acknowledgment.",
209 .AddAttribute (
"TryLinkAcks",
"The number of link acknowledgment to use.",
212 MakeUintegerChecker<uint32_t> ())
213 .AddAttribute (
"PassiveAckTimeout",
"The time a packet in maintenance buffer wait for passive acknowledgment.",
217 .AddAttribute (
"TryPassiveAcks",
"The number of passive acknowledgment to use.",
220 MakeUintegerChecker<uint32_t> ())
221 .AddAttribute (
"RequestPeriod",
"The base time interval between route requests.",
225 .AddAttribute (
"MaxRequestPeriod",
"The max time interval between route requests.",
229 .AddAttribute (
"GraReplyTableSize",
"The gratuitous reply table size.",
232 MakeUintegerChecker<uint32_t> ())
233 .AddAttribute (
"CacheType",
"Use Link Cache or use Path Cache",
236 MakeStringChecker ())
237 .AddAttribute (
"StabilityDecrFactor",
"The stability decrease factor for link cache",
240 MakeUintegerChecker<uint32_t> ())
241 .AddAttribute (
"StabilityIncrFactor",
"The stability increase factor for link cache",
244 MakeUintegerChecker<uint32_t> ())
245 .AddAttribute (
"InitStability",
"The initial stability factor for link cache",
249 .AddAttribute (
"MinLifeTime",
"The minimal life time for link cache",
253 .AddAttribute (
"UseExtends",
"The extension time for link cache",
257 .AddAttribute (
"EnableSubRoute",
"Enables saving of sub route when receiving route error messages, only available when using path route cache",
260 MakeBooleanChecker ())
261 .AddAttribute (
"RetransIncr",
"The increase time for retransmission timer when facing network congestion",
265 .AddAttribute (
"MaxNetworkQueueSize",
"The max number of packet to save in the network queue.",
268 MakeUintegerChecker<uint32_t> ())
269 .AddAttribute (
"MaxNetworkQueueDelay",
"The max time for a packet to stay in the network queue.",
273 .AddAttribute (
"NumPriorityQueues",
"The max number of packet to save in the network queue.",
276 MakeUintegerChecker<uint32_t> ())
277 .AddAttribute (
"LinkAcknowledgment",
"Enable Link layer acknowledgment mechanism",
280 MakeBooleanChecker ())
281 .AddTraceSource (
"Tx",
"Send DSR packet.",
283 .AddTraceSource (
"Drop",
"Drop DSR packet",
335 Ptr<Node> node = this->GetObject<Node> ();
338 m_ipv4 = this->GetObject<Ipv4L3Protocol> ();
367 std::pair<std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator,
bool> result_i =
m_priorityQueue.insert (std::make_pair (i, queue_i));
404 if (addr != loopback)
457 Config::Connect (
"NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyRxEnd",
470 Mac48Address nodeAddr = netDevice->GetMac()->GetAddress();
471 std::ostringstream oss;
480 NS_LOG_WARN (
"WifiMacTrailer left, skip this packet");
501 NS_LOG_WARN (
"arp header present, skip this packet");
531 newEntry.SetSrc (sourceIp);
532 newEntry.SetDst (destinationIp);
534 newEntry.SetOurAdd (previousHop);
535 newEntry.SetNextHop (ourAddress);
539 dsr->CancelLinkPacketTimer (newEntry);
552 return n->
GetDevice (atoi (elements[3].c_str ()));
555 std::vector<std::string>
558 std::vector <std::string> elements;
560 while (pos1 != context.npos)
562 pos1 = context.find (
"/",pos1);
563 pos2 = context.find (
"/",pos1+1);
564 elements.push_back (context.substr (pos1+1,pos2-(pos1+1)));
652 for (int32_t i = 0; i < nNodes; ++i)
689 std::vector<Ipv4Address> nodelist = rt.
GetVector ();
715 for (int32_t i = 0; i < nNodes; ++i)
721 if (netDevice->GetAddress () == address)
742 for (std::vector<Ipv4Address>::const_iterator i = vec.begin (); i != vec.end (); ++i)
754 if (vec.size () == 2)
762 if (ipv4Address == vec.back ())
764 NS_LOG_DEBUG (
"We have reached to the final destination " << ipv4Address <<
" " << vec.back ());
767 for (std::vector<Ipv4Address>::const_iterator i = vec.begin (); i != vec.end (); ++i)
769 if (ipv4Address == (*i))
803 for (int32_t i = 0; i < nNodes; ++i)
872 newPacket->RemoveAtStart (offset);
876 newPacket->CopyData (buf,
sizeof(buf));
877 uint8_t numberAddress = (buf[1] - 2) / 4;
881 newPacket->RemoveHeader (sourceRoute);
885 newPacket->RemoveHeader (ackReq);
893 if (nextHop ==
"0.0.0.0")
904 std::vector<Ipv4Address> nodeList = salvageRoute.
GetVector ();
944 if (nextHop != destination)
1006 NS_LOG_DEBUG (
"Here we try to find the data packet in the send buffer");
1012 NS_LOG_INFO (
"We have found a route for the packet");
1015 uint8_t protocol = i->GetProtocol ();
1030 uint32_t size = copyP->
GetSize ();
1031 uint8_t *
data =
new uint8_t[size];
1034 uint8_t optionType = 0;
1035 optionType = *(
data);
1037 if (optionType == 3)
1041 uint8_t errorType = *(data + 2);
1057 std::vector<Ipv4Address> errorRoute = toDst.
GetVector ();
1065 uint8_t salvage = 0;
1069 if (nextHop ==
"0.0.0.0")
1076 uint8_t length = (sourceRoute.
GetLength () + newUnreach.GetLength ());
1086 newPacket->
AddHeader (dsrRoutingHeader);
1091 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1093 NS_LOG_LOGIC (
"Will be inserting into priority queue number: " << priority);
1118 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
1120 if (nextHop ==
"0.0.0.0")
1125 uint8_t salvage = 0;
1134 uint8_t length = sourceRoute.
GetLength ();
1147 networkKey.
m_ackId = newEntry.GetAckId ();
1148 networkKey.
m_ourAdd = newEntry.GetOurAdd ();
1149 networkKey.
m_nextHop = newEntry.GetNextHop ();
1150 networkKey.
m_source = newEntry.GetSrc ();
1155 passiveKey.
m_source = newEntry.GetSrc ();
1157 passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
1160 linkKey.
m_source = newEntry.GetSrc ();
1162 linkKey.
m_ourAdd = newEntry.GetOurAdd ();
1163 linkKey.
m_nextHop = newEntry.GetNextHop ();
1176 if (nextHop != destination)
1226 NS_LOG_INFO (
this << from << to << packetType << *p);
1233 uint32_t sourceId = dsrRoutingHeader.
GetSourceId ();
1241 uint32_t size = p->
GetSize ();
1242 uint8_t *
data =
new uint8_t[size];
1244 uint8_t optionType = 0;
1245 optionType = *(
data);
1249 if (optionType == 96)
1255 " overhearing packet PID: " << p->
GetUid () <<
1256 " from " << promiscSource <<
1258 " with source IP " << ipv4Header.
GetSource () <<
1260 " and packet : " << *dsrPacket);
1262 bool isPromisc =
true;
1263 dsrOption->Process (p, dsrPacket,
m_mainAddress, source, ipv4Header, nextHeader, isPromisc, promiscSource);
1277 NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)protocol);
1285 <<
"s " <<
m_mainAddress <<
" there is no route for this packet, queue the packet");
1293 <<
"s Add packet PID: " << packet->
GetUid () <<
" to queue. Packet: " << *packet);
1315 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
1317 if (nextHop ==
"0.0.0.0")
1322 uint8_t salvage = 0;
1332 uint8_t length = sourceRoute.
GetLength ();
1340 source, destination, 0,
1347 networkKey.
m_ackId = newEntry.GetAckId ();
1348 networkKey.
m_ourAdd = newEntry.GetOurAdd ();
1349 networkKey.
m_nextHop = newEntry.GetNextHop ();
1350 networkKey.
m_source = newEntry.GetSrc ();
1355 passiveKey.
m_source = newEntry.GetSrc ();
1357 passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
1360 linkKey.
m_source = newEntry.GetSrc ();
1362 linkKey.
m_ourAdd = newEntry.GetOurAdd ();
1363 linkKey.
m_nextHop = newEntry.GetNextHop ();
1376 if (nextHop != destination)
1393 NS_LOG_FUNCTION (
this << errorHop << destination << originalDst << (uint32_t)salvage << (uint32_t)protocol);
1407 uint8_t rerrLength = rerrUnreachHeader.
GetLength ();
1416 <<
"s " <<
m_mainAddress <<
" there is no route for this packet, queue the packet");
1420 newPacket->
AddHeader (dsrRoutingHeader);
1428 <<
"s Add packet PID: " << p->
GetUid () <<
" to queue. Packet: " << *p);
1432 NS_LOG_DEBUG (
"When there is no existing route request for " << destination <<
", initialize one");
1442 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
1444 if (nextHop ==
"0.0.0.0")
1458 uint8_t srLength = sourceRoute.
GetLength ();
1459 uint8_t length = (srLength + rerrLength);
1464 newPacket->
AddHeader (dsrRoutingHeader);
1472 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1474 NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
1499 NS_LOG_FUNCTION (
this << rerr << sourceRoute << nextHop << (uint32_t)protocol << route);
1503 dsrRoutingHeader.SetMessageType (1);
1508 dsrRoutingHeader.SetPayloadLength (uint16_t (length) + 4);
1509 dsrRoutingHeader.AddDsrOption (rerr);
1510 dsrRoutingHeader.AddDsrOption (sourceRoute);
1517 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1519 NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
1543 NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)protocol << route);
1548 NS_LOG_INFO (
"Drop packet. Not handling ICMP packet for now");
1559 <<
"s " <<
m_mainAddress <<
" there is no route for this packet, queue the packet");
1567 <<
"s Add packet PID: " << packet->
GetUid () <<
" to send buffer. Packet: " << *packet);
1593 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
1595 if (nextHop ==
"0.0.0.0")
1600 uint8_t salvage = 0;
1610 uint8_t length = sourceRoute.
GetLength ();
1620 source, destination, 0,
1626 networkKey.
m_ackId = newEntry.GetAckId ();
1627 networkKey.
m_ourAdd = newEntry.GetOurAdd ();
1628 networkKey.
m_nextHop = newEntry.GetNextHop ();
1629 networkKey.
m_source = newEntry.GetSrc ();
1634 passiveKey.
m_source = newEntry.GetSrc ();
1636 passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
1639 linkKey.
m_source = newEntry.GetSrc ();
1641 linkKey.
m_ourAdd = newEntry.GetOurAdd ();
1642 linkKey.
m_nextHop = newEntry.GetNextHop ();
1655 if (nextHop != destination)
1688 uint32_t sourceId = dsrRoutingHeader.
GetSourceId ();
1689 uint32_t destinationId = dsrRoutingHeader.
GetDestId ();
1696 uint8_t numberAddress = (buf[1] - 2) / 4;
1709 newDsrRoutingHeader.
SetDestId (destinationId);
1722 NS_LOG_FUNCTION (
this << packet << source << nextHop << (uint32_t)protocol);
1729 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1731 NS_LOG_INFO (
"Will be inserting into priority queue number: " << priority);
1759 uint32_t numPriorities;
1760 if (continueWithFirst)
1766 numPriorities = priority;
1771 std::map<uint32_t, Ptr<DsrNetworkQueue> >::iterator q =
m_priorityQueue.find (i);
1773 uint32_t queueSize = dsrNetworkQueue->
GetSize ();
1776 if ((i == (m_numPriorityQueues - 1)) && continueWithFirst)
1787 uint32_t totalQueueSize = 0;
1790 NS_LOG_INFO (
"The size of the network queue for " << j->first <<
" is " << j->second->GetSize ());
1791 totalQueueSize += j->second->GetSize ();
1792 NS_LOG_INFO (
"The total network queue size is " << totalQueueSize);
1794 if (totalQueueSize > 5)
1800 dsrNetworkQueue->
Dequeue (newEntry);
1803 NS_LOG_LOGIC (
"Packet sent by Dsr. Calling PriorityScheduler after some time");
1812 NS_LOG_LOGIC (
"Packet dropped by Dsr. Calling PriorityScheduler immediately");
1816 if ((i == (m_numPriorityQueues - 1)) && continueWithFirst)
1834 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
1837 std::vector<DsrNetworkQueueEntry> newNetworkQueue = dsrNetworkQueue->
GetQueue ();
1838 for (std::vector<DsrNetworkQueueEntry>::iterator i = newNetworkQueue.begin (); i != newNetworkQueue.end (); i++)
1843 if (nextHop == j->first.m_nextHop)
1845 NS_LOG_DEBUG (
"The network delay left is " << j->second.GetDelayLeft ());
1846 j->second.SetDelay (j->second.GetDelayLeft () +
m_retransIncr);
1874 NS_LOG_INFO (
"The nexthop address " << nextHop <<
" the source " << source <<
" the destination " << destination);
1880 NS_LOG_DEBUG (
"destination over here " << destination);
1893 uint8_t length = sourceRoute.
GetLength ();
1902 source, destination, 0,
1909 networkKey.
m_ackId = newEntry.GetAckId ();
1910 networkKey.
m_ourAdd = newEntry.GetOurAdd ();
1911 networkKey.
m_nextHop = newEntry.GetNextHop ();
1912 networkKey.
m_source = newEntry.GetSrc ();
1917 passiveKey.
m_source = newEntry.GetSrc ();
1919 passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
1922 linkKey.
m_source = newEntry.GetSrc ();
1924 linkKey.
m_ourAdd = newEntry.GetOurAdd ();
1925 linkKey.
m_nextHop = newEntry.GetNextHop ();
1938 if (nextHop != destination)
1953 NS_LOG_LOGIC (
"Schedule sending the next packet in send buffer");
1960 NS_LOG_LOGIC (
"All queued packets are out-dated for the destination in send buffer");
1978 uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset ();
1983 uint32_t size = copyP->
GetSize ();
1984 uint8_t *
data =
new uint8_t[size];
1987 uint8_t optionType = 0;
1988 optionType = *(
data);
1989 NS_LOG_DEBUG (
"The option type value in send packet " << (uint32_t)optionType);
1990 if (optionType == 3)
1996 uint8_t errorType = *(data + 2);
2000 NS_LOG_DEBUG (
"The packet is route error unreach packet");
2030 newPacket->
AddHeader (newRoutingHeader);
2035 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
2037 NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
2057 NS_LOG_LOGIC (
"Schedule sending the next packet in error buffer");
2065 NS_LOG_DEBUG (
"Packet not found in either the send or error buffer");
2071 uint16_t fragmentOffset, uint16_t identification,
bool saveEntry)
2073 NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)segsLeft);
2092 NS_LOG_DEBUG (
"We get the all equal for passive buffer here");
2097 mbEntry.
SetDst (destination);
2116 NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)segsLeft);
2124 newEntry.
SetSrc (source);
2125 newEntry.
SetDst (destination);
2155 <<
" source " << mb.
GetSrc () <<
" destination " << mb.
GetDst ()
2158 std::map<LinkKey, Timer>::const_iterator i =
2184 NS_LOG_INFO (
"Link acknowledgment received, remove same maintenance buffer entry");
2191 NS_LOG_FUNCTION (
this << (uint32_t)ackId << ipv4Header << realSrc << realDst);
2200 realSrc, realDst, ackId,
2222 <<
" source " << mb.
GetSrc () <<
" destination " << mb.
GetDst ()
2226 std::map<NetworkKey, Timer>::const_iterator i =
2251 NS_LOG_INFO (
"Remove same maintenance buffer entry based on network acknowledgment");
2269 std::map<PassiveKey, Timer>::const_iterator j =
2309 NS_LOG_INFO (
"Cancel the packet timer for next maintenance entry");
2316 NS_LOG_INFO (
"Maintenance buffer entry not found");
2323 NS_LOG_FUNCTION (
this << packet << source << dst << (uint32_t)protocol);
2336 newPacket->
CopyData (buf,
sizeof(buf));
2337 uint8_t numberAddress = (buf[1] - 2) / 4;
2357 std::vector<Ipv4Address> nodeList = toDst.
GetVector ();
2359 if (nextHop ==
"0.0.0.0")
2375 uint8_t length = sourceRoute.
GetLength ();
2387 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
2389 NS_LOG_DEBUG (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
2413 NS_LOG_DEBUG (
"Will not salvage this packet, silently drop");
2471 NS_LOG_DEBUG (
"The passive acknowledgment option for data packet");
2488 NS_LOG_DEBUG (
"is the first retry or not " << isFirst);
2509 networkKey.m_ackId = newEntry.
GetAckId ();
2510 networkKey.m_ourAdd = newEntry.
GetOurAdd ();
2511 networkKey.m_nextHop = newEntry.
GetNextHop ();
2512 networkKey.m_source = newEntry.
GetSrc ();
2513 networkKey.m_destination = newEntry.
GetDst ();
2535 networkKey.m_ackId = mb.
GetAckId ();
2538 networkKey.m_source = mb.
GetSrc ();
2539 networkKey.m_destination = mb.
GetDst ();
2554 NS_LOG_DEBUG (
"The packet with dsr header " << dsrP->GetSize ());
2555 networkKey.m_ackId = mb.
GetAckId ();
2558 networkKey.m_source = mb.
GetSrc ();
2559 networkKey.m_destination = mb.
GetDst ();
2618 NS_LOG_DEBUG (
"We may need to send error messages now");
2629 uint8_t numberAddress = (buf[1] - 2) / 4;
2630 NS_LOG_DEBUG (
"The number of addresses " << (uint32_t)numberAddress);
2648 errorDst = address1;
2735 NS_LOG_LOGIC (
"Packet transmissions to " << nextHop <<
" has been attempted SendRetries times for " << networkKey.
m_ackId);
2744 uint8_t numberAddress = (buf[1] - 2) / 4;
2745 NS_LOG_DEBUG (
"The number of addresses " << (uint32_t)numberAddress);
2763 errorDst = address1;
2793 NS_LOG_FUNCTION (
this << packet << sourceRoute << source << nextHop << targetAddress << (uint32_t)protocol << route);
2798 dsrRoutingHeader.SetMessageType (2);
2799 dsrRoutingHeader.SetSourceId (
GetIDfromIP (source));
2800 dsrRoutingHeader.SetDestId (
GetIDfromIP (targetAddress));
2804 uint8_t length = sourceRoute.
GetLength ();
2805 dsrRoutingHeader.SetPayloadLength (uint16_t (length) + 2);
2806 dsrRoutingHeader.AddDsrOption (sourceRoute);
2812 source, targetAddress,
m_ackId,
2819 networkKey.
m_ackId = newEntry.GetAckId ();
2820 networkKey.
m_ourAdd = newEntry.GetOurAdd ();
2821 networkKey.
m_nextHop = newEntry.GetNextHop ();
2822 networkKey.
m_source = newEntry.GetSrc ();
2827 passiveKey.
m_source = newEntry.GetSrc ();
2829 passiveKey.
m_segsLeft = newEntry.GetSegsLeft ();
2832 linkKey.
m_source = newEntry.GetSrc ();
2834 linkKey.
m_ourAdd = newEntry.GetOurAdd ();
2835 linkKey.
m_nextHop = newEntry.GetNextHop ();
2848 if (nextHop != targetAddress)
2866 NS_LOG_FUNCTION (
this << source << destination << (uint32_t)protocol);
2887 uint8_t length = rreqHeader.
GetLength ();
2889 packet->AddHeader (dsrRoutingHeader);
2892 bool nonProp =
true;
2893 std::vector<Ipv4Address> address;
2894 address.push_back (source);
2895 address.push_back (destination);
2927 std::vector<Ipv4Address> ip = toDst.GetVector ();
2939 if (nextHop ==
"0.0.0.0")
2957 NS_LOG_INFO (
"No route found, initiate route error request");
2974 rreqHeader.SetTarget (originalDst);
2980 uint8_t length = rreqHeader.GetLength () + rerr.
GetLength ();
2984 bool nonProp =
false;
2985 std::vector<Ipv4Address> address;
2987 address.push_back (originalDst);
2998 NS_LOG_INFO (
"Only when there is no existing route request time when the initial route request is scheduled");
3004 NS_LOG_INFO (
"There is existing route request, find the existing route request entry");
3022 NS_LOG_DEBUG (
"Did not find the non-propagation timer");
3067 NS_LOG_FUNCTION (
this << packet << nonProp << requestId << (uint32_t)protocol);
3078 std::vector<Ipv4Address> address;
3079 address.push_back (source);
3080 address.push_back (dst);
3102 std::vector<Ipv4Address> address;
3103 address.push_back (source);
3104 address.push_back (dst);
3154 std::vector<Ipv4Address> ip = toDst.
GetVector ();
3165 NS_LOG_INFO (
"The nextHop address is " << nextHop);
3166 if (nextHop ==
"0.0.0.0")
3192 NS_LOG_DEBUG (
"Route not found. Drop packet with dst " << dst);
3204 NS_LOG_DEBUG (
"Check the route request entry " << source <<
" " << dst);
3221 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
3223 NS_LOG_LOGIC (
"Inserting into priority queue number: " << priority);
3267 std::vector<Ipv4Address>::iterator before = find (nodeList.begin (), nodeList.end (), srcAddress);
3268 for (std::vector<Ipv4Address>::iterator i = nodeList.begin (); i != before; ++i)
3273 std::vector<Ipv4Address>::iterator after = find (nodeList.begin (), nodeList.end (),
m_mainAddress);
3274 for (std::vector<Ipv4Address>::iterator j = after; j != nodeList.end (); ++j)
3300 newPacket->
AddHeader (dsrRoutingHeader);
3309 NS_LOG_INFO (
"The same gratuitous route reply has already sent");
3324 NS_LOG_INFO (
"The output device " << dev <<
" packet is: " << *packet);
3327 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
3329 NS_LOG_INFO (
"Inserting into priority queue number: " << priority);
3353 packet, source, nextHop, route);
3375 NS_LOG_FUNCTION (
this << ackId << destination << realSrc << realDst << (uint32_t)protocol << route);
3381 dsrRoutingHeader.SetMessageType (1);
3383 dsrRoutingHeader.SetDestId (
GetIDfromIP (destination));
3394 dsrRoutingHeader.SetPayloadLength (uint16_t (length) + 2);
3395 dsrRoutingHeader.AddDsrOption (ack);
3403 std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i =
m_priorityQueue.find (priority);
3406 NS_LOG_LOGIC (
"Will be inserting into priority queue " << dsrNetworkQueue <<
" number: " << priority);
3440 uint32_t sourceId = dsrRoutingHeader.
GetSourceId ();
3442 NS_LOG_INFO (
"The source address " << source <<
" with source id " << sourceId);
3448 bool isPromisc =
false;
3459 uint32_t size = p->
GetSize ();
3460 uint8_t *
data =
new uint8_t[size];
3463 uint8_t optionType = 0;
3464 uint8_t optionLength = 0;
3465 uint8_t segmentsLeft = 0;
3467 optionType = *(
data);
3468 NS_LOG_LOGIC (
"The option type value " << (uint32_t)optionType <<
" with packet id " << p->
GetUid());
3471 if (optionType == 1)
3476 NS_LOG_INFO (
"Discard this packet due to unidirectional link");
3481 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3483 if (optionLength == 0)
3489 else if (optionType == 2)
3492 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3494 if (optionLength == 0)
3501 else if (optionType == 32)
3505 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3507 if (optionLength == 0)
3514 else if (optionType == 3)
3517 NS_LOG_INFO (
"The option type value " << (uint32_t)optionType);
3520 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3522 if (optionLength == 0)
3527 NS_LOG_INFO (
"The option Length " << (uint32_t)optionLength);
3530 else if (optionType == 96)
3533 optionLength = dsrOption->Process (p, packet,
m_mainAddress, source, ip, protocol, isPromisc, promiscSource);
3534 segmentsLeft = *(data + 3);
3535 if (optionLength == 0)
3542 if (segmentsLeft == 0)
3554 nextProto->
Receive (copy, ip, incomingInterface);
3581 NS_LOG_INFO (
"This is not the final destination, the packet has already been forward to next hop");
3591 uint8_t salvage = 0;
3653 if ((*i)->GetOptionNumber () == optionNumber)