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

(-)a/src/routing/aodv/aodv-routing-protocol.cc (-18 / +72 lines)
 Lines 269-275    Link Here 
269
RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header,
269
RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header,
270
    Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)
270
    Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)
271
{
271
{
272
  NS_LOG_FUNCTION (this << header.GetDestination ());
272
  NS_LOG_FUNCTION (this << header << (oif? oif->GetIfIndex () : 0));
273
  if (! p)
273
  if (! p)
274
    {
274
    {
275
      return LoopbackRoute (header); // later
275
      return LoopbackRoute (header); // later
 Lines 370-381    Link Here 
370
    {
370
    {
371
      Ipv4InterfaceAddress iface = j->second;
371
      Ipv4InterfaceAddress iface = j->second;
372
      if (m_ipv4->GetInterfaceForAddress (iface.GetLocal ()) == iif)
372
      if (m_ipv4->GetInterfaceForAddress (iface.GetLocal ()) == iif)
373
        if (dst == iface.GetBroadcast ())
373
        if (dst == iface.GetBroadcast () || dst.IsBroadcast ())
374
          {
374
          {
375
            if (!EnableBroadcast)
376
              {
377
                return true;
378
              }
379
            if (m_dpd.IsDuplicate (p, header))
375
            if (m_dpd.IsDuplicate (p, header))
380
              {
376
              {
381
                NS_LOG_DEBUG ("Duplicated packet " << p->GetUid () << " from " << origin << ". Drop.");
377
                NS_LOG_DEBUG ("Duplicated packet " << p->GetUid () << " from " << origin << ". Drop.");
 Lines 385-390    Link Here 
385
            NS_LOG_LOGIC ("Broadcast local delivery to " << iface.GetLocal ());
381
            NS_LOG_LOGIC ("Broadcast local delivery to " << iface.GetLocal ());
386
            Ptr<Packet> packet = p->Copy ();
382
            Ptr<Packet> packet = p->Copy ();
387
            lcb (p, header, iif);
383
            lcb (p, header, iif);
384
            if (!EnableBroadcast)
385
              {
386
                return true;
387
              }
388
            if (header.GetTtl () > 1)
388
            if (header.GetTtl () > 1)
389
              {
389
              {
390
                NS_LOG_LOGIC ("Forward broadcast. TTL " << (uint16_t) header.GetTtl ());
390
                NS_LOG_LOGIC ("Forward broadcast. TTL " << (uint16_t) header.GetTtl ());
 Lines 528-535    Link Here 
528
      UdpSocketFactory::GetTypeId ());
528
      UdpSocketFactory::GetTypeId ());
529
  NS_ASSERT (socket != 0);
529
  NS_ASSERT (socket != 0);
530
  socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this));
530
  socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this));
531
  socket->Bind (InetSocketAddress (iface.GetLocal (), AODV_PORT));
531
  socket->BindToNetDevice (l3->GetNetDevice (i));
532
  socket->Connect (InetSocketAddress (iface.GetBroadcast (), AODV_PORT));
532
  socket->Bind (InetSocketAddress (Ipv4Address::GetAny (), AODV_PORT));
533
  socket->SetAllowBroadcast (true);
533
  socket->SetAttribute ("IpTtl", UintegerValue (1));
534
  socket->SetAttribute ("IpTtl", UintegerValue (1));
534
  m_socketAddresses.insert (std::make_pair (socket, iface));
535
  m_socketAddresses.insert (std::make_pair (socket, iface));
535
536
 Lines 607-614    Link Here 
607
              UdpSocketFactory::GetTypeId ());
608
              UdpSocketFactory::GetTypeId ());
608
          NS_ASSERT (socket != 0);
609
          NS_ASSERT (socket != 0);
609
          socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv,this));
610
          socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv,this));
610
          socket->Bind (InetSocketAddress (iface.GetLocal (), AODV_PORT));
611
          socket->BindToNetDevice (l3->GetNetDevice (i));
611
          socket->Connect (InetSocketAddress (iface.GetBroadcast (), AODV_PORT));
612
          // Bind to any IP address so that broadcasts can be received
613
          socket->Bind (InetSocketAddress (Ipv4Address::GetAny(), AODV_PORT));
614
          socket->SetAllowBroadcast (true);
612
          m_socketAddresses.insert (std::make_pair (socket, iface));
615
          m_socketAddresses.insert (std::make_pair (socket, iface));
613
616
614
          // Add local broadcast record to the routing table
617
          // Add local broadcast record to the routing table
 Lines 644-651    Link Here 
644
              UdpSocketFactory::GetTypeId ());
647
              UdpSocketFactory::GetTypeId ());
645
          NS_ASSERT (socket != 0);
648
          NS_ASSERT (socket != 0);
646
          socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this));
649
          socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this));
647
          socket->Bind (InetSocketAddress (iface.GetLocal (), AODV_PORT));
650
          // Bind to any IP address so that broadcasts can be received
648
          socket->Connect (InetSocketAddress (iface.GetBroadcast (), AODV_PORT));
651
          socket->Bind (InetSocketAddress (Ipv4Address::GetAny(), AODV_PORT));
652
          socket->SetAllowBroadcast (true);
649
          m_socketAddresses.insert (std::make_pair (socket, iface));
653
          m_socketAddresses.insert (std::make_pair (socket, iface));
650
654
651
          // Add local broadcast record to the routing table
655
          // Add local broadcast record to the routing table
 Lines 692-698    Link Here 
692
  NS_ASSERT (m_lo != 0);
696
  NS_ASSERT (m_lo != 0);
693
  Ptr<Ipv4Route> rt = Create<Ipv4Route> ();
697
  Ptr<Ipv4Route> rt = Create<Ipv4Route> ();
694
  rt->SetDestination (hdr.GetDestination ());
