On Fri, Oct 30, 2015 at 07:05:09PM +0100, Alexander Bluhm wrote:
> On Fri, Oct 30, 2015 at 06:48:16PM +0100, Mike Belopuhov wrote:
> > On Fri, Oct 30, 2015 at 18:27 +0100, Alexander Bluhm wrote:
> > > On Fri, Oct 30, 2015 at 02:04:52PM +0100, Reyk Floeter wrote:
> > > > > Socket splicing somove() does the same thing.  I will change it to
> > > > > use m_resethdr() after that got commited.
> > > 
> > > I just compared code in somove() with m_resethdr().  Socket splicing
> > > has to clear the whole packet header, not only the pf part.  I think
> > > this is also useful for pair(4) as it should behave like a cable.
> > > 
> > > Resetting the other m_flags seems wrong.  I have put the M_PKTHDR
> > > into an assert.  If it is not an packet header, the memset() could
> > > overwrite mbuf data.
> > > 
> > > ok?
> > >
> > 
> > Resetting flags that are set on input (e.g. M_CONF, M_AUTH, etc.) is
> > not wrong since input on the other pair has not happened yet and it
> > might provide more problems than shortcuts.  I'm not certain which
> > flags may still be of use before the other pair figures it on its
> > own.  Do you have any examples of such flags?
> 
> I think flags that must be preserverd are
> - M_ZEROIZE
> - M_EXT
> 
> In sys/mbuf.h Flags are split into mbuf flags and mbuf pkthdr flags.
> As we clear the packet header but keep the data, we should probably
> only clear the mbuf pkthdr flags.
> 
> Something like this flag combination?
> 
> bluhm
> 

Yes, OK reyk@

tested with pair(4) ... ipsec on pair(4) ... routed ipsec on pair(4) ...
(pair0 -> ipsec -> pair1 -> $ext_if) ... bridge/pair stp ...

> Index: kern/uipc_mbuf.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/kern/uipc_mbuf.c,v
> retrieving revision 1.209
> diff -u -p -r1.209 uipc_mbuf.c
> --- kern/uipc_mbuf.c  30 Oct 2015 12:54:36 -0000      1.209
> +++ kern/uipc_mbuf.c  30 Oct 2015 18:00:59 -0000
> @@ -253,13 +253,18 @@ m_inithdr(struct mbuf *m)
>  void
>  m_resethdr(struct mbuf *m)
>  {
> -     /* like the previous, but keep any associated data and mbufs */
> -     m->m_flags = M_PKTHDR;
> -     memset(&m->m_pkthdr.pf, 0, sizeof(m->m_pkthdr.pf));
> -     m->m_pkthdr.pf.prio = IFQ_DEFPRIO;
> +     int len = m->m_pkthdr.len;
> +
> +     KASSERT(m->m_flags & M_PKTHDR);
> +     m->m_flags &= (M_EXT|M_PKTHDR|M_EOR|M_EXTWR|M_ZEROIZE);
>  
> -     /* also delete all mbuf tags to reset the state */
> +     /* delete all mbuf tags to reset the state */
>       m_tag_delete_chain(m);
> +
> +     /* like m_inithdr(), but keep any associated data and mbufs */
> +     memset(&m->m_pkthdr, 0, sizeof(m->m_pkthdr));
> +     m->m_pkthdr.pf.prio = IFQ_DEFPRIO;
> +     m->m_pkthdr.len = len;
>  }
>  
>  struct mbuf *
> Index: kern/uipc_socket.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/kern/uipc_socket.c,v
> retrieving revision 1.142
> diff -u -p -r1.142 uipc_socket.c
> --- kern/uipc_socket.c        24 Aug 2015 14:28:25 -0000      1.142
> +++ kern/uipc_socket.c        30 Oct 2015 17:06:57 -0000
> @@ -1325,10 +1325,8 @@ somove(struct socket *so, int wait)
>               goto release;
>       m->m_nextpkt = NULL;
>       if (m->m_flags & M_PKTHDR) {
> -             m_tag_delete_chain(m);
> -             memset(&m->m_pkthdr, 0, sizeof(m->m_pkthdr));
> +             m_resethdr(m);
>               m->m_pkthdr.len = len;
> -             m->m_pkthdr.pf.prio = IFQ_DEFPRIO;
>       }
>  
>       /* Send window update to source peer as receive buffer has changed. */

-- 

Reply via email to