View | Details | Raw Unified | Return to bug 2123
Collapse All | Expand All

(-)a/src/aodv/model/aodv-routing-protocol.cc (-12 / +112 lines)
 Lines 119-124    Link Here 
119
//-----------------------------------------------------------------------------
119
//-----------------------------------------------------------------------------
120
RoutingProtocol::RoutingProtocol () :
120
RoutingProtocol::RoutingProtocol () :
121
  RreqRetries (2),
121
  RreqRetries (2),
122
  TtlStart (1),
123
  TtlIncrement (2),
124
  TtlThreshold (7),
125
  TimeoutBuffer (2),
122
  RreqRateLimit (10),
126
  RreqRateLimit (10),
123
  RerrRateLimit (10),
127
  RerrRateLimit (10),
124
  ActiveRouteTimeout (Seconds (3)),
128
  ActiveRouteTimeout (Seconds (3)),
 Lines 165-170    Link Here 
165
                   TimeValue (Seconds (1)),
169
                   TimeValue (Seconds (1)),
166
                   MakeTimeAccessor (&RoutingProtocol::HelloInterval),
170
                   MakeTimeAccessor (&RoutingProtocol::HelloInterval),
167
                   MakeTimeChecker ())
171
                   MakeTimeChecker ())
172
    .AddAttribute ("TtlStart", "Initial TTL value for RREQ.",
173
                   UintegerValue (1),
174
                   MakeUintegerAccessor (&RoutingProtocol::TtlStart),
175
                   MakeUintegerChecker<uint16_t> ())
176
    .AddAttribute ("TtlIncrement", "TTL increment for each attempt using the expanding ring search for RREQ dissemination.",
177
                   UintegerValue (2),
178
                   MakeUintegerAccessor (&RoutingProtocol::TtlIncrement),
179
                   MakeUintegerChecker<uint16_t> ())
180
    .AddAttribute ("TtlThreshold", "Maximum TTL value for expanding ring search, TTL = NetDiameter is used beyond this value.",
181
                   UintegerValue (7),
182
                   MakeUintegerAccessor (&RoutingProtocol::TtlThreshold),
183
                   MakeUintegerChecker<uint16_t> ())
184
    .AddAttribute ("TimeoutBuffer", "Provide a buffer for the timeout.",
185
                   UintegerValue (2),
186
                   MakeUintegerAccessor (&RoutingProtocol::TimeoutBuffer),
187
                   MakeUintegerChecker<uint16_t> ())
