Index: trunk/src/VBox/Devices/Network/slirp/ip_icmp.c
===================================================================
--- trunk/src/VBox/Devices/Network/slirp/ip_icmp.c	(revision 15195)
+++ trunk/src/VBox/Devices/Network/slirp/ip_icmp.c	(revision 15201)
@@ -85,5 +85,4 @@
         return 1;
     }
-    insque(pData, &pData->icmp_socket, &udb);
 #else /* RT_OS_WINDOWS */
     pData->hmIcmpLibrary = LoadLibrary("Iphlpapi.dll");
@@ -92,5 +91,5 @@
         pData->pfIcmpParseReplies = (long (WINAPI *)(void *, long))
                                     GetProcAddress(pData->hmIcmpLibrary, "IcmpParseReplies");
-        pData->pfIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE)) 
+        pData->pfIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))
                                     GetProcAddress(pData->hmIcmpLibrary, "IcmpCloseHandle");
     }
@@ -106,5 +105,5 @@
         pData->pfIcmpParseReplies = (long (WINAPI *)(void *, long))
                                     GetProcAddress(pData->hmIcmpLibrary, "IcmpParseReplies");
-        pData->pfIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE)) 
+        pData->pfIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))
                                     GetProcAddress(pData->hmIcmpLibrary, "IcmpCloseHandle");
     }
@@ -114,5 +113,5 @@
         FreeLibrary(pData->hmIcmpLibrary);
         return 1;
-    } 
+    }
     if (pData->pfIcmpCloseHandle == NULL)
     {
@@ -301,5 +300,5 @@
                 }
 #else /* VBOX_WITH_SLIRP_ICMP */
-# ifdef RT_OS_WINDOWS      
+# ifdef RT_OS_WINDOWS
                 IP_OPTION_INFORMATION ipopt;
                 int error;
@@ -345,12 +344,12 @@
                 ipopt.Ttl = ip->ip_ttl;
                 status = IcmpSendEcho2(pData->icmp_socket.sh, pData->phEvents[VBOX_ICMP_EVENT_INDEX],
-                                       NULL, NULL, addr.sin_addr.s_addr, icp->icmp_data, 
+                                       NULL, NULL, addr.sin_addr.s_addr, icp->icmp_data,
                                        icmplen - offsetof(struct icmp, icmp_data) , &ipopt,
                                        pData->pvIcmpBuffer, pData->szIcmpBuffer, 0);
                 if (status == 0 && (error = GetLastError()) != ERROR_IO_PENDING)
                 {
-                    error = GetLastError(); 
+                    error = GetLastError();
                     LogRel(("NAT: Error (%d) occurred while sending ICMP (", error));
-                    switch (error) 
+                    switch (error)
                     {
                         case ERROR_INVALID_PARAMETER:
Index: trunk/src/VBox/Devices/Network/slirp/slirp.c
===================================================================
--- trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 15195)
+++ trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 15201)
@@ -12,4 +12,11 @@
 
 #if !defined(VBOX_WITH_SIMPLIFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
+
+# ifdef VBOX_WITH_SLIRP_ICMP
+#  define DO_ENGAGE_EVENT0(so, fdset, label) DO_ENGAGE_EVENT1((so), (fdset), label)
+# else /* VBOX_WITH_SLIRP_ICMP */
+#  define DO_ENGAGE_EVENT0(so, fdset, label) /* ignore */
+#endif /* !VBOX_WITH_SLIRP_ICMP */
+
 # define DO_ENGAGE_EVENT1(so, fdset, label)         \
     do {                                            \
@@ -26,4 +33,6 @@
     } while(0)
 #else /* defined(VBOX_WITH_SIMPLIFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) */
+# define DO_ENGAGE_EVENT0(so, fdset, label) /* ignore */
+
 # define DO_ENGAGE_EVENT1(so, fdset0, label)                                                    \
     do {                                                                                        \
@@ -49,4 +58,7 @@
 #define UDP_ENGAGE_EVENT(so, fdset)                     \
     DO_ENGAGE_EVENT1((so), (fdset), UDP)
+
+#define ICMP_ENGAGE_EVENT(so, fdset)                    \
+    DO_ENGAGE_EVENT0((so), (fdset), UDP)
 
 static const uint8_t special_ethaddr[6] = {
@@ -583,4 +595,6 @@
             }
         }
+        ICMP_ENGAGE_EVENT(&pData->icmp_socket, readfds);
+        ICMP_ENGAGE_EVENT(&pData->icmp_socket, writefds);
     }
 
@@ -867,7 +881,14 @@
             }
         }
-#if defined(VBOX_WITH_SLIRP_ICMP) && defined(RT_OS_WINDOWS)
+#if defined(VBOX_WITH_SLIRP_ICMP)
+# if defined(RT_OS_WINDOWS)
         sorecvfrom(pData, &pData->icmp_socket);
-#endif 
+# else
+        if (so->s != -1 && FD_ISSET(so->s, readfds))
+        {
+            sorecvfrom(pData, &pData->icmp_socket);
+        }
+# endif
+#endif
     }
 
