mctp: Allow MCTP on tun devices
authorMatt Johnston <matt@codeconstruct.com.au>
Wed, 29 Sep 2021 07:26:05 +0000 (15:26 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 29 Sep 2021 10:00:11 +0000 (11:00 +0100)
Allowing TUN is useful for testing, to route packets to userspace or to
tunnel between machines.

Signed-off-by: Matt Johnston <matt@codeconstruct.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mctp/device.c
net/mctp/route.c

index b9f38e765f619395be2dfbf3c6249e1194c37041..c34963974cc10fdfc115fba8e08baf35852effca 100644 (file)
@@ -356,9 +356,12 @@ static int mctp_register(struct net_device *dev)
        if (rtnl_dereference(dev->mctp_ptr))
                return 0;
 
-       /* only register specific types; MCTP-specific and loopback for now */
-       if (dev->type != ARPHRD_MCTP && dev->type != ARPHRD_LOOPBACK)
+       /* only register specific types (inc. NONE for TUN devices) */
+       if (!(dev->type == ARPHRD_MCTP ||
+             dev->type == ARPHRD_LOOPBACK ||
+             dev->type == ARPHRD_NONE)) {
                return 0;
+       }
 
        mdev = mctp_add_dev(dev);
        if (IS_ERR(mdev))
index 5ca186d53cb0f14eb6b14da352ced8eab1891de7..a953f83ed02bb7ee1618d04187ab7f526d2dd41b 100644 (file)
@@ -821,13 +821,18 @@ static int mctp_pkttype_receive(struct sk_buff *skb, struct net_device *dev,
                                struct net_device *orig_dev)
 {
        struct net *net = dev_net(dev);
+       struct mctp_dev *mdev;
        struct mctp_skb_cb *cb;
        struct mctp_route *rt;
        struct mctp_hdr *mh;
 
-       /* basic non-data sanity checks */
-       if (dev->type != ARPHRD_MCTP)
+       rcu_read_lock();
+       mdev = __mctp_dev_get(dev);
+       rcu_read_unlock();
+       if (!mdev) {
+               /* basic non-data sanity checks */
                goto err_drop;
+       }
 
        if (!pskb_may_pull(skb, sizeof(struct mctp_hdr)))
                goto err_drop;
@@ -841,9 +846,7 @@ static int mctp_pkttype_receive(struct sk_buff *skb, struct net_device *dev,
                goto err_drop;
 
        cb = __mctp_cb(skb);
-       rcu_read_lock();
-       cb->net = READ_ONCE(__mctp_dev_get(dev)->net);
-       rcu_read_unlock();
+       cb->net = READ_ONCE(mdev->net);
 
        rt = mctp_route_lookup(net, cb->net, mh->dest);
        if (!rt)