168
    .AddAttribute ("RreqRetries", "Maximum number of retransmissions of RREQ to discover a route",
188
    .AddAttribute ("RreqRetries", "Maximum number of retransmissions of RREQ to discover a route",
169
                   UintegerValue (2),
189
                   UintegerValue (2),
170
                   MakeUintegerAccessor (&RoutingProtocol::RreqRetries),
190
                   MakeUintegerAccessor (&RoutingProtocol::RreqRetries),
 Lines 619-625    Link Here 
619
  socket->Bind (InetSocketAddress (Ipv4Address::GetAny (), AODV_PORT));
639
  socket->Bind (InetSocketAddress (Ipv4Address::GetAny (), AODV_PORT));
620
  socket->BindToNetDevice (l3->GetNetDevice (i));
640
  socket->BindToNetDevice (l3->GetNetDevice (i));
621
  socket->SetAllowBroadcast (true);
641
  socket->SetAllowBroadcast (true);
622
  socket->SetAttribute ("IpTtl", UintegerValue (1));
642
  socket->SetIpRecvTtl(true);
623
  m_socketAddresses.insert (std::make_pair (socket, iface));
643
  m_socketAddresses.insert (std::make_pair (socket, iface));
624
644
625
  // create also a subnet broadcast socket
645
  // create also a subnet broadcast socket
 Lines 630-636    Link Here 
630
  socket->Bind (InetSocketAddress (iface.GetBroadcast (), AODV_PORT));
650
  socket->Bind (InetSocketAddress (iface.GetBroadcast (), AODV_PORT));
631
  socket->BindToNetDevice (l3->GetNetDevice (i));
651
  socket->BindToNetDevice (l3->GetNetDevice (i));
632
  socket->SetAllowBroadcast (true);
652
  socket->SetAllowBroadcast (true);
633
  socket->SetAttribute ("IpTtl", UintegerValue (1));
653
  socket->SetIpRecvTtl(true);
634
  m_socketSubnetBroadcastAddresses.insert (std::make_pair (socket, iface));
654
  m_socketSubnetBroadcastAddresses.insert (std::make_pair (socket, iface));
635
655
636
  // Add local broadcast record to the routing table
656
  // Add local broadcast record to the routing table
 Lines 780-786    Link Here 
780
          socket->Bind (InetSocketAddress (iface.GetLocal (), AODV_PORT));
800
          socket->Bind (InetSocketAddress (iface.GetLocal (), AODV_PORT));
781
          socket->BindToNetDevice (l3->GetNetDevice (i));
801
          socket->BindToNetDevice (l3->GetNetDevice (i));
782
          socket->SetAllowBroadcast (true);
802
          socket->SetAllowBroadcast (true);
783
          socket->SetAttribute ("IpTtl", UintegerValue (1));
803
          socket->SetIpRecvTtl(true);
784
          m_socketAddresses.insert (std::make_pair (socket, iface));
804
          m_socketAddresses.insert (std::make_pair (socket, iface));
785
805
786
          // create also a unicast socket
806
          // create also a unicast socket
 Lines 791-797    Link Here 
791
          socket->Bind (InetSocketAddress (iface.GetBroadcast (), AODV_PORT));
811
          socket->Bind (InetSocketAddress (iface.GetBroadcast (), AODV_PORT));
792
          socket->BindToNetDevice (l3->GetNetDevice (i));
812
          socket->BindToNetDevice (l3->GetNetDevice (i));
793
          socket->SetAllowBroadcast (true);
813
          socket->SetAllowBroadcast (true);
794
          socket->SetAttribute ("IpTtl", UintegerValue (1));
814
          socket->SetIpRecvTtl(true);
795
          m_socketSubnetBroadcastAddresses.insert (std::make_pair (socket, iface));
815
          m_socketSubnetBroadcastAddresses.insert (std::make_pair (socket, iface));
796
816
797
          // Add local broadcast record to the routing table
817
          // Add local broadcast record to the routing table
 Lines 897-909    Link Here 
897
  rreqHeader.SetDst (dst);
917
  rreqHeader.SetDst (dst);
898
918
899
  RoutingTableEntry rt;
919
  RoutingTableEntry rt;
920
  // Using the Hop field in Routing Table to manage the expanding ring search
921
  uint16_t ttl = TtlStart;
900
  if (m_routingTable.LookupRoute (dst, rt))
922
  if (m_routingTable.LookupRoute (dst, rt))
901
    {
923
    {
902
      rreqHeader.SetHopCount (rt.GetHop ());
924
      if (rt.GetFlag () != IN_SEARCH)
925
        {
926
          ttl = std::min<uint16_t> (rt.GetHop () + TtlIncrement, NetDiameter);
927
        }
928
      else
929
        {
930
          ttl = rt.GetHop () + TtlIncrement;
931
          if (ttl > TtlThreshold)
932
            ttl = NetDiameter;
933
        }
934
      if (ttl == NetDiameter)
935
        rt.IncrementRreqCnt ();
903
      if (rt.GetValidSeqNo ())
936
      if (rt.GetValidSeqNo ())
904
        rreqHeader.SetDstSeqno (rt.GetSeqNo ());
937
        rreqHeader.SetDstSeqno (rt.GetSeqNo ());
905
      else
938
      else
906
        rreqHeader.SetUnknownSeqno (true);
939
        rreqHeader.SetUnknownSeqno (true);
940
      rt.SetHop (ttl);
907
      rt.SetFlag (IN_SEARCH);
941
      rt.SetFlag (IN_SEARCH);
908
      m_routingTable.Update (rt);
942
      m_routingTable.Update (rt);
909
    }
943
    }
 Lines 912-919    Link Here 
912
      rreqHeader.SetUnknownSeqno (true);
946
      rreqHeader.SetUnknownSeqno (true);
913
      Ptr<NetDevice> dev = 0;
947
      Ptr<NetDevice> dev = 0;
914
      RoutingTableEntry newEntry (/*device=*/ dev, /*dst=*/ dst, /*validSeqNo=*/ false, /*seqno=*/ 0,
948
      RoutingTableEntry newEntry (/*device=*/ dev, /*dst=*/ dst, /*validSeqNo=*/ false, /*seqno=*/ 0,
915
                                              /*iface=*/ Ipv4InterfaceAddress (),/*hop=*/ 0,
949
                                              /*iface=*/ Ipv4InterfaceAddress (),/*hop=*/ ttl,
916
                                              /*nextHop=*/ Ipv4Address (), /*lifeTime=*/ Seconds (0));
950
                                              /*nextHop=*/ Ipv4Address (), /*lifeTime=*/ Seconds (0));
951
      // Check if TtlStart == NetDiameter
952
      if (ttl == NetDiameter)
953
        newEntry.IncrementRreqCnt ();
917
      newEntry.SetFlag (IN_SEARCH);
954
      newEntry.SetFlag (IN_SEARCH);
918
      m_routingTable.AddRoute (newEntry);
955
      m_routingTable.AddRoute (newEntry);
919
    }
956
    }
 Lines 927-933    Link Here 
