From patchwork Fri Apr 1 15:04:36 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: 604875 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 3qc4Rh34Bgz9sC4 for ; Sat, 2 Apr 2016 02:04:48 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=1HMBh12j; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759002AbcDAPEr (ORCPT ); Fri, 1 Apr 2016 11:04:47 -0400 Received: from mail-qk0-f195.google.com ([209.85.220.195]:33841 "EHLO mail-qk0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751820AbcDAPEp (ORCPT ); Fri, 1 Apr 2016 11:04:45 -0400 Received: by mail-qk0-f195.google.com with SMTP id u128so4684701qkh.1 for ; Fri, 01 Apr 2016 08:04:45 -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=jbtWGrAXmsGUZtL7GeQ6/h0LJnnxm5CFM9tW+D3L/FE=; b=1HMBh12j2nDV70D1JJLaQRsvibYCrijNC5kvOFlnZSoODZmKFAVfzWuUfPf14T0F2n bJhluRZ1gAzzxgpUXxRRnBTGhBfx+utSmxJ3nB/7ECASRxyc0kOP6PnYeuOgMIyQHepE x/FyUNNG2JAMsSJQF14CRJvGhjd14il0wGTT8eYnL1yaqC25+LChU+0FOXuZQ+alNz/L xio/o8cz6kacluW5wEiYavsyqMnTOZSL2yZEmq+ZUJsp+3+uKPzEcNZZVgKGVnm+6uUR PPUGhcTxZoxwFRBsF+1miw0xvz/ESMegwEjO4z4NSn7sO5w4fXjjfLQmBDc6t5tuDmEV ngTw== 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=jbtWGrAXmsGUZtL7GeQ6/h0LJnnxm5CFM9tW+D3L/FE=; b=d02aL1SZ/54o+/paf98DSqT9PgR2ODXIHBJqrlQMqxq63B+nbU9JDqEHfgJn0C9/BJ 8G49Z2IRiOsc6A6SRbIeIItw9iOBXpg4BQlW/XEQtDVRTqbPz9Yjk5S56OrVWUsn/BbG pgCqkfi91jwIb47M4bISbmqE605genLjT2xx7onDtddlTHWy3YPIj6k5RHVlzHbRZ6Xd z2QTcxV6gVNTX4qYkukEHz608X74lhVkVdIxFLDxHrA5deNDaPG79L1RXy/Dz8IS4yaD 9374XnA92NiONU869BbV0NnD/FPKx9SSu/R+mKQtyxiw1kQfUuaehJ6hCteuk2bug468 NDiQ== X-Gm-Message-State: AD7BkJKG/MVJAdr+97ixcUA8F+cdX4E9+SMVaZuYCEUj96zFfIoxgWnq4jMiZl2uOj1fkw== X-Received: by 10.55.214.211 with SMTP id p80mr18848888qkl.84.1459523084874; Fri, 01 Apr 2016 08:04:44 -0700 (PDT) Received: from soheil.nyc.corp.google.com ([100.101.230.231]) by smtp.gmail.com with ESMTPSA id d6sm6312885qkb.13.2016.04.01.08.04.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 01 Apr 2016 08:04:44 -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 v2 net-next 4/8] sock: accept SO_TIMESTAMPING flags in socket cmsg Date: Fri, 1 Apr 2016 11:04:36 -0400 Message-Id: <1459523080-29329-5-git-send-email-soheil.kdev@gmail.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1459523080-29329-1-git-send-email-soheil.kdev@gmail.com> References: <1459523080-29329-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; }