Download raw body.
split in_pcbrtentry() and in6_pcbnotify()
On Tue, Jan 30, 2024 at 06:29:27PM +0100, Alexander Bluhm wrote:
> Hi,
>
> Can we split in_pcbrtentry() and in6_pcbnotify() with the usual
> INP_IPV6 check?
>
> This means less #ifdef INET6 in the function.
>
> Also struct route_in6 *ro is of the correct type and we don't rely
> on the fact that inp_route and inp_route6 are pointers to the same
> union.
>
> ok?
I'm fine with this split. I got lost in here before and see my other mail
about why I despise struct route and struct route_in6.
> bluhm
>
> Index: netinet/in_pcb.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/in_pcb.c,v
> diff -u -p -r1.287 in_pcb.c
> --- netinet/in_pcb.c 28 Jan 2024 20:34:25 -0000 1.287
> +++ netinet/in_pcb.c 30 Jan 2024 17:21:45 -0000
> @@ -909,6 +909,11 @@ in_pcbrtentry(struct inpcb *inp)
> {
> struct route *ro;
>
> +#ifdef INET6
> + if (ISSET(inp->inp_flags, INP_IPV6))
> + in6_pcbrtentry(inp);
> +#endif
> +
> ro = &inp->inp_route;
>
> /* check if route is still valid */
> @@ -921,34 +926,16 @@ in_pcbrtentry(struct inpcb *inp)
> * No route yet, so try to acquire one.
> */
> if (ro->ro_rt == NULL) {
> -#ifdef INET6
> - memset(ro, 0, sizeof(struct route_in6));
> -#else
> memset(ro, 0, sizeof(struct route));
> -#endif
>
> -#ifdef INET6
> - if (ISSET(inp->inp_flags, INP_IPV6)) {
> - if (IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6))
> - return (NULL);
> - ro->ro_dst.sa_family = AF_INET6;
> - ro->ro_dst.sa_len = sizeof(struct sockaddr_in6);
> - satosin6(&ro->ro_dst)->sin6_addr = inp->inp_faddr6;
> - ro->ro_tableid = inp->inp_rtableid;
> - ro->ro_rt = rtalloc_mpath(&ro->ro_dst,
> - &inp->inp_laddr6.s6_addr32[0], ro->ro_tableid);
> - } else
> -#endif /* INET6 */
> - {
> - if (inp->inp_faddr.s_addr == INADDR_ANY)
> - return (NULL);
> - ro->ro_dst.sa_family = AF_INET;
> - ro->ro_dst.sa_len = sizeof(struct sockaddr_in);
> - satosin(&ro->ro_dst)->sin_addr = inp->inp_faddr;
> - ro->ro_tableid = inp->inp_rtableid;
> - ro->ro_rt = rtalloc_mpath(&ro->ro_dst,
> - &inp->inp_laddr.s_addr, ro->ro_tableid);
> - }
> + if (inp->inp_faddr.s_addr == INADDR_ANY)
> + return (NULL);
> + ro->ro_dst.sa_family = AF_INET;
> + ro->ro_dst.sa_len = sizeof(struct sockaddr_in);
> + satosin(&ro->ro_dst)->sin_addr = inp->inp_faddr;
> + ro->ro_tableid = inp->inp_rtableid;
> + ro->ro_rt = rtalloc_mpath(&ro->ro_dst,
> + &inp->inp_laddr.s_addr, ro->ro_tableid);
> }
> return (ro->ro_rt);
> }
> Index: netinet/in_pcb.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/in_pcb.h,v
> diff -u -p -r1.149 in_pcb.h
> --- netinet/in_pcb.h 28 Jan 2024 20:34:25 -0000 1.149
> +++ netinet/in_pcb.h 30 Jan 2024 17:21:45 -0000
> @@ -367,6 +367,8 @@ struct rtentry *
> in_pcbrtentry(struct inpcb *);
>
> /* INET6 stuff */
> +struct rtentry *
> + in6_pcbrtentry(struct inpcb *);
> void in6_pcbnotify(struct inpcbtable *, const struct sockaddr_in6 *,
> u_int, const struct sockaddr_in6 *, u_int, u_int, int, void *,
> void (*)(struct inpcb *, int));
> Index: netinet6/in6_pcb.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/in6_pcb.c,v
> diff -u -p -r1.133 in6_pcb.c
> --- netinet6/in6_pcb.c 28 Jan 2024 20:34:25 -0000 1.133
> +++ netinet6/in6_pcb.c 30 Jan 2024 17:21:46 -0000
> @@ -561,6 +561,35 @@ in6_pcbnotify(struct inpcbtable *table,
> rw_exit_write(&table->inpt_notify);
> }
>
> +struct rtentry *
> +in6_pcbrtentry(struct inpcb *inp)
> +{
> + struct route_in6 *ro = &inp->inp_route6;
> +
> + /* check if route is still valid */
> + if (!rtisvalid(ro->ro_rt)) {
> + rtfree(ro->ro_rt);
> + ro->ro_rt = NULL;
> + }
> +
> + /*
> + * No route yet, so try to acquire one.
> + */
> + if (ro->ro_rt == NULL) {
> + memset(ro, 0, sizeof(struct route_in6));
> +
> + if (IN6_IS_ADDR_UNSPECIFIED(&inp->inp_faddr6))
> + return (NULL);
> + ro->ro_dst.sin6_family = AF_INET6;
> + ro->ro_dst.sin6_len = sizeof(struct sockaddr_in6);
> + ro->ro_dst.sin6_addr = inp->inp_faddr6;
> + ro->ro_tableid = inp->inp_rtableid;
> + ro->ro_rt = rtalloc_mpath(sin6tosa(&ro->ro_dst),
> + &inp->inp_laddr6.s6_addr32[0], ro->ro_tableid);
> + }
> + return (ro->ro_rt);
> +}
> +
> struct inpcb *
> in6_pcbhash_lookup(struct inpcbtable *table, uint64_t hash, u_int rdomain,
> const struct in6_addr *faddr, u_short fport,
> Index: netinet6/ip6_output.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_output.c,v
> diff -u -p -r1.283 ip6_output.c
> --- netinet6/ip6_output.c 18 Jan 2024 11:03:16 -0000 1.283
> +++ netinet6/ip6_output.c 30 Jan 2024 17:21:47 -0000
> @@ -1486,7 +1486,7 @@ do { \
> if (!(so->so_state & SS_ISCONNECTED))
> return (ENOTCONN);
>
> - rt = in_pcbrtentry(inp);
> + rt = in6_pcbrtentry(inp);
> if (!rtisvalid(rt))
> return (EHOSTUNREACH);
>
>
--
:wq Claudio
split in_pcbrtentry() and in6_pcbnotify()