diff --git a/subsys/net/ip/icmpv4.c b/subsys/net/ip/icmpv4.c index 11a65025e4a..65b5de53937 100644 --- a/subsys/net/ip/icmpv4.c +++ b/subsys/net/ip/icmpv4.c @@ -65,7 +65,10 @@ int net_icmpv4_finalize(struct net_pkt *pkt) return -ENOBUFS; } - icmp_hdr->chksum = net_calc_chksum_icmpv4(pkt); + icmp_hdr->chksum = 0U; + if (net_if_need_calc_tx_checksum(net_pkt_iface(pkt))) { + icmp_hdr->chksum = net_calc_chksum_icmpv4(pkt); + } return net_pkt_set_data(pkt, &icmpv4_access); } @@ -688,9 +691,11 @@ enum net_verdict net_icmpv4_input(struct net_pkt *pkt, return NET_DROP; } - if (net_calc_chksum_icmpv4(pkt) != 0U) { - NET_DBG("DROP: Invalid checksum"); - goto drop; + if (net_if_need_calc_rx_checksum(net_pkt_iface(pkt))) { + if (net_calc_chksum_icmpv4(pkt) != 0U) { + NET_DBG("DROP: Invalid checksum"); + goto drop; + } } if (net_ipv4_is_addr_bcast(net_pkt_iface(pkt), diff --git a/subsys/net/ip/icmpv6.c b/subsys/net/ip/icmpv6.c index 2bf63bc8b24..6919edc1741 100644 --- a/subsys/net/ip/icmpv6.c +++ b/subsys/net/ip/icmpv6.c @@ -79,7 +79,10 @@ int net_icmpv6_finalize(struct net_pkt *pkt) return -ENOBUFS; } - icmp_hdr->chksum = net_calc_chksum_icmpv6(pkt); + icmp_hdr->chksum = 0U; + if (net_if_need_calc_rx_checksum(net_pkt_iface(pkt))) { + icmp_hdr->chksum = net_calc_chksum_icmpv6(pkt); + } return net_pkt_set_data(pkt, &icmp_access); } @@ -409,9 +412,12 @@ enum net_verdict net_icmpv6_input(struct net_pkt *pkt, return NET_DROP; } - if (net_calc_chksum_icmpv6(pkt) != 0U) { - NET_DBG("DROP: invalid checksum"); - goto drop; + + if (net_if_need_calc_rx_checksum(net_pkt_iface(pkt))) { + if (net_calc_chksum_icmpv6(pkt) != 0U) { + NET_DBG("DROP: invalid checksum"); + goto drop; + } } net_pkt_acknowledge_data(pkt, &icmp_access);