Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1919142pxk; Sat, 26 Sep 2020 09:30:34 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyF9LO3rTR6aR32s5CdyKtdm9ncTEQXHykveTikPFBz+Nwp/fG9ZDm1VwH5ATqWKicnD9UK X-Received: by 2002:aa7:cf05:: with SMTP id a5mr7473773edy.313.1601137834497; Sat, 26 Sep 2020 09:30:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601137834; cv=none; d=google.com; s=arc-20160816; b=S9J0d41ShSxYKZFHnm7t5Yr+tn+MqpoSR0q7hkLrJpvv4t1teRiB3ZYdZsb+9Gh9P0 h31QXUK4ajmnbDxowTmrhn43rixG0LZ3g8Wx2H9SJn3G/gtUpGEqnt7fcz1pW6KRoVEq ddRYoYqjOyG2eUgmo/HXV929eoMcG2ewAd4/liaTfWpE+eykVTIFPZA3A/T2L2c53y0R aWT4OQbmD0NhRWcFyWPbwuc2C7cLw2KysZcHUuPhY7fiX+Us/0LbiyCuBn3SoWGybE8Z dRkOBNYcjhNzb9ewFkTEV+oRUIhS32IshR5quJmHE7mi21nIo41AD1CSWbzeAB/dvIhD LwDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=TdS6CKNnVj9vibD1EvuIdxr1dtzTjwzpqs49V076hL8=; b=pKoRTtGPkgxM1/GCBx/DMiMHMJDO3GNAvCZJ2cyXMVqfjvKVkdxyFEU3CXct7NGrM7 xIJaE3H4KN/0KwumZREBV1zsN2VWyl/1dxR390Eb28zd69lhRX4c0C5DW2ssJANUTHon B+xAo+W3cKTXvgbnT9k905W2Hns7utnxVAHBZpeFRIz6UtzQ5MsvJ3DdKrmx3q2LTs2J mgL455pHCyUelbPQm1kd4DT/NuxMB9ARW/cSy4B4WKgqTnnb3jbdFPAd2pI+rGdguXtW as6rWVgmauyxgkItic2AXBMex39GAmAdvEmTTeuT6/c9tbY1BEegRywbckfjZM48El36 n6JA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w7si3961765ejk.390.2020.09.26.09.30.11; Sat, 26 Sep 2020 09:30:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729835AbgIZQ1I (ORCPT + 99 others); Sat, 26 Sep 2020 12:27:08 -0400 Received: from smtp05.smtpout.orange.fr ([80.12.242.127]:28053 "EHLO smtp.smtpout.orange.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725208AbgIZQ1I (ORCPT ); Sat, 26 Sep 2020 12:27:08 -0400 Received: from tomoyo.flets-east.jp ([153.230.197.127]) by mwinf5d10 with ME id YgSs230022lQRaH03gT107; Sat, 26 Sep 2020 18:27:05 +0200 X-ME-Helo: tomoyo.flets-east.jp X-ME-Auth: bWFpbGhvbC52aW5jZW50QHdhbmFkb28uZnI= X-ME-Date: Sat, 26 Sep 2020 18:27:05 +0200 X-ME-IP: 153.230.197.127 From: Vincent Mailhol To: linux-can@vger.kernel.org Cc: Vincent Mailhol , Oliver Hartkopp , Marc Kleine-Budde , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH] can: raw: add missing error queue support Date: Sun, 27 Sep 2020 01:24:31 +0900 Message-Id: <20200926162527.270030-1-mailhol.vincent@wanadoo.fr> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Error queue are not yet implemented in CAN-raw sockets. The problem: a userland call to recvmsg(soc, msg, MSG_ERRQUEUE) on a CAN-raw socket would unqueue messages from the normal queue without any kind of error or warning. As such, it prevented CAN drivers from using the functionalities that relies on the error queue such as skb_tx_timestamp(). SCM_CAN_RAW_ERRQUEUE is defined as the type for the CAN raw error queue. SCM stands for "Socket control messages". The name is inspired from SCM_J1939_ERRQUEUE of include/uapi/linux/can/j1939.h. Signed-off-by: Vincent Mailhol --- include/uapi/linux/can/raw.h | 3 +++ net/can/raw.c | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/include/uapi/linux/can/raw.h b/include/uapi/linux/can/raw.h index 6a11d308eb5c..3386aa81fdf2 100644 --- a/include/uapi/linux/can/raw.h +++ b/include/uapi/linux/can/raw.h @@ -49,6 +49,9 @@ #include #define SOL_CAN_RAW (SOL_CAN_BASE + CAN_RAW) +enum { + SCM_CAN_RAW_ERRQUEUE = 1, +}; /* for socket options affecting the socket (not the global system) */ diff --git a/net/can/raw.c b/net/can/raw.c index 94a9405658dc..98abab119136 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -804,6 +804,10 @@ static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, noblock = flags & MSG_DONTWAIT; flags &= ~MSG_DONTWAIT; + if (flags & MSG_ERRQUEUE) + return sock_recv_errqueue(sk, msg, size, + SOL_CAN_RAW, SCM_CAN_RAW_ERRQUEUE); + skb = skb_recv_datagram(sk, flags, noblock, &err); if (!skb) return err; -- 2.26.2