[PATCH can-next v2 1/3] af_can: ensure sk_protocol is always set on socket creation
Filippo Storniolo <[email protected]>
| Newsgroups | org.kernel.vger.linux-can |
|---|---|
| Message-ID | <[email protected]> |
From: Davide Caratti <[email protected]> Currently, only j1939 assigns a value to 'sk_protocol'. As a prerequisite for the implementation of CAN sockets diagnostics, AF_CAN sockets need an easy way to determine which protocol is on top of an existing socket. POC test using can-tests: | # perf probe -m can_j1939 --add "j1939_sk_recvmsg sock->sk->sk_protocol" | # perf record -e probe:j1939_sk_recvmsg -aR -- ./j1939/tst-j1939-ac | [...] | # perf script | tst-j1939-ac 5807 [002] 322767.312599: probe:j1939_sk_recvmsg: (ffffffffc0b29a14) sk_protocol=0x7 | ^^^ 0x7, that's CAN_J1939 | # perf probe -m can_raw --add "raw_recvmsg sock->sk->sk_protocol" | # perf record -e probe:raw_recvmsg -aR ./netlayer/tst-rcv-own-msgs vcan0 | # perf script | [...] | tst-rcv-own-msg 5816 [001] 323173.651122: probe:raw_recvmsg: (ffffffffc0b20154) sk_protocol=0x1 | ^^^ 0x1, that's CAN_RAW. It was 0x0 on unpatched kernel Storing the "protocol" value in can_create() fixes the problem. This also fixes AF_CAN support for the following system call: | getsockopt(..., SOL_SOCKET, SO_PROTOCOL, &proto, sizeof(proto)) that was assigning 0 to 'proto' since the earliest kernel versions. Fixes: 0d66548a10cb ("[CAN]: Add PF_CAN core module") Signed-off-by: Davide Caratti <[email protected]> --- net/can/af_can.c | 1 + net/can/j1939/socket.c | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/net/can/af_can.c b/net/can/af_can.c index 7bc86b176b4d..65af25946985 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c @@ -162,6 +162,7 @@ static int can_create(struct net *net, struct socket *sock, int protocol, } sock_init_data(sock, sk); + sk->sk_protocol = protocol; sk->sk_destruct = can_sock_destruct; if (sk->sk_prot->init) diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c index 50a598ef5fd4..ccd43ff5519c 100644 --- a/net/can/j1939/socket.c +++ b/net/can/j1939/socket.c @@ -420,7 +420,6 @@ static int j1939_sk_init(struct sock *sk) /* j1939_sk_sock_destruct() depends on SOCK_RCU_FREE flag */ sock_set_flag(sk, SOCK_RCU_FREE); sk->sk_destruct = j1939_sk_sock_destruct; - sk->sk_protocol = CAN_J1939; return 0; } -- 2.55.0