On 27/01/17(Fri) 14:33, David Hill wrote:
> [...] 
> Forgot a file...   Try this:

Is it now possible to pass a 'struct mbuf *' instead of a 'struct mbuf **'
to the pr_ctloutput() functions?

Changing the signature would ensure we do not miss a call.  This would
also simplify the SETOPT case.

> Index: kern/uipc_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_socket.c,v
> retrieving revision 1.174
> diff -u -p -r1.174 uipc_socket.c
> --- kern/uipc_socket.c        26 Jan 2017 00:08:50 -0000      1.174
> +++ kern/uipc_socket.c        27 Jan 2017 19:30:31 -0000
> @@ -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,21 +1843,25 @@ 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) {
>                               struct domain *dom = so->so_proto->pr_domain;
>  
>                               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 +1892,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.220
> diff -u -p -r1.220 rtsock.c
> --- net/rtsock.c      24 Jan 2017 00:17:14 -0000      1.220
> +++ net/rtsock.c      27 Jan 2017 19:30:31 -0000
> @@ -277,12 +277,12 @@ route_ctloutput(int op, struct socket *s
>       case PRCO_GETOPT:
>               switch (optname) {
>               case ROUTE_MSGFILTER:
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
> +                     m = *mp;
>                       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 = *mp;
>                       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       27 Jan 2017 19:30:31 -0000
> @@ -225,8 +225,6 @@ 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);
> @@ -241,9 +239,6 @@ ip_mrouter_get(struct socket *so, int op
>                       error = ENOPROTOOPT;
>                       break;
>               }
> -
> -             if (error)
> -                     m_free(*mp);
>       }
>  
>       return (error);
> 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       27 Jan 2017 19:30:31 -0000
> @@ -1081,7 +1081,7 @@ ip_ctloutput(int op, struct socket *so, 
>               switch (optname) {
>               case IP_OPTIONS:
>               case IP_RETOPTS:
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
> +                     m = *mp;
>                       if (inp->inp_options) {
>                               m->m_len = inp->inp_options->m_len;
>                               memcpy(mtod(m, caddr_t),
> @@ -1102,7 +1102,7 @@ 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 = *mp;
>                       m->m_len = sizeof(int);
>                       switch (optname) {
>  
> @@ -1163,7 +1163,7 @@ ip_ctloutput(int op, struct socket *so, 
>                       break;
>  
>               case IP_PORTRANGE:
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
> +                     m = *mp;
>                       m->m_len = sizeof(int);
>  
>                       if (inp->inp_flags & INP_HIGHPORT)
> @@ -1180,12 +1180,11 @@ 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 = *mp;
>                       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 +1209,12 @@ ip_ctloutput(int op, struct socket *so, 
>                       error = EOPNOTSUPP;
>                       break;
>               case SO_RTABLE:
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
> +                     m = *mp;
>                       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 = *mp;
>                       m->m_len = sizeof(int);
>                       *mtod(m, int *) = inp->inp_pipex;
>                       break;
> @@ -1632,10 +1631,7 @@ 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);
> Index: netinet/raw_ip.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/raw_ip.c,v
> retrieving revision 1.93
> diff -u -p -r1.93 raw_ip.c
> --- netinet/raw_ip.c  25 Jan 2017 17:34:31 -0000      1.93
> +++ netinet/raw_ip.c  27 Jan 2017 19:30:31 -0000
> @@ -347,7 +347,6 @@ 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;
>                       break;
> 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      27 Jan 2017 19:30:32 -0000
> @@ -573,7 +573,7 @@ tcp_ctloutput(int op, struct socket *so,
>               break;
>  
>       case PRCO_GETOPT:
> -             *mp = m = m_get(M_WAIT, MT_SOOPTS);
> +             m = *mp;
>               m->m_len = sizeof(int);
>  
>               switch (optname) {
> 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  27 Jan 2017 19:30:32 -0000
> @@ -1853,7 +1853,7 @@ icmp6_ctloutput(int op, struct socket *s
>                               error = EINVAL;
>                               break;
>                       }
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
> +                     m = *mp;
>                       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     27 Jan 2017 19:30:32 -0000
> @@ -250,8 +250,6 @@ ip6_mrouter_get(int cmd, struct socket *
>       if (so != ip6_mrouter)
>               return (EPERM);
>  
> -     *mp = m_get(M_WAIT, MT_SOOPTS);
> -
>       switch (cmd) {
>       default:
>               return EOPNOTSUPP;
> 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     27 Jan 2017 19:30:32 -0000
> @@ -1475,7 +1475,7 @@ do { \
>                               }
>                               if (error)
>                                       break;
> -                             *mp = m = m_get(M_WAIT, MT_SOOPTS);
> +                             m = *mp;
>                               m->m_len = sizeof(int);
>                               *mtod(m, int *) = optval;
>                               break;
> @@ -1515,7 +1515,7 @@ do { \
>                               optdatalen = sizeof(mtuinfo);
>                               if (optdatalen > MCLBYTES)
>                                       return (EMSGSIZE); /* XXX */
> -                             *mp = m = m_get(M_WAIT, MT_SOOPTS);
> +                             m = *mp;
>                               if (optdatalen > MLEN)
>                                       MCLGET(m, M_WAIT);
>                               m->m_len = optdatalen;
> @@ -1552,12 +1552,11 @@ do { \
>                       case IPV6_ESP_TRANS_LEVEL:
>                       case IPV6_ESP_NETWORK_LEVEL:
>                       case IPV6_IPCOMP_LEVEL:
> -                             *mp = m = m_get(M_WAIT, MT_SOOPTS);
> +                             m = *mp;
> +                             m->m_len = sizeof(int); 
>  #ifndef IPSEC
> -                             m->m_len = sizeof(int);
>                               *mtod(m, int *) = IPSEC_LEVEL_NONE;
>  #else
> -                             m->m_len = sizeof(int);
>                               switch (optname) {
>                               case IPV6_AUTH_LEVEL:
>                                       optval = inp->inp_seclevel[SL_AUTH];
> @@ -1581,12 +1580,12 @@ do { \
>  #endif
>                               break;
>                       case SO_RTABLE:
> -                             *mp = m = m_get(M_WAIT, MT_SOOPTS);
> +                             m = *mp;
>                               m->m_len = sizeof(u_int);
>                               *mtod(m, u_int *) = optval;
>                               break;
>                       case IPV6_PIPEX:
> -                             *mp = m = m_get(M_WAIT, MT_SOOPTS);
> +                             m = *mp;
>                               m->m_len = sizeof(int);
>                               *mtod(m, int *) = optval;
>                               break;
> @@ -1653,7 +1652,7 @@ ip6_raw_ctloutput(int op, struct socket 
>                       else
>                               optval = inp->inp_cksum6;
>  
> -                     *mp = m = m_get(M_WAIT, MT_SOOPTS);
> +                     m = *mp;
>                       m->m_len = sizeof(int);
>                       *mtod(m, int *) = optval;
>                       break;
> @@ -1682,7 +1681,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 */
> @@ -1787,7 +1785,7 @@ ip6_getpcbopt(struct ip6_pktopts *pktopt
>  
>       if (optdatalen > MCLBYTES)
>               return (EMSGSIZE); /* XXX */
> -     *mp = m = m_get(M_WAIT, MT_SOOPTS);
> +     m = *mp;
>       if (optdatalen > MLEN)
>               MCLGET(m, M_WAIT);
>       m->m_len = optdatalen;
> @@ -2173,10 +2171,7 @@ ip6_getmoptions(int optname, struct ip6_
>  {
>       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);
> 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        27 Jan 2017 19:30:32 -0000
> @@ -502,7 +502,6 @@ 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;
>                               break;
> 

Reply via email to