Much easier to read as well. OK
On Fri, Mar 03, 2017 at 03:49:08PM +0100, Alexander Bluhm wrote:
> Hi,
>
> I prefer compiler checks over variable argument lists.
> So lets convert the pr_output functions.
>
> ok?
>
> bluhm
>
> Index: net/pfkey.c
> ===================================================================
> RCS file: /cvs/src/sys/net/pfkey.c,v
> retrieving revision 1.38
> diff -u -p -r1.38 pfkey.c
> --- net/pfkey.c 2 Mar 2017 08:58:24 -0000 1.38
> +++ net/pfkey.c 3 Mar 2017 14:45:48 -0000
> @@ -90,10 +90,10 @@ static struct pfkey_version *pfkey_versi
>
> struct sockaddr pfkey_addr = { 2, PF_KEY, };
>
> -/* static struct domain pfkeydomain; */
> -static int pfkey_usrreq(struct socket *socket, int req, struct mbuf *mbuf,
> - struct mbuf *nam, struct mbuf *control, struct proc *);
> -static int pfkey_output(struct mbuf *mbuf, struct socket *socket);
> +int pfkey_usrreq(struct socket *, int , struct mbuf *, struct mbuf *,
> + struct mbuf *, struct proc *);
> +int pfkey_output(struct mbuf *, struct socket *, struct sockaddr *,
> + struct mbuf *);
>
> void pfkey_init(void);
> int pfkey_buildprotosw(void);
> @@ -154,8 +154,9 @@ pfkey_sendup(struct socket *socket, stru
> return (0);
> }
>
> -static int
> -pfkey_output(struct mbuf *mbuf, struct socket *socket)
> +int
> +pfkey_output(struct mbuf *mbuf, struct socket *socket, struct sockaddr
> *dstaddr,
> + struct mbuf *control)
> {
> void *message;
> int error = 0;
> @@ -230,7 +231,7 @@ pfkey_detach(struct socket *socket, stru
> return (rval);
> }
>
> -static int
> +int
> pfkey_usrreq(struct socket *socket, int req, struct mbuf *mbuf,
> struct mbuf *nam, struct mbuf *control, struct proc *p)
> {
> @@ -266,7 +267,7 @@ static struct protosw pfkey_protosw_temp
> .pr_domain = &pfkeydomain,
> .pr_protocol = -1,
> .pr_flags = PR_ATOMIC | PR_ADDR,
> - .pr_output = (void *) pfkey_output,
> + .pr_output = pfkey_output,
> .pr_usrreq = pfkey_usrreq
> };
>
> Index: net/raw_usrreq.c
> ===================================================================
> RCS file: /cvs/src/sys/net/raw_usrreq.c,v
> retrieving revision 1.28
> diff -u -p -r1.28 raw_usrreq.c
> --- net/raw_usrreq.c 23 Jan 2017 16:31:24 -0000 1.28
> +++ net/raw_usrreq.c 3 Mar 2017 14:45:48 -0000
> @@ -139,7 +139,7 @@ raw_usrreq(struct socket *so, int req, s
> error = ENOTCONN;
> break;
> }
> - error = (*so->so_proto->pr_output)(m, so);
> + error = (*so->so_proto->pr_output)(m, so, NULL, NULL);
> m = NULL;
> if (nam)
> rp->rcb_faddr = 0;
> Index: net/route.h
> ===================================================================
> RCS file: /cvs/src/sys/net/route.h,v
> retrieving revision 1.157
> diff -u -p -r1.157 route.h
> --- net/route.h 2 Mar 2017 17:09:21 -0000 1.157
> +++ net/route.h 3 Mar 2017 14:45:49 -0000
> @@ -417,7 +417,8 @@ struct sockaddr_in6;
> struct bfd_config;
>
> void route_init(void);
> -int route_output(struct mbuf *, ...);
> +int route_output(struct mbuf *, struct socket *, struct sockaddr *,
> + struct mbuf *);
> int route_usrreq(struct socket *, int, struct mbuf *,
> struct mbuf *, struct mbuf *, struct proc *);
> void rt_ifmsg(struct ifnet *);
> Index: net/rtsock.c
> ===================================================================
> RCS file: /cvs/src/sys/net/rtsock.c,v
> retrieving revision 1.227
> diff -u -p -r1.227 rtsock.c
> --- net/rtsock.c 3 Mar 2017 14:22:40 -0000 1.227
> +++ net/rtsock.c 3 Mar 2017 14:45:49 -0000
> @@ -528,7 +528,8 @@ rt_report(struct rtentry *rt, u_char typ
> }
>
> int
> -route_output(struct mbuf *m, ...)
> +route_output(struct mbuf *m, struct socket *so, struct sockaddr *dstaddr,
> + struct mbuf *control)
> {
> struct rt_msghdr *rtm = NULL;
> struct rtentry *rt = NULL;
> @@ -536,19 +537,13 @@ route_output(struct mbuf *m, ...)
> int plen, len, seq, newgate = 0, error = 0;
> struct ifnet *ifp = NULL;
> struct ifaddr *ifa = NULL;
> - struct socket *so;
> struct rawcb *rp = NULL;
> #ifdef MPLS
> struct sockaddr_mpls *psa_mpls;
> #endif
> - va_list ap;
> u_int tableid;
> u_int8_t prio;
> u_char vers, type;
> -
> - va_start(ap, m);
> - so = va_arg(ap, struct socket *);
> - va_end(ap);
>
> if (m == NULL || ((m->m_len < sizeof(int32_t)) &&
> (m = m_pullup(m, sizeof(int32_t))) == 0))
> Index: netinet/ip_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_var.h,v
> retrieving revision 1.68
> diff -u -p -r1.68 ip_var.h
> --- netinet/ip_var.h 1 Feb 2017 20:59:47 -0000 1.68
> +++ netinet/ip_var.h 3 Mar 2017 14:45:49 -0000
> @@ -253,7 +253,8 @@ void ip_forward(struct mbuf *, struct i
> 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 *, ...);
> +int rip_output(struct mbuf *, struct socket *, struct sockaddr *,
> + struct mbuf *);
> int rip_usrreq(struct socket *,
> int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *);
>
> Index: netinet/raw_ip.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/raw_ip.c,v
> retrieving revision 1.95
> diff -u -p -r1.95 raw_ip.c
> --- netinet/raw_ip.c 1 Feb 2017 20:59:47 -0000 1.95
> +++ netinet/raw_ip.c 3 Mar 2017 14:45:49 -0000
> @@ -207,19 +207,12 @@ rip_input(struct mbuf **mp, int *offp, i
> * Tack on options user may have setup with control call.
> */
> int
> -rip_output(struct mbuf *m, ...)
> +rip_output(struct mbuf *m, struct socket *so, struct sockaddr *dstaddr,
> + struct mbuf *control)
> {
> - struct socket *so;
> - u_long dst;
> struct ip *ip;
> struct inpcb *inp;
> int flags, error;
> - va_list ap;
> -
> - va_start(ap, m);
> - so = va_arg(ap, struct socket *);
> - dst = va_arg(ap, u_long);
> - va_end(ap);
>
> inp = sotoinpcb(so);
> flags = IP_ALLOWBROADCAST;
> @@ -242,7 +235,7 @@ rip_output(struct mbuf *m, ...)
> ip->ip_p = inp->inp_ip.ip_p;
> ip->ip_len = htons(m->m_pkthdr.len);
> ip->ip_src = inp->inp_laddr;
> - ip->ip_dst.s_addr = dst;
> + ip->ip_dst = satosin(dstaddr)->sin_addr;
> ip->ip_ttl = inp->inp_ip.ip_ttl ? inp->inp_ip.ip_ttl : MAXTTL;
> } else {
> if (m->m_pkthdr.len > IP_MAXPACKET) {
> @@ -512,25 +505,29 @@ rip_usrreq(struct socket *so, int req, s
> */
> case PRU_SEND:
> {
> - u_int32_t dst;
> + struct sockaddr_in dst;
>
> + memset(&dst, 0, sizeof(dst));
> + dst.sin_family = AF_INET;
> + dst.sin_len = sizeof(dst);
> if (so->so_state & SS_ISCONNECTED) {
> if (nam) {
> error = EISCONN;
> break;
> }
> - dst = inp->inp_faddr.s_addr;
> + dst.sin_addr = inp->inp_faddr;
> } else {
> if (nam == NULL) {
> error = ENOTCONN;
> break;
> }
> - dst = mtod(nam, struct sockaddr_in *)->sin_addr.s_addr;
> + dst.sin_addr =
> + mtod(nam, struct sockaddr_in *)->sin_addr;
> }
> #ifdef IPSEC
> /* XXX Find an IPsec TDB */
> #endif
> - error = rip_output(m, so, dst);
> + error = rip_output(m, so, sintosa(&dst), NULL);
> m = NULL;
> break;
> }
> Index: netinet6/ip6_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_var.h,v
> retrieving revision 1.69
> diff -u -p -r1.69 ip6_var.h
> --- netinet6/ip6_var.h 28 Feb 2017 09:59:34 -0000 1.69
> +++ netinet6/ip6_var.h 3 Mar 2017 14:45:49 -0000
> @@ -345,7 +345,8 @@ 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_output(struct mbuf *, ...);
> +int rip6_output(struct mbuf *, struct socket *, struct sockaddr *,
> + struct mbuf *);
> int rip6_usrreq(struct socket *,
> int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *);
> int rip6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
> Index: netinet6/raw_ip6.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/raw_ip6.c,v
> retrieving revision 1.106
> diff -u -p -r1.106 raw_ip6.c
> --- netinet6/raw_ip6.c 9 Feb 2017 15:23:35 -0000 1.106
> +++ netinet6/raw_ip6.c 3 Mar 2017 14:45:50 -0000
> @@ -317,11 +317,9 @@ rip6_ctlinput(int cmd, struct sockaddr *
> * Tack on options user may have setup with control call.
> */
> int
> -rip6_output(struct mbuf *m, ...)
> +rip6_output(struct mbuf *m, struct socket *so, struct sockaddr *dstaddr,
> + struct mbuf *control)
> {
> - struct socket *so;
> - struct sockaddr_in6 *dstsock;
> - struct mbuf *control;
> struct in6_addr *dst;
> struct ip6_hdr *ip6;
> struct inpcb *in6p;
> @@ -330,21 +328,14 @@ rip6_output(struct mbuf *m, ...)
> struct ip6_pktopts opt, *optp = NULL, *origoptp;
> int type; /* for ICMPv6 output statistics only */
> int priv = 0;
> - va_list ap;
> int flags;
>
> - va_start(ap, m);
> - so = va_arg(ap, struct socket *);
> - dstsock = va_arg(ap, struct sockaddr_in6 *);
> - control = va_arg(ap, struct mbuf *);
> - va_end(ap);
> -
> in6p = sotoinpcb(so);
>
> priv = 0;
> if ((so->so_state & SS_PRIV) != 0)
> priv = 1;
> - dst = &dstsock->sin6_addr;
> + dst = &satosin6(dstaddr)->sin6_addr;
> if (control) {
> if ((error = ip6_setpktopts(control, &opt,
> in6p->inp_outputopts6,
> @@ -384,7 +375,7 @@ rip6_output(struct mbuf *m, ...)
> /* KAME hack: embed scopeid */
> origoptp = in6p->inp_outputopts6;
> in6p->inp_outputopts6 = optp;
> - if (in6_embedscope(&ip6->ip6_dst, dstsock, in6p) != 0) {
> + if (in6_embedscope(&ip6->ip6_dst, satosin6(dstaddr), in6p) != 0) {
> error = EINVAL;
> goto bad;
> }
> @@ -396,7 +387,7 @@ rip6_output(struct mbuf *m, ...)
> {
> struct in6_addr *in6a;
>
> - error = in6_pcbselsrc(&in6a, dstsock, in6p, optp);
> + error = in6_pcbselsrc(&in6a, satosin6(dstaddr), in6p, optp);
> if (error)
> goto bad;
>
> @@ -732,7 +723,7 @@ rip6_usrreq(struct socket *so, int req,
> break;
> }
> }
> - error = rip6_output(m, so, dst, control);
> + error = rip6_output(m, so, sin6tosa(dst), control);
> m = NULL;
> break;
> }
> Index: sys/protosw.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/protosw.h,v
> retrieving revision 1.22
> diff -u -p -r1.22 protosw.h
> --- sys/protosw.h 1 Feb 2017 20:59:47 -0000 1.22
> +++ sys/protosw.h 3 Mar 2017 14:45:50 -0000
> @@ -71,7 +71,8 @@ struct protosw {
> /* input to protocol (from below) */
> int (*pr_input)(struct mbuf **, int *, int);
> /* output to protocol (from above) */
> - int (*pr_output)(struct mbuf *, ...);
> + int (*pr_output)(struct mbuf *, struct socket *, struct sockaddr *,
> + struct mbuf *);
> /* control input (from below) */
> void (*pr_ctlinput)(int, struct sockaddr *, u_int, void *);
> /* control output (from above) */
>