aboutsummaryrefslogtreecommitdiffstats
path: root/tools/ioemu
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-09-10 14:17:02 +0000
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-09-10 14:17:02 +0000
commitc834c5e778e7174294f54608ca38b6686e5566f1 (patch)
tree8d17889e8f92e9fd7fe16af5c71fb867ee00a441 /tools/ioemu
parentb1f3138ed7e9f2ff257a1470d3dc239913e17e50 (diff)
downloadxen-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.c11
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))