LEFT | RIGHT |
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ | 1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
2 /* | 2 /* |
3 * Copyright (c) 2009 IITP RAS | 3 * Copyright (c) 2009 IITP RAS |
4 * | 4 * |
5 * This program is free software; you can redistribute it and/or modify | 5 * This program is free software; you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 2 as | 6 * it under the terms of the GNU General Public License version 2 as |
7 * published by the Free Software Foundation; | 7 * published by the Free Software Foundation; |
8 * | 8 * |
9 * This program is distributed in the hope that it will be useful, | 9 * This program is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 964 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
975 RreqHeader rreqHeader; | 975 RreqHeader rreqHeader; |
976 rreqHeader.SetDst (dst); | 976 rreqHeader.SetDst (dst); |
977 | 977 |
978 RoutingTableEntry rt; | 978 RoutingTableEntry rt; |
979 // Using the Hop field in Routing Table to manage the expanding ring search | 979 // Using the Hop field in Routing Table to manage the expanding ring search |
980 uint16_t ttl = m_ttlStart; | 980 uint16_t ttl = m_ttlStart; |
981 if (m_routingTable.LookupRoute (dst, rt)) | 981 if (m_routingTable.LookupRoute (dst, rt)) |
982 { | 982 { |
983 if (rt.GetFlag () != IN_SEARCH) | 983 if (rt.GetFlag () != IN_SEARCH) |
984 { | 984 { |
985 ttl = std::min<uint16_t> (rt.GetHop () + m_ttlIncrement, (uint16_t)m_n
etDiameter); | 985 ttl = std::min<uint16_t> (rt.GetHop () + m_ttlIncrement, m_netDiameter
); |
986 } | 986 } |
987 else | 987 else |
988 { | 988 { |
989 ttl = rt.GetHop () + m_ttlIncrement; | 989 ttl = rt.GetHop () + m_ttlIncrement; |
990 if (ttl > m_ttlThreshold) | 990 if (ttl > m_ttlThreshold) |
991 { | 991 { |
992 ttl = (uint16_t)m_netDiameter; | 992 ttl = m_netDiameter; |
993 } | 993 } |
994 } | 994 } |
995 if (ttl == m_netDiameter) | 995 if (ttl == m_netDiameter) |
996 { | 996 { |
997 rt.IncrementRreqCnt (); | 997 rt.IncrementRreqCnt (); |
998 } | 998 } |
999 if (rt.GetValidSeqNo ()) | 999 if (rt.GetValidSeqNo ()) |
1000 { | 1000 { |
1001 rreqHeader.SetDstSeqno (rt.GetSeqNo ()); | 1001 rreqHeader.SetDstSeqno (rt.GetSeqNo ()); |
1002 } | 1002 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1044 m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) | 1044 m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) |
1045 { | 1045 { |
1046 Ptr<Socket> socket = j->first; | 1046 Ptr<Socket> socket = j->first; |
1047 Ipv4InterfaceAddress iface = j->second; | 1047 Ipv4InterfaceAddress iface = j->second; |
1048 | 1048 |
1049 rreqHeader.SetOrigin (iface.GetLocal ()); | 1049 rreqHeader.SetOrigin (iface.GetLocal ()); |
1050 m_rreqIdCache.IsDuplicate (iface.GetLocal (), m_requestId); | 1050 m_rreqIdCache.IsDuplicate (iface.GetLocal (), m_requestId); |
1051 | 1051 |
1052 Ptr<Packet> packet = Create<Packet> (); | 1052 Ptr<Packet> packet = Create<Packet> (); |
1053 SocketIpTtlTag tag; | 1053 SocketIpTtlTag tag; |
1054 tag.SetTtl ((uint8_t)ttl); | 1054 tag.SetTtl (static_cast<uint8_t> (ttl)); |
1055 packet->AddPacketTag (tag); | 1055 packet->AddPacketTag (tag); |
1056 packet->AddHeader (rreqHeader); | 1056 packet->AddHeader (rreqHeader); |
1057 TypeHeader tHeader (AODVTYPE_RREQ); | 1057 TypeHeader tHeader (AODVTYPE_RREQ); |
1058 packet->AddHeader (tHeader); | 1058 packet->AddHeader (tHeader); |
1059 // Send to all-hosts broadcast if on /32 addr, subnet-directed otherwise | 1059 // Send to all-hosts broadcast if on /32 addr, subnet-directed otherwise |
1060 Ipv4Address destination; | 1060 Ipv4Address destination; |
1061 if (iface.GetMask () == Ipv4Mask::GetOnes ()) | 1061 if (iface.GetMask () == Ipv4Mask::GetOnes ()) |
1062 { | 1062 { |
1063 destination = Ipv4Address ("255.255.255.255"); | 1063 destination = Ipv4Address ("255.255.255.255"); |
1064 } | 1064 } |
(...skipping 28 matching lines...) Expand all Loading... |
1093 m_addressReqTimer[dst].SetArguments (dst); | 1093 m_addressReqTimer[dst].SetArguments (dst); |
1094 RoutingTableEntry rt; | 1094 RoutingTableEntry rt; |
1095 m_routingTable.LookupRoute (dst, rt); | 1095 m_routingTable.LookupRoute (dst, rt); |
1096 Time retry; | 1096 Time retry; |
1097 if (rt.GetHop () < m_netDiameter) | 1097 if (rt.GetHop () < m_netDiameter) |
1098 { | 1098 { |
1099 retry = 2 * m_nodeTraversalTime * (rt.GetHop () + m_timeoutBuffer); | 1099 retry = 2 * m_nodeTraversalTime * (rt.GetHop () + m_timeoutBuffer); |
1100 } | 1100 } |
1101 else | 1101 else |
1102 { | 1102 { |
1103 // Binary exponential backoff | 1103 NS_ABORT_MSG_UNLESS (rt.GetRreqCnt () > 0, "Unexpected value for GetRreqCo
unt ()"); |
1104 retry = (int64_t)std::pow<uint16_t> (2, rt.GetRreqCnt () - 1) * m_netTrave
rsalTime; | 1104 uint16_t backoffFactor = rt.GetRreqCnt () - 1; |
| 1105 NS_LOG_LOGIC ("Applying binary exponential backoff factor " << backoffFact
or); |
| 1106 retry = m_netTraversalTime * (1 << backoffFactor); |
1105 } | 1107 } |
1106 m_addressReqTimer[dst].Schedule (retry); | 1108 m_addressReqTimer[dst].Schedule (retry); |
1107 NS_LOG_LOGIC ("Scheduled RREQ retry in " << retry.GetSeconds () << " seconds")
; | 1109 NS_LOG_LOGIC ("Scheduled RREQ retry in " << retry.GetSeconds () << " seconds")
; |
1108 } | 1110 } |
1109 | 1111 |
1110 void | 1112 void |
1111 RoutingProtocol::RecvAodv (Ptr<Socket> socket) | 1113 RoutingProtocol::RecvAodv (Ptr<Socket> socket) |
1112 { | 1114 { |
1113 NS_LOG_FUNCTION (this << socket); | 1115 NS_LOG_FUNCTION (this << socket); |
1114 Address sourceAddress; | 1116 Address sourceAddress; |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1411 * incremented value. Otherwise, the destination does not change its sequence
number before generating the RREP message. | 1413 * incremented value. Otherwise, the destination does not change its sequence
number before generating the RREP message. |
1412 */ | 1414 */ |
1413 if (!rreqHeader.GetUnknownSeqno () && (rreqHeader.GetDstSeqno () == m_seqNo +
1)) | 1415 if (!rreqHeader.GetUnknownSeqno () && (rreqHeader.GetDstSeqno () == m_seqNo +
1)) |
1414 { | 1416 { |
1415 m_seqNo++; | 1417 m_seqNo++; |
1416 } | 1418 } |
1417 RrepHeader rrepHeader ( /*prefixSize=*/ 0, /*hops=*/ 0, /*dst=*/ rreqHeader.Ge
tDst (), | 1419 RrepHeader rrepHeader ( /*prefixSize=*/ 0, /*hops=*/ 0, /*dst=*/ rreqHeader.Ge
tDst (), |
1418 /*dstSeqNo=*/ m_seqNo, /*origin=*/ toO
rigin.GetDestination (), /*lifeTime=*/ m_myRouteTimeout); | 1420 /*dstSeqNo=*/ m_seqNo, /*origin=*/ toO
rigin.GetDestination (), /*lifeTime=*/ m_myRouteTimeout); |
1419 Ptr<Packet> packet = Create<Packet> (); | 1421 Ptr<Packet> packet = Create<Packet> (); |
1420 SocketIpTtlTag tag; | 1422 SocketIpTtlTag tag; |
1421 tag.SetTtl ((uint8_t)toOrigin.GetHop ()); | 1423 tag.SetTtl (static_cast<uint8_t> (toOrigin.GetHop ())); |
1422 packet->AddPacketTag (tag); | 1424 packet->AddPacketTag (tag); |
1423 packet->AddHeader (rrepHeader); | 1425 packet->AddHeader (rrepHeader); |
1424 TypeHeader tHeader (AODVTYPE_RREP); | 1426 TypeHeader tHeader (AODVTYPE_RREP); |
1425 packet->AddHeader (tHeader); | 1427 packet->AddHeader (tHeader); |
1426 Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ())
; | 1428 Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ())
; |
1427 NS_ASSERT (socket); | 1429 NS_ASSERT (socket); |
1428 socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_POR
T)); | 1430 socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_POR
T)); |
1429 } | 1431 } |
1430 | 1432 |
1431 void | 1433 void |
1432 RoutingProtocol::SendReplyByIntermediateNode (RoutingTableEntry & toDst, Routing
TableEntry & toOrigin, bool gratRep) | 1434 RoutingProtocol::SendReplyByIntermediateNode (RoutingTableEntry & toDst, Routing
TableEntry & toOrigin, bool gratRep) |
1433 { | 1435 { |
1434 NS_LOG_FUNCTION (this); | 1436 NS_LOG_FUNCTION (this); |
1435 RrepHeader rrepHeader (/*prefix size=*/ 0, /*hops=*/ (uint8_t)toDst.GetHop (),
/*dst=*/ toDst.GetDestination (), /*dst seqno=*/ toDst.GetSeqNo (), | 1437 RrepHeader rrepHeader (/*prefix size=*/ 0, /*hops=*/ static_cast<uint8_t> (toD
st.GetHop ()), /*dst=*/ toDst.GetDestination (), /*dst seqno=*/ toDst.GetSeqNo (
), |
1436 /*origin=*/ toOrigin.GetDestination ()
, /*lifetime=*/ toDst.GetLifeTime ()); | 1438 /*origin=*/ toOrigin.GetDestination ()
, /*lifetime=*/ toDst.GetLifeTime ()); |
1437 /* If the node we received a RREQ for is a neighbor we are | 1439 /* If the node we received a RREQ for is a neighbor we are |
1438 * probably facing a unidirectional link... Better request a RREP-ack | 1440 * probably facing a unidirectional link... Better request a RREP-ack |
1439 */ | 1441 */ |
1440 if (toDst.GetHop () == 1) | 1442 if (toDst.GetHop () == 1) |
1441 { | 1443 { |
1442 rrepHeader.SetAckRequired (true); | 1444 rrepHeader.SetAckRequired (true); |
1443 RoutingTableEntry toNextHop; | 1445 RoutingTableEntry toNextHop; |
1444 m_routingTable.LookupRoute (toOrigin.GetNextHop (), toNextHop); | 1446 m_routingTable.LookupRoute (toOrigin.GetNextHop (), toNextHop); |
1445 toNextHop.m_ackTimer.SetFunction (&RoutingProtocol::AckTimerExpire, this); | 1447 toNextHop.m_ackTimer.SetFunction (&RoutingProtocol::AckTimerExpire, this); |
1446 toNextHop.m_ackTimer.SetArguments (toNextHop.GetDestination (), m_blackLis
tTimeout); | 1448 toNextHop.m_ackTimer.SetArguments (toNextHop.GetDestination (), m_blackLis
tTimeout); |
1447 toNextHop.m_ackTimer.SetDelay (m_nextHopWait); | 1449 toNextHop.m_ackTimer.SetDelay (m_nextHopWait); |
1448 } | 1450 } |
1449 toDst.InsertPrecursor (toOrigin.GetNextHop ()); | 1451 toDst.InsertPrecursor (toOrigin.GetNextHop ()); |
1450 toOrigin.InsertPrecursor (toDst.GetNextHop ()); | 1452 toOrigin.InsertPrecursor (toDst.GetNextHop ()); |
1451 m_routingTable.Update (toDst); | 1453 m_routingTable.Update (toDst); |
1452 m_routingTable.Update (toOrigin); | 1454 m_routingTable.Update (toOrigin); |
1453 | 1455 |
1454 Ptr<Packet> packet = Create<Packet> (); | 1456 Ptr<Packet> packet = Create<Packet> (); |
1455 SocketIpTtlTag tag; | 1457 SocketIpTtlTag tag; |
1456 tag.SetTtl ((uint8_t)toOrigin.GetHop ()); | 1458 tag.SetTtl (static_cast<uint8_t> (toOrigin.GetHop ())); |
1457 packet->AddPacketTag (tag); | 1459 packet->AddPacketTag (tag); |
1458 packet->AddHeader (rrepHeader); | 1460 packet->AddHeader (rrepHeader); |
1459 TypeHeader tHeader (AODVTYPE_RREP); | 1461 TypeHeader tHeader (AODVTYPE_RREP); |
1460 packet->AddHeader (tHeader); | 1462 packet->AddHeader (tHeader); |
1461 Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ())
; | 1463 Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ())
; |
1462 NS_ASSERT (socket); | 1464 NS_ASSERT (socket); |
1463 socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_POR
T)); | 1465 socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_POR
T)); |
1464 | 1466 |
1465 // Generating gratuitous RREPs | 1467 // Generating gratuitous RREPs |
1466 if (gratRep) | 1468 if (gratRep) |
1467 { | 1469 { |
1468 RrepHeader gratRepHeader (/*prefix size=*/ 0, /*hops=*/ (uint8_t)toOrigin.
GetHop (), /*dst=*/ toOrigin.GetDestination (), | 1470 RrepHeader gratRepHeader (/*prefix size=*/ 0, /*hops=*/ static_cast<uint8_
t> (toOrigin.GetHop ()), /*dst=*/ toOrigin.GetDestination (), |
1469 /*dst seqno=*/ toOrigin.GetSeqN
o (), /*origin=*/ toDst.GetDestination (), | 1471 /*dst seqno=*/ toOrigin.GetSeqN
o (), /*origin=*/ toDst.GetDestination (), |
1470 /*lifetime=*/ toOrigin.GetLifeT
ime ()); | 1472 /*lifetime=*/ toOrigin.GetLifeT
ime ()); |
1471 Ptr<Packet> packetToDst = Create<Packet> (); | 1473 Ptr<Packet> packetToDst = Create<Packet> (); |
1472 SocketIpTtlTag gratTag; | 1474 SocketIpTtlTag gratTag; |
1473 gratTag.SetTtl ((uint8_t)toDst.GetHop ()); | 1475 gratTag.SetTtl (static_cast<uint8_t> (toDst.GetHop ())); |
1474 packetToDst->AddPacketTag (gratTag); | 1476 packetToDst->AddPacketTag (gratTag); |
1475 packetToDst->AddHeader (gratRepHeader); | 1477 packetToDst->AddHeader (gratRepHeader); |
1476 TypeHeader type (AODVTYPE_RREP); | 1478 TypeHeader type (AODVTYPE_RREP); |
1477 packetToDst->AddHeader (type); | 1479 packetToDst->AddHeader (type); |
1478 socket = FindSocketWithInterfaceAddress (toDst.GetInterface ()); | 1480 socket = FindSocketWithInterfaceAddress (toDst.GetInterface ()); |
1479 NS_ASSERT (socket); | 1481 NS_ASSERT (socket); |
1480 NS_LOG_LOGIC ("Send gratuitous RREP " << packet->GetUid ()); | 1482 NS_LOG_LOGIC ("Send gratuitous RREP " << packet->GetUid ()); |
1481 socket->SendTo (packetToDst, 0, InetSocketAddress (toDst.GetNextHop (), AO
DV_PORT)); | 1483 socket->SendTo (packetToDst, 0, InetSocketAddress (toDst.GetNextHop (), AO
DV_PORT)); |
1482 } | 1484 } |
1483 } | 1485 } |
(...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2118 m_htimer.SetFunction (&RoutingProtocol::HelloTimerExpire, this); | 2120 m_htimer.SetFunction (&RoutingProtocol::HelloTimerExpire, this); |
2119 startTime = m_uniformRandomVariable->GetInteger (0, 100); | 2121 startTime = m_uniformRandomVariable->GetInteger (0, 100); |
2120 NS_LOG_DEBUG ("Starting at time " << startTime << "ms"); | 2122 NS_LOG_DEBUG ("Starting at time " << startTime << "ms"); |
2121 m_htimer.Schedule (MilliSeconds (startTime)); | 2123 m_htimer.Schedule (MilliSeconds (startTime)); |
2122 } | 2124 } |
2123 Ipv4RoutingProtocol::DoInitialize (); | 2125 Ipv4RoutingProtocol::DoInitialize (); |
2124 } | 2126 } |
2125 | 2127 |
2126 } //namespace aodv | 2128 } //namespace aodv |
2127 } //namespace ns3 | 2129 } //namespace ns3 |
LEFT | RIGHT |