[dev] Modify ZEBRA_ROUTE_KERNEL priority/metric read in linux
Donald Sharp
sharpd at cumulusnetworks.com
Wed Sep 27 11:29:05 EDT 2017
It was just pointed out to me that I did not explain what happened in
mid-august:
In zebra (specifically rt_netlink.c) we fixed the code that handled
blackhole/unreachable routes and started actually seeing them in
zebra. So pre this fix zebra would receive the default unreachable
route ( or really any unreachable/blackhole route ) and drop it on the
floor. Post-fix we accepted the route and noted it in zebra's rib.
The admin distance of `0' caused us to not attempt to override the
route at all.
On Wed, Sep 27, 2017 at 9:33 AM, Donald Sharp
<sharpd at cumulusnetworks.com> wrote:
> All -
>
> This PR:
>
> https://github.com/FRRouting/frr/pull/1237
>
> has received a request that we spend a bit of time disseminating the
> problem and this proposed fix for more feedback.
>
> The Problem:
>
> Linux kernel VRF table lookups follow this behavior: Lookup up in the
> table prefix A. If no route is found fall back to the main default
> table and lookup prefix A again. This behavior is considered
> 'surprising' to people who expect the behavior of VRF's to stop
> looking when nothing is found in the corresponding table. The linux
> kernel coders documented that a default unreachable route with a high
> metric should be installed into the VRF table to prevent the fallback
> mechanism from being invoked in the kernel. Prior to mid-August this
> was not that big of a deal as that default unreachable routes were
> being ignored by rt_netlink.c. As such when a zebra( or higher )
> installed a default route, zebra would not have knowledge of the
> default unreachable route and so zebra would make the decision to just
> install the default route. Since zebra installs routes into the
> kernel with a metric of 20, the new default route would be used.
>
> So After mid August, zebra started seeing the default unreachable
> kernel route. This default unreachable received an admin distance of
> 0. As such when FRR attempted to install another default route it
> would fail the admin distance check and not be installed.
>
> The Proposal:
>
> Since there is no good way to specify admin distance to/from the
> kernel currently, let's interpret the metric/priority for
> ZEBRA_ROUTE_KERNEL routes a bit differently
> admin distance == High order byte of metric passed from kernel
> metric == Low 3 bytes of metric passed from kernel
>
> What this allows:
>
> The vrf creator scripts( something like iproute2 ) can be modified to
> use a metric that would correspond to an admin distance of 255. This
> way when the default unreachable is read we translate the metric to
> Admin distance = 255 metric = <some value>
>
> This allows zebra to allow static routes and routing protocols to
> override the default unreachable and it allows people who do not
> modify the metric values for normal ( ip route .... commands ) for
> their routes to behave like they think it should (the kernel should
> win)
>
> This does not affect *bsd because most bsd's have a uint8_t metric and
> we will not change behavior their.
>
> donald
More information about the dev
mailing list