From 242a5532008921a4b6a2e17af8880ce073cc5e1c Mon Sep 17 00:00:00 2001 From: Martin Kalcok Date: Fri, 17 Jan 2025 18:30:24 +0100 Subject: [PATCH] route-table: Allow parsing routes without nexthop. A recent commit[0] added condition to "route_table_parse__" function that causes it to throw 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. One of these types is "blackhole" route, that we intend to use in OVN for route advertising (RTN_BLACKHOLE)[1]. This change does not enforce the above-mentioned condition for those special route types that don't require "nexthop information". [0] https://github.com/openvswitch/ovs/commit/91fc51106cfeff33901080ecb063f621eeb00f54 [1] https://mail.openvswitch.org/pipermail/ovs-dev/2025-January/419383.html Signed-off-by: Martin Kalcok Signed-off-by: 0-day Robot --- lib/route-table.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/route-table.c b/lib/route-table.c index 8106dc93d90..c232a388ff7 100644 --- a/lib/route-table.c +++ b/lib/route-table.c @@ -220,6 +220,24 @@ route_table_reset(void) } } + +/* Returns true if the given route requires nexhop information (output + interface, nexthop IP, ...). Returns false for special route types, like + blackhole, that don't need this information. + */ +static bool +route_needs_nexthop(const struct rtmsg *rtm) { + switch (rtm->rtm_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, @@ -430,7 +448,7 @@ route_table_parse__(struct ofpbuf *buf, size_t ofs, &mp_change.rd.nexthops); } } - if (!attrs[RTA_OIF] && !attrs[RTA_GATEWAY] + if (route_needs_nexthop(rtm) && !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");