Skip to content

Commit

Permalink
can: isotp: remove re-binding of bound socket
Browse files Browse the repository at this point in the history
commit 72ed3ee 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: e057dd3 ("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>
  • Loading branch information
hartkopp authored and gregkh committed May 12, 2022
1 parent b266f56 commit 30a63e7
Showing 1 changed file with 5 additions and 17 deletions.
22 changes: 5 additions & 17 deletions net/can/isotp.c
Expand Up @@ -1146,6 +1146,11 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len)

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;
Expand All @@ -1156,10 +1161,6 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len)
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;
Expand All @@ -1186,19 +1187,6 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len)

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;
Expand Down

0 comments on commit 30a63e7

Please sign in to comment.