From 21a68b8a3f6baa9c9b6889be80b09a0447b4d1fc Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Tue, 15 Jun 2010 18:32:04 +0100 Subject: [PATCH] Fix OLSR socket usage: use the new SetAllowBroadcast socket option; Bind to interface bcast address instead of local address, use SendTo instead of Send. This is how things have to work with real world sockets. --- src/routing/olsr/olsr-routing-protocol.cc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/routing/olsr/olsr-routing-protocol.cc b/src/routing/olsr/olsr-routing-protocol.cc index 6c8498ef3..e7e8d9e0a 100644 --- a/src/routing/olsr/olsr-routing-protocol.cc +++ b/src/routing/olsr/olsr-routing-protocol.cc @@ -291,13 +291,14 @@ void RoutingProtocol::DoStart () // Create a socket to listen only on this interface Ptr socket = Socket::CreateSocket (GetObject (), - UdpSocketFactory::GetTypeId()); + UdpSocketFactory::GetTypeId()); + socket->SetAllowBroadcast (true); + InetSocketAddress inetAddr (addr.GetSubnetDirectedBroadcast (m_ipv4->GetAddress (i, 0).GetMask ()), OLSR_PORT_NUMBER); socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvOlsr, this)); - if (socket->Bind (InetSocketAddress (addr, OLSR_PORT_NUMBER))) + if (socket->Bind (inetAddr)) { - NS_FATAL_ERROR ("Failed to bind() OLSR receive socket"); + NS_FATAL_ERROR ("Failed to bind() OLSR socket"); } - socket->Connect (InetSocketAddress (addr.GetSubnetDirectedBroadcast (m_ipv4->GetAddress (i, 0).GetMask ()), OLSR_PORT_NUMBER)); m_socketAddresses[socket] = m_ipv4->GetAddress (i, 0); canRunOlsr = true; @@ -1142,6 +1143,8 @@ RoutingProtocol::ProcessHello (const olsr::MessageHeader &msg, const Ipv4Address &receiverIface, const Ipv4Address &senderIface) { + NS_LOG_FUNCTION (msg << receiverIface << senderIface); + const olsr::MessageHeader::Hello &hello = msg.GetHello (); LinkSensing (msg, hello, receiverIface, senderIface); @@ -1545,7 +1548,8 @@ RoutingProtocol::SendPacket (Ptr packet, for (std::map , Ipv4InterfaceAddress>::const_iterator i = m_socketAddresses.begin (); i != m_socketAddresses.end (); i++) { - i->first->Send (packet); + Ipv4Address bcast = i->second.GetLocal ().GetSubnetDirectedBroadcast (i->second.GetMask ()); + i->first->SendTo (packet, 0, InetSocketAddress (bcast, OLSR_PORT_NUMBER)); } }