net: skip TCP/UDP pseudo-header checksum with hardware offload

When supporting hardware checksum offloading, the network protocol stack
does not perform TCP/UDP pseudo-header checksum calculation.

Skip TCP/UDP pseudo header checksum calculation in network protocol stack

Signed-off-by: daichuan <daichuan@xiaomi.com>
This commit is contained in:
daichuan
2025-08-30 01:18:20 +08:00
committed by Xiang Xiao
parent 42da4e322a
commit 99bf7c3c5f
8 changed files with 237 additions and 137 deletions
+8 -24
View File
@@ -250,46 +250,30 @@ void udp_send(FAR struct net_driver_s *dev, FAR struct udp_conn_s *conn)
#ifdef CONFIG_NET_UDP_CHECKSUMS
/* Calculate UDP checksum. */
if ((dev->d_features & NETDEV_TX_CSUM) == 0)
{
#ifdef CONFIG_NET_IPv4
#ifdef CONFIG_NET_IPv6
if (IFF_IS_IPv4(dev->d_flags))
if (IFF_IS_IPv4(dev->d_flags))
#endif
{
if ((dev->d_features & NETDEV_TX_CSUM) == 0)
{
udp->udpchksum = ~udp_ipv4_chksum(dev);
}
else
{
uint16_t chksum = ipv4_upperlayer_header_chksum(dev,
IP_PROTO_UDP);
udp->udpchksum = HTONS(chksum);
}
}
#endif /* CONFIG_NET_IPv4 */
#ifdef CONFIG_NET_IPv6
#ifdef CONFIG_NET_IPv4
else
else
#endif
{
if ((dev->d_features & NETDEV_TX_CSUM) == 0)
{
udp->udpchksum = ~udp_ipv6_chksum(dev);
}
else
{
uint16_t chksum = ipv6_upperlayer_header_chksum(dev,
IP_PROTO_UDP,
IPv6_HDRLEN);
udp->udpchksum = HTONS(chksum);
}
}
#endif /* CONFIG_NET_IPv6 */
if (udp->udpchksum == 0)
{
udp->udpchksum = 0xffff;
if (udp->udpchksum == 0)
{
udp->udpchksum = 0xffff;
}
}
#endif /* CONFIG_NET_UDP_CHECKSUMS */