All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] can-isotp fix and functional addressing
@ 2020-12-03 14:06 Oliver Hartkopp
  2020-12-03 14:06 ` [PATCH 1/2] can-isotp: block setsockopt on bound sockets Oliver Hartkopp
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Oliver Hartkopp @ 2020-12-03 14:06 UTC (permalink / raw)
  To: mkl, kuba, davem, netdev, linux-can; +Cc: Oliver Hartkopp

This patch set contains a fix that showed up while implementing the
functional addressing switch suggested by Thomas Wagner.

Unfortunately the functional addressing switch came in very late but
it is really very simple and already tested.

I would like to leave it to the maintainers whether the second patch
can still go into the 5.10-rc tree, which is intended for long-term.

Oliver Hartkopp (2):
  can-isotp: block setsockopt on bound sockets
  can-isotp: add SF_BROADCAST support for functional addressing

 include/uapi/linux/can/isotp.h |  2 +-
 net/can/isotp.c                | 32 +++++++++++++++++++++++---------
 2 files changed, 24 insertions(+), 10 deletions(-)

-- 
2.29.2


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] can-isotp: block setsockopt on bound sockets
  2020-12-03 14:06 [PATCH 0/2] can-isotp fix and functional addressing Oliver Hartkopp
@ 2020-12-03 14:06 ` Oliver Hartkopp
  2020-12-03 14:06 ` [PATCH 2/2] can-isotp: add SF_BROADCAST support for functional addressing Oliver Hartkopp
  2020-12-03 14:25 ` [PATCH 0/2] can-isotp fix and " Marc Kleine-Budde
  2 siblings, 0 replies; 4+ messages in thread
From: Oliver Hartkopp @ 2020-12-03 14:06 UTC (permalink / raw)
  To: mkl, kuba, davem, netdev, linux-can; +Cc: Oliver Hartkopp, Thomas Wagner

The isotp socket can be widely configured in its behaviour regarding
addressing types, fill-ups, receive pattern tests and link layer length.
Usually all these settings need to be fixed before bind() and can not
be changed afterwards.

This patch adds a check to enforce the common usage pattern.

Fixes: e057dd3fc20f ("can: add ISO 15765-2:2016 transport protocol")
Tested-by: Thomas Wagner <thwa1@web.de>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
---
 net/can/isotp.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/net/can/isotp.c b/net/can/isotp.c
