From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Maygu-0003XF-3K for qemu-devel@nongnu.org; Tue, 11 Aug 2009 17:15:32 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Maygp-0003VI-AG for qemu-devel@nongnu.org; Tue, 11 Aug 2009 17:15:31 -0400 Received: from [199.232.76.173] (port=33567 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Maygp-0003VD-5q for qemu-devel@nongnu.org; Tue, 11 Aug 2009 17:15:27 -0400 Received: from mail.gmx.net ([213.165.64.20]:58818) by monty-python.gnu.org with smtp (Exim 4.60) (envelope-from ) id 1Maygo-0001tg-Hq for qemu-devel@nongnu.org; Tue, 11 Aug 2009 17:15:27 -0400 Date: Tue, 11 Aug 2009 23:15:23 +0200 From: Reimar =?iso-8859-1?Q?D=F6ffinger?= Message-ID: <20090811211523.GE10500@1und1.de> References: <4A81D3F1.1040300@codemonkey.ws> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <4A81D3F1.1040300@codemonkey.ws> Subject: [Qemu-devel] [PATCH 4/5] Short frames do not exist, so remove code to handle them. Also expand packets that are smaller than the shor frame limit, otherwise the OS X network stack seems to discard them. List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org This patch expands received data shorter than 60 bytes so no short-frame detection is incorrectly triggered, and of course also throws away all short-frame detection code since it makes no sense. It was also wrong since size is without CRC and thus the short frame limit is 60, not 64. And related to that (but without a patch), I think that the > } else if ((size > MAX_ETH_FRAME_SIZE + 4) && !(s->configuration[18] & 8)) { check is wrong, too, and the + 4 should not be there... Back to the patch, e.g. the rtl8139 driver also expands those frames (and I just copied the code for that). This too _definitely_ is necessary to support these AppleIntel8255x drivers. Signed-off-by: Reimar Döffinger --- hw/eepro100.c | 20 +++++++++++--------- 1 files changed, 11 insertions(+), 9 deletions(-) diff --git a/hw/eepro100.c b/hw/eepro100.c index 5620bc7..d2c18cc 100644 --- a/hw/eepro100.c +++ b/hw/eepro100.c @@ -1452,6 +1452,8 @@ static int nic_can_receive(VLANClientState *vc) //~ return !eepro100_buffer_full(s); } +#define MIN_BUF_SIZE 60 + static ssize_t nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size) { /* TODO: @@ -1459,6 +1461,7 @@ static ssize_t nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size * - Interesting packets should set bit 29 in power management driver register. */ EEPRO100State *s = vc->opaque; + uint8_t buf1[MIN_BUF_SIZE]; uint16_t rfd_status = 0xa000; static const uint8_t broadcast_macaddr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; @@ -1466,16 +1469,18 @@ static ssize_t nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size /* TODO: check multiple IA bit. */ assert(!(s->configuration[20] & BIT(6))); + /* Short frames can not happen on virtual hardware, so expand them. */ + if (size < MIN_BUF_SIZE) { + memcpy(buf1, buf, size); + memset(buf1 + size, 0, MIN_BUF_SIZE - size); + buf = buf1; + size = MIN_BUF_SIZE; + } + if (s->configuration[8] & 0x80) { /* CSMA is disabled. */ logout("%p received while CSMA is disabled\n", s); return -1; - } else if (size < 64 && (s->configuration[7] & 1)) { - /* Short frame and configuration byte 7/0 (discard short receive) set: - * Short frame is discarded */ - logout("%p received short frame (%d byte)\n", s, size); - s->statistics.rx_short_frame_errors++; - //~ return -1; } else if ((size > MAX_ETH_FRAME_SIZE + 4) && !(s->configuration[18] & 8)) { /* Long frame and configuration byte 18/3 (long receive ok) not set: * Long frames are discarded. */ @@ -1536,9 +1541,6 @@ static ssize_t nic_receive(VLANClientState *vc, const uint8_t * buf, size_t size s->rbd_addr = le32_to_cpu(rbd.link); } assert(size <= rfd_size); - if (size < 64) { - rfd_status |= 0x0080; - } logout("command 0x%04x, link 0x%08x, addr 0x%08x, size %u\n", rfd_command, rx.link, rx.rx_buf_addr, rfd_size); stw_phys(s->ru_base + s->ru_offset + offsetof(eepro100_rx_t, status), -- 1.6.4