(Bug 735) Update Olsr for local delivery
authorTom Henderson <tomh@tomh.org>
Thu, 19 Nov 2009 15:21:26 -0800
changeset 5761 55f21c521021
parent 5760 4f08a0837018
child 5762 ae78a8de6f5f
(Bug 735) Update Olsr for local delivery
src/routing/olsr/olsr-routing-protocol.cc
src/routing/olsr/olsr-routing-protocol.h
--- a/src/routing/olsr/olsr-routing-protocol.cc	Thu Nov 19 14:39:01 2009 -0800
+++ b/src/routing/olsr/olsr-routing-protocol.cc	Thu Nov 19 15:21:26 2009 -0800
@@ -219,7 +219,7 @@
 {
   m_ipv4 = 0;
 
-  for (std::map< Ptr<Socket>, Ipv4Address >::iterator iter = m_socketAddresses.begin ();
+  for (std::map< Ptr<Socket>, Ipv4InterfaceAddress >::iterator iter = m_socketAddresses.begin ();
        iter != m_socketAddresses.end (); iter++)
     {
       iter->first->Close ();
@@ -278,7 +278,7 @@
           NS_FATAL_ERROR ("Failed to bind() OLSR receive socket");
         }
       socket->Connect (InetSocketAddress (Ipv4Address (0xffffffff), OLSR_PORT_NUMBER));
-      m_socketAddresses[socket] = addr;
+      m_socketAddresses[socket] = m_ipv4->GetAddress (i, 0);
     }
 
   HelloTimerExpire ();
@@ -305,7 +305,7 @@
 
   InetSocketAddress inetSourceAddr = InetSocketAddress::ConvertFrom (sourceAddress);
   Ipv4Address senderIfaceAddr = inetSourceAddr.GetIpv4 ();
-  Ipv4Address receiverIfaceAddr = m_socketAddresses[socket];
+  Ipv4Address receiverIfaceAddr = m_socketAddresses[socket].GetLocal ();
   NS_ASSERT (receiverIfaceAddr != Ipv4Address ());
   NS_LOG_DEBUG ("OLSR node " << m_mainAddress << " received a OLSR packet from "
                 << senderIfaceAddr << " to " << receiverIfaceAddr);
@@ -2653,11 +2653,32 @@
 }
 
 bool RoutingProtocol::RouteInput  (Ptr<const Packet> p, 
-  const Ipv4Header &header, Ptr<const NetDevice> idev,                            UnicastForwardCallback ucb, MulticastForwardCallback mcb,             
+  const Ipv4Header &header, Ptr<const NetDevice> idev,                            
+  UnicastForwardCallback ucb, MulticastForwardCallback mcb,             
   LocalDeliverCallback lcb, ErrorCallback ecb)
 {   
   NS_LOG_FUNCTION (this << " " << m_ipv4->GetObject<Node> ()->GetId() << " " << header.GetDestination ());
   
+  Ipv4Address dst = header.GetDestination ();
+  Ipv4Address origin = header.GetSource ();
+
+  // Consume self-originated packets
+  if (IsMyOwnAddress (origin) == true)
+    {
+      return true; 
+    }
+  
+  // Local delivery
+  NS_ASSERT (m_ipv4->GetInterfaceForDevice (idev) >= 0);
+  uint32_t iif = m_ipv4->GetInterfaceForDevice (idev);
+  if (m_ipv4->IsDestinationAddress (dst, iif))
+    {
+        NS_LOG_LOGIC ("Local delivery to " << dst);
+        lcb (p, header, iif);
+        return true;
+    }
+  
+  // Forwarding
   Ptr<Ipv4Route> rtentry;
   RoutingTableEntry entry1, entry2; 
   if (Lookup (header.GetDestination (), entry1))
@@ -2920,6 +2941,21 @@
   AddTestCase (new OlsrMprTestCase ());
 }
 
+bool
+RoutingProtocol::IsMyOwnAddress (const Ipv4Address & a) const
+{
+  for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j =
+      m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j)
+    {
+      Ipv4InterfaceAddress iface = j->second;
+      if (a == iface.GetLocal ())
+        {
+          return true;
+        }
+    }
+  return false;
+}
+
 
 }} // namespace olsr, ns3
 
--- a/src/routing/olsr/olsr-routing-protocol.h	Thu Nov 19 14:39:01 2009 -0800
+++ b/src/routing/olsr/olsr-routing-protocol.h	Thu Nov 19 15:21:26 2009 -0800
@@ -229,13 +229,15 @@
                                const olsr::MessageHeader::Hello &hello);
 
   int Degree (NeighborTuple const &tuple);
+  /// Check that address is one of my interfaces
+  bool IsMyOwnAddress (const Ipv4Address & a) const;
 
   Ipv4Address m_mainAddress;
 
   // One socket per interface, each bound to that interface's address
   // (reason: for OLSR Link Sensing we need to know on which interface
   // HELLO messages arrive)
-  std::map< Ptr<Socket>, Ipv4Address > m_socketAddresses;
+  std::map< Ptr<Socket>, Ipv4InterfaceAddress > m_socketAddresses;
 
   TracedCallback <const PacketHeader &,
                   const MessageList &> m_rxPacketTrace;