net: qualcomm: rmnet: Allow configuration updates to existing devices
authorSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>
Wed, 1 Apr 2020 21:23:55 +0000 (15:23 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 17 Apr 2020 08:50:17 +0000 (10:50 +0200)
commit 2abb5792387eb188b12051337d5dcd2cba615cb0 upstream.

This allows the changelink operation to succeed if the mux_id was
specified as an argument. Note that the mux_id must match the
existing mux_id of the rmnet device or should be an unused mux_id.

Fixes: 1dc49e9d164c ("net: rmnet: do not allow to change mux id if mux id is duplicated")
Reported-and-tested-by: Alex Elder <elder@linaro.org>
Signed-off-by: Sean Tranchetti <stranche@codeaurora.org>
Signed-off-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Cc: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c

index fbf4cbc..02cdbb2 100644 (file)
@@ -279,7 +279,6 @@ static int rmnet_changelink(struct net_device *dev, struct nlattr *tb[],
 {
        struct rmnet_priv *priv = netdev_priv(dev);
        struct net_device *real_dev;
-       struct rmnet_endpoint *ep;
        struct rmnet_port *port;
        u16 mux_id;
 
@@ -294,19 +293,27 @@ static int rmnet_changelink(struct net_device *dev, struct nlattr *tb[],
 
        if (data[IFLA_RMNET_MUX_ID]) {
                mux_id = nla_get_u16(data[IFLA_RMNET_MUX_ID]);
-               if (rmnet_get_endpoint(port, mux_id)) {
-                       NL_SET_ERR_MSG_MOD(extack, "MUX ID already exists");
-                       return -EINVAL;
-               }
-               ep = rmnet_get_endpoint(port, priv->mux_id);
-               if (!ep)
-                       return -ENODEV;
 
-               hlist_del_init_rcu(&ep->hlnode);
-               hlist_add_head_rcu(&ep->hlnode, &port->muxed_ep[mux_id]);
+               if (mux_id != priv->mux_id) {
+                       struct rmnet_endpoint *ep;
+
+                       ep = rmnet_get_endpoint(port, priv->mux_id);
+                       if (!ep)
+                               return -ENODEV;
 
-               ep->mux_id = mux_id;
-               priv->mux_id = mux_id;
+                       if (rmnet_get_endpoint(port, mux_id)) {
+                               NL_SET_ERR_MSG_MOD(extack,
+                                                  "MUX ID already exists");
+                               return -EINVAL;
+                       }
+
+                       hlist_del_init_rcu(&ep->hlnode);
+                       hlist_add_head_rcu(&ep->hlnode,
+                                          &port->muxed_ep[mux_id]);
+
+                       ep->mux_id = mux_id;
+                       priv->mux_id = mux_id;
+               }
        }
 
        if (data[IFLA_RMNET_FLAGS]) {