aboutsummaryrefslogtreecommitdiff
path: root/hw/net/imx_fec.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/net/imx_fec.c')
-rw-r--r--hw/net/imx_fec.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
index 2c14804041..f03450c028 100644
--- a/hw/net/imx_fec.c
+++ b/hw/net/imx_fec.c
@@ -561,22 +561,18 @@ static void imx_enet_do_tx(IMXFECState *s, uint32_t index)
ptr += len;
frame_size += len;
if (bd.flags & ENET_BD_L) {
+ int csum = 0;
+
if (bd.option & ENET_BD_PINS) {
- struct ip_header *ip_hd = PKT_GET_IP_HDR(s->frame);
- if (IP_HEADER_VERSION(ip_hd) == 4) {
- net_checksum_calculate(s->frame, frame_size);
- }
+ csum |= (CSUM_TCP | CSUM_UDP);
}
if (bd.option & ENET_BD_IINS) {
- struct ip_header *ip_hd = PKT_GET_IP_HDR(s->frame);
- /* We compute checksum only for IPv4 frames */
- if (IP_HEADER_VERSION(ip_hd) == 4) {
- uint16_t csum;
- ip_hd->ip_sum = 0;
- csum = net_raw_checksum((uint8_t *)ip_hd, sizeof(*ip_hd));
- ip_hd->ip_sum = cpu_to_be16(csum);
- }
+ csum |= CSUM_IP;
+ }
+ if (csum) {
+ net_checksum_calculate(s->frame, frame_size, csum);
}
+
/* Last buffer in frame. */
qemu_send_packet(qemu_get_queue(s->nic), s->frame, frame_size);