From patchwork Sun Apr 3 03:08:09 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: 605503 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 3qd0SR3JvXz9snk for ; Sun, 3 Apr 2016 13:08:39 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=v+aNKeBK; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752145AbcDCDIa (ORCPT ); Sat, 2 Apr 2016 23:08:30 -0400 Received: from mail-qg0-f67.google.com ([209.85.192.67]:34528 "EHLO mail-qg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751999AbcDCDIZ (ORCPT ); Sat, 2 Apr 2016 23:08:25 -0400 Received: by mail-qg0-f67.google.com with SMTP id j35so14801006qge.1 for ; Sat, 02 Apr 2016 20:08:25 -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=v+aNKeBKYtZtGiZoQ4nHjN+Whxnr6scNv+OuWG9/JqwkqfzFi8twYiMQpenW1Jffae EEGidKxK0mW5R1ZDZYg0FCMp+hU2EtxDUKGSWiqmOYjf4UMpVEsbmzaCBbpk14XXFJSe OzJAEXQo0PU6LsrdL7uEJcWzReYsv41F9yPFKLSYieWtigdbm3uf8boZ3Mt50Iv+ayGj 5/MRAhw2naZLdE1Fah5ZtIhCWHFtuBIqsxsIHbHjMas3TT6Y1wwxqGL8SaK1u3Lgitj1 yDr2oOROW/nXX7rQtcnNiFERU7FN7TBCUVgPCaobu0vjaUeduc9lhltJa4jfvFYWN9wn cnIg== 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=A37Zcn80z+FxfzY3PcOmOGfkh018IzVlXD0TDAcpEzaUZw7BYwAiUJ+0J+8vpwqhs2 TFfLQb/d2daK2SyBPQ7wpDqN7uUusPtDYdkqIxdHbYmQjrdpPZlD6kh38P0YKvKvpwqc zCrFGe4OzCH/gpliFYAncYNeAqgy0Urb6Cn8Lh8EoPIVdIj9ez+4SltqBsbC/0SapHmo NdtLoLWJ9UQPuwS+P96ARqJpKboycvni9IoTLuDIPv3aa6STPpbkvHp9zcXe72vejUnx W3gAZ3zMQiNsQO4NxEVEX+93HmSTRQOOOWhU/OVlrZNyrdtQYuDzTwxuLAKzWMbu86hP RAWg== X-Gm-Message-State: AD7BkJKRndNEj4wLBNk774ZKq4FOF68rNDbZoPOAafU8FaQJnSSdZn2QNHMwXT0qTloKiA== X-Received: by 10.140.141.6 with SMTP id 6mr5633941qhn.82.1459652904786; Sat, 02 Apr 2016 20:08:24 -0700 (PDT) Received: from soheil.nyc.corp.google.com ([100.101.230.231]) by smtp.gmail.com with ESMTPSA id r65sm9611121qki.17.2016.04.02.20.08.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 02 Apr 2016 20:08:24 -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 v3 net-next 4/8] sock: accept SO_TIMESTAMPING flags in socket cmsg Date: Sat, 2 Apr 2016 23:08:09 -0400 Message-Id: <1459652893-14207-5-git-send-email-soheil.kdev@gmail.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1459652893-14207-1-git-send-email-soheil.kdev@gmail.com> References: <1459652893-14207-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; }