Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 44da5ae5 authored by Thomas Graf's avatar Thomas Graf Committed by Jesse Gross
Browse files

openvswitch: 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: default avatarThomas Graf <tgraf@suug.ch>
Signed-off-by: default avatarJesse Gross <jesse@nicira.com>
parent 43d4be9c
Loading
Loading
Loading
Loading
+9 −1
Original line number Original line Diff line number Diff line
@@ -40,7 +40,15 @@ struct ovs_header {


#define OVS_DATAPATH_FAMILY  "ovs_datapath"
#define OVS_DATAPATH_FAMILY  "ovs_datapath"
#define OVS_DATAPATH_MCGROUP "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 {
enum ovs_datapath_cmd {
	OVS_DP_CMD_UNSPEC,
	OVS_DP_CMD_UNSPEC,
+21 −0
Original line number Original line Diff line number Diff line
@@ -1148,6 +1148,18 @@ static struct datapath *lookup_datapath(struct net *net,
	return dp ? dp : ERR_PTR(-ENODEV);
	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)
static void ovs_dp_change(struct datapath *dp, struct nlattr **a)
{
{
	if (a[OVS_DP_ATTR_USER_FEATURES])
	if (a[OVS_DP_ATTR_USER_FEATURES])
@@ -1220,6 +1232,15 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
		if (err == -EBUSY)
		if (err == -EBUSY)
			err = -EEXIST;
			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;
		goto err_destroy_ports_array;
	}
	}