lkml.org 
[lkml]   [2022]   [May]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.17 046/140] can: isotp: remove re-binding of bound socket
    Date
    From: Oliver Hartkopp <socketcan@hartkopp.net>

    commit 72ed3ee9fa0b461ad086403a8b5336154bd82234 upstream.

    As a carry over from the CAN_RAW socket (which allows to change the CAN
    interface while mantaining the filter setup) the re-binding of the
    CAN_ISOTP socket needs to take care about CAN ID address information and
    subscriptions. It turned out that this feature is so limited (e.g. the
    sockopts remain fix) that it finally has never been needed/used.

    In opposite to the stateless CAN_RAW socket the switching of the CAN ID
    subscriptions might additionally lead to an interrupted ongoing PDU
    reception. So better remove this unneeded complexity.

    Fixes: e057dd3fc20f ("can: add ISO 15765-2:2016 transport protocol")
    Link: https://lore.kernel.org/all/20220422082337.1676-1-socketcan@hartkopp.net
    Cc: stable@vger.kernel.org
    Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/can/isotp.c | 22 +++++-----------------
    1 file changed, 5 insertions(+), 17 deletions(-)

    --- a/net/can/isotp.c
    +++ b/net/can/isotp.c
    @@ -1146,6 +1146,11 @@ static int isotp_bind(struct socket *soc

    lock_sock(sk);

    + if (so->bound) {
    + err = -EINVAL;
    + goto out;
    + }
    +
    /* do not register frame reception for functional addressing */
    if (so->opt.flags & CAN_ISOTP_SF_BROADCAST)
    do_rx_reg = 0;
    @@ -1156,10 +1161,6 @@ static int isotp_bind(struct socket *soc
    goto out;
    }

    - if (so->bound && addr->can_ifindex == so->ifindex &&
    - rx_id == so->rxid && tx_id == so->txid)
    - goto out;
    -
    dev = dev_get_by_index(net, addr->can_ifindex);
    if (!dev) {
    err = -ENODEV;
    @@ -1186,19 +1187,6 @@ static int isotp_bind(struct socket *soc

    dev_put(dev);

    - if (so->bound && do_rx_reg) {
    - /* unregister old filter */
    - if (so->ifindex) {
    - dev = dev_get_by_index(net, so->ifindex);
    - if (dev) {
    - can_rx_unregister(net, dev, so->rxid,
    - SINGLE_MASK(so->rxid),
    - isotp_rcv, sk);
    - dev_put(dev);
    - }
    - }
    - }
    -
    /* switch to new settings */
    so->ifindex = ifindex;
    so->rxid = rx_id;

    \
     
     \ /
      Last update: 2022-05-10 16:25    [W:2.205 / U:0.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site