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

(-)a/src/olsr/model/olsr-routing-protocol.cc (-10 / +59 lines)
 Lines 47-52    Link Here 
47
#include "ns3/enum.h"
47
#include "ns3/enum.h"
48
#include "ns3/trace-source-accessor.h"
48
#include "ns3/trace-source-accessor.h"
49
#include "ns3/ipv4-header.h"
49
#include "ns3/ipv4-header.h"
50
#include "ns3/ipv4-packet-info-tag.h"
50
51
51
/********** Useful macros **********/
52
/********** Useful macros **********/
52
53
 Lines 240-251    Link Here 
240
  m_hnaRoutingTable = 0;
241
  m_hnaRoutingTable = 0;
241
  m_routingTableAssociation = 0;
242
  m_routingTableAssociation = 0;
242
243
243
  for (std::map< Ptr<Socket>, Ipv4InterfaceAddress >::iterator iter = m_socketAddresses.begin ();
244
  if (m_recvSocket)
244
       iter != m_socketAddresses.end (); iter++)
245
    {
246
      m_recvSocket->Close ();
247
    }
248
249
  for (std::map< Ptr<Socket>, Ipv4InterfaceAddress >::iterator iter = m_sendSockets.begin ();
250
       iter != m_sendSockets.end (); iter++)
245
    {
251
    {
246
      iter->first->Close ();
252
      iter->first->Close ();
247
    }
253
    }
248
  m_socketAddresses.clear ();
254
  m_sendSockets.clear ();
249
255
250
  Ipv4RoutingProtocol::DoDispose ();
256
  Ipv4RoutingProtocol::DoDispose ();
251
}
257
}
 Lines 340-346    Link Here 
340
          continue;
346
          continue;
341
        }
347
        }
342
348
343
      // Create a socket to listen only on this interface
349
      // Create a socket to listen on all the interfaces
350
      if (m_recvSocket == 0)
351
        {
352
          m_recvSocket = Socket::CreateSocket (GetObject<Node> (),
353
                                               UdpSocketFactory::GetTypeId ());
354
          m_recvSocket->SetAllowBroadcast (true);
355
          InetSocketAddress inetAddr (Ipv4Address::GetAny (), OLSR_PORT_NUMBER);
356
          m_recvSocket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvOlsr,  this));
357
          if (m_recvSocket->Bind (inetAddr))
358
            {
359
              NS_FATAL_ERROR ("Failed to bind() OLSR socket");
360
            }
361
          m_recvSocket->SetRecvPktInfo (true);
362
          m_recvSocket->ShutdownSend ();
363
        }
364
365
      // Create a socket to send packets from this specific interfaces
344
      Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (),
366
      Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (),
345
                                                 UdpSocketFactory::GetTypeId ());
367
                                                 UdpSocketFactory::GetTypeId ());
346
      socket->SetAllowBroadcast (true);
368
      socket->SetAllowBroadcast (true);
 Lines 351-357    Link Here 
351
          NS_FATAL_ERROR ("Failed to bind() OLSR socket");
373
          NS_FATAL_ERROR ("Failed to bind() OLSR socket");
352
        }
374
        }
353
      socket->BindToNetDevice (m_ipv4->GetNetDevice (i));
375
      socket->BindToNetDevice (m_ipv4->GetNetDevice (i));
354
      m_socketAddresses[socket] = m_ipv4->GetAddress (i, 0);
376
      socket->SetRecvPktInfo (true);
377
      m_sendSockets[socket] = m_ipv4->GetAddress (i, 0);
355
378
356
      canRunOlsr = true;
379
      canRunOlsr = true;
357
    }
380
    }
 Lines 386-394    Link Here 
386
  Address sourceAddress;
409
  Address sourceAddress;
387
  receivedPacket = socket->RecvFrom (sourceAddress);
410
  receivedPacket = socket->RecvFrom (sourceAddress);
388
411
412
  Ipv4PacketInfoTag interfaceInfo;
413
  if (!receivedPacket->RemovePacketTag (interfaceInfo))
414
    {
415
      NS_ABORT_MSG ("No incoming interface on OLSR message, aborting.");
416
    }
417
  uint32_t incomingIf = interfaceInfo.GetRecvIf ();
418
  Ptr<Node> node = this->GetObject<Node> ();
419
  Ptr<NetDevice> dev = node->GetDevice (incomingIf);
420
  uint32_t recvInterfaceIndex = m_ipv4->GetInterfaceForDevice (dev);
421
422
  if (m_interfaceExclusions.find (recvInterfaceIndex) != m_interfaceExclusions.end ())
