if_tap unaligned access problem

Claudio Jeker cjeker at diehard.n-r-g.com
Thu Apr 28 13:59:07 PDT 2005


On Thu, Apr 28, 2005 at 11:30:02AM -0700, 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 :-)
> 

There seems to be a reason that a function like m_adj() and ETHER_ALIGN
exists.

-- 
:wq Claudio


More information about the freebsd-net mailing list