927
  rreqHeader.SetOriginSeqno (m_seqNo);
964
  rreqHeader.SetOriginSeqno (m_seqNo);
928
  m_requestId++;
965
  m_requestId++;
929
  rreqHeader.SetId (m_requestId);
966
  rreqHeader.SetId (m_requestId);
930
  rreqHeader.SetHopCount (0);
931
967
932
  // Send RREQ as subnet directed broadcast from each interface used by aodv
968
  // Send RREQ as subnet directed broadcast from each interface used by aodv
933
  for (std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j =
969
  for (std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j =
 Lines 940-945    Link Here 
940
      m_rreqIdCache.IsDuplicate (iface.GetLocal (), m_requestId);
976
      m_rreqIdCache.IsDuplicate (iface.GetLocal (), m_requestId);
941
977
942
      Ptr<Packet> packet = Create<Packet> ();
978
      Ptr<Packet> packet = Create<Packet> ();
979
      SocketIpTtlTag tag;
980
      tag.SetTtl (ttl);
981
      packet->AddPacketTag (tag);
943
      packet->AddHeader (rreqHeader);
982
      packet->AddHeader (rreqHeader);
944
      TypeHeader tHeader (AODVTYPE_RREQ);
983
      TypeHeader tHeader (AODVTYPE_RREQ);
945
      packet->AddHeader (tHeader);
984
      packet->AddHeader (tHeader);
 Lines 980-989    Link Here 
980
  m_addressReqTimer[dst].SetArguments (dst);
1019
  m_addressReqTimer[dst].SetArguments (dst);
981
  RoutingTableEntry rt;
1020
  RoutingTableEntry rt;
982
  m_routingTable.LookupRoute (dst, rt);
1021
  m_routingTable.LookupRoute (dst, rt);
983
  rt.IncrementRreqCnt ();
1022
  Time retry;
1023
  if (rt.GetHop () < NetDiameter)
1024
    {
1025
      retry = 2 * NodeTraversalTime * (rt.GetHop () + TimeoutBuffer);
1026
    }
1027
  else
1028
    {
1029
      // Binary exponential backoff
1030
      retry = std::pow<uint16_t> (2, rt.GetRreqCnt () - 1) * NetTraversalTime;
1031
    }
984
  m_routingTable.Update (rt);
1032
  m_routingTable.Update (rt);
985
  m_addressReqTimer[dst].Schedule (Time (rt.GetRreqCnt () * NetTraversalTime));
1033
  m_addressReqTimer[dst].Schedule (retry);
986
  NS_LOG_LOGIC ("Scheduled RREQ retry in " << Time (rt.GetRreqCnt () * NetTraversalTime).GetSeconds () << " seconds");
1034
  NS_LOG_LOGIC ("Scheduled RREQ retry in " << retry.GetSeconds () << " seconds");
987
}
1035
}
988
1036
989
void
1037
void
 Lines 1241-1252    Link Here 
