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".

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.

[0] https://mail.openvswitch.org/pipermail/ovs-dev/2025-January/419383.html
[1] 
https://patchwork.ozlabs.org/project/openvswitch/patch/[email protected]/

CC: Frode Nordahl <[email protected]>
Fixes: 91fc51106cfe ("route-table: Support parsing multipath routes.")
Signed-off-by: Martin Kalcok <[email protected]>
---
 lib/route-table.c | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/lib/route-table.c b/lib/route-table.c
index 6dfb364a4..ecc7fd7e5 100644
--- a/lib/route-table.c
+++ b/lib/route-table.c
@@ -226,6 +226,23 @@ 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 +467,20 @@ route_table_parse__(struct ofpbuf *buf, size_t ofs,
                 ofpbuf_uninit(&mp_buf);
             }
         }
-        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 case that
+         * 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;

base-commit: caed64d1685409d1f9b53b35621a08ad6588200c
prerequisite-patch-id: 9d606dcf57f9213291028029f2a71a43f346ce1e
prerequisite-patch-id: b61606e7f32fede1bd34248957f67d72040be326
prerequisite-patch-id: 907ead49b46ccf4b2e81e9f49f535788e592348b
-- 
2.43.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to