From 94358dcffbec33cbcfd425e925139fd7e9d6153f Mon Sep 17 00:00:00 2001 From: Thomas Graf Date: Tue, 3 Dec 2013 20:56:22 -0800 Subject: [PATCH] datapath: Drop user features if old user space attempted to create datapath Drop user features if an outdated user space instance that does not understand the concept of user_features attempted to create a new datapath. Signed-off-by: Thomas Graf Reviewed-by: Daniel Borkmann Signed-off-by: Jesse Gross --- datapath/datapath.c | 21 +++++++++++++++++++++ include/linux/openvswitch.h | 10 +++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/datapath/datapath.c b/datapath/datapath.c index 08562a349..0714a9986 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -1153,6 +1153,18 @@ static struct datapath *lookup_datapath(struct net *net, return dp ? dp : ERR_PTR(-ENODEV); } +static void ovs_dp_reset_user_features(struct sk_buff *skb, struct genl_info *info) +{ + struct datapath *dp; + + dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs); + if (!dp) + return; + + WARN(dp->user_features, "Dropping previously announced user features\n"); + dp->user_features = 0; +} + static void ovs_dp_change(struct datapath *dp, struct nlattr **a) { if (a[OVS_DP_ATTR_USER_FEATURES]) @@ -1219,6 +1231,15 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info) if (err == -EBUSY) err = -EEXIST; + if (err == -EEXIST) { + /* An outdated user space instance that does not understand + * the concept of user_features has attempted to create a new + * datapath and is likely to reuse it. Drop all user features. + */ + if (info->genlhdr->version < OVS_DP_VER_FEATURES) + ovs_dp_reset_user_features(skb, info); + } + goto err_destroy_ports_array; } diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h index 585fa6307..5137c2f59 100644 --- a/include/linux/openvswitch.h +++ b/include/linux/openvswitch.h @@ -60,7 +60,15 @@ struct ovs_header { #define OVS_DATAPATH_FAMILY "ovs_datapath" #define OVS_DATAPATH_MCGROUP "ovs_datapath" -#define OVS_DATAPATH_VERSION 0x1 + +/* V2: + * - API users are expected to provide OVS_DP_ATTR_USER_FEATURES + * when creating the datapath. + */ +#define OVS_DATAPATH_VERSION 2 + +/* First OVS datapath version to support features */ +#define OVS_DP_VER_FEATURES 2 enum ovs_datapath_cmd { OVS_DP_CMD_UNSPEC, -- 2.43.0