On 11/04/16(Mon) 15:29, Martin Pieuchot wrote:
> Instead of rtfree(9)ing the cached route after using it, if it is a
> multipath one, free it before.
> 
> Ok?

Anyone?

> Index: netinet/ip_input.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_input.c,v
> retrieving revision 1.269
> diff -u -p -r1.269 ip_input.c
> --- netinet/ip_input.c        29 Mar 2016 10:34:42 -0000      1.269
> +++ netinet/ip_input.c        11 Apr 2016 13:21:44 -0000
> @@ -1422,8 +1422,9 @@ ip_forward(struct mbuf *m, struct ifnet 
>  
>       rtableid = m->m_pkthdr.ph_rtableid;
>  
> +     rt = ipforward_rt.ro_rt;
>       sin = satosin(&ipforward_rt.ro_dst);
> -     if ((rt = ipforward_rt.ro_rt) == NULL ||
> +     if (rt == NULL || ISSET(rt->rt_flags, RTF_MPATH) ||
>           ip->ip_dst.s_addr != sin->sin_addr.s_addr ||
>           rtableid != ipforward_rt.ro_tableid) {
>               if (ipforward_rt.ro_rt) {
> @@ -1506,7 +1507,7 @@ ip_forward(struct mbuf *m, struct ifnet 
>                       goto freecopy;
>       }
>       if (!fake)
> -             goto freert;
> +             return;
>  
>       switch (error) {
>  
> @@ -1528,9 +1529,7 @@ ip_forward(struct mbuf *m, struct ifnet 
>               code = ICMP_UNREACH_NEEDFRAG;
>  
>  #ifdef IPSEC
> -             if (ipforward_rt.ro_rt) {
> -                     struct rtentry *rt = ipforward_rt.ro_rt;
> -
> +             if (rt != NULL) {
>                       if (rt->rt_rmx.rmx_mtu)
>                               destmtu = rt->rt_rmx.rmx_mtu;
>                       else {
> @@ -1569,15 +1568,6 @@ ip_forward(struct mbuf *m, struct ifnet 
>   freecopy:
>       if (fake)
>               m_tag_delete_chain(&mfake);
> - freert:
> -#ifndef SMALL_KERNEL
> -     if (ipmultipath && ipforward_rt.ro_rt &&
> -         (ipforward_rt.ro_rt->rt_flags & RTF_MPATH)) {
> -             rtfree(ipforward_rt.ro_rt);
> -             ipforward_rt.ro_rt = NULL;
> -     }
> -#endif
> -     return;
>  }
>  
>  int
> Index: netinet6/ip6_forward.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_forward.c,v
> retrieving revision 1.87
> diff -u -p -r1.87 ip6_forward.c
> --- netinet6/ip6_forward.c    29 Mar 2016 11:57:51 -0000      1.87
> +++ netinet6/ip6_forward.c    11 Apr 2016 13:21:45 -0000
> @@ -225,6 +225,7 @@ reroute:
>                * ip6_forward_rt.ro_dst.sin6_addr is equal to ip6->ip6_dst
>                */
>               if (!rtisvalid(ip6_forward_rt.ro_rt) ||
> +                 ISSET(ip6_forward_rt.ro_rt->rt_flags, RTF_MPATH) ||
>                   ip6_forward_rt.ro_tableid != rtableid) {
>                       if (ip6_forward_rt.ro_rt) {
>                               rtfree(ip6_forward_rt.ro_rt);
> @@ -248,6 +249,7 @@ reroute:
>                       return;
>               }
>       } else if (!rtisvalid(ip6_forward_rt.ro_rt) ||
> +        ISSET(ip6_forward_rt.ro_rt->rt_flags, RTF_MPATH) ||
>          !IN6_ARE_ADDR_EQUAL(&ip6->ip6_dst, &dst->sin6_addr) ||
>          ip6_forward_rt.ro_tableid != rtableid) {
>               if (ip6_forward_rt.ro_rt) {
> @@ -303,7 +305,7 @@ reroute:
>                       icmp6_error(mcopy, ICMP6_DST_UNREACH,
>                                   ICMP6_DST_UNREACH_BEYONDSCOPE, 0);
>               m_freem(m);
> -             goto freert;
> +             goto out;
>       }
>  
>  #ifdef IPSEC
> @@ -346,7 +348,7 @@ reroute:
>               /* Callee frees mbuf */
>               error = ipsp_process_packet(m, tdb, AF_INET6, 0);
>               m_freem(mcopy);
> -             goto freert;
> +             goto out;
>       }
>  #endif /* IPSEC */
>  
> @@ -387,7 +389,7 @@ reroute:
>                               icmp6_error(mcopy, ICMP6_DST_UNREACH,
>                                   ICMP6_DST_UNREACH_ADDR, 0);
>                       m_freem(m);
> -                     goto freert;
> +                     goto out;
>               }
>               type = ND_REDIRECT;
>       }
> @@ -434,7 +436,7 @@ reroute:
>                       icmp6_error(mcopy, ICMP6_PACKET_TOO_BIG, 0,
>                           ifp->if_mtu);
>               m_freem(m);
> -             goto freert;
> +             goto out;
>       }
>  
>       error = nd6_output(ifp, m, dst, rt);
> @@ -454,12 +456,12 @@ reroute:
>  senderr:
>  #endif
>       if (mcopy == NULL)
> -             goto freert;
> +             goto out;
>       switch (error) {
>       case 0:
>               if (type == ND_REDIRECT) {
>                       icmp6_redirect_output(mcopy, rt);
> -                     goto freert;
> +                     goto out;
>               }
>               goto freecopy;
>  
> @@ -481,17 +483,10 @@ senderr:
>               break;
>       }
>       icmp6_error(mcopy, type, code, 0);
> -     goto freert;
> +     goto out;
>  
> - freecopy:
> +freecopy:
>       m_freem(mcopy);
> - freert:
> -#ifndef SMALL_KERNEL
> -     if (ip6_multipath && ip6_forward_rt.ro_rt &&
> -         (ip6_forward_rt.ro_rt->rt_flags & RTF_MPATH)) {
> -             rtfree(ip6_forward_rt.ro_rt);
> -             ip6_forward_rt.ro_rt = NULL;
> -     }
> -#endif
> +out:
>       if_put(ifp);
>  }
> Index: netinet6/ip6_input.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_input.c,v
> retrieving revision 1.157
> diff -u -p -r1.157 ip6_input.c
> --- netinet6/ip6_input.c      11 Apr 2016 13:02:35 -0000      1.157
> +++ netinet6/ip6_input.c      11 Apr 2016 13:21:45 -0000
> @@ -422,6 +422,7 @@ ip6_input(struct mbuf *m)
>        *  Unicast check
>        */
>       if (rtisvalid(ip6_forward_rt.ro_rt) &&
> +         !ISSET(ip6_forward_rt.ro_rt->rt_flags, RTF_MPATH) &&
>           IN6_ARE_ADDR_EQUAL(&ip6->ip6_dst,
>                              &ip6_forward_rt.ro_dst.sin6_addr) &&
>           rtableid == ip6_forward_rt.ro_tableid)
> 

Reply via email to