Split in6_selectsrc() into a low-level part and a pcb-level part, and
authorvgross <vgross@openbsd.org>
Wed, 20 Jul 2016 18:51:50 +0000 (18:51 +0000)
committervgross <vgross@openbsd.org>
Wed, 20 Jul 2016 18:51:50 +0000 (18:51 +0000)
convert in_selectsrc() prototype to match.

Ok bluhm@ mpi@.

sys/netinet/in_pcb.c
sys/netinet/in_pcb.h
sys/netinet/udp_usrreq.c
sys/netinet6/icmp6.c
sys/netinet6/in6_pcb.c
sys/netinet6/in6_src.c
sys/netinet6/ip6_var.h
sys/netinet6/nd6_nbr.c
sys/netinet6/raw_ip6.c
sys/netinet6/udp6_output.c

index 2e47cb7..d25c04d 100644 (file)
@@ -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;
 
index db841e3..0a67d11 100644 (file)
@@ -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 *);
 
index 38c54fe..f8cd2c9 100644 (file)
@@ -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;
 
index 98d1859..1bfd67f 100644 (file)
@@ -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 */
index 41df3ee..c6bdb0b 100644 (file)
@@ -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);
 
index fe46fd2..26d7df7 100644 (file)
@@ -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
index 848ad02..064221e 100644 (file)
@@ -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);
 
index 69e74a1..f701aa4 100644 (file)
@@ -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];
index 724d502..da8cd22 100644 (file)
@@ -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;
index c7cb276..61f3b3a 100644 (file)
@@ -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;