Mathieu's patch: Avoid stack explosion (bug 417)
authorRaj Bhattacharjea <raj.b@gatech.edu>
Sat, 13 Dec 2008 23:26:01 -0500
changeset 4022 142c13a3975f
parent 4021 f8a5d0a63f4e
child 4023 d320dea20aca
Mathieu's patch: Avoid stack explosion (bug 417)
src/internet-stack/ipv4-end-point.cc
src/internet-stack/ipv4-end-point.h
--- a/src/internet-stack/ipv4-end-point.cc	Sat Dec 13 14:13:37 2008 -0800
+++ b/src/internet-stack/ipv4-end-point.cc	Sat Dec 13 23:26:01 2008 -0500
@@ -21,6 +21,7 @@
 #include "ipv4-end-point.h"
 #include "ns3/packet.h"
 #include "ns3/log.h"
+#include "ns3/simulator.h"
 
 NS_LOG_COMPONENT_DEFINE ("Ipv4EndPoint");
 
@@ -95,9 +96,14 @@
 Ipv4EndPoint::ForwardUp (Ptr<Packet> p, Ipv4Address saddr, uint16_t sport)
 {
   if (!m_rxCallback.IsNull ())
-  {
-    m_rxCallback (p, saddr, sport);
-  }
+    {
+      Simulator::ScheduleNow (&Ipv4EndPoint::DoForwardUp, this, p, saddr, sport);
+    }
+}
+void 
+Ipv4EndPoint::DoForwardUp (Ptr<Packet> p, Ipv4Address saddr, uint16_t sport)
+{
+  m_rxCallback (p, saddr, sport);
 }
 
 void 
@@ -109,8 +115,16 @@
                    (uint32_t)icmpCode << icmpInfo);
   if (!m_icmpCallback.IsNull ())
     {
-      m_icmpCallback (icmpSource,icmpTtl,icmpType,icmpCode,icmpInfo);
+      Simulator::ScheduleNow (&Ipv4EndPoint::DoForwardIcmp, this, 
+                              icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
     }
 }
+void 
+Ipv4EndPoint::DoForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl, 
+                             uint8_t icmpType, uint8_t icmpCode,
+                             uint32_t icmpInfo)
+{
+  m_icmpCallback (icmpSource,icmpTtl,icmpType,icmpCode,icmpInfo);
+}
 
 }; // namespace ns3
--- a/src/internet-stack/ipv4-end-point.h	Sat Dec 13 14:13:37 2008 -0800
+++ b/src/internet-stack/ipv4-end-point.h	Sat Dec 13 23:26:01 2008 -0500
@@ -69,6 +69,10 @@
                     uint32_t icmpInfo);
 
 private:
+  void DoForwardUp (Ptr<Packet> p, Ipv4Address saddr, uint16_t sport);
+  void DoForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl, 
+                      uint8_t icmpType, uint8_t icmpCode,
+                      uint32_t icmpInfo);
   Ipv4Address m_localAddr;
   uint16_t m_localPort;
   Ipv4Address m_peerAddr;