it appears that we can mistakenly declare a packet's
checksum to be ok in the following drivers
- ether82563.c
- ether82598.c
- etherigbe.c
- etherm10g.c (saved by hw that eats packets with bad checksums)
- ethervt6105m.c

the problem is that the Block->flags are not cleared.
so if a Block receives a packet with a good checksum,
it will remain set when recycled.  so any subsequent
packet received to the same Block will appear to have
a good checksum.  oops.

i was going to submit a patch, but i realized that all these
drivers have differences from sources.  in any event, the
fix is a single line.  for example, for ether82563.c:

/n/dump/2010/0105/sys/src/9/pc/ether82563.c:744,749 - ether82563.c:744,750
  rbfree(Block *b, int t)
  {
        b->rp = b->wp = (uchar*)PGROUND((uintptr)b->base);
+       b->flag &= ~(Bipck | Budpck | Btcpck | Bpktck);
        ilock(&i82563rblock[t]);
        b->next = i82563rbpool[t];
        i82563rbpool[t] = b;

in looking at this, i noticed that that Block->checksum is set
in
- ether82563.c
- ether82598.c
- etherigbe.c
- etherm10g.c

but otherwise unreferenced.  is this something that should
be removed, or should it be completed?

- erik

Reply via email to