src/internet-stack/ipv4-l3-protocol.cc
changeset 4607 0e15594f67f3
parent 4603 67a0a49c1db4
child 4616 a84f60b6cd12
--- a/src/internet-stack/ipv4-l3-protocol.cc	Fri Jun 26 10:48:35 2009 +0200
+++ b/src/internet-stack/ipv4-l3-protocol.cc	Fri Jun 26 10:56:51 2009 +0200
@@ -251,6 +251,7 @@
   Ptr<Ipv4Interface> interface = CreateObject<Ipv4Interface> ();
   interface->SetNode (m_node);
   interface->SetDevice (device);
+  interface->SetForwarding (m_ipForward);
   return AddIpv4Interface (interface);
 }
 
@@ -412,7 +413,7 @@
     MakeCallback (&Ipv4L3Protocol::IpForward, this),
     MakeCallback (&Ipv4L3Protocol::IpMulticastForward, this),
     MakeCallback (&Ipv4L3Protocol::LocalDeliver, this),
-    MakeNullCallback <void, Ptr<const Packet>, const Ipv4Header &> ()
+    MakeCallback (&Ipv4L3Protocol::RouteInputError, this)
   );
 
 }
@@ -845,16 +846,39 @@
     }
 }
 
+bool 
+Ipv4L3Protocol::IsForwarding (uint32_t i) const
+{
+  NS_LOG_FUNCTION (this << i);
+  Ptr<Ipv4Interface> interface = GetInterface (i);
+  NS_LOG_LOGIC ("Forwarding state: " << interface->IsForwarding ());
+  return interface->IsForwarding ();
+}
+
+void 
+Ipv4L3Protocol::SetForwarding (uint32_t i, bool val)
+{
+  NS_LOG_FUNCTION (this << i);
+  Ptr<Ipv4Interface> interface = GetInterface (i);
+  interface->SetForwarding (val);
+}
+
 Ptr<NetDevice>
 Ipv4L3Protocol::GetNetDevice (uint32_t i)
 {
+  NS_LOG_FUNCTION (this << i);
   return GetInterface (i)-> GetDevice ();
 }
 
 void 
 Ipv4L3Protocol::SetIpForward (bool forward) 
 {
+  NS_LOG_FUNCTION (this << forward);
   m_ipForward = forward;
+  for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++)
+    {
+      (*i)->SetForwarding (forward);
+    }
 }
 
 bool 
@@ -863,5 +887,13 @@
   return m_ipForward;
 }
 
+void
+Ipv4L3Protocol::RouteInputError (Ptr<const Packet> p, const Ipv4Header & ipHeader, Socket::SocketErrno sockErrno)
+{
+  NS_LOG_FUNCTION (this << p << ipHeader << sockErrno);
+  NS_LOG_LOGIC ("Route input failure-- dropping packet to " << ipHeader << " with errno " << sockErrno); 
+  m_dropTrace (p);
+}
+
 
 }//namespace ns3