On Mon, May 30, 2016 at 02:49:11PM +0200, Martin Pieuchot wrote:
> Do not grab the KERNEL_LOCK if the source address is already specified.
> 
> Note that the sending path will still be done while holding the
> KERNEL_LOCK but it doesn't hurt to get this right.  Plus this makes it
> similar to another chunk in this file.
> 
> ok?

Yeah, makes sense. OK

> 
> Index: netinet/ip_output.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_output.c,v
> retrieving revision 1.322
> diff -u -p -r1.322 ip_output.c
> --- netinet/ip_output.c       4 May 2016 13:22:51 -0000       1.322
> +++ netinet/ip_output.c       30 May 2016 04:53:09 -0000
> @@ -185,14 +185,17 @@ reroute:
>       if ((IN_MULTICAST(ip->ip_dst.s_addr) ||
>           (ip->ip_dst.s_addr == INADDR_BROADCAST)) &&
>           imo != NULL && (ifp = if_get(imo->imo_ifidx)) != NULL) {
> -             struct in_ifaddr *ia;
>  
>               mtu = ifp->if_mtu;
> -             KERNEL_LOCK();
> -             IFP_TO_IA(ifp, ia);
> -             if (ip->ip_src.s_addr == INADDR_ANY && ia)
> -                     ip->ip_src = ia->ia_addr.sin_addr;
> -             KERNEL_UNLOCK();
> +             if (ip->ip_src.s_addr == INADDR_ANY) {
> +                     struct in_ifaddr *ia;
> +
> +                     KERNEL_LOCK();
> +                     IFP_TO_IA(ifp, ia);
> +                     if (ia != NULL)
> +                             ip->ip_src = ia->ia_addr.sin_addr;
> +                     KERNEL_UNLOCK();
> +             }
>       } else {
>               struct in_ifaddr *ia;
>  
> 

Reply via email to