From f9813c411f470daa9ee84c6608eec5fdfb6663e8 Mon Sep 17 00:00:00 2001 From: vgross Date: Wed, 20 Jul 2016 18:51:50 +0000 Subject: [PATCH] Split in6_selectsrc() into a low-level part and a pcb-level part, and convert in_selectsrc() prototype to match. Ok bluhm@ mpi@. --- sys/netinet/in_pcb.c | 15 +++++++++------ sys/netinet/in_pcb.h | 5 ++--- sys/netinet/udp_usrreq.c | 5 ++--- sys/netinet6/icmp6.c | 4 ++-- sys/netinet6/in6_pcb.c | 6 ++---- sys/netinet6/in6_src.c | 34 +++++++++++++++++++++++++++------- sys/netinet6/ip6_var.h | 7 ++++--- sys/netinet6/nd6_nbr.c | 8 ++++---- sys/netinet6/raw_ip6.c | 10 +++------- sys/netinet6/udp6_output.c | 6 ++---- 10 files changed, 57 insertions(+), 43 deletions(-) diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index 2e47cb7e1a1..d25c04d2293 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in_pcb.c,v 1.210 2016/07/19 14:49:46 mpi Exp $ */ +/* $OpenBSD: in_pcb.c,v 1.211 2016/07/20 18:51:50 vgross Exp $ */ /* $NetBSD: in_pcb.c,v 1.25 1996/02/13 23:41:53 christos Exp $ */ /* @@ -525,8 +525,7 @@ in_pcbconnect(struct inpcb *inp, struct mbuf *nam) if (sin->sin_port == 0) return (EADDRNOTAVAIL); - error = in_selectsrc(&ina, sin, inp->inp_moptions, &inp->inp_route, - &inp->inp_laddr, inp->inp_rtableid); + error = in_pcbselsrc(&ina, sin, inp); if (error) return (error); @@ -876,10 +875,14 @@ in_pcbrtentry(struct inpcb *inp) * an entry to the caller for later use. */ int -in_selectsrc(struct in_addr **insrc, struct sockaddr_in *sin, - struct ip_moptions *mopts, struct route *ro, struct in_addr *laddr, - u_int rtableid) +in_pcbselsrc(struct in_addr **insrc, struct sockaddr_in *sin, + struct inpcb *inp) { + struct ip_moptions *mopts = inp->inp_moptions; + struct route *ro = &inp->inp_route; + struct in_addr *laddr = &inp->inp_laddr; + u_int rtableid = inp->inp_rtableid; + struct sockaddr_in *sin2; struct in_ifaddr *ia = NULL; diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h index db841e327ed..0a67d11746d 100644 --- a/sys/netinet/in_pcb.h +++ b/sys/netinet/in_pcb.h @@ -1,4 +1,4 @@ -/* $OpenBSD: in_pcb.h,v 1.100 2016/06/27 16:33:48 jca Exp $ */ +/* $OpenBSD: in_pcb.h,v 1.101 2016/07/20 18:51:50 vgross Exp $ */ /* $NetBSD: in_pcb.h,v 1.14 1996/02/13 23:42:00 christos Exp $ */ /* @@ -289,8 +289,7 @@ void in_setpeeraddr(struct inpcb *, struct mbuf *); void in_setsockaddr(struct inpcb *, struct mbuf *); int in_baddynamic(u_int16_t, u_int16_t); int in_rootonly(u_int16_t, u_int16_t); -int in_selectsrc(struct in_addr **, struct sockaddr_in *, - struct ip_moptions *, struct route *, struct in_addr *, u_int); +int in_pcbselsrc(struct in_addr **, struct sockaddr_in *, struct inpcb *); struct rtentry * in_pcbrtentry(struct inpcb *); diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 38c54fe434a..f8cd2c950f2 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -1,4 +1,4 @@ -/* $OpenBSD: udp_usrreq.c,v 1.214 2016/06/28 11:22:53 jca Exp $ */ +/* $OpenBSD: udp_usrreq.c,v 1.215 2016/07/20 18:51:50 vgross Exp $ */ /* $NetBSD: udp_usrreq.c,v 1.28 1996/03/16 23:54:03 christos Exp $ */ /* @@ -989,8 +989,7 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct mbuf *addr, goto release; } - error = in_selectsrc(&laddr, sin, inp->inp_moptions, - &inp->inp_route, &inp->inp_laddr, inp->inp_rtableid); + error = in_pcbselsrc(&laddr, sin, inp); if (error) goto release; diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c index 98d1859b3e7..1bfd67f5ada 100644 --- a/sys/netinet6/icmp6.c +++ b/sys/netinet6/icmp6.c @@ -1,4 +1,4 @@ -/* $OpenBSD: icmp6.c,v 1.186 2016/07/05 10:17:14 mpi Exp $ */ +/* $OpenBSD: icmp6.c,v 1.187 2016/07/20 18:51:50 vgross Exp $ */ /* $KAME: icmp6.c,v 1.217 2001/06/20 15:03:29 jinmei Exp $ */ /* @@ -1259,7 +1259,7 @@ icmp6_reflect(struct mbuf *m, size_t off) * source address of the erroneous packet. */ bzero(&ro, sizeof(ro)); - error = in6_selectsrc(&src, &sa6_src, NULL, NULL, &ro, NULL, + error = in6_selectsrc(&src, &sa6_src, NULL, &ro, m->m_pkthdr.ph_rtableid); if (ro.ro_rt) rtfree(ro.ro_rt); /* XXX: we could use this */ diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c index 41df3ee8d0f..c6bdb0b988b 100644 --- a/sys/netinet6/in6_pcb.c +++ b/sys/netinet6/in6_pcb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in6_pcb.c,v 1.93 2016/07/05 10:17:14 mpi Exp $ */ +/* $OpenBSD: in6_pcb.c,v 1.94 2016/07/20 18:51:50 vgross Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -281,9 +281,7 @@ in6_pcbconnect(struct inpcb *inp, struct mbuf *nam) * with the address specified by setsockopt(IPV6_PKTINFO). * Is it the intended behavior? */ - error = in6_selectsrc(&in6a, sin6, inp->inp_outputopts6, - inp->inp_moptions6, &inp->inp_route6, &inp->inp_laddr6, - inp->inp_rtableid); + error = in6_pcbselsrc(&in6a, sin6, inp, inp->inp_outputopts6); if (error) return (error); diff --git a/sys/netinet6/in6_src.c b/sys/netinet6/in6_src.c index fe46fd2da20..26d7df7c5c7 100644 --- a/sys/netinet6/in6_src.c +++ b/sys/netinet6/in6_src.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in6_src.c,v 1.76 2016/07/05 10:17:14 mpi Exp $ */ +/* $OpenBSD: in6_src.c,v 1.77 2016/07/20 18:51:50 vgross Exp $ */ /* $KAME: in6_src.c,v 1.36 2001/02/06 04:08:17 itojun Exp $ */ /* @@ -88,15 +88,18 @@ int in6_selectif(struct sockaddr_in6 *, struct ip6_pktopts *, /* * Return an IPv6 address, which is the most appropriate for a given - * destination and user specified options. - * If necessary, this function lookups the routing table and returns - * an entry to the caller for later use. + * destination and pcb. We need the additional opt parameter because + * the values set at pcb level can be overriden via cmsg. */ int -in6_selectsrc(struct in6_addr **in6src, struct sockaddr_in6 *dstsock, - struct ip6_pktopts *opts, struct ip6_moptions *mopts, - struct route_in6 *ro, struct in6_addr *laddr, u_int rtableid) +in6_pcbselsrc(struct in6_addr **in6src, struct sockaddr_in6 *dstsock, + struct inpcb *inp, struct ip6_pktopts *opts) { + struct ip6_moptions *mopts = inp->inp_moptions6; + struct route_in6 *ro = &inp->inp_route6; + struct in6_addr *laddr = &inp->inp_laddr6; + u_int rtableid = inp->inp_rtableid; + struct ifnet *ifp = NULL; struct in6_addr *dst; struct in6_ifaddr *ia6 = NULL; @@ -169,6 +172,23 @@ in6_selectsrc(struct in6_addr **in6src, struct sockaddr_in6 *dstsock, return (0); } + return in6_selectsrc(in6src, dstsock, mopts, ro, rtableid); +} + +/* + * Return an IPv6 address, which is the most appropriate for a given + * destination and multicast options. + * If necessary, this function lookups the routing table and returns + * an entry to the caller for later use. + */ +int +in6_selectsrc(struct in6_addr **in6src, struct sockaddr_in6 *dstsock, + struct ip6_moptions *mopts, struct route_in6 *ro, u_int rtableid) +{ + struct ifnet *ifp = NULL; + struct in6_addr *dst; + struct in6_ifaddr *ia6 = NULL; + /* * If the destination address is a link-local unicast address or * a link/interface-local multicast address, and if the outgoing diff --git a/sys/netinet6/ip6_var.h b/sys/netinet6/ip6_var.h index 848ad02291d..064221e6275 100644 --- a/sys/netinet6/ip6_var.h +++ b/sys/netinet6/ip6_var.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ip6_var.h,v 1.60 2016/06/01 11:11:44 jca Exp $ */ +/* $OpenBSD: ip6_var.h,v 1.61 2016/07/20 18:51:50 vgross Exp $ */ /* $KAME: ip6_var.h,v 1.33 2000/06/11 14:59:20 jinmei Exp $ */ /* @@ -294,9 +294,10 @@ int rip6_sysctl(int *, u_int, void *, size_t *, void *, size_t); int dest6_input(struct mbuf **, int *, int); int none_input(struct mbuf **, int *, int); +int in6_pcbselsrc(struct in6_addr **, struct sockaddr_in6 *, + struct inpcb *, struct ip6_pktopts *); int in6_selectsrc(struct in6_addr **, struct sockaddr_in6 *, - struct ip6_pktopts *, struct ip6_moptions *, struct route_in6 *, - struct in6_addr *, u_int); + struct ip6_moptions *, struct route_in6 *, u_int); struct rtentry *in6_selectroute(struct sockaddr_in6 *, struct ip6_pktopts *, struct route_in6 *, unsigned int rtableid); diff --git a/sys/netinet6/nd6_nbr.c b/sys/netinet6/nd6_nbr.c index 69e74a14a0e..f701aa4b514 100644 --- a/sys/netinet6/nd6_nbr.c +++ b/sys/netinet6/nd6_nbr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nd6_nbr.c,v 1.105 2016/07/05 10:17:14 mpi Exp $ */ +/* $OpenBSD: nd6_nbr.c,v 1.106 2016/07/20 18:51:50 vgross Exp $ */ /* $KAME: nd6_nbr.c,v 1.61 2001/02/10 16:06:14 jinmei Exp $ */ /* @@ -471,8 +471,8 @@ nd6_ns_output(struct ifnet *ifp, struct in6_addr *daddr6, int error; bcopy(&dst_sa, &ro.ro_dst, sizeof(dst_sa)); - error = in6_selectsrc(&src0, &dst_sa, NULL, NULL, &ro, - NULL, m->m_pkthdr.ph_rtableid); + error = in6_selectsrc(&src0, &dst_sa, NULL, &ro, + m->m_pkthdr.ph_rtableid); if (error) { char addr[INET6_ADDRSTRLEN]; @@ -990,7 +990,7 @@ nd6_na_output(struct ifnet *ifp, struct in6_addr *daddr6, * Select a source whose scope is the same as that of the dest. */ bcopy(&dst_sa, &ro.ro_dst, sizeof(dst_sa)); - error = in6_selectsrc(&src0, &dst_sa, NULL, NULL, &ro, NULL, + error = in6_selectsrc(&src0, &dst_sa, NULL, &ro, m->m_pkthdr.ph_rtableid); if (error) { char addr[INET6_ADDRSTRLEN]; diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c index 724d502837e..da8cd22922a 100644 --- a/sys/netinet6/raw_ip6.c +++ b/sys/netinet6/raw_ip6.c @@ -1,4 +1,4 @@ -/* $OpenBSD: raw_ip6.c,v 1.91 2016/07/05 10:17:14 mpi Exp $ */ +/* $OpenBSD: raw_ip6.c,v 1.92 2016/07/20 18:51:50 vgross Exp $ */ /* $KAME: raw_ip6.c,v 1.69 2001/03/04 15:55:44 itojun Exp $ */ /* @@ -396,9 +396,7 @@ rip6_output(struct mbuf *m, ...) { struct in6_addr *in6a; - error = in6_selectsrc(&in6a, dstsock, optp, - in6p->inp_moptions6, &in6p->inp_route6, &in6p->inp_laddr6, - in6p->inp_rtableid); + error = in6_pcbselsrc(&in6a, dstsock, in6p, optp); if (error) goto bad; @@ -700,9 +698,7 @@ rip6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, } /* Source address selection. XXX: need pcblookup? */ - error = in6_selectsrc(&in6a, addr, in6p->inp_outputopts6, - in6p->inp_moptions6, &in6p->inp_route6, - &in6p->inp_laddr6, in6p->inp_rtableid); + error = in6_pcbselsrc(&in6a, addr, in6p, in6p->inp_outputopts6); if (error) break; in6p->inp_laddr6 = *in6a; diff --git a/sys/netinet6/udp6_output.c b/sys/netinet6/udp6_output.c index c7cb27656fa..61f3b3a4833 100644 --- a/sys/netinet6/udp6_output.c +++ b/sys/netinet6/udp6_output.c @@ -1,4 +1,4 @@ -/* $OpenBSD: udp6_output.c,v 1.48 2016/05/19 08:02:22 vgross Exp $ */ +/* $OpenBSD: udp6_output.c,v 1.49 2016/07/20 18:51:50 vgross Exp $ */ /* $KAME: udp6_output.c,v 1.21 2001/02/07 11:51:54 itojun Exp $ */ /* @@ -154,9 +154,7 @@ udp6_output(struct inpcb *in6p, struct mbuf *m, struct mbuf *addr6, goto release; } - error = in6_selectsrc(&laddr, sin6, optp, - in6p->inp_moptions6, &in6p->inp_route6, - &in6p->inp_laddr6, in6p->inp_rtableid); + error = in6_pcbselsrc(&laddr, sin6, in6p, optp); if (error) goto release; -- 2.20.1