Commit 3d790a4c authored by Or Gerlitz's avatar Or Gerlitz Committed by Roland Dreier

IPoIB: Make sure child devices use valid/proper pkeys

Make sure that the IB invalid pkey (0x0000 or 0x8000) isn't used for
child devices.

Also, make sure to always set the full membership bit for the pkey of
devices created by rtnl link ops.
Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 3b2f64d0
...@@ -1461,7 +1461,7 @@ static ssize_t create_child(struct device *dev, ...@@ -1461,7 +1461,7 @@ static ssize_t create_child(struct device *dev,
if (sscanf(buf, "%i", &pkey) != 1) if (sscanf(buf, "%i", &pkey) != 1)
return -EINVAL; return -EINVAL;
if (pkey < 0 || pkey > 0xffff) if (pkey <= 0 || pkey > 0xffff || pkey == 0x8000)
return -EINVAL; return -EINVAL;
/* /*
......
...@@ -119,6 +119,15 @@ static int ipoib_new_child_link(struct net *src_net, struct net_device *dev, ...@@ -119,6 +119,15 @@ static int ipoib_new_child_link(struct net *src_net, struct net_device *dev,
} else } else
child_pkey = nla_get_u16(data[IFLA_IPOIB_PKEY]); child_pkey = nla_get_u16(data[IFLA_IPOIB_PKEY]);
if (child_pkey == 0 || child_pkey == 0x8000)
return -EINVAL;
/*
* Set the full membership bit, so that we join the right
* broadcast group, etc.
*/
child_pkey |= 0x8000;
err = __ipoib_vlan_add(ppriv, netdev_priv(dev), child_pkey, IPOIB_RTNL_CHILD); err = __ipoib_vlan_add(ppriv, netdev_priv(dev), child_pkey, IPOIB_RTNL_CHILD);
if (!err && data) if (!err && data)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment