Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 06 Feb 2006 15:24:50 -0800
From:      Nate Lawson <nate@root.org>
To:        Nate Lawson <nate@root.org>
Cc:        Alan Cox <alc@cs.rice.edu>, src-committers@FreeBSD.org, Oleg Bulyzhin <oleg@FreeBSD.org>, cvs-all@FreeBSD.org, cvs-src@FreeBSD.org
Subject:   Re: cvs commit: src/sys/dev/bge if_bge.c
Message-ID:  <43E7DAC2.8060101@root.org>
In-Reply-To: <43E7D662.6000608@root.org>
References:  <200602020958.k129wWtc066930@repoman.freebsd.org> <20060202100637.GB24350@lath.rinet.ru> <20060205235817.GQ5499@cs.rice.edu> <20060206221141.GA57775@lath.rinet.ru> <43E7CBD5.5090203@root.org> <20060206223436.GB57775@lath.rinet.ru> <43E7D662.6000608@root.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Nate Lawson wrote:
> Oleg Bulyzhin wrote:
> 
>> On Mon, Feb 06, 2006 at 02:21:09PM -0800, Nate Lawson wrote:
>>
>>> Oleg Bulyzhin wrote:
>>>
>>>>         nq = q->m_nextpkt;
>>>>         q->m_nextpkt = NULL;
>>>>         m->m_pkthdr.csum_flags &= q->m_pkthdr.csum_flags;
>>>> -        m->m_pkthdr.csum_data += q->m_pkthdr.csum_data;
>>>> +        sum = m->m_pkthdr.csum_data + q->m_pkthdr.csum_data;
>>>> +        m->m_pkthdr.csum_data = (sum & 0xffff) + (sum >> 16);
>>>>         m_cat(m, q);
>>>>     }
>>>> #ifdef MAC
>>>
>>>
>>> I'm not familiar with this code.  So m->m_pkthdr.csum_data is 32 
>>> bits? Couldn't the same thing be achieved with making it 16 bits 
>>> since the add will wrap normally?
>>
>>
>> It will not work cause it's not just a trivial sum it's so called
>> "1's complement sum" (refer rfc1071 for details).
> 
> 
> You're right, but aren't you missing the NOT step?
> 1. 2's complement sum
> 2. Add in carry
> 3. 1's complement of result (not)

Sam Leffler mentioned this comment from NetBSD would be helpful.  Might 
you add it to clear up misunderstandings like I had?

sys/mbuf.h has useful comments not found in the freebsd file:

/*
  * record/packet header in first mbuf of chain; valid if M_PKTHDR set
  *
  * A note about csum_data: For the out-bound direction, the low 16 bits
  * indicates the offset after the L4 header where the final L4 checksum 
value
  * is to be stored and the high 16 bits is the length of the L3 header (the
  * start of the data to be checksumed).  For the in-bound direction, it 
is only
  * valid if the M_CSUM_DATA flag is set.  In this case, an L4 checksum 
has been
  * calculated by hardware, but it is up to software to perform final
  * verification.
  *
  * Note for in-bound TCP/UDP checksums, we expect the csum_data to NOT
  * be bit-wise inverted (the final step in the calculation of an IP
  * checksum) -- this is so we can accumulate the checksum for fragmented
  * packets during reassembly.
  */

Thanks,
-- 
Nate



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?43E7DAC2.8060101>