1241
        }
1289
        }
1242
    }
1290
    }
1243
1291
1292
  SocketIpTtlTag tag;
1293
  p->RemovePacketTag (tag);
1294
  if (tag.GetTtl () < 2)
1295
    {
1296
      NS_LOG_DEBUG ("TTL exceeded. Drop RREQ origin " << src << " destination " << dst );
1297
      return;
1298
    }
1299
1244
  for (std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j =
1300
  for (std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j =
1245
         m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j)
1301
         m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j)
1246
    {
1302
    {
1247
      Ptr<Socket> socket = j->first;
1303
      Ptr<Socket> socket = j->first;
1248
      Ipv4InterfaceAddress iface = j->second;
1304
      Ipv4InterfaceAddress iface = j->second;
1249
      Ptr<Packet> packet = Create<Packet> ();
1305
      Ptr<Packet> packet = Create<Packet> ();
1306
      SocketIpTtlTag ttl;
1307
      ttl.SetTtl (tag.GetTtl () - 1);
1308
      packet->AddPacketTag (ttl);
1250
      packet->AddHeader (rreqHeader);
1309
      packet->AddHeader (rreqHeader);
1251
      TypeHeader tHeader (AODVTYPE_RREQ);
1310
      TypeHeader tHeader (AODVTYPE_RREQ);
1252
      packet->AddHeader (tHeader);
1311
      packet->AddHeader (tHeader);
 Lines 1279-1284    Link Here 
1279
  RrepHeader rrepHeader ( /*prefixSize=*/ 0, /*hops=*/ 0, /*dst=*/ rreqHeader.GetDst (),
1338
  RrepHeader rrepHeader ( /*prefixSize=*/ 0, /*hops=*/ 0, /*dst=*/ rreqHeader.GetDst (),
1280
                                          /*dstSeqNo=*/ m_seqNo, /*origin=*/ toOrigin.GetDestination (), /*lifeTime=*/ MyRouteTimeout);
1339
                                          /*dstSeqNo=*/ m_seqNo, /*origin=*/ toOrigin.GetDestination (), /*lifeTime=*/ MyRouteTimeout);
1281
  Ptr<Packet> packet = Create<Packet> ();
1340
  Ptr<Packet> packet = Create<Packet> ();
1341
  SocketIpTtlTag tag;
1342
  tag.SetTtl (toOrigin.GetHop ());
1343
  packet->AddPacketTag (tag);
1282
  packet->AddHeader (rrepHeader);
1344
  packet->AddHeader (rrepHeader);
1283
  TypeHeader tHeader (AODVTYPE_RREP);
1345
  TypeHeader tHeader (AODVTYPE_RREP);
1284
  packet->AddHeader (tHeader);
1346
  packet->AddHeader (tHeader);
 Lines 1311-1316    Link Here 
1311
  m_routingTable.Update (toOrigin);
1373
  m_routingTable.Update (toOrigin);
1312
1374
1313
  Ptr<Packet> packet = Create<Packet> ();
1375
  Ptr<Packet> packet = Create<Packet> ();
1376
  SocketIpTtlTag tag;
1377
  tag.SetTtl (toOrigin.GetHop ());
1378
  packet->AddPacketTag (tag);
1314
  packet->AddHeader (rrepHeader);
1379
  packet->AddHeader (rrepHeader);
1315
  TypeHeader tHeader (AODVTYPE_RREP);
1380
  TypeHeader tHeader (AODVTYPE_RREP);
1316
  packet->AddHeader (tHeader);
1381
  packet->AddHeader (tHeader);
 Lines 1325-1330    Link Here 
1325
                                                 /*dst seqno=*/ toOrigin.GetSeqNo (), /*origin=*/ toDst.GetDestination (),
1390
                                                 /*dst seqno=*/ toOrigin.GetSeqNo (), /*origin=*/ toDst.GetDestination (),
1326
                                                 /*lifetime=*/ toOrigin.GetLifeTime ());
1391
                                                 /*lifetime=*/ toOrigin.GetLifeTime ());
