Skip to content

Commit

Permalink
route-table: Allow parsing routes without nexthop.
Browse files Browse the repository at this point in the history
A recent commit added condition to "route_table_parse__" function that
causes it to throw an error when parsing route without "nexthop
information" (either RTA_OIF, RTA_GATEWAY, RTA_VIA or RTA_MULTIPATH). While
this requirement is reasonable for regular routes, there are some route types
that don't need nexthop. We intend to use one of these types,
(RTN_BLACKHOLE)[0], in OVN for route advertising .

This change does not enforce the above-mentioned condition for those special
route types that don't require "nexthop information".

[0] https://mail.openvswitch.org/pipermail/ovs-dev/2025-January/419383.html

Fixes: 91fc511 ("route-table: Support parsing multipath routes.")
Signed-off-by: Martin Kalcok <[email protected]>
Signed-off-by: Eelco Chaudron <[email protected]>
  • Loading branch information
mkalcok authored and chaudron committed Jan 30, 2025
1 parent c5b3ac7 commit 481bc09
Showing 1 changed file with 27 additions and 2 deletions.
29 changes: 27 additions & 2 deletions lib/route-table.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,24 @@ route_table_reset(void)
}
}

/* Returns true if the given route requires nexthop information (output
* interface, nexthop IP, ...). Returns false for special route types
* that don't need this information. */
static bool
route_type_needs_nexthop(unsigned char rtmsg_type)
{
switch (rtmsg_type) {
case RTN_BLACKHOLE:
case RTN_THROW:
case RTN_UNREACHABLE:
case RTN_PROHIBIT:
return false;

default:
return true;
}
}

static int
route_table_parse__(struct ofpbuf *buf, size_t ofs,
const struct nlmsghdr *nlmsg,
Expand Down Expand Up @@ -447,13 +465,20 @@ route_table_parse__(struct ofpbuf *buf, size_t ofs,
&mp_change.rd.nexthops);
}
}
if (!attrs[RTA_OIF] && !attrs[RTA_GATEWAY]
&& !attrs[RTA_VIA] && !attrs[RTA_MULTIPATH]) {
if (route_type_needs_nexthop(rtm->rtm_type)
&& !attrs[RTA_OIF] && !attrs[RTA_GATEWAY]
&& !attrs[RTA_VIA] && !attrs[RTA_MULTIPATH]) {
VLOG_DBG_RL(&rl, "route message needs an RTA_OIF, RTA_GATEWAY, "
"RTA_VIA or RTA_MULTIPATH attribute");
goto error_out;
}
/* Add any additional RTA attribute processing before RTA_MULTIPATH. */

/* Ensure that the change->rd->nexthops list is cleared in cases when
* the route does not need a next hop. */
if (!route_type_needs_nexthop(rtm->rtm_type)) {
route_data_destroy_nexthops__(&change->rd);
}
} else {
VLOG_DBG_RL(&rl, "received unparseable rtnetlink route message");
goto error_out;
Expand Down

0 comments on commit 481bc09

Please sign in to comment.