From patchwork Wed Mar 30 22:37:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Soheil Hassas Yeganeh X-Patchwork-Id: 603680 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3qb2bN49mxz9sXQ for ; Thu, 31 Mar 2016 09:37:52 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=zR0xi1al; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755273AbcC3Whv (ORCPT ); Wed, 30 Mar 2016 18:37:51 -0400 Received: from mail-qg0-f65.google.com ([209.85.192.65]:36447 "EHLO mail-qg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755127AbcC3Wht (ORCPT ); Wed, 30 Mar 2016 18:37:49 -0400 Received: by mail-qg0-f65.google.com with SMTP id n34so6175551qge.3 for ; Wed, 30 Mar 2016 15:37:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=sMZ/qE/rbtsqhGE26qOwDU0Xv7MeL13TKyzlp/XsOcQ=; b=zR0xi1al3k4D9qUAI88fDuvKjVTeO2F0BZ3hyxb9uik95lFFUJnXq725jVWYmjAHJ0 Mhkc55HO4crB4HJr6nvYSe78I1y6UJ6MpdsYcYzV4oOxQmZD6SL2HEWhrlm40OuKhnlo p/i2dynLBh0Vhc9JkIoXKCI9Q66ySw1EdOtGJXiOynIhIfGYRTJHZTix9wxZr8QRxueB 9ke8ASxpfzDLCKekG1SJSHOAcjhiPM1bqPzDaTPmwCASt4OENhZmkGjKcN3+HejDdz5P c2KNdlJUydQfFIEEjvCWs/v3AQir36dfC1w+37wYbb3fjdUd55QRQcW9ymoPpyhiIrXX uSBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=sMZ/qE/rbtsqhGE26qOwDU0Xv7MeL13TKyzlp/XsOcQ=; b=ICrUZRrPUj3lBN1UH4CkgizD4hCs1cc6zkmKjr8EZbOkAy4dcY8shULuFb1J0xpxOL h86XY9JfXQZH45cpqJF/1KYOA+MNgcDr+rA2MmKPYqlPobaLCi66gMod+Pd0xSRXzaij 5DhaJU6PEQjjnWZ01URiU8jPg4jhOEvjtTZIByCBVB3RahcY1m4MPL2I83SAAxiByx5/ oY92oDlf+bw8O87jlIkCvmK88PrQGvhZKA+szkFwZlDS1MwvKj6wozIKSB9m4fFO48nE HiP/nJaF37AtqGuyeAKmEhVIY1++WsPHIfZ6D/gRBZryMp3j7QPHoyc4Yv8AiLrTIveW Igjw== X-Gm-Message-State: AD7BkJLYBu9psAXeeYJKxSbXifcr2YY/UC5lA8W1gkPBAxki5BDe37etn9uwoeA8VsGTCQ== X-Received: by 10.140.157.16 with SMTP id d16mr2331693qhd.89.1459377468513; Wed, 30 Mar 2016 15:37:48 -0700 (PDT) Received: from soheil.nyc.corp.google.com ([100.101.230.231]) by smtp.gmail.com with ESMTPSA id l67sm2782265qgl.47.2016.03.30.15.37.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 30 Mar 2016 15:37:48 -0700 (PDT) From: Soheil Hassas Yeganeh To: davem@davemloft.net, netdev@vger.kernel.org Cc: willemb@google.com, edumazet@google.com, ycheng@google.com, ncardwell@google.com, kafai@fb.com, Soheil Hassas Yeganeh Subject: [PATCH net-next 4/8] sock: accept SO_TIMESTAMPING flags in socket cmsg Date: Wed, 30 Mar 2016 18:37:24 -0400 Message-Id: <1459377448-2239-5-git-send-email-soheil.kdev@gmail.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1459377448-2239-1-git-send-email-soheil.kdev@gmail.com> References: <1459377448-2239-1-git-send-email-soheil.kdev@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Soheil Hassas Yeganeh Accept SO_TIMESTAMPING in control messages of the SOL_SOCKET level as a basis to accept timestamping requests per write. This implementation only accepts TX recording flags (i.e., SOF_TIMESTAMPING_TX_HARDWARE, SOF_TIMESTAMPING_TX_SOFTWARE, SOF_TIMESTAMPING_TX_SCHED, and SOF_TIMESTAMPING_TX_ACK) in control messages. Users need to set reporting flags (e.g., SOF_TIMESTAMPING_OPT_ID) per socket via socket options. This commit adds a tsflags field in sockcm_cookie which is set in __sock_cmsg_send. It only override the SOF_TIMESTAMPING_TX_* bits in sockcm_cookie.tsflags allowing the control message to override the recording behavior per write, yet maintaining the value of other flags. This patch implements validating the control message and setting tsflags in struct sockcm_cookie. Next commits in this series will actually implement timestamping per write for different protocols. Signed-off-by: Soheil Hassas Yeganeh Acked-by: Willem de Bruijn --- include/net/sock.h | 1 + include/uapi/linux/net_tstamp.h | 10 ++++++++++ net/core/sock.c | 13 +++++++++++++ 3 files changed, 24 insertions(+) diff --git a/include/net/sock.h b/include/net/sock.h index 03772d4..af012da 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1418,6 +1418,7 @@ void sk_send_sigurg(struct sock *sk); struct sockcm_cookie { u32 mark; + u16 tsflags; }; int __sock_cmsg_send(struct sock *sk, struct msghdr *msg, struct cmsghdr *cmsg, diff --git a/include/uapi/linux/net_tstamp.h b/include/uapi/linux/net_tstamp.h index 6d1abea..264e515 100644 --- a/include/uapi/linux/net_tstamp.h +++ b/include/uapi/linux/net_tstamp.h @@ -31,6 +31,16 @@ enum { SOF_TIMESTAMPING_LAST }; +/* + * SO_TIMESTAMPING flags are either for recording a packet timestamp or for + * reporting the timestamp to user space. + * Recording flags can be set both via socket options and control messages. + */ +#define SOF_TIMESTAMPING_TX_RECORD_MASK (SOF_TIMESTAMPING_TX_HARDWARE | \ + SOF_TIMESTAMPING_TX_SOFTWARE | \ + SOF_TIMESTAMPING_TX_SCHED | \ + SOF_TIMESTAMPING_TX_ACK) + /** * struct hwtstamp_config - %SIOCGHWTSTAMP and %SIOCSHWTSTAMP parameter * diff --git a/net/core/sock.c b/net/core/sock.c index 0a64fe2..315f5e5 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1870,6 +1870,8 @@ EXPORT_SYMBOL(sock_alloc_send_skb); int __sock_cmsg_send(struct sock *sk, struct msghdr *msg, struct cmsghdr *cmsg, struct sockcm_cookie *sockc) { + u32 tsflags; + switch (cmsg->cmsg_type) { case SO_MARK: if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) @@ -1878,6 +1880,17 @@ int __sock_cmsg_send(struct sock *sk, struct msghdr *msg, struct cmsghdr *cmsg, return -EINVAL; sockc->mark = *(u32 *)CMSG_DATA(cmsg); break; + case SO_TIMESTAMPING: + if (cmsg->cmsg_len != CMSG_LEN(sizeof(u32))) + return -EINVAL; + + tsflags = *(u32 *)CMSG_DATA(cmsg); + if (tsflags & ~SOF_TIMESTAMPING_TX_RECORD_MASK) + return -EINVAL; + + sockc->tsflags &= ~SOF_TIMESTAMPING_TX_RECORD_MASK; + sockc->tsflags |= tsflags; + break; default: return -EINVAL; }