1327
      Ptr<Packet> packetToDst = Create<Packet> ();
1392
      Ptr<Packet> packetToDst = Create<Packet> ();
1393
      SocketIpTtlTag gratTag;
1394
      gratTag.SetTtl (toDst.GetHop ());
1395
      packetToDst->AddPacketTag (gratTag);
1328
      packetToDst->AddHeader (gratRepHeader);
1396
      packetToDst->AddHeader (gratRepHeader);
1329
      TypeHeader type (AODVTYPE_RREP);
1397
      TypeHeader type (AODVTYPE_RREP);
1330
      packetToDst->AddHeader (type);
1398
      packetToDst->AddHeader (type);
 Lines 1342-1347    Link Here 
1342
  RrepAckHeader h;
1410
  RrepAckHeader h;
1343
  TypeHeader typeHeader (AODVTYPE_RREP_ACK);
1411
  TypeHeader typeHeader (AODVTYPE_RREP_ACK);
1344
  Ptr<Packet> packet = Create<Packet> ();
1412
  Ptr<Packet> packet = Create<Packet> ();
1413
  SocketIpTtlTag tag;
1414
  tag.SetTtl (1);
1415
  packet->AddPacketTag (tag);
1345
  packet->AddHeader (h);
1416
  packet->AddHeader (h);
1346
  packet->AddHeader (typeHeader);
1417
  packet->AddHeader (typeHeader);
1347
  RoutingTableEntry toNeighbor;
1418
  RoutingTableEntry toNeighbor;
 Lines 1468-1474    Link Here 
1468
      m_routingTable.Update (toNextHopToOrigin);
1539
      m_routingTable.Update (toNextHopToOrigin);
1469
    }
1540
    }
1470
1541
1542
  SocketIpTtlTag tag;
1543
  p->RemovePacketTag(tag);
1544
  if (tag.GetTtl () < 2)
1545
    {
1546
      NS_LOG_DEBUG ("TTL exceeded. Drop RREP destination " << dst << " origin " << rrepHeader.GetOrigin ());
1547
      return;
1548
    }
1549
1471
  Ptr<Packet> packet = Create<Packet> ();
1550
  Ptr<Packet> packet = Create<Packet> ();
1551
  SocketIpTtlTag ttl;
1552
  ttl.SetTtl(tag.GetTtl() - 1);
1553
  packet->AddPacketTag(ttl);
1472
  packet->AddHeader (rrepHeader);
1554
  packet->AddHeader (rrepHeader);
1473
  TypeHeader tHeader (AODVTYPE_RREP);
1555
  TypeHeader tHeader (AODVTYPE_RREP);
1474
  packet->AddHeader (tHeader);
1556
  packet->AddHeader (tHeader);
 Lines 1556-1561    Link Here 
