hw/net: Added CSO for IPv6
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> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
650181007a
commit
9a8d949245
@ -468,8 +468,8 @@ static void net_tx_pkt_do_sw_csum(struct NetTxPkt *pkt)
|
|||||||
/* num of iovec without vhdr */
|
/* num of iovec without vhdr */
|
||||||
uint32_t iov_len = pkt->payload_frags + NET_TX_PKT_PL_START_FRAG - 1;
|
uint32_t iov_len = pkt->payload_frags + NET_TX_PKT_PL_START_FRAG - 1;
|
||||||
uint16_t csl;
|
uint16_t csl;
|
||||||
struct ip_header *iphdr;
|
|
||||||
size_t csum_offset = pkt->virt_hdr.csum_start + pkt->virt_hdr.csum_offset;
|
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 */
|
/* Put zero to checksum field */
|
||||||
iov_from_buf(iov, iov_len, csum_offset, &csum, sizeof csum);
|
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 */
|
/* Calculate L4 TCP/UDP checksum */
|
||||||
csl = pkt->payload_len;
|
csl = pkt->payload_len;
|
||||||
|
|
||||||
|
csum_cntr = 0;
|
||||||
|
cso = 0;
|
||||||
/* add pseudo header to csum */
|
/* add pseudo header to csum */
|
||||||
iphdr = pkt->vec[NET_TX_PKT_L3HDR_FRAG].iov_base;
|
if (l3_proto == ETH_P_IP) {
|
||||||
csum_cntr = eth_calc_ip4_pseudo_hdr_csum(iphdr, csl, &cso);
|
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 */
|
/* data checksum */
|
||||||
csum_cntr +=
|
csum_cntr +=
|
||||||
|
Loading…
Reference in New Issue
Block a user