diff mbox

[PATCHv2] qemu: e1000 fix TOR math

Message ID 20100906115026.GA16300@redhat.com
State New
Headers show

Commit Message

Michael S. Tsirkin Sept. 6, 2010, 11:50 a.m. UTC
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 <mst@redhat.com>
---

Changes from v1:
	minor refactoring to avoid += within if statement.

 hw/e1000.c |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

Comments

Juan Quintela Sept. 7, 2010, 9:50 a.m. UTC | #1
"Michael S. Tsirkin" <mst@redhat.com> wrote:
> 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 <mst@redhat.com>

Acked-by: Juan Quintela <quintela@redhat.com>

Thanks for the v2 O:-)
Michael S. Tsirkin Sept. 7, 2010, 5:31 p.m. UTC | #2
On Tue, Sep 07, 2010 at 11:50:38AM +0200, Juan Quintela wrote:
> "Michael S. Tsirkin" <mst@redhat.com> wrote:
> > 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 <mst@redhat.com>
> 
> Acked-by: Juan Quintela <quintela@redhat.com>
> 
> Thanks for the v2 O:-)

BTW, I think this patch is good for the release branch.
diff mbox

Patch

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 <Destination
+     * Address> field through the <CRC> 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])