index d78ab13bd8be..26bdc3c20b7e 100644
--- a/net/can/isotp.c
+++ b/net/can/isotp.c
@@ -1155,10 +1155,13 @@ static int isotp_setsockopt(struct socket *sock, int level, int optname,
 	int ret = 0;
 
 	if (level != SOL_CAN_ISOTP)
 		return -EINVAL;
 
+	if (so->bound)
+		return -EISCONN;
+
 	switch (optname) {
 	case CAN_ISOTP_OPTS:
 		if (optlen != sizeof(struct can_isotp_options))
 			return -EINVAL;
 
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] can-isotp: add SF_BROADCAST support for functional addressing
  2020-12-03 14:06 [PATCH 0/2] can-isotp fix and functional addressing Oliver Hartkopp
  2020-12-03 14:06 ` [PATCH 1/2] can-isotp: block setsockopt on bound sockets Oliver Hartkopp
@ 2020-12-03 14:06 ` Oliver Hartkopp
  2020-12-03 14:25 ` [PATCH 0/2] can-isotp fix and " Marc Kleine-Budde
  2 siblings, 0 replies; 4+ messages in thread
From: Oliver Hartkopp @ 2020-12-03 14:06 UTC (permalink / raw)
  To: mkl, kuba, davem, netdev, linux-can; +Cc: Oliver Hartkopp, Thomas Wagner

When CAN_ISOTP_SF_BROADCAST is set in the CAN_ISOTP_OPTS flags the
CAN_ISOTP socket is switched into functional addressing mode, where
only single frame (SF) protocol data units can be send on the specified
CAN interface and the given tp.tx_id after bind().

In opposite to normal and extended addressing this socket does not
register a CAN-ID for reception which would be needed for a 1-to-1
ISOTP connection with a segmented bi-directional data transfer.

Sending SFs on this socket is therefore a TX-only 'broadcast' operation.

Suggested-by: Thomas Wagner <thwa1@web.de>
Tested-by: Thomas Wagner <thwa1@web.de>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
---
 include/uapi/linux/can/isotp.h |  2 +-
 net/can/isotp.c                | 29 ++++++++++++++++++++---------
 2 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/include/uapi/linux/can/isotp.h b/include/uapi/linux/can/isotp.h
index 7793b26aa154..c55935b64ccc 100644
--- a/include/uapi/linux/can/isotp.h
+++ b/include/uapi/linux/can/isotp.h
@@ -133,11 +133,11 @@ struct can_isotp_ll_options {
 #define CAN_ISOTP_HALF_DUPLEX	0x040	/* half duplex error state handling */
 #define CAN_ISOTP_FORCE_TXSTMIN	0x080	/* ignore stmin from received FC */
 #define CAN_ISOTP_FORCE_RXSTMIN	0x100	/* ignore CFs depending on rx stmin */
 #define CAN_ISOTP_RX_EXT_ADDR	0x200	/* different rx extended addressing */
 #define CAN_ISOTP_WAIT_TX_DONE	0x400	/* wait for tx completion */
-
+#define CAN_ISOTP_SF_BROADCAST	0x800	/* 1-to-N functional addressing */
 
 /* default values */
 
 #define CAN_ISOTP_DEFAULT_FLAGS		0
 #define CAN_ISOTP_DEFAULT_EXT_ADDRESS	0x00
diff --git a/net/can/isotp.c b/net/can/isotp.c
index 26bdc3c20b7e..5ce26e568f16 100644
--- a/net/can/isotp.c
+++ b/net/can/isotp.c
@@ -863,10 +863,18 @@ static int isotp_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
 	}
 
 	if (!size || size > MAX_MSG_LENGTH)
 		return -EINVAL;
 
+	/* take care of a potential SF_DL ESC offset for TX_DL > 8 */
+	off = (so->tx.ll_dl > CAN_MAX_DLEN) ? 1 : 0;
+
+	/* does the given data fit into a single frame for SF_BROADCAST? */
+	if ((so->opt.flags & CAN_ISOTP_SF_BROADCAST) &&
+	    (size > so->tx.ll_dl - SF_PCI_SZ4 - ae - off))
+		return -EINVAL;
+
 	err = memcpy_from_msg(so->tx.buf, msg, size);
 	if (err < 0)
 		return err;
 
 	dev = dev_get_by_index(sock_net(sk), so->ifindex);
@@ -889,13 +897,10 @@ static int isotp_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
 	so->tx.idx = 0;
 
 	cf = (struct canfd_frame *)skb->data;
 	skb_put(skb, so->ll.mtu);
 
-	/* take care of a potential SF_DL ESC offset for TX_DL > 8 */
-	off = (so->tx.ll_dl > CAN_MAX_DLEN) ? 1 : 0;
-
 	/* check for single frame transmission depending on TX_DL */
 	if (size <= so->tx.ll_dl - SF_PCI_SZ4 - ae - off) {
 		/* The message size generally fits into a SingleFrame - good.
 		 *
 		 * SF_DL ESC offset optimization:
@@ -1014,11 +1019,11 @@ static int isotp_release(struct socket *sock)
 
 	hrtimer_cancel(&so->txtimer);
 	hrtimer_cancel(&so->rxtimer);
 
 	/* remove current filters & unregister */
-	if (so->bound) {
+	if (so->bound && (!(so->opt.flags & CAN_ISOTP_SF_BROADCAST))) {
 		if (so->ifindex) {
 			struct net_device *dev;
 
 			dev = dev_get_by_index(net, so->ifindex);
 			if (dev) {
@@ -1050,10 +1055,11 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len)
 	struct net *net = sock_net(sk);
 	int ifindex;
 	struct net_device *dev;
 	int err = 0;
 	int notify_enetdown = 0;
+	int do_rx_reg = 1;
 
 	if (len < CAN_REQUIRED_SIZE(struct sockaddr_can, can_addr.tp))
 		return -EINVAL;
 
 	if (addr->can_addr.tp.rx_id == addr->can_addr.tp.tx_id)
@@ -1064,10 +1070,14 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len)
 		return -EADDRNOTAVAIL;
 
 	if (!addr->can_ifindex)
 		return -ENODEV;
 
+	/* do not register frame reception for functional addressing */
+	if (so->opt.flags & CAN_ISOTP_SF_BROADCAST)
+		do_rx_reg = 0;
+
 	lock_sock(sk);
 
 	if (so->bound && addr->can_ifindex == so->ifindex &&
 	    addr->can_addr.tp.rx_id == so->rxid &&
 	    addr->can_addr.tp.tx_id == so->txid)
@@ -1091,17 +1101,18 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len)
 	if (!(dev->flags & IFF_UP))
 		notify_enetdown = 1;
 
 	ifindex = dev->ifindex;
 
-	can_rx_register(net, dev, addr->can_addr.tp.rx_id,
-			SINGLE_MASK(addr->can_addr.tp.rx_id), isotp_rcv, sk,
-			"isotp", sk);
+	if (do_rx_reg)
+		can_rx_register(net, dev, addr->can_addr.tp.rx_id,
+				SINGLE_MASK(addr->can_addr.tp.rx_id),
+				isotp_rcv, sk, "isotp", sk);
 
 	dev_put(dev);
 
-	if (so->bound) {
+	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,
@@ -1300,11 +1311,11 @@ static int isotp_notifier(struct notifier_block *nb, unsigned long msg,
 
 	switch (msg) {
 	case NETDEV_UNREGISTER:
 		lock_sock(sk);
 		/* remove current filters & unregister */
-		if (so->bound)
+		if (so->bound && (!(so->opt.flags & CAN_ISOTP_SF_BROADCAST)))
 			can_rx_unregister(dev_net(dev), dev, so->rxid,
 					  SINGLE_MASK(so->rxid),
 					  isotp_rcv, sk);
 
 		so->ifindex = 0;
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 0/2] can-isotp fix and functional addressing
  2020-12-03 14:06 [PATCH 0/2] can-isotp fix and functional addressing Oliver Hartkopp
  2020-12-03 14:06 ` [PATCH 1/2] can-isotp: block setsockopt on bound sockets Oliver Hartkopp
  2020-12-03 14:06 ` [PATCH 2/2] can-isotp: add SF_BROADCAST support for functional addressing Oliver Hartkopp
@ 2020-12-03 14:25 ` Marc Kleine-Budde
  2 siblings, 0 replies; 4+ messages in thread
From: Marc Kleine-Budde @ 2020-12-03 14:25 UTC (permalink / raw)
  To: Oliver Hartkopp, kuba, davem, netdev, linux-can


[-- Attachment #1.1: Type: text/plain, Size: 765 bytes --]

On 12/3/20 3:06 PM, Oliver Hartkopp wrote:
> This patch set contains a fix that showed up while implementing the
> functional addressing switch suggested by Thomas Wagner.
> 
> Unfortunately the functional addressing switch came in very late but
> it is really very simple and already tested.
> 
> I would like to leave it to the maintainers whether the second patch
> can still go into the 5.10-rc tree, which is intended for long-term.

Added to linux-can/testing.

Tnx,
Marc

-- 
Pengutronix e.K.                 | Marc Kleine-Budde           |
Embedded Linux                   | https://www.pengutronix.de  |
Vertretung West/Dortmund         | Phone: +49-231-2826-924     |
Amtsgericht Hildesheim, HRA 2686 | Fax:   +49-5121-206917-5555 |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-12-03 15:01 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-03 14:06 [PATCH 0/2] can-isotp fix and functional addressing Oliver Hartkopp
2020-12-03 14:06 ` [PATCH 1/2] can-isotp: block setsockopt on bound sockets Oliver Hartkopp
2020-12-03 14:06 ` [PATCH 2/2] can-isotp: add SF_BROADCAST support for functional addressing Oliver Hartkopp
2020-12-03 14:25 ` [PATCH 0/2] can-isotp fix and " Marc Kleine-Budde

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.