From owner-freebsd-net@FreeBSD.ORG Thu Apr 28 21:12:39 2005 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6A44316A4CE for ; Thu, 28 Apr 2005 21:12:39 +0000 (GMT) Received: from ebb.errno.com (ebb.errno.com [66.127.85.87]) by mx1.FreeBSD.org (Postfix) with ESMTP id ED1BD43D1D for ; Thu, 28 Apr 2005 21:12:38 +0000 (GMT) (envelope-from sam@errno.com) Received: from [66.127.85.91] (sam@[66.127.85.91]) (authenticated bits=0) by ebb.errno.com (8.12.9/8.12.6) with ESMTP id j3SLCUms085330 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 28 Apr 2005 14:12:31 -0700 (PDT) (envelope-from sam@errno.com) Message-ID: <42715269.3010306@errno.com> Date: Thu, 28 Apr 2005 14:15:21 -0700 From: Sam Leffler User-Agent: Mozilla Thunderbird 1.0.2 (X11/20050327) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Julian Elischer References: <20050428135120.GB21428@cell.sick.ru> <427111BF.2050607@savvis.net> <42712BAA.4070201@elischer.org> In-Reply-To: <42712BAA.4070201@elischer.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit cc: Sten Spans cc: net@freebsd.org Subject: Re: if_tap unaligned access problem X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Apr 2005 21:12:39 -0000 Julian Elischer wrote: > > > Maksim Yevmenkin wrote: > >> Hello, >> >>> A quick question about if_tap, the tapwrite function >>> ( which copies an ethernet frame into an mbuf using uiotombuf ) >>> is broken on alpha and sparc64. >>> The 14 byte ethernet header causes the rest of the frame to >>> be misaligned on 4 byte boundaries. This causes crashes in >>> various other parts of the kernel. The solution would be to >>> shift the mbuf by two bytes, but I am not quite sure where >>> this should happen. >> >> >> >> i think we have few options here: >> >> 1) revert back original tapwrite function that was changed in v. 1.48 >> and set offset to 2 bytes in top mbuf >> >> 2) change current version of tapwrite so it would m_prepend and >> m_pullup mbuf after m_uiotombuf >> >> 3) change m_uiotombuf to accept one more parameter - mbuf offset at >> which data should be copied. there are not that many users of m_uiotombuf >> >> /sys/kern/uipc_syscalls.c >> /sys/net/if_tap.c >> /sys/net/if_tun.c >> /sys/netgraph/ng_device.c > > > > I think we should defien a MAC header that looks like: > char dummy[2] > char dest[6] > char src[6] > char type_len[2] > and make ether net cards start writing 2 bytes into the buffer :-) The whole alignment thing is currently handled quite poorly. For example, are frequently aligning to the front of a cluster for ethernet receives which means that frames bridged to a non-802.3 device often have to prepend an mbuf because there's not enough space for their larger header. We need to fix the alignment on receive based on multiple considerations and not just ip alignment. There's a similar can-of-worms on the tx side that's a bit more involved. Dealing with rx-side alignment is getting high on my todo list but various other problems keep cropping up. Sam