mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-30 21:42:06 -06:00
e1000: Fix TCP checksum overflow with TSO
When adding the length to the pseudo header, we're not properly accounting for overflow. From: Mark Wu <dwu@redhat.com> Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
a5fd2c345f
commit
e685b4eb64
1 changed files with 4 additions and 1 deletions
|
@ -384,9 +384,12 @@ xmit_seg(E1000State *s)
|
||||||
} else // UDP
|
} else // UDP
|
||||||
cpu_to_be16wu((uint16_t *)(tp->data+css+4), len);
|
cpu_to_be16wu((uint16_t *)(tp->data+css+4), len);
|
||||||
if (tp->sum_needed & E1000_TXD_POPTS_TXSM) {
|
if (tp->sum_needed & E1000_TXD_POPTS_TXSM) {
|
||||||
|
unsigned int phsum;
|
||||||
// add pseudo-header length before checksum calculation
|
// add pseudo-header length before checksum calculation
|
||||||
sp = (uint16_t *)(tp->data + tp->tucso);
|
sp = (uint16_t *)(tp->data + tp->tucso);
|
||||||
cpu_to_be16wu(sp, be16_to_cpup(sp) + len);
|
phsum = be16_to_cpup(sp) + len;
|
||||||
|
phsum = (phsum >> 16) + (phsum & 0xffff);
|
||||||
|
cpu_to_be16wu(sp, phsum);
|
||||||
}
|
}
|
||||||
tp->tso_frames++;
|
tp->tso_frames++;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue