i think it should be documented ;)

otherwise ok

Index: mbuf.9
===================================================================
RCS file: /cvs/src/share/man/man9/mbuf.9,v
retrieving revision 1.91
diff -u -p -u -r1.91 mbuf.9
--- mbuf.9      8 Oct 2015 14:09:34 -0000       1.91
+++ mbuf.9      30 Oct 2015 17:15:40 -0000
@@ -44,6 +44,8 @@
 .Fn MGET "struct mbuf *m" "int how" "int type"
 .Ft struct mbuf *
 .Fn m_getclr "int how" "int type"
+.Ft void
+.Fn m_resethdr struct mbuf *
 .Ft struct mbuf *
 .Fn m_gethdr "int how" "int type"
 .Fn MGETHDR "struct mbuf *m" "int how" "int type"
@@ -445,6 +447,11 @@ See
 .Fn m_get
 for a description of
 .Fa how .
+.It Fn m_resethdr "struct mbuf *"
+Deletes all
+.Xr pf 4
+data and all tags attached to packet
+.Fa mbuf .
 .It Fn m_gethdr "int how" "int type"
 Return a pointer to an mbuf of the type specified after initializing
 it to contain a packet header.


Reyk Floeter([email protected]) on 2015.10.30 14:04:52 +0100:
> On Fri, Oct 30, 2015 at 01:40:19PM +0100, Alexander Bluhm wrote:
> > On Fri, Oct 30, 2015 at 12:56:34PM +0100, Reyk Floeter wrote:
> > > --- sys/sys/mbuf.h        22 Oct 2015 05:26:06 -0000      1.198
> > > +++ sys/sys/mbuf.h        30 Oct 2015 11:30:33 -0000
> > > @@ -410,6 +410,7 @@ struct        mbuf *m_get(int, int);
> > >  struct   mbuf *m_getclr(int, int);
> > >  struct   mbuf *m_gethdr(int, int);
> > >  struct   mbuf *m_inithdr(struct mbuf *);
> > > +void     m_resethdr(struct mbuf *);
> > >  int            m_defrag(struct mbuf *, int);
> > 
> > The m_resethdr should have the same indent as m_defrag.
> > 
> 
> Really?  The indent of m_defrag() is wrong - many spaces and not like
> the other int functions further down - but I didn't dare to touch it.
> It sticks in the eye, so I'll fix m_defrag indent as well.
> 
> > > --- sys/net/if_pair.c     25 Oct 2015 12:59:57 -0000      1.4
> > > +++ sys/net/if_pair.c     30 Oct 2015 11:30:33 -0000
> > > @@ -30,6 +30,11 @@
> > >  #include <netinet/in.h>
> > >  #include <netinet/if_ether.h>
> > >  
> > > +#include "pf.h"
> > > +#if NPF > 0
> > > +#include <net/pfvar.h>
> > > +#endif
> > 
> > I think you don't need that anymore.
> > 
> > > @@ -182,9 +187,13 @@ pairstart(struct ifnet *ifp)
> > >  #endif /* NBPFILTER > 0 */
> > >  
> > >           ifp->if_opackets++;
> > > -         if (pairedifp != NULL)
> > > +         if (pairedifp != NULL) {
> > > +#if NPF > 0
> > > +                 if (m->m_flags & M_PKTHDR)
> > > +                         m_resethdr(m);
> > > +#endif
> > 
> > Calling m_tag_delete_chain() is not pf specific, so I would do it
> > without the #if NPF.
> > 
> > Otherwise OK bluhm@
> > 
> > Socket splicing somove() does the same thing.  I will change it to
> > use m_resethdr() after that got commited.
> 
> Cool.
> 
> I'm going to commit the attached diff for now.
> 
> Reyk
> 
> Index: sys/kern/uipc_mbuf.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_mbuf.c,v
> retrieving revision 1.208
> diff -u -p -u -p -r1.208 uipc_mbuf.c
> --- sys/kern/uipc_mbuf.c      22 Oct 2015 05:26:06 -0000      1.208
> +++ sys/kern/uipc_mbuf.c      30 Oct 2015 12:45:50 -0000
> @@ -250,6 +250,18 @@ m_inithdr(struct mbuf *m)
>       return (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;
> +
> +     /* also delete all mbuf tags to reset the state */
> +     m_tag_delete_chain(m);
> +}
> +
>  struct mbuf *
>  m_getclr(int nowait, int type)
>  {
> Index: sys/sys/mbuf.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/mbuf.h,v
> retrieving revision 1.198
> diff -u -p -u -p -r1.198 mbuf.h
> --- sys/sys/mbuf.h    22 Oct 2015 05:26:06 -0000      1.198
> +++ sys/sys/mbuf.h    30 Oct 2015 12:45:50 -0000
> @@ -410,7 +410,8 @@ struct    mbuf *m_get(int, int);
>  struct       mbuf *m_getclr(int, int);
>  struct       mbuf *m_gethdr(int, int);
>  struct       mbuf *m_inithdr(struct mbuf *);
> -int        m_defrag(struct mbuf *, int);
> +void m_resethdr(struct mbuf *);
> +int  m_defrag(struct mbuf *, int);
>  struct       mbuf *m_prepend(struct mbuf *, int, int);
>  struct       mbuf *m_pulldown(struct mbuf *, int, int, int *);
>  struct       mbuf *m_pullup(struct mbuf *, int);
> Index: sys/net/if_pair.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_pair.c,v
> retrieving revision 1.4
> diff -u -p -u -p -r1.4 if_pair.c
> --- sys/net/if_pair.c 25 Oct 2015 12:59:57 -0000      1.4
> +++ sys/net/if_pair.c 30 Oct 2015 12:45:50 -0000
> @@ -182,9 +182,11 @@ pairstart(struct ifnet *ifp)
>  #endif /* NBPFILTER > 0 */
>  
>               ifp->if_opackets++;
> -             if (pairedifp != NULL)
> +             if (pairedifp != NULL) {
> +                     if (m->m_flags & M_PKTHDR)
> +                             m_resethdr(m);
>                       ml_enqueue(&ml, m);
> -             else
> +             } else
>                       m_freem(m);
>       }
>  
> 

-- 

Reply via email to