diff --git a/subsys/net/ip/icmpv4.c b/subsys/net/ip/icmpv4.c index 8bab97d9cfc..0ea8d40ba46 100644 --- a/subsys/net/ip/icmpv4.c +++ b/subsys/net/ip/icmpv4.c @@ -610,7 +610,8 @@ enum net_verdict net_icmpv4_input(struct net_pkt *pkt, return NET_DROP; } - if (net_if_need_calc_rx_checksum(net_pkt_iface(pkt))) { + if (net_if_need_calc_rx_checksum(net_pkt_iface(pkt)) || + net_pkt_is_ip_reassembled(pkt)) { if (net_calc_chksum_icmpv4(pkt) != 0U) { NET_DBG("DROP: Invalid checksum"); goto drop; diff --git a/subsys/net/ip/icmpv6.c b/subsys/net/ip/icmpv6.c index c04e3dddf72..65c01a510c7 100644 --- a/subsys/net/ip/icmpv6.c +++ b/subsys/net/ip/icmpv6.c @@ -342,7 +342,8 @@ enum net_verdict net_icmpv6_input(struct net_pkt *pkt, } - if (net_if_need_calc_rx_checksum(net_pkt_iface(pkt))) { + if (net_if_need_calc_rx_checksum(net_pkt_iface(pkt)) || + net_pkt_is_ip_reassembled(pkt)) { if (net_calc_chksum_icmpv6(pkt) != 0U) { NET_DBG("DROP: invalid checksum"); goto drop; diff --git a/subsys/net/ip/tcp.c b/subsys/net/ip/tcp.c index 6ec7745c952..82faa777694 100644 --- a/subsys/net/ip/tcp.c +++ b/subsys/net/ip/tcp.c @@ -3609,7 +3609,8 @@ struct net_tcp_hdr *net_tcp_input(struct net_pkt *pkt, struct net_tcp_hdr *tcp_hdr; if (IS_ENABLED(CONFIG_NET_TCP_CHECKSUM) && - net_if_need_calc_rx_checksum(net_pkt_iface(pkt)) && + (net_if_need_calc_rx_checksum(net_pkt_iface(pkt)) || + net_pkt_is_ip_reassembled(pkt)) && net_calc_chksum_tcp(pkt) != 0U) { NET_DBG("DROP: checksum mismatch"); goto drop; diff --git a/subsys/net/ip/udp.c b/subsys/net/ip/udp.c index 5ecc595053b..e3f45b3db38 100644 --- a/subsys/net/ip/udp.c +++ b/subsys/net/ip/udp.c @@ -164,7 +164,8 @@ struct net_udp_hdr *net_udp_input(struct net_pkt *pkt, } if (IS_ENABLED(CONFIG_NET_UDP_CHECKSUM) && - net_if_need_calc_rx_checksum(net_pkt_iface(pkt))) { + (net_if_need_calc_rx_checksum(net_pkt_iface(pkt)) || + net_pkt_is_ip_reassembled(pkt))) { if (!udp_hdr->chksum) { if (IS_ENABLED(CONFIG_NET_UDP_MISSING_CHECKSUM) && net_pkt_family(pkt) == AF_INET) {