On Tue, Jan 31, 2017 at 03:35:47PM -0500, David Hill wrote:
> Updated diff.

OK bluhm@

> 
> Index: kern/uipc_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_socket.c,v
> retrieving revision 1.175
> diff -u -p -r1.175 uipc_socket.c
> --- kern/uipc_socket.c        27 Jan 2017 20:31:42 -0000      1.175
> +++ kern/uipc_socket.c        31 Jan 2017 20:29:37 -0000
> @@ -1560,7 +1560,7 @@ sosetopt(struct socket *so, int level, i
>               if (so->so_proto && so->so_proto->pr_ctloutput) {
>                       NET_LOCK(s);
>                       error = (*so->so_proto->pr_ctloutput)(PRCO_SETOPT, so,
> -                         level, optname, &m0);
> +                         level, optname, m0);
>                       NET_UNLOCK(s);
>                       return (error);
>               }
> @@ -1707,7 +1707,7 @@ sosetopt(struct socket *so, int level, i
>                               level = dom->dom_protosw->pr_protocol;
>                               NET_LOCK(s);
>                               error = (*so->so_proto->pr_ctloutput)
> -                                 (PRCO_SETOPT, so, level, optname, &m0);
> +                                 (PRCO_SETOPT, so, level, optname, m0);
>                               NET_UNLOCK(s);
>                               return (error);
>                       }
> @@ -1739,7 +1739,7 @@ sosetopt(struct socket *so, int level, i
>               if (error == 0 && so->so_proto && so->so_proto->pr_ctloutput) {
>                       NET_LOCK(s);
>                       (*so->so_proto->pr_ctloutput)(PRCO_SETOPT, so,
> -                         level, optname, &m0);
> +                         level, optname, m0);
>                       NET_UNLOCK(s);
>                       m = NULL;       /* freed by protocol */
>               }
> @@ -1758,11 +1758,19 @@ sogetopt(struct socket *so, int level, i
>  
>       if (level != SOL_SOCKET) {
>               if (so->so_proto && so->so_proto->pr_ctloutput) {
> +                     m = m_get(M_WAIT, MT_SOOPTS);
> +                     m->m_len = 0;
> +
>                       NET_LOCK(s);
>                       error = (*so->so_proto->pr_ctloutput)(PRCO_GETOPT, so,
> -                         level, optname, mp);
> +                         level, optname, m);
>                       NET_UNLOCK(s);
> -                     return (error);
> +                     if (error) {
> +                             m_free(m);
> +                             return (error);
> +                     }
> +                     *mp = m;
> +                     return (0);
>               } else
>                       return (ENOPROTOOPT);
>       } else {
> @@ -1835,7 +1843,6 @@ sogetopt(struct socket *so, int level, i
>                   }
>  
>               case SO_RTABLE:
> -                     (void)m_free(m);
>                       if (so->so_proto && so->so_proto->pr_domain &&
>                           so->so_proto->pr_domain->dom_protosw &&
>                           so->so_proto->pr_ctloutput) {
> @@ -1844,12 +1851,16 @@ sogetopt(struct socket *so, int level, i
>                               level = dom->dom_protosw->pr_protocol;
>                               NET_LOCK(s);
>                               error = (*so->so_proto->pr_ctloutput)
> -                                 (PRCO_GETOPT, so, level, optname, mp);
> +                                 (PRCO_GETOPT, so, level, optname, m);
>                               NET_UNLOCK(s);
> -                             return (error);
> +                             if (error) {
> +                                     (void)m_free(m);
> +                                     return (error);
> +                             }
> +                             break;
>                       }
> +                     (void)m_free(m);
>                       return (ENOPROTOOPT);
> -                     break;
>  
>  #ifdef SOCKET_SPLICE
>               case SO_SPLICE:
> @@ -1880,7 +1891,6 @@ sogetopt(struct socket *so, int level, i
>                       }
>                       (void)m_free(m);
>                       return (EOPNOTSUPP);
> -                     break;
>  
>               default:
>                       (void)m_free(m);
> Index: net/rtsock.c
> ===================================================================
> RCS file: /cvs/src/sys/net/rtsock.c,v
> retrieving revision 1.221
> diff -u -p -r1.221 rtsock.c
> --- net/rtsock.c      31 Jan 2017 10:24:41 -0000      1.221
> +++ net/rtsock.c      31 Jan 2017 20:29:37 -0000
> @@ -98,7 +98,7 @@ struct walkarg {
>       caddr_t w_where, w_tmem;
>  };
>  
> -int  route_ctloutput(int, struct socket *, int, int, struct mbuf **);
> +int  route_ctloutput(int, struct socket *, int, int, struct mbuf *);
>  void route_input(struct mbuf *m0, sa_family_t);
>  int  route_arp_conflict(struct rtentry *, struct rt_addrinfo *);
>  int  route_cleargateway(struct rtentry *, void *, unsigned int);
> @@ -234,17 +234,16 @@ route_usrreq(struct socket *so, int req,
>  
>  int
>  route_ctloutput(int op, struct socket *so, int level, int optname,
> -    struct mbuf **mp)
> +    struct mbuf *m)
>  {
>       struct routecb *rop = sotoroutecb(so);
> -     struct mbuf *m = *mp;
>       int error = 0;
>       unsigned int tid;
>  
>       if (level != AF_ROUTE) {
>               error = EINVAL;
> -             if (op == PRCO_SETOPT && *mp)
> -                     m_free(*mp);
> +             if (op == PRCO_SETOPT && m)
> +                     m_free(m);
>               return (error);
>       }
>  
> @@ -277,12 +276,10 @@ route_ctloutput(int op, struct socket *s
>       case PRCO_GETOPT:
>               switch (optname) {
>               case ROUTE_MSGFILTER:
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
>                       m->m_len = sizeof(unsigned int);
>                       *mtod(m, unsigned int *) = rop->msgfilter;
>                       break;
>               case ROUTE_TABLEFILTER:
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
>                       m->m_len = sizeof(unsigned int);
>                       *mtod(m, unsigned int *) = rop->rtableid;
>                       break;
> Index: netinet/ip_mroute.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_mroute.c,v
> retrieving revision 1.107
> diff -u -p -r1.107 ip_mroute.c
> --- netinet/ip_mroute.c       12 Jan 2017 08:22:42 -0000      1.107
> +++ netinet/ip_mroute.c       31 Jan 2017 20:29:37 -0000
> @@ -173,7 +173,7 @@ mfc_find(struct ifnet *ifp, struct in_ad
>   * Handle MRT setsockopt commands to modify the multicast routing tables.
>   */
>  int
> -ip_mrouter_set(struct socket *so, int optname, struct mbuf **mp)
> +ip_mrouter_set(struct socket *so, int optname, struct mbuf *m)
>  {
>       struct inpcb *inp = sotoinpcb(so);
>       int error;
> @@ -184,32 +184,32 @@ ip_mrouter_set(struct socket *so, int op
>       else
>               switch (optname) {
>               case MRT_INIT:
> -                     error = ip_mrouter_init(so, *mp);
> +                     error = ip_mrouter_init(so, m);
>                       break;
>               case MRT_DONE:
>                       error = ip_mrouter_done(so);
>                       break;
>               case MRT_ADD_VIF:
> -                     error = add_vif(so, *mp);
> +                     error = add_vif(so, m);
>                       break;
>               case MRT_DEL_VIF:
> -                     error = del_vif(so, *mp);
> +                     error = del_vif(so, m);
>                       break;
>               case MRT_ADD_MFC:
> -                     error = add_mfc(so, *mp);
> +                     error = add_mfc(so, m);
>                       break;
>               case MRT_DEL_MFC:
> -                     error = del_mfc(so, *mp);
> +                     error = del_mfc(so, m);
>                       break;
>               case MRT_API_CONFIG:
> -                     error = set_api_config(so, *mp);
> +                     error = set_api_config(so, m);
>                       break;
>               default:
>                       error = ENOPROTOOPT;
>                       break;
>               }
>  
> -     m_free(*mp);
> +     m_free(m);
>       return (error);
>  }
>  
> @@ -217,7 +217,7 @@ ip_mrouter_set(struct socket *so, int op
>   * Handle MRT getsockopt commands
>   */
>  int
> -ip_mrouter_get(struct socket *so, int optname, struct mbuf **mp)
> +ip_mrouter_get(struct socket *so, int optname, struct mbuf *m)
>  {
>       struct inpcb *inp = sotoinpcb(so);
>       int error;
> @@ -225,25 +225,20 @@ ip_mrouter_get(struct socket *so, int op
>       if (so != ip_mrouter[inp->inp_rtableid])
>               error = ENOPROTOOPT;
>       else {
> -             *mp = m_get(M_WAIT, MT_SOOPTS);
> -
>               switch (optname) {
>               case MRT_VERSION:
> -                     error = get_version(*mp);
> +                     error = get_version(m);
>                       break;
>               case MRT_API_SUPPORT:
> -                     error = get_api_support(*mp);
> +                     error = get_api_support(m);
>                       break;
>               case MRT_API_CONFIG:
> -                     error = get_api_config(*mp);
> +                     error = get_api_config(m);
>                       break;
>               default:
>                       error = ENOPROTOOPT;
>                       break;
>               }
> -
> -             if (error)
> -                     m_free(*mp);
>       }
>  
>       return (error);
> Index: netinet/ip_mroute.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_mroute.h,v
> retrieving revision 1.27
> diff -u -p -r1.27 ip_mroute.h
> --- netinet/ip_mroute.h       12 Jan 2017 08:22:42 -0000      1.27
> +++ netinet/ip_mroute.h       31 Jan 2017 20:29:38 -0000
> @@ -223,8 +223,8 @@ struct igmpmsg {
>       struct    in_addr im_src, im_dst;
>  };
>  
> -int  ip_mrouter_set(struct socket *, int, struct mbuf **);
> -int  ip_mrouter_get(struct socket *, int, struct mbuf **);
> +int  ip_mrouter_set(struct socket *, int, struct mbuf *);
> +int  ip_mrouter_get(struct socket *, int, struct mbuf *);
>  int  mrt_ioctl(struct socket *, u_long, caddr_t);
>  int  mrt_sysctl_vif(void *, size_t *);
>  int  mrt_sysctl_mfc(void *, size_t *);
> Index: netinet/ip_output.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_output.c,v
> retrieving revision 1.334
> diff -u -p -r1.334 ip_output.c
> --- netinet/ip_output.c       10 Jan 2017 09:01:18 -0000      1.334
> +++ netinet/ip_output.c       31 Jan 2017 20:29:38 -0000
> @@ -845,10 +845,9 @@ ip_optcopy(struct ip *ip, struct ip *jp)
>   */
>  int
>  ip_ctloutput(int op, struct socket *so, int level, int optname,
> -    struct mbuf **mp)
> +    struct mbuf *m)
>  {
>       struct inpcb *inp = sotoinpcb(so);
> -     struct mbuf *m = *mp;
>       int optval = 0;
>       struct proc *p = curproc; /* XXX */
>       int error = 0;
> @@ -857,7 +856,7 @@ ip_ctloutput(int op, struct socket *so, 
>       if (level != IPPROTO_IP) {
>               error = EINVAL;
>               if (op == PRCO_SETOPT)
> -                     (void) m_free(*mp);
> +                     (void) m_free(m);
>       } else switch (op) {
>       case PRCO_SETOPT:
>               switch (optname) {
> @@ -1081,7 +1080,6 @@ ip_ctloutput(int op, struct socket *so, 
>               switch (optname) {
>               case IP_OPTIONS:
>               case IP_RETOPTS:
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
>                       if (inp->inp_options) {
>                               m->m_len = inp->inp_options->m_len;
>                               memcpy(mtod(m, caddr_t),
> @@ -1102,7 +1100,6 @@ ip_ctloutput(int op, struct socket *so, 
>               case IP_RECVRTABLE:
>               case IP_IPSECFLOWINFO:
>               case IP_IPDEFTTL:
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
>                       m->m_len = sizeof(int);
>                       switch (optname) {
>  
> @@ -1159,11 +1156,10 @@ ip_ctloutput(int op, struct socket *so, 
>               case IP_MULTICAST_LOOP:
>               case IP_ADD_MEMBERSHIP:
>               case IP_DROP_MEMBERSHIP:
> -                     error = ip_getmoptions(optname, inp->inp_moptions, mp);
> +                     error = ip_getmoptions(optname, inp->inp_moptions, m);
>                       break;
>  
>               case IP_PORTRANGE:
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
>                       m->m_len = sizeof(int);
>  
>                       if (inp->inp_flags & INP_HIGHPORT)
> @@ -1180,12 +1176,10 @@ ip_ctloutput(int op, struct socket *so, 
>               case IP_ESP_TRANS_LEVEL:
>               case IP_ESP_NETWORK_LEVEL:
>               case IP_IPCOMP_LEVEL:
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
> -#ifndef IPSEC
>                       m->m_len = sizeof(int);
> +#ifndef IPSEC
>                       *mtod(m, int *) = IPSEC_LEVEL_NONE;
>  #else
> -                     m->m_len = sizeof(int);
>                       switch (optname) {
>                       case IP_AUTH_LEVEL:
>                               optval = inp->inp_seclevel[SL_AUTH];
> @@ -1210,12 +1204,10 @@ ip_ctloutput(int op, struct socket *so, 
>                       error = EOPNOTSUPP;
>                       break;
>               case SO_RTABLE:
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
>                       m->m_len = sizeof(u_int);
>                       *mtod(m, u_int *) = inp->inp_rtableid;
>                       break;
>               case IP_PIPEX:
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
>                       m->m_len = sizeof(int);
>                       *mtod(m, int *) = inp->inp_pipex;
>                       break;
> @@ -1624,7 +1616,7 @@ ip_setmoptions(int optname, struct ip_mo
>   * Return the IP multicast options in response to user getsockopt().
>   */
>  int
> -ip_getmoptions(int optname, struct ip_moptions *imo, struct mbuf **mp)
> +ip_getmoptions(int optname, struct ip_moptions *imo, struct mbuf *m)
>  {
>       u_char *ttl;
>       u_char *loop;
> @@ -1632,13 +1624,10 @@ ip_getmoptions(int optname, struct ip_mo
>       struct in_ifaddr *ia;
>       struct ifnet *ifp;
>  
> -     *mp = m_get(M_WAIT, MT_SOOPTS);
> -
>       switch (optname) {
> -
>       case IP_MULTICAST_IF:
> -             addr = mtod(*mp, struct in_addr *);
> -             (*mp)->m_len = sizeof(struct in_addr);
> +             addr = mtod(m, struct in_addr *);
> +             m->m_len = sizeof(struct in_addr);
>               if (imo == NULL || (ifp = if_get(imo->imo_ifidx)) == NULL)
>                       addr->s_addr = INADDR_ANY;
>               else {
> @@ -1650,15 +1639,15 @@ ip_getmoptions(int optname, struct ip_mo
>               return (0);
>  
>       case IP_MULTICAST_TTL:
> -             ttl = mtod(*mp, u_char *);
> -             (*mp)->m_len = 1;
> +             ttl = mtod(m, u_char *);
> +             m->m_len = 1;
>               *ttl = (imo == NULL) ? IP_DEFAULT_MULTICAST_TTL
>                                    : imo->imo_ttl;
>               return (0);
>  
>       case IP_MULTICAST_LOOP:
> -             loop = mtod(*mp, u_char *);
> -             (*mp)->m_len = 1;
> +             loop = mtod(m, u_char *);
> +             m->m_len = 1;
>               *loop = (imo == NULL) ? IP_DEFAULT_MULTICAST_LOOP
>                                     : imo->imo_loop;
>               return (0);
> Index: netinet/ip_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_var.h,v
> retrieving revision 1.67
> diff -u -p -r1.67 ip_var.h
> --- netinet/ip_var.h  29 Jan 2017 19:58:47 -0000      1.67
> +++ netinet/ip_var.h  31 Jan 2017 20:29:38 -0000
> @@ -219,13 +219,13 @@ extern struct pool ipqent_pool;
>  struct route;
>  struct inpcb;
>  
> -int   ip_ctloutput(int, struct socket *, int, int, struct mbuf **);
> +int   ip_ctloutput(int, struct socket *, int, int, struct mbuf *);
>  void  ip_drain(void);
>  void  ip_flush(void);
>  int   ip_fragment(struct mbuf *, struct ifnet *, u_long);
>  void  ip_freef(struct ipq *);
>  void  ip_freemoptions(struct ip_moptions *);
> -int   ip_getmoptions(int, struct ip_moptions *, struct mbuf **);
> +int   ip_getmoptions(int, struct ip_moptions *, struct mbuf *);
>  void  ip_init(void);
>  struct mbuf*
>        ip_insertoptions(struct mbuf *, struct mbuf *, int *);
> @@ -250,7 +250,7 @@ void       ip_savecontrol(struct inpcb *, str
>  void  ipintr(void);
>  void  ipv4_input(struct mbuf *);
>  void  ip_forward(struct mbuf *, struct ifnet *, struct rtentry *, int);
> -int   rip_ctloutput(int, struct socket *, int, int, struct mbuf **);
> +int   rip_ctloutput(int, struct socket *, int, int, struct mbuf *);
>  void  rip_init(void);
>  int   rip_input(struct mbuf **, int *, int);
>  int   rip_output(struct mbuf *, ...);
> Index: netinet/raw_ip.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/raw_ip.c,v
> retrieving revision 1.94
> diff -u -p -r1.94 raw_ip.c
> --- netinet/raw_ip.c  29 Jan 2017 19:58:47 -0000      1.94
> +++ netinet/raw_ip.c  31 Jan 2017 20:29:38 -0000
> @@ -299,7 +299,7 @@ rip_output(struct mbuf *m, ...)
>   */
>  int
>  rip_ctloutput(int op, struct socket *so, int level, int optname,
> -    struct mbuf **mp)
> +    struct mbuf *m)
>  {
>       struct inpcb *inp = sotoinpcb(so);
>       int error = 0;
> @@ -307,7 +307,7 @@ rip_ctloutput(int op, struct socket *so,
>  
>       if (level != IPPROTO_IP) {
>               if (op == PRCO_SETOPT)
> -                     (void) m_free(*mp);
> +                     (void) m_free(m);
>               return (EINVAL);
>       }
>  
> @@ -316,28 +316,27 @@ rip_ctloutput(int op, struct socket *so,
>       case IP_HDRINCL:
>               error = 0;
>               if (op == PRCO_SETOPT) {
> -                     if (*mp == NULL || (*mp)->m_len < sizeof (int))
> +                     if (m == NULL || m->m_len < sizeof (int))
>                               error = EINVAL;
> -                     else if (*mtod(*mp, int *))
> +                     else if (*mtod(m, int *))
>                               inp->inp_flags |= INP_HDRINCL;
>                       else
>                               inp->inp_flags &= ~INP_HDRINCL;
> -                     m_free(*mp);
> +                     m_free(m);
>               } else {
> -                     *mp = m_get(M_WAIT, M_SOOPTS);
> -                     (*mp)->m_len = sizeof(int);
> -                     *mtod(*mp, int *) = inp->inp_flags & INP_HDRINCL;
> +                     m->m_len = sizeof(int);
> +                     *mtod(m, int *) = inp->inp_flags & INP_HDRINCL;
>               }
>               return (error);
>  
>       case IP_DIVERTFL:
>               switch (op) {
>               case PRCO_SETOPT:
> -                     if (*mp == NULL || (*mp)->m_len < sizeof (int)) {
> +                     if (m == NULL || m->m_len < sizeof (int)) {
>                               error = EINVAL;
>                               break;
>                       }
> -                     dir = *mtod(*mp, int *);
> +                     dir = *mtod(m, int *);
>                       if (inp->inp_divertfl > 0)
>                               error = ENOTSUP;
>                       else if ((dir & IPPROTO_DIVERT_RESP) ||
> @@ -349,9 +348,8 @@ rip_ctloutput(int op, struct socket *so,
>                       break;
>  
>               case PRCO_GETOPT:
> -                     *mp = m_get(M_WAIT, M_SOOPTS);
> -                     (*mp)->m_len = sizeof(int);
> -                     *mtod(*mp, int *) = inp->inp_divertfl;
> +                     m->m_len = sizeof(int);
> +                     *mtod(m, int *) = inp->inp_divertfl;
>                       break;
>  
>               default:
> @@ -360,7 +358,7 @@ rip_ctloutput(int op, struct socket *so,
>               }
>  
>               if (op == PRCO_SETOPT)
> -                     (void)m_free(*mp);
> +                     (void)m_free(m);
>               return (error);
>  
>       case MRT_INIT:
> @@ -376,10 +374,10 @@ rip_ctloutput(int op, struct socket *so,
>  #ifdef MROUTING
>               switch (op) {
>               case PRCO_SETOPT:
> -                     error = ip_mrouter_set(so, optname, mp);
> +                     error = ip_mrouter_set(so, optname, m);
>                       break;
>               case PRCO_GETOPT:
> -                     error = ip_mrouter_get(so, optname, mp);
> +                     error = ip_mrouter_get(so, optname, m);
>                       break;
>               default:
>                       error = EINVAL;
> @@ -388,11 +386,11 @@ rip_ctloutput(int op, struct socket *so,
>               return (error);
>  #else
>               if (op == PRCO_SETOPT)
> -                     m_free(*mp);
> +                     m_free(m);
>               return (EOPNOTSUPP);
>  #endif
>       }
> -     return (ip_ctloutput(op, so, level, optname, mp));
> +     return (ip_ctloutput(op, so, level, optname, m));
>  }
>  
>  u_long       rip_sendspace = RIPSNDQ;
> Index: netinet/tcp_usrreq.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v
> retrieving revision 1.142
> diff -u -p -r1.142 tcp_usrreq.c
> --- netinet/tcp_usrreq.c      10 Jan 2017 09:01:18 -0000      1.142
> +++ netinet/tcp_usrreq.c      31 Jan 2017 20:29:38 -0000
> @@ -449,29 +449,28 @@ tcp_usrreq(struct socket *so, int req, s
>  
>  int
>  tcp_ctloutput(int op, struct socket *so, int level, int optname,
> -    struct mbuf **mp)
> +    struct mbuf *m)
>  {
>       int error = 0;
>       struct inpcb *inp;
>       struct tcpcb *tp;
> -     struct mbuf *m;
>       int i;
>  
>       inp = sotoinpcb(so);
>       if (inp == NULL) {
>               if (op == PRCO_SETOPT)
> -                     (void) m_free(*mp);
> +                     (void) m_free(m);
>               return (ECONNRESET);
>       }
>       if (level != IPPROTO_TCP) {
>               switch (so->so_proto->pr_domain->dom_family) {
>  #ifdef INET6
>               case PF_INET6:
> -                     error = ip6_ctloutput(op, so, level, optname, mp);
> +                     error = ip6_ctloutput(op, so, level, optname, m);
>                       break;
>  #endif /* INET6 */
>               case PF_INET:
> -                     error = ip_ctloutput(op, so, level, optname, mp);
> +                     error = ip_ctloutput(op, so, level, optname, m);
>                       break;
>               default:
>                       error = EAFNOSUPPORT;   /*?*/
> @@ -484,7 +483,6 @@ tcp_ctloutput(int op, struct socket *so,
>       switch (op) {
>  
>       case PRCO_SETOPT:
> -             m = *mp;
>               switch (optname) {
>  
>               case TCP_NODELAY:
> @@ -573,7 +571,6 @@ tcp_ctloutput(int op, struct socket *so,
>               break;
>  
>       case PRCO_GETOPT:
> -             *mp = m = m_get(M_WAIT, MT_SOOPTS);
>               m->m_len = sizeof(int);
>  
>               switch (optname) {
> Index: netinet/tcp_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/tcp_var.h,v
> retrieving revision 1.120
> diff -u -p -r1.120 tcp_var.h
> --- netinet/tcp_var.h 29 Jan 2017 19:58:47 -0000      1.120
> +++ netinet/tcp_var.h 31 Jan 2017 20:29:38 -0000
> @@ -602,7 +602,7 @@ int        tcp_freeq(struct tcpcb *);
>  void  tcp6_ctlinput(int, struct sockaddr *, u_int, void *);
>  #endif
>  void  tcp_ctlinput(int, struct sockaddr *, u_int, void *);
> -int   tcp_ctloutput(int, struct socket *, int, int, struct mbuf **);
> +int   tcp_ctloutput(int, struct socket *, int, int, struct mbuf *);
>  struct tcpcb *
>        tcp_disconnect(struct tcpcb *);
>  struct tcpcb *
> Index: netinet6/icmp6.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/icmp6.c,v
> retrieving revision 1.197
> diff -u -p -r1.197 icmp6.c
> --- netinet6/icmp6.c  19 Jan 2017 14:49:19 -0000      1.197
> +++ netinet6/icmp6.c  31 Jan 2017 20:29:38 -0000
> @@ -1802,11 +1802,10 @@ fail:
>   */
>  int
>  icmp6_ctloutput(int op, struct socket *so, int level, int optname,
> -    struct mbuf **mp)
> +    struct mbuf *m)
>  {
>       int error = 0;
>       struct inpcb *in6p = sotoinpcb(so);
> -     struct mbuf *m = *mp;
>  
>       if (level != IPPROTO_ICMPV6) {
>               if (op == PRCO_SETOPT)
> @@ -1853,7 +1852,6 @@ icmp6_ctloutput(int op, struct socket *s
>                               error = EINVAL;
>                               break;
>                       }
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
>                       m->m_len = sizeof(struct icmp6_filter);
>                       p = mtod(m, struct icmp6_filter *);
>                       bcopy(in6p->inp_icmp6filt, p,
> Index: netinet6/ip6_mroute.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_mroute.c,v
> retrieving revision 1.107
> diff -u -p -r1.107 ip6_mroute.c
> --- netinet6/ip6_mroute.c     6 Jan 2017 10:02:57 -0000       1.107
> +++ netinet6/ip6_mroute.c     31 Jan 2017 20:29:38 -0000
> @@ -245,12 +245,10 @@ ip6_mrouter_set(int cmd, struct socket *
>   * Handle MRT getsockopt commands
>   */
>  int
> -ip6_mrouter_get(int cmd, struct socket *so, struct mbuf **mp)
> +ip6_mrouter_get(int cmd, struct socket *so, struct mbuf *m)
>  {
>       if (so != ip6_mrouter)
>               return (EPERM);
> -
> -     *mp = m_get(M_WAIT, MT_SOOPTS);
>  
>       switch (cmd) {
>       default:
> Index: netinet6/ip6_mroute.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_mroute.h,v
> retrieving revision 1.17
> diff -u -p -r1.17 ip6_mroute.h
> --- netinet6/ip6_mroute.h     22 Dec 2016 11:04:44 -0000      1.17
> +++ netinet6/ip6_mroute.h     31 Jan 2017 20:29:38 -0000
> @@ -247,7 +247,7 @@ struct rtdetq {           /* XXX: rtdetq is also 
>  #define MAX_UPQ6     4               /* max. no of pkts in upcall Q */
>  
>  int  ip6_mrouter_set(int, struct socket *, struct mbuf *);
> -int  ip6_mrouter_get(int, struct socket *, struct mbuf **);
> +int  ip6_mrouter_get(int, struct socket *, struct mbuf *);
>  int  ip6_mrouter_done(void);
>  void ip6_mrouter_detach(struct ifnet *);
>  int  mrt6_ioctl(u_long, caddr_t);
> Index: netinet6/ip6_output.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_output.c,v
> retrieving revision 1.222
> diff -u -p -r1.222 ip6_output.c
> --- netinet6/ip6_output.c     27 Jan 2017 02:55:36 -0000      1.222
> +++ netinet6/ip6_output.c     31 Jan 2017 20:29:38 -0000
> @@ -117,10 +117,10 @@ struct ip6_exthdrs {
>  };
>  
>  int ip6_pcbopt(int, u_char *, int, struct ip6_pktopts **, int, int);
> -int ip6_getpcbopt(struct ip6_pktopts *, int, struct mbuf **);
> +int ip6_getpcbopt(struct ip6_pktopts *, int, struct mbuf *);
>  int ip6_setpktopt(int, u_char *, int, struct ip6_pktopts *, int, int, int);
>  int ip6_setmoptions(int, struct ip6_moptions **, struct mbuf *);
> -int ip6_getmoptions(int, struct ip6_moptions *, struct mbuf **);
> +int ip6_getmoptions(int, struct ip6_moptions *, struct mbuf *);
>  int ip6_copyexthdr(struct mbuf **, caddr_t, int);
>  int ip6_insertfraghdr(struct mbuf *, struct mbuf *, int,
>       struct ip6_frag **);
> @@ -1048,12 +1048,11 @@ ip6_getpmtu(struct rtentry *rt, struct i
>   */
>  int
>  ip6_ctloutput(int op, struct socket *so, int level, int optname,
> -    struct mbuf **mp)
> +    struct mbuf *m)
>  {
>       int privileged, optdatalen, uproto;
>       void *optdata;
>       struct inpcb *inp = sotoinpcb(so);
> -     struct mbuf *m = *mp;
>       int error, optval;
>       struct proc *p = curproc; /* For IPSec and rdomain */
>       u_int rtid = 0;
> @@ -1475,7 +1474,6 @@ do { \
>                               }
>                               if (error)
>                                       break;
> -                             *mp = m = m_get(M_WAIT, MT_SOOPTS);
>                               m->m_len = sizeof(int);
>                               *mtod(m, int *) = optval;
>                               break;
> @@ -1515,7 +1513,6 @@ do { \
>                               optdatalen = sizeof(mtuinfo);
>                               if (optdatalen > MCLBYTES)
>                                       return (EMSGSIZE); /* XXX */
> -                             *mp = m = m_get(M_WAIT, MT_SOOPTS);
>                               if (optdatalen > MLEN)
>                                       MCLGET(m, M_WAIT);
>                               m->m_len = optdatalen;
> @@ -1532,7 +1529,7 @@ do { \
>                       case IPV6_DONTFRAG:
>                       case IPV6_USE_MIN_MTU:
>                               error = ip6_getpcbopt(inp->inp_outputopts6,
> -                                 optname, mp);
> +                                 optname, m);
>                               break;
>  
>                       case IPV6_MULTICAST_IF:
> @@ -1541,7 +1538,7 @@ do { \
>                       case IPV6_JOIN_GROUP:
>                       case IPV6_LEAVE_GROUP:
>                               error = ip6_getmoptions(optname,
> -                                 inp->inp_moptions6, mp);
> +                                 inp->inp_moptions6, m);
>                               break;
>  
>                       case IPSEC6_OUTSA:
> @@ -1552,7 +1549,6 @@ do { \
>                       case IPV6_ESP_TRANS_LEVEL:
>                       case IPV6_ESP_NETWORK_LEVEL:
>                       case IPV6_IPCOMP_LEVEL:
> -                             *mp = m = m_get(M_WAIT, MT_SOOPTS);
>  #ifndef IPSEC
>                               m->m_len = sizeof(int);
>                               *mtod(m, int *) = IPSEC_LEVEL_NONE;
> @@ -1581,12 +1577,10 @@ do { \
>  #endif
>                               break;
>                       case SO_RTABLE:
> -                             *mp = m = m_get(M_WAIT, MT_SOOPTS);
>                               m->m_len = sizeof(u_int);
>                               *mtod(m, u_int *) = optval;
>                               break;
>                       case IPV6_PIPEX:
> -                             *mp = m = m_get(M_WAIT, MT_SOOPTS);
>                               m->m_len = sizeof(int);
>                               *mtod(m, int *) = optval;
>                               break;
> @@ -1600,23 +1594,22 @@ do { \
>       } else {
>               error = EINVAL;
>               if (op == PRCO_SETOPT)
> -                     (void)m_free(*mp);
> +                     (void)m_free(m);
>       }
>       return (error);
>  }
>  
>  int
>  ip6_raw_ctloutput(int op, struct socket *so, int level, int optname,
> -    struct mbuf **mp)
> +    struct mbuf *m)
>  {
>       int error = 0, optval;
>       const int icmp6off = offsetof(struct icmp6_hdr, icmp6_cksum);
>       struct inpcb *inp = sotoinpcb(so);
> -     struct mbuf *m = *mp;
>  
>       if (level != IPPROTO_IPV6) {
>               if (op == PRCO_SETOPT)
> -                     (void)m_free(*mp);
> +                     (void)m_free(m);
>               return (EINVAL);
>       }
>  
> @@ -1653,7 +1646,6 @@ ip6_raw_ctloutput(int op, struct socket 
>                       else
>                               optval = inp->inp_cksum6;
>  
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
>                       m->m_len = sizeof(int);
>                       *mtod(m, int *) = optval;
>                       break;
> @@ -1682,7 +1674,6 @@ ip6_raw_ctloutput(int op, struct socket 
>  void
>  ip6_initpktopts(struct ip6_pktopts *opt)
>  {
> -
>       bzero(opt, sizeof(*opt));
>       opt->ip6po_hlim = -1;   /* -1 means default hop limit */
>       opt->ip6po_tclass = -1; /* -1 means default traffic class */
> @@ -1706,7 +1697,7 @@ ip6_pcbopt(int optname, u_char *buf, int
>  }
>  
>  int
> -ip6_getpcbopt(struct ip6_pktopts *pktopt, int optname, struct mbuf **mp)
> +ip6_getpcbopt(struct ip6_pktopts *pktopt, int optname, struct mbuf *m)
>  {
>       void *optdata = NULL;
>       int optdatalen = 0;
> @@ -1715,7 +1706,6 @@ ip6_getpcbopt(struct ip6_pktopts *pktopt
>       struct in6_pktinfo null_pktinfo;
>       int deftclass = 0, on;
>       int defminmtu = IP6PO_MINMTU_MCASTONLY;
> -     struct mbuf *m;
>  
>       switch (optname) {
>       case IPV6_PKTINFO:
> @@ -1787,7 +1777,6 @@ ip6_getpcbopt(struct ip6_pktopts *pktopt
>  
>       if (optdatalen > MCLBYTES)
>               return (EMSGSIZE); /* XXX */
> -     *mp = m = m_get(M_WAIT, MT_SOOPTS);
>       if (optdatalen > MLEN)
>               MCLGET(m, M_WAIT);
>       m->m_len = optdatalen;
> @@ -2169,17 +2158,14 @@ ip6_setmoptions(int optname, struct ip6_
>   * Return the IP6 multicast options in response to user getsockopt().
>   */
>  int
> -ip6_getmoptions(int optname, struct ip6_moptions *im6o, struct mbuf **mp)
> +ip6_getmoptions(int optname, struct ip6_moptions *im6o, struct mbuf *m)
>  {
>       u_int *hlim, *loop, *ifindex;
>  
> -     *mp = m_get(M_WAIT, MT_SOOPTS);
> -
>       switch (optname) {
> -
>       case IPV6_MULTICAST_IF:
> -             ifindex = mtod(*mp, u_int *);
> -             (*mp)->m_len = sizeof(u_int);
> +             ifindex = mtod(m, u_int *);
> +             m->m_len = sizeof(u_int);
>               if (im6o == NULL || im6o->im6o_ifidx == 0)
>                       *ifindex = 0;
>               else
> @@ -2187,8 +2173,8 @@ ip6_getmoptions(int optname, struct ip6_
>               return (0);
>  
>       case IPV6_MULTICAST_HOPS:
> -             hlim = mtod(*mp, u_int *);
> -             (*mp)->m_len = sizeof(u_int);
> +             hlim = mtod(m, u_int *);
> +             m->m_len = sizeof(u_int);
>               if (im6o == NULL)
>                       *hlim = ip6_defmcasthlim;
>               else
> @@ -2196,8 +2182,8 @@ ip6_getmoptions(int optname, struct ip6_
>               return (0);
>  
>       case IPV6_MULTICAST_LOOP:
> -             loop = mtod(*mp, u_int *);
> -             (*mp)->m_len = sizeof(u_int);
> +             loop = mtod(m, u_int *);
> +             m->m_len = sizeof(u_int);
>               if (im6o == NULL)
>                       *loop = ip6_defmcasthlim;
>               else
> Index: netinet6/ip6_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_var.h,v
> retrieving revision 1.65
> diff -u -p -r1.65 ip6_var.h
> --- netinet6/ip6_var.h        2 Dec 2016 11:16:04 -0000       1.65
> +++ netinet6/ip6_var.h        31 Jan 2017 20:29:38 -0000
> @@ -241,7 +241,7 @@ extern int ip6_auto_linklocal;
>  struct in6pcb;
>  struct inpcb;
>  
> -int  icmp6_ctloutput(int, struct socket *, int, int, struct mbuf **);
> +int  icmp6_ctloutput(int, struct socket *, int, int, struct mbuf *);
>  
>  void ip6_init(void);
>  void ip6intr(void);
> @@ -264,8 +264,8 @@ void      ip6_mloopback(struct ifnet *, struc
>  int  ip6_output(struct mbuf *, struct ip6_pktopts *, struct route_in6 *, int,
>           struct ip6_moptions *, struct inpcb *);
>  int  ip6_fragment(struct mbuf *, int, u_char, u_long);
> -int  ip6_ctloutput(int, struct socket *, int, int, struct mbuf **);
> -int  ip6_raw_ctloutput(int, struct socket *, int, int, struct mbuf **);
> +int  ip6_ctloutput(int, struct socket *, int, int, struct mbuf *);
> +int  ip6_raw_ctloutput(int, struct socket *, int, int, struct mbuf *);
>  void ip6_initpktopts(struct ip6_pktopts *);
>  int  ip6_setpktopts(struct mbuf *, struct ip6_pktopts *,
>           struct ip6_pktopts *, int, int);
> @@ -285,7 +285,7 @@ void      frag6_drain(void);
>  void rip6_init(void);
>  int  rip6_input(struct mbuf **mp, int *offp, int proto);
>  void rip6_ctlinput(int, struct sockaddr *, u_int, void *);
> -int  rip6_ctloutput(int, struct socket *, int, int, struct mbuf **);
> +int  rip6_ctloutput(int, struct socket *, int, int, struct mbuf *);
>  int  rip6_output(struct mbuf *, ...);
>  int  rip6_usrreq(struct socket *,
>           int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *);
> Index: netinet6/raw_ip6.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/raw_ip6.c,v
> retrieving revision 1.103
> diff -u -p -r1.103 raw_ip6.c
> --- netinet6/raw_ip6.c        23 Jan 2017 16:31:24 -0000      1.103
> +++ netinet6/raw_ip6.c        31 Jan 2017 20:29:38 -0000
> @@ -474,7 +474,7 @@ rip6_output(struct mbuf *m, ...)
>   */
>  int
>  rip6_ctloutput(int op, struct socket *so, int level, int optname,
> -     struct mbuf **mp)
> +    struct mbuf *m)
>  {
>       struct inpcb *inp = sotoinpcb(so);
>       int error = 0;
> @@ -487,11 +487,11 @@ rip6_ctloutput(int op, struct socket *so
>               case IP_DIVERTFL:
>                       switch (op) {
>                       case PRCO_SETOPT:
> -                             if (*mp == NULL || (*mp)->m_len < sizeof(int)) {
> +                             if (m == NULL || m->m_len < sizeof(int)) {
>                                       error = EINVAL;
>                                       break;
>                               }
> -                             dir = *mtod(*mp, int *);
> +                             dir = *mtod(m, int *);
>                               if (inp->inp_divertfl > 0)
>                                       error = ENOTSUP;
>                               else if ((dir & IPPROTO_DIVERT_RESP) ||
> @@ -502,9 +502,8 @@ rip6_ctloutput(int op, struct socket *so
>                               break;
>  
>                       case PRCO_GETOPT:
> -                             *mp = m_get(M_WAIT, M_SOOPTS);
> -                             (*mp)->m_len = sizeof(int);
> -                             *mtod(*mp, int *) = inp->inp_divertfl;
> +                             m->m_len = sizeof(int);
> +                             *mtod(m, int *) = inp->inp_divertfl;
>                               break;
>  
>                       default:
> @@ -513,7 +512,7 @@ rip6_ctloutput(int op, struct socket *so
>                       }
>  
>                       if (op == PRCO_SETOPT)
> -                             (void)m_free(*mp);
> +                             (void)m_free(m);
>                       return (error);
>  
>  #ifdef MROUTING
> @@ -524,18 +523,18 @@ rip6_ctloutput(int op, struct socket *so
>               case MRT6_ADD_MFC:
>               case MRT6_DEL_MFC:
>                       if (op == PRCO_SETOPT) {
> -                             error = ip6_mrouter_set(optname, so, *mp);
> -                             m_free(*mp);
> +                             error = ip6_mrouter_set(optname, so, m);
> +                             m_free(m);
>                       } else if (op == PRCO_GETOPT)
> -                             error = ip6_mrouter_get(optname, so, mp);
> +                             error = ip6_mrouter_get(optname, so, m);
>                       else
>                               error = EINVAL;
>                       return (error);
>  #endif
>               case IPV6_CHECKSUM:
> -                     return (ip6_raw_ctloutput(op, so, level, optname, mp));
> +                     return (ip6_raw_ctloutput(op, so, level, optname, m));
>               default:
> -                     return (ip6_ctloutput(op, so, level, optname, mp));
> +                     return (ip6_ctloutput(op, so, level, optname, m));
>               }
>  
>       case IPPROTO_ICMPV6:
> @@ -543,11 +542,11 @@ rip6_ctloutput(int op, struct socket *so
>                * XXX: is it better to call icmp6_ctloutput() directly
>                * from protosw?
>                */
> -             return (icmp6_ctloutput(op, so, level, optname, mp));
> +             return (icmp6_ctloutput(op, so, level, optname, m));
>  
>       default:
>               if (op == PRCO_SETOPT)
> -                     m_free(*mp);
> +                     m_free(m);
>               return EINVAL;
>       }
>  }
> Index: sys/protosw.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/protosw.h,v
> retrieving revision 1.21
> diff -u -p -r1.21 protosw.h
> --- sys/protosw.h     29 Jan 2017 19:58:47 -0000      1.21
> +++ sys/protosw.h     31 Jan 2017 20:29:38 -0000
> @@ -75,7 +75,7 @@ struct protosw {
>                                       /* control input (from below) */
>       void    (*pr_ctlinput)(int, struct sockaddr *, u_int, void *);
>                                       /* control output (from above) */
> -     int     (*pr_ctloutput)(int, struct socket *, int, int, struct mbuf **);
> +     int     (*pr_ctloutput)(int, struct socket *, int, int, struct mbuf *);
>  
>  /* user-protocol hook */
>                                       /* user request: see list below */

Reply via email to