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