Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Apr 2005 11:40:42 +0200 (CEST)
From:      Sten Spans <sten@blinkenlights.nl>
To:        Sam Leffler <sam@errno.com>
Cc:        net@freebsd.org
Subject:   Re: if_tap unaligned access problem
Message-ID:  <Pine.SOC.4.61.0504291132520.28551@tea.blinkenlights.nl>
In-Reply-To: <42715269.3010306@errno.com>
References:  <20050428135120.GB21428@cell.sick.ru> <427111BF.2050607@savvis.net> <42712BAA.4070201@elischer.org> <42715269.3010306@errno.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 28 Apr 2005, Sam Leffler wrote:

> 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.

I could try to port the changes netbsd made using m_copyup and
send you the resulting patchfile. IPv4 has already been serviced by
John-Mark Gurney in perforce.

Would that help getting this into the tree ?

http://mail-index.netbsd.org/source-changes/2002/07/01/0001.html
http://perforce.freebsd.org/fileDiffView.cgi?FSPC=//depot/user/jmg/arm/src/s
ys/netinet/ip%5finput.c&REV=3&ACT=edit

-- 
Sten Spans

"There is a crack in everything, that's how the light gets in."
Leonard Cohen - Anthem



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.SOC.4.61.0504291132520.28551>