423
    {
424
      return;
425
    }
426
427
389
  InetSocketAddress inetSourceAddr = InetSocketAddress::ConvertFrom (sourceAddress);
428
  InetSocketAddress inetSourceAddr = InetSocketAddress::ConvertFrom (sourceAddress);
390
  Ipv4Address senderIfaceAddr = inetSourceAddr.GetIpv4 ();
429
  Ipv4Address senderIfaceAddr = inetSourceAddr.GetIpv4 ();
391
  Ipv4Address receiverIfaceAddr = m_socketAddresses[socket].GetLocal ();
430
431
  int32_t interfaceForAddress = m_ipv4->GetInterfaceForAddress (senderIfaceAddr);
432
  if (interfaceForAddress != -1)
433
    {
434
      NS_LOG_LOGIC ("Ignoring a packet sent by myself.");
435
      return;
436
    }
437
438
  Ipv4Address receiverIfaceAddr = m_ipv4->GetAddress (recvInterfaceIndex, 0).GetLocal ();
439
  // Ipv4Address receiverIfaceAddr = m_socketAddresses[socket].GetLocal ();
392
  NS_ASSERT (receiverIfaceAddr != Ipv4Address ());
440
  NS_ASSERT (receiverIfaceAddr != Ipv4Address ());
393
  NS_LOG_DEBUG ("OLSR node " << m_mainAddress << " received a OLSR packet from "
441
  NS_LOG_DEBUG ("OLSR node " << m_mainAddress << " received a OLSR packet from "
394
                             << senderIfaceAddr << " to " << receiverIfaceAddr);
442
                             << senderIfaceAddr << " to " << receiverIfaceAddr);
 Lines 1588-1597    Link Here 
1588
1636
1589
  // Send it
1637
  // Send it
1590
  for (std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator i =
1638
  for (std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator i =
1591
         m_socketAddresses.begin (); i != m_socketAddresses.end (); i++)
1639
         m_sendSockets.begin (); i != m_sendSockets.end (); i++)
1592
    {
1640
    {
1641
      Ptr<Packet> pkt = packet->Copy ();
1593
      Ipv4Address bcast = i->second.GetLocal ().GetSubnetDirectedBroadcast (i->second.GetMask ());
1642
      Ipv4Address bcast = i->second.GetLocal ().GetSubnetDirectedBroadcast (i->second.GetMask ());
1594
      i->first->SendTo (packet, 0, InetSocketAddress (bcast, OLSR_PORT_NUMBER));
1643
      i->first->SendTo (pkt, 0, InetSocketAddress (bcast, OLSR_PORT_NUMBER));
1595
    }
1644
    }
1596
}
1645
}
1597
1646
 Lines 3082-3089    Link Here 
3082
bool
3131
bool
3083
RoutingProtocol::IsMyOwnAddress (const Ipv4Address & a) const
3132
RoutingProtocol::IsMyOwnAddress (const Ipv4Address & a) const
3084
{
3133
{
3085
  for (std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j =
3134
  std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j;
3086
         m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j)
3135
  for (j = m_sendSockets.begin (); j != m_sendSockets.end (); ++j)
3087
    {
3136
    {
3088
      Ipv4InterfaceAddress iface = j->second;
3137
      Ipv4InterfaceAddress iface = j->second;
3089
      if (a == iface.GetLocal ())
3138
      if (a == iface.GetLocal ())
(-)a/src/olsr/model/olsr-routing-protocol.h (-1 / +3 lines)
 Lines 764-770    Link Here 
764
  // One socket per interface, each bound to that interface's address
764
  // One socket per interface, each bound to that interface's address
765
  // (reason: for OLSR Link Sensing we need to know on which interface
765
  // (reason: for OLSR Link Sensing we need to know on which interface
766
  // HELLO messages arrive)
766
  // HELLO messages arrive)
767
  std::map< Ptr<Socket>, Ipv4InterfaceAddress > m_socketAddresses; //!< Container of sockets and the interfaces they are opened onto.
767
  std::map< Ptr<Socket>, Ipv4InterfaceAddress > m_sendSockets; //!< Container of sockets and the interfaces they are opened onto.
768
  Ptr<Socket> m_recvSocket; //!< Receiving socket.
769
768
770
769
  /// Rx packet trace.
771
  /// Rx packet trace.
770
  TracedCallback <const PacketHeader &, const MessageList &> m_rxPacketTrace;
772
  TracedCallback <const PacketHeader &, const MessageList &> m_rxPacketTrace;

Return to bug 2760