From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=47540 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OsaNf-0004JJ-9A for qemu-devel@nongnu.org; Mon, 06 Sep 2010 08:01:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OsaJJ-0004xZ-1e for qemu-devel@nongnu.org; Mon, 06 Sep 2010 07:56:30 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38726) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OsaJI-0004xJ-QT for qemu-devel@nongnu.org; Mon, 06 Sep 2010 07:56:29 -0400 Date: Mon, 6 Sep 2010 14:50:26 +0300 From: "Michael S. Tsirkin" Message-ID: <20100906115026.GA16300@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Subject: [Qemu-devel] [PATCHv2] qemu: e1000 fix TOR math List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-devel@nongnu.org, Juan Quintela Patch b0b900070c7cb29bbefb732ec00397abe5de6d73 made TOR valuer incorrect: the spec says it should always include the CRC field. No one seems to use this field, but better to stick to spec. Signed-off-by: Michael S. Tsirkin --- Changes from v1: minor refactoring to avoid += within if statement. hw/e1000.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff --git a/hw/e1000.c b/hw/e1000.c index 80b78bc..7d7d140 100644 --- a/hw/e1000.c +++ b/hw/e1000.c @@ -345,7 +345,7 @@ is_vlan_txd(uint32_t txd_lower) /* FCS aka Ethernet CRC-32. We don't get it from backends and can't * fill it in, just pad descriptor length by 4 bytes unless guest - * told us to trip it off the packet. */ + * told us to strip it off the packet. */ static inline int fcs_len(E1000State *s) { @@ -690,9 +690,14 @@ e1000_receive(VLANClientState *nc, const uint8_t *buf, size_t size) s->mac_reg[GPRC]++; s->mac_reg[TPR]++; - n = s->mac_reg[TORL]; - if ((s->mac_reg[TORL] += size) < n) + /* TOR - Total Octets Received: + * This register includes bytes received in a packet from the field through the field, inclusively. + */ + n = s->mac_reg[TORL] + size + /* Always include FCS length. */ 4; + if (n < s->mac_reg[TORL]) s->mac_reg[TORH]++; + s->mac_reg[TORL] = n; n = E1000_ICS_RXT0; if ((rdt = s->mac_reg[RDT]) < s->mac_reg[RDH]) -- 1.7.2.rc0.14.g41c1c