From owner-cvs-all@FreeBSD.ORG Mon Feb 6 23:26:01 2006 Return-Path: X-Original-To: cvs-all@FreeBSD.org Delivered-To: cvs-all@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 7D1A416A420; Mon, 6 Feb 2006 23:26:01 +0000 (GMT) (envelope-from nate@root.org) Received: from www.cryptography.com (li-22.members.linode.com [64.5.53.22]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1A31E43D46; Mon, 6 Feb 2006 23:26:01 +0000 (GMT) (envelope-from nate@root.org) Received: from [10.0.0.53] (adsl-67-119-74-222.dsl.sntc01.pacbell.net [67.119.74.222]) by www.cryptography.com (8.12.8/8.12.8) with ESMTP id k16NOeEr021546 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Mon, 6 Feb 2006 15:24:41 -0800 Message-ID: <43E7DAC2.8060101@root.org> Date: Mon, 06 Feb 2006 15:24:50 -0800 From: Nate Lawson User-Agent: Mozilla Thunderbird 1.0.6 (Windows/20050716) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Nate Lawson 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> In-Reply-To: <43E7D662.6000608@root.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Alan Cox , src-committers@FreeBSD.org, Oleg Bulyzhin , cvs-all@FreeBSD.org, cvs-src@FreeBSD.org Subject: Re: cvs commit: src/sys/dev/bge if_bge.c X-BeenThere: cvs-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: CVS commit messages for the entire tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 06 Feb 2006 23:26:01 -0000 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