Subject: Re: [BUG] net/ipv4: inconsistent routing table

From: Stephen Hemminger <[email-masked]>
Date: Wed, 12 Aug 2015 08:23:52 -0700

On Wed, 12 Aug 2015 16:14:33 +0800
Zang MingJie <[email-masked]> wrote:

> On Wed, Aug 12, 2015 at 4:52 AM, Alexander Duyck
> <[email-masked]> wrote:
> > On 08/10/2015 04:50 AM, Hannes Frederic Sowa wrote:
> >>
> >> Hello,
> >>
> >> Zang MingJie <[email-masked]> writes:
> >>
> >>> Here comes several options:
> >>>
> >>> 1. reject local next hop w/ EINVAL
> >>> 2. delete route when local next hop removed
> >>
> >> Will also cause some people to complain.
> >>
> >>> 3. transition between RT_SCOPE_HOST amd RT_SCOPE_LINK
> >>
> >> I don't understand the scope transition. I know Alex mentioned it for
> >> the first time. Maybe he can explain?
> >
> >
> > If I am not mistaken part of the issue in terms of the behaviour being seen
> > is due to the fact that the nexthop scope is recorded only when the route is
> > added, and there is code in place in rt_set_nexthop which will only use the
> > gateway if the scope is RT_SCOPE_LINK.  So what we would probably need to do
> > is go through and audit any routes on a given interface every time an
> > address is added or removed and if the nh_gw is equal to the address added
> > or removed would would need to transition between RT_SCOPE_LINK and
> > RT_SCOPE_HOST since the gateway is transitioning between the local system
> > and somewhere on the other side of the link.
> >
> > The problem is that this would still be a behaviour change and there may be
> > somebody that has heartburn about it.
> 
> That's why I'm going to introduce a sysconf entry, with the entry
> unset, keep compatibility; with the entry set, fix the bug.
> 
> >
> >>> 4. document it
> >>
> >> I prefer that one :)
> >
> >
> > Yeah, me too.  The fact is things have worked this way up until now and I
> > suspect the reason why this hasn't been reported until now is simply because
> > in many cases it works since routes are usually updated if you are moving
> > the gateway onto the local system.

Most people doing any router use routing protocols suites like Quagga
or Bird which have a routing management daemon. This is the kind of change
that the routing services portion manages. When a route or interface change
is detected it updates the FIB based on the bigger RIB.