Commit 7b1871af authored by Matt Johnston's avatar Matt Johnston Committed by David S. Miller
Browse files

mctp: Warn if pointer is set for a wrong dev type

Should not occur but is a sanity check.

May help tracking down Trinity reported issue
https://lore.kernel.org/lkml/20210913030701.GA5926@xsang-OptiPlex-9020/



Signed-off-by: default avatarMatt Johnston <matt@codeconstruct.com.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6183569d
Loading
Loading
Loading
Loading
+24 −7
Original line number Diff line number Diff line
@@ -337,12 +337,26 @@ static int mctp_set_link_af(struct net_device *dev, const struct nlattr *attr,
	return 0;
}

/* Matches netdev types that should have MCTP handling */
static bool mctp_known(struct net_device *dev)
{
	/* only register specific types (inc. NONE for TUN devices) */
	return dev->type == ARPHRD_MCTP ||
		   dev->type == ARPHRD_LOOPBACK ||
		   dev->type == ARPHRD_NONE;
}

static void mctp_unregister(struct net_device *dev)
{
	struct mctp_dev *mdev;

	mdev = mctp_dev_get_rtnl(dev);

	if (mctp_known(dev) != (bool)mdev) {
		// Sanity check, should match what was set in mctp_register
		netdev_warn(dev, "%s: mdev pointer %d but type (%d) match is %d",
			    __func__, (bool)mdev, mctp_known(dev), dev->type);
		return;
	}
	if (!mdev)
		return;

@@ -360,16 +374,19 @@ static int mctp_register(struct net_device *dev)
	struct mctp_dev *mdev;

	/* Already registered? */
	if (rtnl_dereference(dev->mctp_ptr))
		return 0;
	mdev = rtnl_dereference(dev->mctp_ptr);

	/* only register specific types (inc. NONE for TUN devices) */
	if (!(dev->type == ARPHRD_MCTP ||
	      dev->type == ARPHRD_LOOPBACK ||
	      dev->type == ARPHRD_NONE)) {
	if (mdev) {
		if (!mctp_known(dev))
			netdev_warn(dev, "%s: mctp_dev set for unknown type %d",
				    __func__, dev->type);
		return 0;
	}

	/* only register specific types */
	if (!mctp_known(dev))
		return 0;

	mdev = mctp_add_dev(dev);
	if (IS_ERR(mdev))
		return PTR_ERR(mdev);