Index: /trunk/src/VBox/Devices/Network/slirp/slirp.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 24062)
+++ /trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 24063)
@@ -1525,11 +1525,21 @@
 }
 
+#ifdef VBOX_WITH_SLIRP_BSD_MBUF
+void slirp_input(PNATState pData, const uint8_t *pkt, int pkt_len)
+#else
 void slirp_input(PNATState pData, void *pvArg)
+#endif
 {
     struct mbuf *m;
     int proto;
     static bool fWarnedIpv6;
+#ifdef VBOX_WITH_SLIRP_BSD_MBUF
+    struct ethhdr *eh = (struct ethhdr*)pkt;
+    int size = 0;
+#else
     struct ethhdr *eh;
-
+#endif
+
+#ifndef VBOX_WITH_SLIRP_BSD_MBUF
     m = (struct mbuf *)pvArg;
     if (m->m_len < ETH_HLEN)
@@ -1541,4 +1551,53 @@
     eh = mtod(m, struct ethhdr *);
     proto = ntohs(eh->h_proto);
+#else
+    Log2(("NAT: slirp_input %d\n", pkt_len));
+    if (pkt_len < ETH_HLEN)
+    {
+        LogRel(("NAT: packet having size %d has been ingnored\n", pkt_len));
+        return;
+    }
+    Log4(("NAT: in:%R[ether]->%R[ether]\n", &eh->h_source, &eh->h_dest));
+
+    if (memcmp(eh->h_source, special_ethaddr, ETH_ALEN) == 0)
+    {
+        /* @todo vasily: add ether logging routine in debug.c */
+        Log(("NAT: packet was addressed to other MAC\n"));
+        RTMemFree((void *)pkt);
+        return;
+    }
+
+    if (pkt_len < MSIZE)
+    {
+        size = MCLBYTES;
+    }
+    else if (pkt_len < MCLBYTES)
+    {
+        size = MCLBYTES;
+    }
+    else if(pkt_len < MJUM9BYTES)
+    {
+        size = MJUM9BYTES;
+    }
+    else if (pkt_len < MJUM16BYTES)
+    {
+        size = MJUM16BYTES;
+    }
+    else
+    {
+        AssertMsgFailed(("Unsupported size"));
+    }
+    m = m_getjcl(pData, M_NOWAIT, MT_HEADER, M_PKTHDR, size);
+    if (!m)
+    {
+        LogRel(("NAT: can't allocate new mbuf\n"));
+        RTMemFree((void *)pkt);
+        return;
+    }
+
+    m->m_len = pkt_len ;
+    memcpy(m->m_data, pkt, pkt_len);
+    proto = ntohs(*(uint16_t *)(pkt + 12));
+#endif
     /* Note: we add to align the IP header */
 
@@ -1561,4 +1620,5 @@
             m->m_pkthdr.header = mtod(m, void *);
 #endif
+#if 1
             if (   pData->fmbuf_water_line
                 && pData->fmbuf_water_warn_sent == 0
@@ -1569,4 +1629,5 @@
                 pData->tsmbuf_water_warn_sent = curtime;
             }
+#endif
             ip_input(pData, m);
             break;
@@ -1584,4 +1645,7 @@
             break;
     }
+#ifdef VBOX_WITH_SLIRP_BSD_MBUF
+    RTMemFree((void *)pkt);
+#endif
 }
 
@@ -2043,4 +2107,5 @@
 #endif
     if_encap(pData, ETH_P_ARP, m, ETH_ENCAP_URG);
+    Log(("NAT: ARP request sent\n"));
 }
 
