For out-of-tree datapath, only try genetlink/compat.
For in-tree kernel datapath, try rtnetlink then genetlink.

Signed-off-by: Eric Garver <[email protected]>
---
 lib/dpif-netlink.c | 35 ++++++++++++++++++++++++++++++++---
 1 file changed, 32 insertions(+), 3 deletions(-)

diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
index e6459f358989..769806eadbf1 100644
--- a/lib/dpif-netlink.c
+++ b/lib/dpif-netlink.c
@@ -210,6 +210,11 @@ static int ovs_packet_family;
  * Initialized by dpif_netlink_init(). */
 static unsigned int ovs_vport_mcgroup;
 
+/* rtnetlink information for OVS.
+ *
+ * Initialized by dpif_netlink_init(). */
+static bool ovs_datapath_out_of_tree = false;
+
 static int dpif_netlink_init(void);
 static int open_dpif(const struct dpif_netlink_dp *, struct dpif **);
 static uint32_t dpif_netlink_port_get_pid(const struct dpif *,
@@ -1014,11 +1019,13 @@ dpif_netlink_port_add(struct dpif *dpif_, struct netdev 
*netdev,
                       odp_port_t *port_nop)
 {
     struct dpif_netlink *dpif = dpif_netlink_cast(dpif_);
-    int error;
+    int error = EOPNOTSUPP;
 
     fat_rwlock_wrlock(&dpif->upcall_lock);
-    error = dpif_netlink_port_create_and_add(dpif, netdev, port_nop);
-    if (error == EOPNOTSUPP) {
+    if (!ovs_datapath_out_of_tree) {
+        error = dpif_netlink_port_create_and_add(dpif, netdev, port_nop);
+    }
+    if (error) {
         error = dpif_netlink_port_add_compat(dpif, netdev, port_nop);
     }
     fat_rwlock_unlock(&dpif->upcall_lock);
@@ -2503,6 +2510,7 @@ dpif_netlink_init(void)
 {
     static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
     static int error;
+    struct netdev *netdev = NULL;
 
     if (ovsthread_once_start(&once)) {
         error = nl_lookup_genl_family(OVS_DATAPATH_FAMILY,
@@ -2526,6 +2534,27 @@ dpif_netlink_init(void)
             error = nl_lookup_genl_mcgroup(OVS_VPORT_FAMILY, OVS_VPORT_MCGROUP,
                                            &ovs_vport_mcgroup);
         }
+#ifdef __linux__
+        if (!error) {
+            error = netdev_open("ovs-system-probe", "geneve", &netdev);
+            if (!error) {
+                error = netdev_geneve_create_kind(netdev, "ovs_geneve");
+                if (error != EOPNOTSUPP) {
+                    if (!error) {
+                        char namebuf[NETDEV_VPORT_NAME_BUFSIZE];
+                        const char *dp_port;
+
+                        dp_port = netdev_vport_get_dpif_port(netdev, namebuf,
+                                                             sizeof namebuf);
+                        netdev_geneve_destroy(dp_port);
+                    }
+                    ovs_datapath_out_of_tree = true;
+                }
+                netdev_close(netdev);
+                error = 0;
+            }
+        }
+#endif
 
         ovsthread_once_done(&once);
     }
-- 
2.10.0

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

Reply via email to