The tap driver can retrieve a potentially unlimited number of packets
in a single poll. This can lead to heap exhaustion under heavy load.
Fix by imposing an artificial receive quota (as already used in other
drivers without natural receive limits).
Signed-off-by: Michael Brown <mcb30@ipxe.org>
#include <linux/if_tun.h>
#define RX_BUF_SIZE 1536
+#define RX_QUOTA 4
/** @file
*
struct tap_nic * nic = netdev->priv;
struct pollfd pfd;
struct io_buffer * iobuf;
+ unsigned int quota = RX_QUOTA;
int r;
pfd.fd = nic->fd;
if (! iobuf)
goto allocfail;
- while ((r = linux_read(nic->fd, iobuf->data, RX_BUF_SIZE)) > 0) {
+ while (quota-- &&
+ ((r = linux_read(nic->fd, iobuf->data, RX_BUF_SIZE)) > 0)) {
DBGC2(nic, "tap %p read %d bytes\n", nic, r);
iob_put(iobuf, r);