# HG changeset patch # User kaf24@firebug.cl.cam.ac.uk # Date 1126361822 0 # Node ID 4b2c87242ad3a0963f1990acb6d8c15b1c017a5c # Parent 5c49ed1145ccd3ec28f51a5f0f4cb33736852a63 Fix bug that service os & vmx guest can't communicate with each other. The bug was physical packets smaller than minimal packet size of 60 bytes were gettign thrown away. Hence ARP traffic for example was dropped. Signed-off-by: Edwin Zhai Signed-off-by: Xiaofeng Ling diff -r 5c49ed1145cc -r 4b2c87242ad3 tools/ioemu/hw/pcnet.c --- a/tools/ioemu/hw/pcnet.c Fri Sep 09 15:11:18 2005 -0800 +++ b/tools/ioemu/hw/pcnet.c Sat Sep 10 14:17:02 2005 +0000 @@ -380,10 +380,13 @@ static int pcnet_can_receive(void *opaqu return sizeof(s->buffer)-16; } +#define MIN_BUF_SIZE 60 + static void pcnet_receive(void *opaque, const uint8_t *buf, int size) { PCNetState *s = opaque; int is_padr = 0, is_bcast = 0, is_ladr = 0; + uint8_t buf1[60]; if (CSR_DRX(s) || CSR_STOP(s) || CSR_SPND(s) || !size) return; @@ -392,6 +395,14 @@ static void pcnet_receive(void *opaque, printf("pcnet_receive size=%d\n", size); #endif + /* if too small buffer, then expand it */ + if (size < MIN_BUF_SIZE) { + memcpy(buf1, buf, size); + memset(buf1 + size, 0, MIN_BUF_SIZE - size); + buf = buf1; + size = MIN_BUF_SIZE; + } + if (CSR_PROM(s) || (is_padr=padr_match(s, buf, size)) || (is_bcast=padr_bcast(s, buf, size))