Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Apr 2005 11:30:02 -0700
From:      Julian Elischer <julian@elischer.org>
To:        Maksim Yevmenkin <maksim.yevmenkin@savvis.net>
Cc:        net@freebsd.org
Subject:   Re: if_tap unaligned access problem
Message-ID:  <42712BAA.4070201@elischer.org>
In-Reply-To: <427111BF.2050607@savvis.net>
References:  <20050428135120.GB21428@cell.sick.ru> <427111BF.2050607@savvis.net>

next in thread | previous in thread | raw e-mail | index | archive | help


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 :-)

>
>> If_tun which is almost the same code has no such problem because
>> it lacks the 14 byte ethernet header. Openbsd has a combined
>> tun/tap driver, with some alignment hacks to fix this.
>
>
> yes, that is true.
>
>> Should I create a pr for this problem, or is there a simple
>> quick fix possible ?
>
>
> you probably should file pr. (1) and (2) above are quick fixes. (3) is 
> more complicated and, maybe, not desirable.
>
> max
> _______________________________________________
> freebsd-net@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?42712BAA.4070201>