Along with dependent data structures these functions are useful
for programs that build against OVS private library sources,
allowing them to make use of functionality provided by the
route-table module.

A test program to be run as part of the system tests that
exercise the exported interfaces will be added in a subsequent
patch.

Signed-off-by: Frode Nordahl <[email protected]>
---
 lib/route-table.c |  60 ++-------------------
 lib/route-table.h | 134 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 137 insertions(+), 57 deletions(-)

diff --git a/lib/route-table.c b/lib/route-table.c
index 7086fd2bd..56f7dd167 100644
--- a/lib/route-table.c
+++ b/lib/route-table.c
@@ -48,56 +48,6 @@ VLOG_DEFINE_THIS_MODULE(route_table);
 
 COVERAGE_DEFINE(route_table_dump);
 
-struct route_data_nexthop {
-    struct ovs_list nexthop_node;
-
-    sa_family_t family;
-    struct in6_addr addr;
-    char ifname[IFNAMSIZ]; /* Interface name. */
-};
-
-struct route_data {
-    /* Routes can have multiple next hops per destination.
-     *
-     * Each next hop has its own set of attributes such as address family,
-     * interface and IP address.
-     *
-     * When retrieving information about a route from the kernel, in the case
-     * of multiple next hops, information is provided as nested attributes.
-     *
-     * A linked list with struct route_data_nexthop entries is used to store
-     * this information as we parse each attribute.
-     *
-     * For the common case of one next hop, the nexthops list will contain a
-     * single entry pointing to the struct route_data _primary_next_hop
-     * element.
-     *
-     * Any dynamically allocated list elements MUST be freed with a call to the
-     * route_data_destroy function. */
-    struct ovs_list nexthops;
-    struct route_data_nexthop _primary_next_hop;
-
-    /* Copied from struct rtmsg. */
-    unsigned char rtm_dst_len;
-    unsigned char rtm_protocol;
-    bool rtn_local;
-
-    /* Extracted from Netlink attributes. */
-    struct in6_addr rta_dst;     /* 0 if missing. */
-    struct in6_addr rta_prefsrc; /* 0 if missing. */
-    uint32_t rta_mark;           /* 0 if missing. */
-    uint32_t rta_table_id;       /* 0 if missing. */
-    uint32_t rta_priority;       /* 0 if missing. */
-};
-
-/* A digested version of a route message sent down by the kernel to indicate
- * that a route has changed. */
-struct route_table_msg {
-    bool relevant;        /* Should this message be processed? */
-    uint16_t nlmsg_type;  /* e.g. RTM_NEWROUTE, RTM_DELROUTE. */
-    struct route_data rd; /* Data parsed from this message. */
-};
-
 static struct ovs_mutex route_table_mutex = OVS_MUTEX_INITIALIZER;
 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
 
@@ -115,14 +65,13 @@ static bool route_table_valid = false;
 
 static void route_table_reset(void);
 static void route_table_handle_msg(const struct route_table_msg *, void *aux);
-static int route_table_parse(struct ofpbuf *, void *change);
 static void route_table_change(struct route_table_msg *, void *aux);
 static void route_map_clear(void);
 
 static void name_table_init(void);
 static void name_table_change(const struct rtnetlink_change *, void *);
 
-static void
+void
 route_data_destroy(struct route_data *rd)
 {
     struct route_data_nexthop *rdnh;
@@ -197,10 +146,7 @@ route_table_wait(void)
     ovs_mutex_unlock(&route_table_mutex);
 }
 
-typedef void route_table_handle_msg_callback(const struct route_table_msg *,
-                                             void *aux);
-
-static bool
+bool
 route_table_dump_one_table(uint32_t id,
                            route_table_handle_msg_callback *handle_msg_cb,
                            void *aux)
@@ -466,7 +412,7 @@ error_out:
  * responsibility to free it with a call to route_data_destroy().
  *
  * In case of error, any allocated memory will be freed before returning. */
