qcacmn: Fix checksum offload logic for rx packets
Currently, hardware supports checksum offload for only ipv4, tcpv4/v6 and udpv4/v6 packets. But driver sets checksum as CHECKSUM_UNNECESSARY for all rx packets if tcp_udp_err and ip_err bit in rx_attention_tlv is not set. If driver sets CHECKSUM_UNNECESSARY in skb then network stack will not validate checksum and will reply to even wrong checksum packets which is incorrect. So, fix is to set checksum for all rx packets other than ipv4, tcpv4/v6 and udpv4/v6 to CHECKSUM_NONE instead of CHECKSUM_UNNECESSARY so that network stack validates checksum. Change-Id: Ifb9c74fb729361da6db715fa667f926b71ce948f CRs-Fixed: 3378925
This commit is contained in:

committed by
Madan Koyyalamudi

parent
0be3bb02d9
commit
bbae800e14
@@ -2542,13 +2542,33 @@ void dp_rx_cksum_offload(struct dp_pdev *pdev,
|
||||
hal_rx_tlv_csum_err_get(pdev->soc->hal_soc, rx_tlv_hdr, &ip_csum_err,
|
||||
&tcp_udp_csum_er);
|
||||
|
||||
if (qdf_likely(!ip_csum_err && !tcp_udp_csum_er)) {
|
||||
cksum.l4_result = QDF_NBUF_RX_CKSUM_TCP_UDP_UNNECESSARY;
|
||||
qdf_nbuf_set_rx_cksum(nbuf, &cksum);
|
||||
if (qdf_nbuf_is_ipv4_pkt(nbuf)) {
|
||||
if (qdf_likely(!ip_csum_err)) {
|
||||
cksum.l4_result = QDF_NBUF_RX_CKSUM_TCP_UDP_UNNECESSARY;
|
||||
if (qdf_nbuf_is_ipv4_udp_pkt(nbuf) ||
|
||||
qdf_nbuf_is_ipv4_tcp_pkt(nbuf)) {
|
||||
if (qdf_likely(!tcp_udp_csum_er))
|
||||
cksum.csum_level = 1;
|
||||
else
|
||||
DP_STATS_INCC(pdev,
|
||||
err.tcp_udp_csum_err, 1,
|
||||
tcp_udp_csum_er);
|
||||
}
|
||||
} else {
|
||||
DP_STATS_INCC(pdev, err.ip_csum_err, 1, ip_csum_err);
|
||||
}
|
||||
} else if (qdf_nbuf_is_ipv6_udp_pkt(nbuf) ||
|
||||
qdf_nbuf_is_ipv6_tcp_pkt(nbuf)) {
|
||||
if (qdf_likely(!tcp_udp_csum_er))
|
||||
cksum.l4_result = QDF_NBUF_RX_CKSUM_TCP_UDP_UNNECESSARY;
|
||||
else
|
||||
DP_STATS_INCC(pdev, err.tcp_udp_csum_err, 1,
|
||||
tcp_udp_csum_er);
|
||||
} else {
|
||||
DP_STATS_INCC(pdev, err.ip_csum_err, 1, ip_csum_err);
|
||||
DP_STATS_INCC(pdev, err.tcp_udp_csum_err, 1, tcp_udp_csum_er);
|
||||
cksum.l4_result = QDF_NBUF_RX_CKSUM_NONE;
|
||||
}
|
||||
|
||||
qdf_nbuf_set_rx_cksum(nbuf, &cksum);
|
||||
}
|
||||
#else
|
||||
static inline
|
||||
|
Reference in New Issue
Block a user