On Tue, Jul 08, 2014 at 11:39:12PM -0400, Lawrence Teo wrote:
> The current divert(4) implementation allocates an mbuf tag in pf_test()
> to store the divert port specified by a divert-packet PF rule.
> 
> The divert_packet() function then looks up that mbuf tag to retrieve the
> divert port number before sending the packet to userspace.
> 
> As far as I can tell, this approach of using an mbuf tag was borrowed
> from divert-to's implementation.  However, in the case of divert(4) I
> think it's overkill because once the packet has reached userspace,
> its mbuf and mbuf tag are no longer needed.
> 
> I would like to simplify divert(4)'s implementation by passing the
> divert port to divert_packet() directly as an argument, which avoids the
> allocation of an mbuf tag completely.
> 
> ok?
> 

Nice one. 

Does anyone have an idea why the mbuf tag was added in the first
place?  Maybe henning's PF shuffling removed the need for it.

ok reyk@

> 
> Index: net/pf.c
> ===================================================================
> RCS file: /cvs/src/sys/net/pf.c,v
> retrieving revision 1.878
> diff -u -p -u -p -r1.878 pf.c
> --- net/pf.c  20 May 2014 11:03:13 -0000      1.878
> +++ net/pf.c  14 Jun 2014 18:12:06 -0000
> @@ -6617,14 +6617,8 @@ done:
>               }
>       }
>  
> -     if (action == PF_PASS && r->divert_packet.port) {
> -             struct pf_divert *divert;
> -
> -             if ((divert = pf_get_divert(pd.m)))
> -                     divert->port = r->divert_packet.port;
> -
> +     if (action == PF_PASS && r->divert_packet.port)
>               action = PF_DIVERT;
> -     }
>  
>       if (pd.pflog) {
>               struct pf_rule_item     *ri;
> @@ -6651,12 +6645,12 @@ done:
>       case PF_DIVERT:
>               switch (pd.af) {
>               case AF_INET:
> -                     if (divert_packet(pd.m, pd.dir) == 0)
> +                     if (!divert_packet(pd.m, pd.dir, r->divert_packet.port))
>                               *m0 = NULL;
>                       break;
>  #ifdef INET6
>               case AF_INET6:
> -                     if (divert6_packet(pd.m, pd.dir) == 0)
> +                     if (!divert6_packet(pd.m, pd.dir, 
> r->divert_packet.port))
>                               *m0 = NULL;
>                       break;
>  #endif /* INET6 */
> Index: netinet/ip_divert.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_divert.c,v
> retrieving revision 1.22
> diff -u -p -u -p -r1.22 ip_divert.c
> --- netinet/ip_divert.c       23 Apr 2014 14:43:14 -0000      1.22
> +++ netinet/ip_divert.c       14 Jun 2014 17:45:12 -0000
> @@ -189,12 +189,11 @@ fail:
>  }
>  
>  int
> -divert_packet(struct mbuf *m, int dir)
> +divert_packet(struct mbuf *m, int dir, u_int16_t divert_port)
>  {
>       struct inpcb *inp;
>       struct socket *sa = NULL;
>       struct sockaddr_in addr;
> -     struct pf_divert *divert;
>  
>       inp = NULL;
>       divstat.divs_ipackets++;
> @@ -205,15 +204,8 @@ divert_packet(struct mbuf *m, int dir)
>               return (0);
>       }
>  
> -     divert = pf_find_divert(m);
> -     if (divert == NULL) {
> -             divstat.divs_errors++;
> -             m_freem(m);
> -             return (0);
> -     }
> -
>       TAILQ_FOREACH(inp, &divbtable.inpt_queue, inp_queue) {
> -             if (inp->inp_lport != divert->port)
> +             if (inp->inp_lport != divert_port)
>                       continue;
>               if (inp->inp_divertfl == 0)
>                       break;
> Index: netinet/ip_divert.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_divert.h,v
> retrieving revision 1.5
> diff -u -p -u -p -r1.5 ip_divert.h
> --- netinet/ip_divert.h       23 Apr 2014 14:43:14 -0000      1.5
> +++ netinet/ip_divert.h       14 Jun 2014 17:52:05 -0000
> @@ -55,7 +55,7 @@ extern struct       divstat         divstat;
>  
>  void  divert_init(void);
>  void  divert_input(struct mbuf *, ...);
> -int   divert_packet(struct mbuf *, int);
> +int   divert_packet(struct mbuf *, int, u_int16_t);
>  int   divert_sysctl(int *, u_int, void *, size_t *, void *, size_t);
>  int   divert_usrreq(struct socket *,
>           int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *);
> Index: netinet6/ip6_divert.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_divert.c,v
> retrieving revision 1.23
> diff -u -p -u -p -r1.23 ip6_divert.c
> --- netinet6/ip6_divert.c     28 Apr 2014 15:43:04 -0000      1.23
> +++ netinet6/ip6_divert.c     14 Jun 2014 18:13:03 -0000
> @@ -188,12 +188,11 @@ fail:
>  }
>  
>  int
> -divert6_packet(struct mbuf *m, int dir)
> +divert6_packet(struct mbuf *m, int dir, u_int16_t divert_port)
>  {
>       struct inpcb *inp;
>       struct socket *sa = NULL;
>       struct sockaddr_in6 addr;
> -     struct pf_divert *divert;
>  
>       inp = NULL;
>       div6stat.divs_ipackets++;
> @@ -204,15 +203,8 @@ divert6_packet(struct mbuf *m, int dir)
>               return (0);
>       }
>  
> -     divert = pf_find_divert(m);
> -     if (divert == NULL) {
> -             div6stat.divs_errors++;
> -             m_freem(m);
> -             return (0);
> -     }
> -
>       TAILQ_FOREACH(inp, &divb6table.inpt_queue, inp_queue) {
> -             if (inp->inp_lport != divert->port)
> +             if (inp->inp_lport != divert_port)
>                       continue;
>               if (inp->inp_divertfl == 0)
>                       break;
> Index: netinet6/ip6_divert.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_divert.h,v
> retrieving revision 1.4
> diff -u -p -u -p -r1.4 ip6_divert.h
> --- netinet6/ip6_divert.h     23 Apr 2014 14:43:14 -0000      1.4
> +++ netinet6/ip6_divert.h     14 Jun 2014 18:12:21 -0000
> @@ -55,7 +55,7 @@ extern struct       div6stat                div6stat;
>  
>  void  divert6_init(void);
>  int   divert6_input(struct mbuf **, int *, int);
> -int   divert6_packet(struct mbuf *, int);
> +int   divert6_packet(struct mbuf *, int, u_int16_t);
>  int   divert6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
>  int   divert6_usrreq(struct socket *,
>           int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *);
> 

-- 

Reply via email to