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 CC: Frode Nordahl <[email protected]> Fixes: 91fc51106cfe ("route-table: Support parsing multipath routes.") Signed-off-by: Martin Kalcok <[email protected]> --- v4: * Fix code style. * Rebased on current 'main' after the requirement patchset[1] was merged. v3: * Fix typo in arguments for the "route_type_needs_nexthop" function v2: * Ensure that the list of nexthops is cleared if the route does not have them. * The function for determining whether a route requires nexthop now takes route_type (unsigned char) as an argument directly. Previously it took a pointer to rtmsg struct. * The patch is rebased on top of the in-flight patch series by Frode[1] * Fixed typos. [1] https://patchwork.ozlabs.org/project/openvswitch/patch/[email protected]/ lib/route-table.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/route-table.c b/lib/route-table.c index 6dfb364a4..08d37bbfd 100644 --- a/lib/route-table.c +++ b/lib/route-table.c @@ -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, @@ -450,13 +468,20 @@ route_table_parse__(struct ofpbuf *buf, size_t ofs, ofpbuf_uninit(&mp_buf); } } - if (!attrs[RTA_OIF] && !attrs[RTA_GATEWAY] + 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; -- 2.43.0 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
