mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-03 02:22:48 +00:00
zebra: implement NEXTHOP_FLAG_ONLINK
On Linux, the kernel will only allow for a route to be installed when its gateway is directly attached according the kernel fib. There are cases when this restriction by the kernel is too strong, in those cases, we deploy the RTNH_F_ONLINK netlink flag. Signed-off-by: Christian Franke <chris@opensourcerouting.org> Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
48a53dc71c
commit
e8d3d2991f
@ -253,6 +253,7 @@ struct nexthop
|
||||
#define NEXTHOP_FLAG_ACTIVE (1 << 0) /* This nexthop is alive. */
|
||||
#define NEXTHOP_FLAG_FIB (1 << 1) /* FIB nexthop. */
|
||||
#define NEXTHOP_FLAG_RECURSIVE (1 << 2) /* Recursive nexthop. */
|
||||
#define NEXTHOP_FLAG_ONLINK (1 << 3) /* Nexthop should be installed onlink. */
|
||||
|
||||
/* Nexthop address */
|
||||
union g_addr gate;
|
||||
|
@ -1443,8 +1443,11 @@ _netlink_route_build_singlepath(
|
||||
int bytelen,
|
||||
struct nexthop *nexthop,
|
||||
struct nlmsghdr *nlmsg,
|
||||
struct rtmsg *rtmsg,
|
||||
size_t req_size)
|
||||
{
|
||||
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
|
||||
rtmsg->rtm_flags |= RTNH_F_ONLINK;
|
||||
if (nexthop->type == NEXTHOP_TYPE_IPV4
|
||||
|| nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
|
||||
{
|
||||
@ -1534,6 +1537,9 @@ _netlink_route_build_multipath(
|
||||
rtnh->rtnh_hops = 0;
|
||||
rta->rta_len += rtnh->rtnh_len;
|
||||
|
||||
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
|
||||
rtnh->rtnh_flags |= RTNH_F_ONLINK;
|
||||
|
||||
if (nexthop->type == NEXTHOP_TYPE_IPV4
|
||||
|| nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
|
||||
{
|
||||
@ -1733,7 +1739,8 @@ netlink_route_multipath (int cmd, struct prefix *p, struct rib *rib,
|
||||
|
||||
_netlink_route_debug(cmd, p, nexthop, routedesc, family);
|
||||
_netlink_route_build_singlepath(routedesc, bytelen,
|
||||
nexthop, &req.n, sizeof req);
|
||||
nexthop, &req.n, &req.r,
|
||||
sizeof req);
|
||||
|
||||
if (cmd == RTM_NEWROUTE)
|
||||
SET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB);
|
||||
|
@ -615,6 +615,9 @@ vty_show_ip_route_detail (struct vty *vty, struct route_node *rn)
|
||||
if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
|
||||
vty_out (vty, " inactive");
|
||||
|
||||
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
|
||||
vty_out (vty, " onlink");
|
||||
|
||||
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
|
||||
vty_out (vty, " (recursive)");
|
||||
|
||||
@ -710,6 +713,9 @@ vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib)
|
||||
if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
|
||||
vty_out (vty, " inactive");
|
||||
|
||||
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
|
||||
vty_out (vty, " onlink");
|
||||
|
||||
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
|
||||
vty_out (vty, " (recursive)");
|
||||
|
||||
@ -1600,6 +1606,9 @@ vty_show_ipv6_route_detail (struct vty *vty, struct route_node *rn)
|
||||
if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
|
||||
vty_out (vty, " inactive");
|
||||
|
||||
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
|
||||
vty_out (vty, " onlink");
|
||||
|
||||
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
|
||||
vty_out (vty, " (recursive)");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user