lkml.org 
[lkml]   [2020]   [Apr]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 41/84] net: qualcomm: rmnet: Allow configuration updates to existing devices
    Date
    From: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>

    [ Upstream commit 2abb5792387eb188b12051337d5dcd2cba615cb0 ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../ethernet/qualcomm/rmnet/rmnet_config.c | 31 ++++++++++++-------
    1 file changed, 19 insertions(+), 12 deletions(-)

    diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
    index fbf4cbcf1a654..02cdbb22d3355 100644
    --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
    +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
    @@ -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]) {
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-04-15 14:26    [W:4.036 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site