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;
>