diff options
| author | Bin Meng <bin.meng@windriver.com> | 2020-12-11 17:35:12 +0800 |
|---|---|---|
| committer | Jason Wang <jasowang@redhat.com> | 2021-01-25 17:04:56 +0800 |
| commit | f574633529926697ced51b6865e5c50bbb78bf1b (patch) | |
| tree | 98d77919083dfcbec0247c6980c479d08bc07d3b /hw/net/imx_fec.c | |
| parent | d97f11590a0f60cd911ace8bb68180b5a09a068d (diff) | |
| download | focaccia-qemu-f574633529926697ced51b6865e5c50bbb78bf1b.tar.gz focaccia-qemu-f574633529926697ced51b6865e5c50bbb78bf1b.zip | |
net: checksum: Introduce fine control over checksum type
At present net_checksum_calculate() blindly calculates all types of checksums (IP, TCP, UDP). Some NICs may have a per type setting in their BDs to control what checksum should be offloaded. To support such hardware behavior, introduce a 'csum_flag' parameter to the net_checksum_calculate() API to allow fine control over what type checksum is calculated. Existing users of this API are updated accordingly. Signed-off-by: Bin Meng <bin.meng@windriver.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
Diffstat (limited to 'hw/net/imx_fec.c')
| -rw-r--r-- | hw/net/imx_fec.c | 20 |
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); |