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