Hi,

Here is a suggestion for the title:

  net: fix uneeded replacement of 0 by ffff for TCP checksum

The commit log looks good to me, but you can add:

  Fixes: 6006818cfb26 ("net: new checksum functions")
  Cc: sta...@dpdk.org

On Wed, May 27, 2020 at 05:36:59PM +0200, Morten Brørup wrote:
> > From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Stephen Hemminger
> > Sent: Wednesday, May 27, 2020 5:03 PM
> > 
> > On Wed, 27 May 2020 22:41:27 +0800
> > guohongzhi <guohongz...@huawei.com> wrote:
> >
> > > --- a/lib/librte_net/rte_ip.h
> > > +++ b/lib/librte_net/rte_ip.h
> > > @@ -324,8 +324,7 @@ rte_ipv4_phdr_cksum(const struct rte_ipv4_hdr 
> > > *ipv4_hdr, uint64_t ol_flags)
> > >   * @param l4_hdr
> > >   *   The pointer to the beginning of the L4 header.
> > >   * @return
> > > - *   The complemented checksum to set in the IP packet
> > > - *   or 0 on error
> > > + *   The complemented checksum to set in the IP packet.
> > >   */
> > >  static inline uint16_t
> > >  rte_ipv4_udptcp_cksum(const struct rte_ipv4_hdr *ipv4_hdr, const void 
> > > *l4_hdr)

It still returns 0 when ipv4_hdr->total_length < sizeof(struct rte_ipv4_hdr).
I suggest to keep this case in the API comment, maybe like this:

  The complemented checksum to set in the IP packet
  or 0 if the IP length is invalid in the header.


> > > + /* For Udp, if the computed checksum is zero,
> > > +  * it is transmitted as all ones.RFC768
> > > +  */
> > > + if (cksum == 0 && ipv4_hdr->next_proto_id == IPPROTO_UDP)
> > >           cksum = 0xffff;
> > >
> > 
> > 
> > The comment should be reformatted to be clearer.
> > 
> > Maybe:
> >     /*
> >      * Per RFC768:
> >      * If the computed  checksum  is zero,it is transmitted  as all
> > ones
> >      * (the equivalent  in one's complement  arithmetic).
> >      */
> > 
> 
> But without the double spaces. :-)

I agree, Stephen's wording looks better, can you please use it?

> > There is no special case required here, it is true for TCP as well.
> 
> I disagree. I researched this topic when Hongzhi Guo initially submitted the 
> patches, and have only seen the special exception mentioned in RFC 768 
> (describing UDP), where a transmitted value of 0x0000 means that the checksum 
> has not been generated. None of the RFCs regarding Internet Checksum or TCP 
> checksum mentions this special case.
> 
> > In TCP it appears 0 is allowed but not generally used. Most
> > implementations
> > use common checksum for both TCP and UDP
> 
> Then most implementations are wrong.
> 
> Jon Postel famously wrote: "Be liberal in what you accept, and conservative 
> in what you send."
> 
> This function is in the transmission path, so we should calculate it 
> correctly.
> 
> In the receive path, when checking the checksum as described in RFC 1071, any 
> of the two values (0x0000 or 0xFFFF) in the Checksum field will yield the 
> correct result. Which is why most implementations can get away with doing it 
> wrong.

I agree with Morten, it looks more strict like this.

Reply via email to