> +/**
> + * Process the IPv4 checksum of an IPv4 header without any extensions.
> + *
> + * The checksum field does NOT have to be set by the caller, the field
> + * is skipped by the calculation.
> + *
> + * @param ipv4_hdr
> + *   The pointer to the contiguous IPv4 header.
> + * @return
> + *   The complemented checksum to set in the IP packet.
> + */
> +__rte_experimental
> +static inline uint16_t
> +rte_ipv4_cksum_simple(const struct rte_ipv4_hdr *ipv4_hdr)
> +{
> +     const uint16_t *v16_h;
> +     uint32_t ip_cksum;
> +
> +     /*
> +      * Compute the sum of successive 16-bit words of the IPv4 header,
> +      * skipping the checksum field of the header.
> +      */
> +     v16_h = (const unaligned_uint16_t *)&ipv4_hdr->version_ihl;
> +     ip_cksum = v16_h[0] + v16_h[1] + v16_h[2] + v16_h[3] +
> +             v16_h[4] + v16_h[6] + v16_h[7] + v16_h[8] + v16_h[9];
> +
> +     /* reduce 32 bit checksum to 16 bits and complement it */
> +     ip_cksum = (ip_cksum & 0xffff) + (ip_cksum >> 16);
> +     ip_cksum = (ip_cksum & 0xffff) + (ip_cksum >> 16);
> +     ip_cksum = (~ip_cksum) & 0x0000FFFF;
> +     return (ip_cksum == 0) ? 0xFFFF : (uint16_t) ip_cksum;

The zero exception does not apply to the checksum stored in the IP header, only 
to the checksum in the UDP header.

> +}

Besides that, for the series,
Acked-by: Morten Brørup <m...@smartsharesystems.com>

Reply via email to