-static int
+int
 route_table_parse(struct ofpbuf *buf, void *change)
 {
     struct nlmsghdr *nlmsg;
diff --git a/lib/route-table.h b/lib/route-table.h
index 3a02d737a..ae28b6af1 100644
--- a/lib/route-table.h
+++ b/lib/route-table.h
@@ -24,8 +24,133 @@
 #include <stdbool.h>
 #include <stdint.h>
 
+#include "openvswitch/list.h"
+#include "openvswitch/ofpbuf.h"
 #include "openvswitch/types.h"
 
+/*
+ * route-table, system route table synchronization for Open vSwitch.
+ *
+ * Overview
+ * ========
+ *
+ * The route-table module has two use cases:
+ *
+ * 1) Internal use by Open vSwitch which together with the ovs-router module
+ *    implement route lookup for features such as flow based tunneling,
+ *    userspace tunneling, and sFlow.
+ *
+ * 2) External use by projects such as Open Virtual Network (OVN), that use
+ *    Open vSwitch as a compile time library.
+ *
+ * Typical External Usage
+ * ======================
+ *
+ * static void
+ * my_handle_msg(const struct route_table_msg *change, void *data)
+ * {
+ *     struct my_data *aux = data;
+ *
+ *     if (data) {
+ *         aux->rta_dst = change->rd.rta_dst;
+ *     }
+ * }
+ *
+ * static void
+ * my_route_table_dump(void)
+ * {
+ *     struct my_data *aux;
+ *
+ *     route_table_dump_one_table(RT_TABLE_MAIN, my_handle_msg, aux);
+ * }
+ *
+ * static void
+ * my_route_table_change(struct route_table_msg *change, void *aux OVS_UNUSED);
+ * {
+ *     my_handle_msg(change, NULL);
+ *     route_data_destroy(&change->rd);
+ * }
+ *
+ * static void
+ * my_init(void)
+ * {
+ *     static struct nln_notifier *route6_notifier = NULL;
+ *     static struct nln_notifier *route_notifier = NULL;
+ *     static struct route_table_msg nln_change;
+ *     static struct nln *nln = NULL;
+ *
+ *     nln = nln_create(NETLINK_ROUTE, route_table_parse, NULL);
+ *
+ *     route6_notifier =
+ *        nln_notifier_create(nln, RTNLGRP_IPV6_ROUTE,
+ *                            (nln_notify_func *) test_lib_route_table_change,
+ *                            NULL);
+ *
+ *     route_notifier =
+ *        nln_notifier_create(nln, RTNLGRP_IPV4_ROUTE,
+ *                            (nln_notify_func *) test_lib_route_table_change,
+ *                            NULL);
+ * }
+ *
+ * Thread-safety
+ * =============
+ *
+ * Assuming thread safe initialization of dependencies such as netlink socket,
+ * netlink notifier and so on, the functions in this module are thread safe.
+ */
+
+/* Information about a next hop stored in a linked list with base in struct
+ * route_data.  Please refer to comment in struct route_data for details. */
+struct route_data_nexthop {
+    struct ovs_list nexthop_node;
+
+    sa_family_t family;
+    struct in6_addr addr;
+    char ifname[IFNAMSIZ]; /* Interface name. */
+};
+
+struct route_data {
+    /* Routes can have multiple next hops per destination.
+     *
+     * Each next hop has its own set of attributes such as address family,
+     * interface and IP address.
+     *
+     * When retrieving information about a route from the kernel, in the case
+     * of multiple next hops, information is provided as nested attributes.
+     *
+     * A linked list with struct route_data_nexthop entries is used to store
+     * this information as we parse each attribute.
+     *
+     * For the common case of one next hop, the nexthops list will contain a
+     * single entry pointing to the struct route_data _primary_next_hop
+     * element.
+     *
+     * Any dynamically allocated list elements MUST be freed with a call to the
+     * route_data_destroy function. */
+    struct ovs_list nexthops;
+    struct route_data_nexthop _primary_next_hop;
+
+    /* Copied from struct rtmsg. */
+    unsigned char rtm_dst_len;
+    unsigned char rtm_protocol;
+    bool rtn_local;
+
+    /* Extracted from Netlink attributes. */
+    struct in6_addr rta_dst;     /* 0 if missing. */
+    struct in6_addr rta_prefsrc; /* 0 if missing. */
+    uint32_t rta_mark;           /* 0 if missing. */
+    uint32_t rta_table_id;       /* 0 if missing. */
+    uint32_t rta_priority;       /* 0 if missing. */
+};
+
+/* A digested version of a route message sent down by the kernel to indicate
+ * that a route has changed. */
+struct route_table_msg {
+    bool relevant;        /* Should this message be processed? */
+    uint16_t nlmsg_type;  /* e.g. RTM_NEWROUTE, RTM_DELROUTE. */
+    struct route_data rd; /* Data parsed from this message. */
+};
+
 uint64_t route_table_get_change_seq(void);
 void route_table_init(void);
 void route_table_run(void);
@@ -33,4 +158,13 @@ void route_table_wait(void);
 bool route_table_fallback_lookup(const struct in6_addr *ip6_dst,
                                  char name[],
                                  struct in6_addr *gw6);
+
+typedef void route_table_handle_msg_callback(const struct route_table_msg *,
+                                             void *aux);
+
+bool route_table_dump_one_table(uint32_t id,
+                                route_table_handle_msg_callback *,
+                                void *aux);
+int route_table_parse(struct ofpbuf *buf, void *change);
+void route_data_destroy(struct route_data *rd);
 #endif /* route-table.h */
-- 
2.47.1

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

Reply via email to