Subject: Re: Regarding to your linux kernel CL

From: Timo Teräs <[email-masked]>
Date: Wed, 06 Oct 2010 10:02:56 +0300

On 10/05/2010 04:23 AM, Chung-Yih Wang (王崇懿) wrote:
>     I encountered an issue with your CL
> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=d11a4dc18bf41719c9f0d7ed494d295dd2973b92.
> The cause is that we use a connected UDP socket for building the
> l2tp/ipsec vpn connection. However, when the ipsec tunnel is built,
> your CL made the sk_dst_check useless(since it always return the
> 'freed' dst_entry and can not reset the dst entry for the socket).
> What is your comment to conquer this issue?
> 
> Solution 1. We could add a CL to change it to (dst && dst->obsolete &&
> (dst->obsolete>0  || dst->ops->check(...)==NULL) in sk_dst_check()) ?
> 
> Solution 2. Revert the change?
> 
> Any comment?

What's the problem here? sk_dst_check not honoring if dst->obsolete>0 ?
Sounds like the sk_dst_check was buggy in the first place.

Looks like there's still some code around that does not do what the
obsolete field has been used for a long time.
  obsolete =  0, dst entry is ok
  obsolete = -1, you need to call ops->check for this entry
  obsolete >  0, this entry is invalid

So net/core/sock.c needs fixing. Just if we should change dst_check()
too, I'm not sure.

Should we fix sk_dst_check to use dst_check(), and dst_check() to check
for dst->obsolete>0 ?