Message ID | 20200629011800.374914-1-andrew@daynix.com |
---|---|
State | New |
Headers | show |
Series | [v2,1/2] hw/net: Added CSO for IPv6 | expand |
On 2020/6/29 上午9:17, andrew@daynix.com wrote: > From: Andrew <andrew@daynix.com> > > Added fix for checksum offload for IPv6 if a backend doesn't > have a virtual header. > This patch is a part of IPv6 fragmentation. > > Signed-off-by: Andrew Melnychenko <andrew@daynix.com> Applied. Thanks > --- > hw/net/net_tx_pkt.c | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > > diff --git a/hw/net/net_tx_pkt.c b/hw/net/net_tx_pkt.c > index 162f802dd7..331c73cfc0 100644 > --- a/hw/net/net_tx_pkt.c > +++ b/hw/net/net_tx_pkt.c > @@ -468,8 +468,8 @@ static void net_tx_pkt_do_sw_csum(struct NetTxPkt *pkt) > /* num of iovec without vhdr */ > uint32_t iov_len = pkt->payload_frags + NET_TX_PKT_PL_START_FRAG - 1; > uint16_t csl; > - struct ip_header *iphdr; > size_t csum_offset = pkt->virt_hdr.csum_start + pkt->virt_hdr.csum_offset; > + uint16_t l3_proto = eth_get_l3_proto(iov, 1, iov->iov_len); > > /* Put zero to checksum field */ > iov_from_buf(iov, iov_len, csum_offset, &csum, sizeof csum); > @@ -477,9 +477,18 @@ static void net_tx_pkt_do_sw_csum(struct NetTxPkt *pkt) > /* Calculate L4 TCP/UDP checksum */ > csl = pkt->payload_len; > > + csum_cntr = 0; > + cso = 0; > /* add pseudo header to csum */ > - iphdr = pkt->vec[NET_TX_PKT_L3HDR_FRAG].iov_base; > - csum_cntr = eth_calc_ip4_pseudo_hdr_csum(iphdr, csl, &cso); > + if (l3_proto == ETH_P_IP) { > + csum_cntr = eth_calc_ip4_pseudo_hdr_csum( > + pkt->vec[NET_TX_PKT_L3HDR_FRAG].iov_base, > + csl, &cso); > + } else if (l3_proto == ETH_P_IPV6) { > + csum_cntr = eth_calc_ip6_pseudo_hdr_csum( > + pkt->vec[NET_TX_PKT_L3HDR_FRAG].iov_base, > + csl, pkt->l4proto, &cso); > + } > > /* data checksum */ > csum_cntr +=
diff --git a/hw/net/net_tx_pkt.c b/hw/net/net_tx_pkt.c index 162f802dd7..331c73cfc0 100644 --- a/hw/net/net_tx_pkt.c +++ b/hw/net/net_tx_pkt.c @@ -468,8 +468,8 @@ static void net_tx_pkt_do_sw_csum(struct NetTxPkt *pkt) /* num of iovec without vhdr */ uint32_t iov_len = pkt->payload_frags + NET_TX_PKT_PL_START_FRAG - 1; uint16_t csl; - struct ip_header *iphdr; size_t csum_offset = pkt->virt_hdr.csum_start + pkt->virt_hdr.csum_offset; + uint16_t l3_proto = eth_get_l3_proto(iov, 1, iov->iov_len); /* Put zero to checksum field */ iov_from_buf(iov, iov_len, csum_offset, &csum, sizeof csum); @@ -477,9 +477,18 @@ static void net_tx_pkt_do_sw_csum(struct NetTxPkt *pkt) /* Calculate L4 TCP/UDP checksum */ csl = pkt->payload_len; + csum_cntr = 0; + cso = 0; /* add pseudo header to csum */ - iphdr = pkt->vec[NET_TX_PKT_L3HDR_FRAG].iov_base; - csum_cntr = eth_calc_ip4_pseudo_hdr_csum(iphdr, csl, &cso); + if (l3_proto == ETH_P_IP) { + csum_cntr = eth_calc_ip4_pseudo_hdr_csum( + pkt->vec[NET_TX_PKT_L3HDR_FRAG].iov_base, + csl, &cso); + } else if (l3_proto == ETH_P_IPV6) { + csum_cntr = eth_calc_ip6_pseudo_hdr_csum( + pkt->vec[NET_TX_PKT_L3HDR_FRAG].iov_base, + csl, pkt->l4proto, &cso); + } /* data checksum */ csum_cntr +=