瀏覽代碼

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: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Or Gerlitz 12 年之前
父節點
當前提交
3d790a4c26
共有 2 個文件被更改,包括 10 次插入1 次删除
  1. 1 1
      drivers/infiniband/ulp/ipoib/ipoib_main.c
  2. 9 0
      drivers/infiniband/ulp/ipoib/ipoib_netlink.c

+ 1 - 1
drivers/infiniband/ulp/ipoib/ipoib_main.c

@@ -1461,7 +1461,7 @@ static ssize_t create_child(struct device *dev,
 	if (sscanf(buf, "%i", &pkey) != 1)
 		return -EINVAL;
 
-	if (pkey < 0 || pkey > 0xffff)
+	if (pkey <= 0 || pkey > 0xffff || pkey == 0x8000)
 		return -EINVAL;
 
 	/*

+ 9 - 0
drivers/infiniband/ulp/ipoib/ipoib_netlink.c

@@ -119,6 +119,15 @@ static int ipoib_new_child_link(struct net *src_net, struct net_device *dev,
 	} else
 		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);
 
 	if (!err && data)