Some while ago Netlink Family names were changed from ODP_*
to OVS_*. This leaded to upgrade related issues when the new ovs-dpctl
wanted to remove existing datapaths from the old kernel module
by using 'ovs_datapath' instead of 'odp_datapath' name.

Issue #8548
---
 include/linux/openvswitch.h |    7 +++++++
 lib/dpif-linux.c            |   38 +++++++++++++++++++++++++++++---------
 2 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h
index 0578b5f..c19af7a 100644
--- a/include/linux/openvswitch.h
+++ b/include/linux/openvswitch.h
@@ -57,6 +57,8 @@ struct ovs_header {
 
 /* Datapaths. */
 
+#define ODP_DATAPATH_FAMILY  "odp_datapath"
+#define ODP_DATAPATH_MCGROUP "odp_datapath"
 #define OVS_DATAPATH_FAMILY  "ovs_datapath"
 #define OVS_DATAPATH_MCGROUP "ovs_datapath"
 #define OVS_DATAPATH_VERSION 0x1
@@ -119,6 +121,7 @@ struct ovs_vport_stats {
 
 /* Packet transfer. */
 
+#define ODP_PACKET_FAMILY "odp_packet"
 #define OVS_PACKET_FAMILY "ovs_packet"
 #define OVS_PACKET_VERSION 0x1
 
@@ -166,6 +169,8 @@ enum ovs_packet_attr {
 
 /* Virtual ports. */
 
+#define ODP_VPORT_FAMILY  "odp_vport"
+#define ODP_VPORT_MCGROUP "odp_vport"
 #define OVS_VPORT_FAMILY  "ovs_vport"
 #define OVS_VPORT_MCGROUP "ovs_vport"
 #define OVS_VPORT_VERSION 0x1
@@ -245,6 +250,8 @@ enum {
 
 /* Flows. */
 
+#define ODP_FLOW_FAMILY  "odp_flow"
+#define ODP_FLOW_MCGROUP "odp_flow"
 #define OVS_FLOW_FAMILY  "ovs_flow"
 #define OVS_FLOW_MCGROUP "ovs_flow"
 #define OVS_FLOW_VERSION 0x1
diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c
index 1f6c2c0..18e3de8 100644
--- a/lib/dpif-linux.c
+++ b/lib/dpif-linux.c
@@ -1242,7 +1242,12 @@ const struct dpif_class dpif_linux_class = {
     dpif_linux_recv_wait,
     dpif_linux_recv_purge,
 };
-
+
+const char *vport_family[2] = {OVS_VPORT_FAMILY, ODP_VPORT_FAMILY};
+const char *flow_family[2] = {OVS_FLOW_FAMILY, ODP_FLOW_FAMILY};
+const char *packet_family[2] = {OVS_PACKET_FAMILY, ODP_PACKET_FAMILY};
+const char *vport_mcgroup_family[2] = {OVS_VPORT_MCGROUP, ODP_VPORT_MCGROUP};
+
 static int
 dpif_linux_init(void)
 {
@@ -1250,29 +1255,44 @@ dpif_linux_init(void)
 
     if (error < 0) {
         unsigned int ovs_vport_mcgroup;
-
+        int family_id = 0; //OVS_*
+        /*
+         * First we must probe for the OVS_* family and only then for ODP_*
+         * as a fall-back mechanism. This will allow ovs-dpctl to unload
+         * kernel module that is registered with 'odp_datapath' Netlink family
+         * name.
+         */
         error = nl_lookup_genl_family(OVS_DATAPATH_FAMILY,
                                       &ovs_datapath_family);
         if (error) {
-            VLOG_ERR("Generic Netlink family '%s' does not exist. "
-                     "The Open vSwitch kernel module is probably not loaded.",
-                     OVS_DATAPATH_FAMILY);
+            family_id = 1; //ODP_*
+            ovs_datapath_family = 0;
+            error = nl_lookup_genl_family(ODP_DATAPATH_FAMILY,
+                                          &ovs_datapath_family);
+            if (error) {
+                VLOG_ERR("Generic Netlink family '%s' or '%s' does not exist."
+                     " The Open vSwitch kernel module is probably not loaded.",
+                     OVS_DATAPATH_FAMILY, ODP_DATAPATH_FAMILY);
+            }
         }
         if (!error) {
-            error = nl_lookup_genl_family(OVS_VPORT_FAMILY, &ovs_vport_family);
+            error = nl_lookup_genl_family(vport_family[family_id],
+                                           &ovs_vport_family);
         }
         if (!error) {
-            error = nl_lookup_genl_family(OVS_FLOW_FAMILY, &ovs_flow_family);
+            error = nl_lookup_genl_family(flow_family[family_id],
+                                           &ovs_flow_family);
         }
         if (!error) {
-            error = nl_lookup_genl_family(OVS_PACKET_FAMILY,
+            error = nl_lookup_genl_family(packet_family[family_id],
                                           &ovs_packet_family);
         }
         if (!error) {
             error = nl_sock_create(NETLINK_GENERIC, &genl_sock);
         }
         if (!error) {
-            error = nl_lookup_genl_mcgroup(OVS_VPORT_FAMILY, OVS_VPORT_MCGROUP,
+            error = nl_lookup_genl_mcgroup(vport_family[family_id],
+                                           vport_mcgroup_family[family_id],
                                            &ovs_vport_mcgroup,
                                            OVS_VPORT_MCGROUP_FALLBACK_ID);
         }
-- 
1.7.4.1

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to