From owner-svn-src-all@FreeBSD.ORG Mon Oct 29 08:21:03 2012 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id A7A637BB for ; Mon, 29 Oct 2012 08:21:03 +0000 (UTC) (envelope-from andre@freebsd.org) Received: from c00l3r.networx.ch (c00l3r.networx.ch [62.48.2.2]) by mx1.freebsd.org (Postfix) with ESMTP id 0449C8FC18 for ; Mon, 29 Oct 2012 08:21:02 +0000 (UTC) Received: (qmail 95451 invoked from network); 29 Oct 2012 09:57:59 -0000 Received: from c00l3r.networx.ch (HELO [127.0.0.1]) ([62.48.2.2]) (envelope-sender ) by c00l3r.networx.ch (qmail-ldap-1.03) with SMTP for ; 29 Oct 2012 09:57:59 -0000 Message-ID: <508E3C6B.2090102@freebsd.org> Date: Mon, 29 Oct 2012 09:20:59 +0100 From: Andre Oppermann User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20121010 Thunderbird/16.0.1 MIME-Version: 1.0 To: pyunyh@gmail.com Subject: Re: svn commit: r242161 - in head/sys: net netinet netpfil/pf References: <201210262106.q9QL6YgY000943@svn.freebsd.org> <508BBE6C.7010409@freebsd.org> <20121027220137.GJ70741@FreeBSD.org> <20121029204104.GA1431@michelle.cdnetworks.com> <20121029052100.GO70741@FreeBSD.org> <20121029214038.GD1431@michelle.cdnetworks.com> In-Reply-To: <20121029214038.GD1431@michelle.cdnetworks.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, Gleb Smirnoff , src-committers@freebsd.org X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 29 Oct 2012 08:21:03 -0000 On 29.10.2012 22:40, YongHyeon PYUN wrote: > On Mon, Oct 29, 2012 at 09:21:00AM +0400, Gleb Smirnoff wrote: >> On Mon, Oct 29, 2012 at 01:41:04PM -0700, YongHyeon PYUN wrote: >> Y> On Sun, Oct 28, 2012 at 02:01:37AM +0400, Gleb Smirnoff wrote: >> Y> > On Sat, Oct 27, 2012 at 12:58:52PM +0200, Andre Oppermann wrote: >> Y> > A> On 26.10.2012 23:06, Gleb Smirnoff wrote: >> Y> > A> > Author: glebius >> Y> > A> > Date: Fri Oct 26 21:06:33 2012 >> Y> > A> > New Revision: 242161 >> Y> > A> > URL: http://svn.freebsd.org/changeset/base/242161 >> Y> > A> > >> Y> > A> > Log: >> Y> > A> > o Remove last argument to ip_fragment(), and obtain all needed information >> Y> > A> > on checksums directly from mbuf flags. This simplifies code. >> Y> > A> > o Clear CSUM_IP from the mbuf in ip_fragment() if we did checksums in >> Y> >> Y> I'm not sure whether ti(4)'s checksum offloading for IP fragmented >> Y> packets(CSUM_IP_FRAGS) still works after this change. ti(4) >> Y> requires CSUM_IP should be set for IP fragmented packets. Not sure >> Y> whether it's a bug or not. I have a ti(4) controller but I don't >> Y> remember where I can find it and don't have a link >> Y> parter(1000baseSX) to test it. :-( >> >> ti(4) declares both CSUM_IP and CSUM_IP_FRAGS, so ip_fragment() won't do > > Because it supports both CSUM_IP and CSUM_IP_FRAGS. Probably ti(4) > is the only controller that supports TCP/UDP checksum offloading > for an IP fragmented packet. This is a bit weird if it doesn't do the fragmentation itself. Computing the IP header checksum doesn't differ for normal and fragmented packets. The protocol checksum (TCP or UDP) stays the same for in the case of IP level fragmentation. It is only visible in the first fragment which includes the protocol header. >> software checksums, and thus won't clear these flags. >> >> Potentially a driver that announces one flag in if_hwassist but relies on >> couple of flags to be set on mbuf is not correct. If a driver can't do single >> checksum processing independently from others, then it should set or clear >> appropriate flags in if_hwassist as a group. > > Hmm, then what would be best way to achieve CSUM_IP_FRAGS in > driver? I don't have clear idea how to utilize the hardware > feature. The stack should tell that the mbuf needs TCP/UDP checksum > offloading for IP fragmented packet(i.e. CSUM_IP_FRAGS is not set by > upper stack). As I said there can't be fragment checksumming without hardware based fragmentation. We have three cases here: 1. TSO where the hardware does the segmentation, TCP and IP header checksums for each generated packet. 2. IP packet fragmentation where a packet is split, the IP header checksum is recomputed for each fragment, but the protocol csum stays the same and is not modified. 3. UDP fragmentation where a large packet is sent to the hardware and it generates first the UDP checksum and then splits it into IP fragments each with its own IP header checksum. So we end up with these possible large send hardware offload capabilities: TSO: including IPv4hdr and TCP checksumming UDP fragmentation: including IPv4hdr and UDP checksumming IP fragmentation: including IPv4hdr checksumming Besides that we have the packet <= MTU sized offload capabilities: TCP checksumming UDP checksumming SCTP checksumming IPv4hdr checksumming >> Y> > A> > hardware. Some driver may not announce CSUM_IP in theur if_hwassist, >> ^^^^^^^^ >> >> Oh, that was a typo! Software was meant. That explains quite a bit of confusion. -- Andre