Date: Tue, 13 May 2014 09:02:04 +0200 From: Michael Tuexen <Michael.Tuexen@lurchi.franken.de> To: pyunyh@gmail.com Cc: FreeBSD Net <freebsd-net@freebsd.org>, "Bjoern A. Zeeb" <bz@FreeBSD.org> Subject: Re: RX checksum offloading problem Message-ID: <1E676F4A-50A7-4FB9-8EE8-08B2A4BD54CB@lurchi.franken.de> In-Reply-To: <20140513052134.GA1419@michelle.cdnetworks.com> References: <A345E6A0-D6FF-4E69-AFBD-9BB67B82F02E@FreeBSD.org> <B149FC4B-4F15-4619-A04F-F1A08DDC1741@lurchi.franken.de> <20140507075612.GA1376@michelle.cdnetworks.com> <36469814-FAC8-4172-A792-487E2AB8ECB9@lurchi.franken.de> <20140507083751.GB1376@michelle.cdnetworks.com> <415C1CB5-3AF9-44E4-943A-74116037980E@lurchi.franken.de> <20140509013556.GA3014@michelle.cdnetworks.com> <B4F16B70-825A-441A-82AA-F7ED28C9D254@lurchi.franken.de> <20140512013612.GA4085@michelle.cdnetworks.com> <72BEDE7B-C1F1-4EE2-BA68-49AED7209E8A@lurchi.franken.de> <20140513052134.GA1419@michelle.cdnetworks.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 13 May 2014, at 07:21, Yonghyeon PYUN <pyunyh@gmail.com> wrote: > On Mon, May 12, 2014 at 01:22:03PM +0200, Michael Tuexen wrote: >> On 12 May 2014, at 03:36, Yonghyeon PYUN <pyunyh@gmail.com> wrote: >> >>> On Fri, May 09, 2014 at 12:46:48PM +0200, Michael Tuexen wrote: >>>> On 09 May 2014, at 03:35, Yonghyeon PYUN <pyunyh@gmail.com> wrote: >>>> > > [...] > >>> Oops, sorry. You're right. Probably I was confused with old memory >>> when I worked on that area. I've quickly read IP reassembly code >>> again and as you said, it should work. However it seems there is a >>> checksumming bug here. >>> >>> /* >>> * In order to do checksumming faster we do 'end-around carry' here >>> * (and not in for{} loop), though it implies we are not going to >>> * reassemble more than 64k fragments. >>> */ >>> m->m_pkthdr.csum_data = >>> (m->m_pkthdr.csum_data & 0xffff) + (m->m_pkthdr.csum_data >> 16); >>> >>> I guess the line above didn't account possible carry happened after >>> the computation. Probably it could be rewritten as the following. >>> >>> while (m->m_pkthdr.csum_data & 0xffff0000) >>> m->m_pkthdr.csum_data = (m->m_pkthdr.csum_data & 0xffff) + >>> (m->m_pkthdr.csum_data >> 16); >> I think you are right here. Good catch. Will you fix it? >> > > Done in r265942. Great. Thanks. Michael >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1E676F4A-50A7-4FB9-8EE8-08B2A4BD54CB>