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