698
  rt->SetDestination (hdr.GetDestination ());
695
  rt->SetSource (hdr.GetSource ());
699
  rt->SetSource (Ipv4Address ("127.0.0.1"));
696
  rt->SetGateway (Ipv4Address ("127.0.0.1"));
700
  rt->SetGateway (Ipv4Address ("127.0.0.1"));
697
  rt->SetOutputDevice (m_lo);
701
  rt->SetOutputDevice (m_lo);
698
  return rt;
702
  return rt;
 Lines 762-768    Link Here 
762
      packet->AddHeader (rreqHeader);
766
      packet->AddHeader (rreqHeader);
763
      TypeHeader tHeader (AODVTYPE_RREQ);
767
      TypeHeader tHeader (AODVTYPE_RREQ);
764
      packet->AddHeader (tHeader);
768
      packet->AddHeader (tHeader);
765
      socket->Send (packet);
769
      // Send to all-hosts broadcast if on /32 addr, subnet-directed otherwise
770
      Ipv4Address destination;
771
      if (iface.GetMask () == Ipv4Mask::GetOnes ())
772
        {
773
          destination = Ipv4Address ("255.255.255.255");
774
        }
775
      else
776
        { 
777
          destination = iface.GetBroadcast ();
778
        }
779
      socket->SendTo (packet, 0, InetSocketAddress (destination, AODV_PORT));
766
    }
780
    }
767
  ScheduleRreqRetry (dst);
781
  ScheduleRreqRetry (dst);
768
  if (EnableHello)
782
  if (EnableHello)
 Lines 989-995    Link Here 
989
      packet->AddHeader (rreqHeader);
1003
      packet->AddHeader (rreqHeader);
990
      TypeHeader tHeader (AODVTYPE_RREQ);
1004
      TypeHeader tHeader (AODVTYPE_RREQ);
991
      packet->AddHeader (tHeader);
1005
      packet->AddHeader (tHeader);
992
      socket->Send (packet);
1006
      // Send to all-hosts broadcast if on /32 addr, subnet-directed otherwise
1007
      Ipv4Address destination;
1008
      if (iface.GetMask () == Ipv4Mask::GetOnes ())
1009
        {
1010
          destination = Ipv4Address ("255.255.255.255");
1011
        }
1012
      else
1013
        { 
1014
          destination = iface.GetBroadcast ();
1015
        }
1016
      socket->SendTo (packet, 0, InetSocketAddress (destination, AODV_PORT));
993
    }
1017
    }
994
1018
995
  if (EnableHello)
1019
  if (EnableHello)
 Lines 1401-1407    Link Here 
1401
      packet->AddHeader (helloHeader);
1425
      packet->AddHeader (helloHeader);
1402
      TypeHeader tHeader (AODVTYPE_RREP);
1426
      TypeHeader tHeader (AODVTYPE_RREP);
1403
      packet->AddHeader (tHeader);
1427
      packet->AddHeader (tHeader);
1404
      socket->Send (packet);
1428
      // Send to all-hosts broadcast if on /32 addr, subnet-directed otherwise
1429
      Ipv4Address destination;
1430
      if (iface.GetMask () == Ipv4Mask::GetOnes ())
1431
        {
1432
          destination = Ipv4Address ("255.255.255.255");
1433
        }
1434
      else
1435
        { 
1436
          destination = iface.GetBroadcast ();
1437
        }
1438
      socket->SendTo (packet, 0, InetSocketAddress (destination, AODV_PORT));
1405
    }
1439
    }
1406
}
1440
}
1407
1441
 Lines 1504-1510    Link Here 
1504
          Ipv4InterfaceAddress iface = i->second;
1538
          Ipv4InterfaceAddress iface = i->second;
1505
          NS_ASSERT (socket);
1539
          NS_ASSERT (socket);
1506
          NS_LOG_LOGIC ("Broadcast RERR message from interface " << iface.GetLocal());
1540
          NS_LOG_LOGIC ("Broadcast RERR message from interface " << iface.GetLocal());
1507
          socket->Send (packet);
1541
          // Send to all-hosts broadcast if on /32 addr, subnet-directed otherwise
1542
          Ipv4Address destination;
1543
          if (iface.GetMask () == Ipv4Mask::GetOnes ())
1544
            {
1545
              destination = Ipv4Address ("255.255.255.255");
1546
            }
1547
          else
1548
            { 
1549
              destination = iface.GetBroadcast ();
1550
            }
1551
          socket->SendTo (packet, 0, InetSocketAddress (destination, AODV_PORT));
1508
        }
1552
        }
1509
    }
1553
    }
1510
}
1554
}
 Lines 1550-1556    Link Here 
1550
      Ptr<Socket> socket = FindSocketWithInterfaceAddress (*i);
1594
      Ptr<Socket> socket = FindSocketWithInterfaceAddress (*i);
1551
      NS_ASSERT (socket);
1595
      NS_ASSERT (socket);
1552
      NS_LOG_LOGIC ("Broadcast RERR message from interface " << i->GetLocal());
1596
      NS_LOG_LOGIC ("Broadcast RERR message from interface " << i->GetLocal());
1553
      socket->Send (packet);
1597
      // Send to all-hosts broadcast if on /32 addr, subnet-directed otherwise
1598
      Ipv4Address destination;
1599
      if (i->GetMask () == Ipv4Mask::GetOnes ())
1600
        {
1601
          destination = Ipv4Address ("255.255.255.255");
1602
        }
1603
      else
1604
        { 
1605
          destination = i->GetBroadcast ();
1606
        }
1607
      socket->SendTo (packet, 0, InetSocketAddress (destination, AODV_PORT));
1554
    }
1608
    }
1555
}
1609
}
1556
1610

Return to bug 964