On 28.04.2021 13:45:10, Oliver Hartkopp wrote: > On 28.04.21 12:47, Marc Kleine-Budde wrote: > > On 28.04.2021 12:24:32, Oliver Hartkopp wrote: > > > > Maybe the way to trigger the sk_error_report(sk) we might return '-1' > > > > while the error is then propagated inside errno. > > > > > > I added some debug print in isotpsend: > > > > > > diff --git a/isotpsend.c b/isotpsend.c > > > index 3ea574c..c2937fa 100644 > > > --- a/isotpsend.c > > > +++ b/isotpsend.c > > > @@ -45,10 +45,11 @@ > > > #include > > > #include > > > #include > > > #include > > > #include > > > +#include > > > > > > #include > > > #include > > > #include > > > #include > > > @@ -252,10 +253,11 @@ int main(int argc, char **argv) > > > buf[buflen] = ((buflen % 0xFF) + 1) & 0xFF; > > > } > > > > > > > > > retval = write(s, buf, buflen); > > > + printf("retval %d errno %d\n", retval, errno); > > > > Note: in user space errno is only valid if retval is "-1"... > > Ok, just returned '-1' in that case of blocking write (which runs into the > timeout) ... > > diff --git a/net/can/isotp.c b/net/can/isotp.c > index 9f94ad3caee9..d5d541b4fed5 100644 > --- a/net/can/isotp.c > +++ b/net/can/isotp.c > @@ -952,10 +952,11 @@ static int isotp_sendmsg(struct socket *sock, struct > msghdr *msg, size_t size) > } > > if (wait_tx_done) { > /* wait for complete transmission of current pdu */ > wait_event_interruptible(so->wait, so->tx.state == > ISOTP_IDLE); > + return -1; > } > > return size; > } > > And now got this: > > $ date +%S.%N && ./isotpsend vcan0 -s 123 -d 321 -D 44 -b && date +%S.%N > 22.411570468 > retval -1 errno 1 ^ ^ | that is your -1 it's -1, as your return value was negative > write: Operation not permitted > > So still nothing to see from "sk->sk_err = ECOMM;" > > But when adding 'return -ECOMM' at the above section it works like this: > > $ date +%S.%N && ./isotpsend vcan0 -s 123 -d 321 -D 44 -b && date +%S.%N > 58.453452222 > retval -1 errno 70 > write: Communication error on send looks good > This is obviously the expected behaviour for user space: > > - get '-1' in the case of socket related errors > - get the details from errno ACK > Maybe all that sk_err stuff is only relevant for listen/accept constructions > for connection oriented sockets and can be removed inside isotp.c ... My theory is: - return bytes send from isotp_sendmsg() or -errno as usual - use sk->sk_error_report(sk) to wake up user space if it is blocked in poll() or blocking in sendmsg()/recvmsg() For example, if you have a normal read() blocking on a CAN_RAW socket on an interface, you get a ENETDOWN when you ifdown the interface: https://elixir.bootlin.com/linux/latest/source/net/can/raw.c#L302 e.g.: | ➜ (pts/54) frogger@hardanger:/tmp candump can0 & | [1] 260474 | ➜ (pts/54) frogger@hardanger:/tmp (1) sudo ip link set can0 down | read: Network is down | [1] + 260474 exit 1 candump can0 regards, 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 |