On Tue, Feb 09, 2021 at 07:02:32AM +0000, Roy Marples wrote:
> Hi David
> 
> On 03/02/2021 21:45, David Young wrote:
> >
> > This change looks a little hasty to me.
> >
> > It looks to me like some of these structs were __packed so that
> > they could be read/written directly from/to any offset in a packet
> > chain using mtod(), which does not pay any mind to the alignment
> > of `*t`:
> >
> > #define mtod(m, t)      ((t)((m)->m_data))
> >
> > I see gre_h is accessed in that way, just for one example.
> 
> Looking at the other places where this is handled, does this patch to gre_h
> address your concerns?
> I tested this on aarch64 which does not define __NO_STRICT_ALIGNMENT and it
> passes the KASSERT.

It is possible to simplify your patch a lot.  The GRE header is only 4
bytes long.  On the receive side, just perform the m_pullup like the
old code did and then memcpy to a `struct gre_h` on the stack.  On the
send side, construct the header on the stack and then memcpy it into the
mbuf.

The same general approach, of copying headers between mbufs the stack,
is probably plenty fast for virtually any size of header used in the
network stack.

Dave

-- 
David Young
dyo...@pobox.com    Urbana, IL    (217) 721-9981

Reply via email to