1556
        {
1638
        {
1557
          TypeHeader typeHeader (AODVTYPE_RERR);
1639
          TypeHeader typeHeader (AODVTYPE_RERR);
1558
          Ptr<Packet> packet = Create<Packet> ();
1640
          Ptr<Packet> packet = Create<Packet> ();
1641
          SocketIpTtlTag tag;
1642
          tag.SetTtl (1);
1643
          packet->AddPacketTag (tag);
1559
          packet->AddHeader (rerrHeader);
1644
          packet->AddHeader (rerrHeader);
1560
          packet->AddHeader (typeHeader);
1645
          packet->AddHeader (typeHeader);
1561
          SendRerrMessage (packet, precursors);
1646
          SendRerrMessage (packet, precursors);
 Lines 1573-1578    Link Here 
1573
    {
1658
    {
1574
      TypeHeader typeHeader (AODVTYPE_RERR);
1659
      TypeHeader typeHeader (AODVTYPE_RERR);
1575
      Ptr<Packet> packet = Create<Packet> ();
1660
      Ptr<Packet> packet = Create<Packet> ();
1661
      SocketIpTtlTag tag;
1662
      tag.SetTtl (1);
1663
      packet->AddPacketTag (tag);
1576
      packet->AddHeader (rerrHeader);
1664
      packet->AddHeader (rerrHeader);
1577
      packet->AddHeader (typeHeader);
1665
      packet->AddHeader (typeHeader);
1578
      SendRerrMessage (packet, precursors);
1666
      SendRerrMessage (packet, precursors);
 Lines 1598-1604    Link Here 
1598
   */
1686
   */
1599
  if (toDst.GetRreqCnt () == RreqRetries)
1687
  if (toDst.GetRreqCnt () == RreqRetries)
1600
    {
1688
    {
1601
      NS_LOG_LOGIC ("route discovery to " << dst << " has been attempted RreqRetries (" << RreqRetries << ") times");
1689
      NS_LOG_LOGIC ("route discovery to " << dst << " has been attempted RreqRetries (" << RreqRetries << ") times with ttl " << NetDiameter);
1602
      m_addressReqTimer.erase (dst);
1690
      m_addressReqTimer.erase (dst);
1603
      m_routingTable.DeleteRoute (dst);
1691
      m_routingTable.DeleteRoute (dst);
1604
      NS_LOG_DEBUG ("Route not found. Drop all packets with dst " << dst);
1692
      NS_LOG_DEBUG ("Route not found. Drop all packets with dst " << dst);
 Lines 1608-1614    Link Here 
1608
1696
1609
  if (toDst.GetFlag () == IN_SEARCH)
1697
  if (toDst.GetFlag () == IN_SEARCH)
1610
    {
1698
    {
1611
      NS_LOG_LOGIC ("Resend RREQ to " << dst << " ttl " << NetDiameter);
1699
      NS_LOG_LOGIC ("Resend RREQ to " << dst << " previous ttl " << toDst.GetHop ());
1612
      SendRequest (dst);
1700
      SendRequest (dst);
1613
    }
1701
    }
1614
  else
1702
  else
 Lines 1680-1685    Link Here 
1680
      RrepHeader helloHeader (/*prefix size=*/ 0, /*hops=*/ 0, /*dst=*/ iface.GetLocal (), /*dst seqno=*/ m_seqNo,
1768
      RrepHeader helloHeader (/*prefix size=*/ 0, /*hops=*/ 0, /*dst=*/ iface.GetLocal (), /*dst seqno=*/ m_seqNo,
1681
                                               /*origin=*/ iface.GetLocal (),/*lifetime=*/ Time (AllowedHelloLoss * HelloInterval));
1769
                                               /*origin=*/ iface.GetLocal (),/*lifetime=*/ Time (AllowedHelloLoss * HelloInterval));
1682
      Ptr<Packet> packet = Create<Packet> ();
1770
      Ptr<Packet> packet = Create<Packet> ();
1771
      SocketIpTtlTag tag;
1772
      tag.SetTtl (1);
1773
      packet->AddPacketTag (tag);
1683
      packet->AddHeader (helloHeader);
1774
      packet->AddHeader (helloHeader);
1684
      TypeHeader tHeader (AODVTYPE_RREP);
1775
      TypeHeader tHeader (AODVTYPE_RREP);
1685
      packet->AddHeader (tHeader);
1776
      packet->AddHeader (tHeader);
 Lines 1744-1749    Link Here 
1744
          NS_LOG_LOGIC ("Send RERR message with maximum size.");
1835
          NS_LOG_LOGIC ("Send RERR message with maximum size.");
1745
          TypeHeader typeHeader (AODVTYPE_RERR);
1836
          TypeHeader typeHeader (AODVTYPE_RERR);
1746
          Ptr<Packet> packet = Create<Packet> ();
1837
          Ptr<Packet> packet = Create<Packet> ();
1838
          SocketIpTtlTag tag;
1839
          tag.SetTtl (1);
1840
          packet->AddPacketTag (tag);
1747
          packet->AddHeader (rerrHeader);
1841
          packet->AddHeader (rerrHeader);
1748
          packet->AddHeader (typeHeader);
1842
          packet->AddHeader (typeHeader);
1749
          SendRerrMessage (packet, precursors);
1843
          SendRerrMessage (packet, precursors);
 Lines 1761-1766    Link Here 
1761
    {
1855
    {
1762
      TypeHeader typeHeader (AODVTYPE_RERR);
1856
      TypeHeader typeHeader (AODVTYPE_RERR);
1763
      Ptr<Packet> packet = Create<Packet> ();
1857
      Ptr<Packet> packet = Create<Packet> ();
1858
      SocketIpTtlTag tag;
1859
      tag.SetTtl (1);
1860
      packet->AddPacketTag (tag);
1764
      packet->AddHeader (rerrHeader);
1861
      packet->AddHeader (rerrHeader);
1765
      packet->AddHeader (typeHeader);
1862
      packet->AddHeader (typeHeader);
1766
      SendRerrMessage (packet, precursors);
1863
      SendRerrMessage (packet, precursors);
 Lines 1789-1794    Link Here 
1789
  rerrHeader.AddUnDestination (dst, dstSeqNo);
1886
  rerrHeader.AddUnDestination (dst, dstSeqNo);
1790
  RoutingTableEntry toOrigin;
1887
  RoutingTableEntry toOrigin;
1791
  Ptr<Packet> packet = Create<Packet> ();
1888
  Ptr<Packet> packet = Create<Packet> ();
1889
  SocketIpTtlTag tag;
1890
  tag.SetTtl (1);
1891
  packet->AddPacketTag (tag);
1792
  packet->AddHeader (rerrHeader);
1892
  packet->AddHeader (rerrHeader);
1793
  packet->AddHeader (TypeHeader (AODVTYPE_RERR));
1893
  packet->AddHeader (TypeHeader (AODVTYPE_RERR));
1794
  if (m_routingTable.LookupValidRoute (origin, toOrigin))
1894
  if (m_routingTable.LookupValidRoute (origin, toOrigin))
(-)a/src/aodv/model/aodv-routing-protocol.h (-2 / +6 lines)
 Lines 103-108    Link Here 
103
  
103
  
104
  // Protocol parameters.
104
  // Protocol parameters.
105
  uint32_t RreqRetries;             ///< Maximum number of retransmissions of RREQ with TTL = NetDiameter to discover a route
105
  uint32_t RreqRetries;             ///< Maximum number of retransmissions of RREQ with TTL = NetDiameter to discover a route
106
  uint16_t TtlStart;                ///< Initial TTL value for RREQ.
107
  uint16_t TtlIncrement;            ///< TTL increment for each attempt using the expanding ring search for RREQ dissemination.
108
  uint16_t TtlThreshold;            ///< Maximum TTL value for expanding ring search, TTL = NetDiameter is used beyond this value.
109
  uint16_t TimeoutBuffer;           ///< Provide a buffer for the timeout.
106
  uint16_t RreqRateLimit;           ///< Maximum number of RREQ per second.
110
  uint16_t RreqRateLimit;           ///< Maximum number of RREQ per second.
107
  uint16_t RerrRateLimit;           ///< Maximum number of REER per second.
111
  uint16_t RerrRateLimit;           ///< Maximum number of REER per second.
108
  Time ActiveRouteTimeout;          ///< Period of time during which the route is considered to be valid.
112
  Time ActiveRouteTimeout;          ///< Period of time during which the route is considered to be valid.
 Lines 172-179    Link Here 
172
  /// If route exists and valid, forward packet.
176
  /// If route exists and valid, forward packet.
173
  bool Forwarding (Ptr<const Packet> p, const Ipv4Header & header, UnicastForwardCallback ucb, ErrorCallback ecb);
177
  bool Forwarding (Ptr<const Packet> p, const Ipv4Header & header, UnicastForwardCallback ucb, ErrorCallback ecb);
174
  /**
178
  /**
175
  * To reduce congestion in a network, repeated attempts by a source node at route discovery
179
  * Repeated attempts by a source node at route discovery for a single destination
176
  * for a single destination MUST utilize a binary exponential backoff.
180
  * use the expanding ring search technique.
177
  */
181
  */
178
  void ScheduleRreqRetry (Ipv4Address dst);
182
  void ScheduleRreqRetry (Ipv4Address dst);
179
  /**
183
  /**

Return to bug 2123