Subject: Re: [PATCH] ipv6: replace RTF_ROUTEINFO with RTF_ADDRCONF in rt6_get_route_info()

From: Duan Jiong <[email-masked]>
Date: Thu, 07 Nov 2013 12:19:05 +0800

于 2013年11月07日 10:42, Hannes Frederic Sowa 写道:
> On Thu, Nov 07, 2013 at 10:01:27AM +0800, Duan Jiong wrote:
>> 于 2013年11月07日 09:51, Hannes Frederic Sowa 写道:
>>> On Wed, Nov 06, 2013 at 03:26:41PM +0800, Duan Jiong wrote:
>>>>
>>>> As the rfc 4191 said, the Router Preference and Lifetime values in a
>>>> ::/0 Route Information Option should override the preference and lifetime
>>>> values in the Router Advertisement header. But when the kernel deals with
>>>> a ::/0 Route Information Option, the rt6_get_route_info() always return
>>>> NULL, that means that overriding will not happen, because those default
>>>> routers were added without flag RTF_ROUTEINFO in rt6_add_dflt_router().
>>>>
>>>> In order to match those default routers, we can replace RTF_ROUTEINFO 
>>>> with RTF_ADDRCONF in rt6_get_route_info().
>>>>
>>>> Signed-off-by: Duan Jiong <[email-masked]>
>>>
>>> Hmm, that looks like a bug. Nice catch!
>>>
>>> Couldn't we just replace the rt6_get_route_info in rt6_route_rcv with a call
>>> to rt6_get_dflt_router? Seems easier, already handles the ::/0 case and also
>>> does preserve the check for the RTF_ROUTEINFO flag in rt6_add_route_info.
>>
>> Yeah, your idea is better. I will modify my patch.
> 
> Stop, stop, stop, sorry that suggestion is plain wrong and stupid.
> 

In my opinion, i think that is well. According to your suggestion, we can 
call the rt6_get_dflt_router or rt6_get_route_info in different situation.

if (rinfo->prefix_len == 0)
	rt = rt6_get_dflt_router(gwaddr, dev);
else
	rt = rt6_get_route_info(net, prefix, rinfo->prefix_len, gwaddr,
				dev->ifindex);

How do you think of the change above?

Thanks,
  Duan

> But I still would like to see the check for RTF_ROUTEINFO happening
> in rt6_add_route_info. We should also rename the function if you only query
> for RTF_ADDRCONF and not RTF_ROUTEINFO.
> 
> Sorry,
> 
>   Hannes
> 
>