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
[email protected]
http://openvswitch.org/mailman/listinfo/dev