diff options
author | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-09-10 14:17:02 +0000 |
---|---|---|
committer | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-09-10 14:17:02 +0000 |
commit | c834c5e778e7174294f54608ca38b6686e5566f1 (patch) | |
tree | 8d17889e8f92e9fd7fe16af5c71fb867ee00a441 /tools/ioemu | |
parent | b1f3138ed7e9f2ff257a1470d3dc239913e17e50 (diff) | |
download | xen-c834c5e778e7174294f54608ca38b6686e5566f1.tar.gz xen-c834c5e778e7174294f54608ca38b6686e5566f1.tar.bz2 xen-c834c5e778e7174294f54608ca38b6686e5566f1.zip |
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 <edwin.zhai@intel.com>
Signed-off-by: Xiaofeng Ling <xiaofeng.ling@intel.com>
Diffstat (limited to 'tools/ioemu')
-rw-r--r-- | tools/ioemu/hw/pcnet.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/tools/ioemu/hw/pcnet.c b/tools/ioemu/hw/pcnet.c index c2a96af636..b713996a2e 100644 --- a/tools/ioemu/hw/pcnet.c +++ b/tools/ioemu/hw/pcnet.c @@ -380,10 +380,13 @@ static int pcnet_can_receive(void *opaque) 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, const uint8_t *buf, int size) 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)) |