Emulator: kernel BPF RX filter for the pcap NIC + NE2000 accept/drop diagnostics
Real-NE2000 semantics: accept only own-MAC unicast + broadcast (multicast
excluded -- the guest stack is unicast+ARP only), and drop npcap's loopback
of our own injected frames. Without it, a live-LAN host download floods the
emulated NIC at wire rate (65k+ frames/min) and wedges netnub before boot
("discarding..."). Filter failure is non-fatal: logs and runs unfiltered.
Also log the first 12 unicast accepts/drops with the live PAR registers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1412,8 +1412,22 @@ bx_ne2k_c::rx_frame(const void *buf, unsigned io_len)
|
||||
return;
|
||||
}
|
||||
} else if (0 != memcmp(buf, BX_NE2K_THIS s.physaddr, 6)) {
|
||||
static unsigned drop_n = 0;
|
||||
if (drop_n < 12) { drop_n++;
|
||||
LOG_MSG("NE2000 rx DROP unicast dst=%02x:%02x:%02x:%02x:%02x:%02x != PAR=%02x:%02x:%02x:%02x:%02x:%02x",
|
||||
pktbuf[0],pktbuf[1],pktbuf[2],pktbuf[3],pktbuf[4],pktbuf[5],
|
||||
BX_NE2K_THIS s.physaddr[0],BX_NE2K_THIS s.physaddr[1],BX_NE2K_THIS s.physaddr[2],
|
||||
BX_NE2K_THIS s.physaddr[3],BX_NE2K_THIS s.physaddr[4],BX_NE2K_THIS s.physaddr[5]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else {
|
||||
static unsigned uni_n = 0;
|
||||
if (uni_n < 12) { uni_n++;
|
||||
LOG_MSG("NE2000 rx ACCEPT unicast len=%d dst=%02x:%02x:%02x:%02x:%02x:%02x",
|
||||
(int)io_len, pktbuf[0],pktbuf[1],pktbuf[2],pktbuf[3],pktbuf[4],pktbuf[5]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
BX_DEBUG(("rx_frame promiscuous receive"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user