From patchwork Fri Oct 24 13:49:10 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Ohly X-Patchwork-Id: 8142 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.176.167]) by ozlabs.org (Postfix) with ESMTP id 883CADDF22 for ; Wed, 12 Nov 2008 01:57:10 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756091AbYKKO5H (ORCPT ); Tue, 11 Nov 2008 09:57:07 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755938AbYKKO5H (ORCPT ); Tue, 11 Nov 2008 09:57:07 -0500 Received: from mga11.intel.com ([192.55.52.93]:30488 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756026AbYKKO5D (ORCPT ); Tue, 11 Nov 2008 09:57:03 -0500 Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 11 Nov 2008 06:51:39 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.33,584,1220252400"; d="scan'208";a="402316127" Received: from ecld0pohly.ikn.intel.com (HELO [172.28.75.199]) ([172.28.75.199]) by fmsmga002.fm.intel.com with ESMTP; 11 Nov 2008 06:52:59 -0800 In-Reply-To: <1226414697.17450.852.camel@ecld0pohly> References: <1226414697.17450.852.camel@ecld0pohly> From: Patrick Ohly Date: Fri, 24 Oct 2008 15:49:10 +0200 Subject: [RFC PATCH 05/13] ip: support for TX timestamps on UDP and RAW sockets To: netdev@vger.kernel.org Cc: Octavian Purdila , Stephen Hemminger , Ingo Oeser , Andi Kleen , John Ronciak , Eric Dumazet , Oliver Hartkopp X-Mailer: Evolution 2.22.2 Message-Id: <1226415422.31699.4.camel@ecld0pohly> Mime-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Signed-off-by: Patrick Ohly --- include/net/ip.h | 1 + net/can/raw.c | 8 ++++++++ net/ipv4/icmp.c | 2 ++ net/ipv4/ip_output.c | 2 ++ net/ipv4/raw.c | 1 + net/ipv4/udp.c | 4 ++++ 6 files changed, 18 insertions(+), 0 deletions(-) diff --git a/include/net/ip.h b/include/net/ip.h index 250e6ef..76cee15 100644 --- a/include/net/ip.h +++ b/include/net/ip.h @@ -54,6 +54,7 @@ struct ipcm_cookie __be32 addr; int oif; struct ip_options *opt; + union ktime tstamp; }; #define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb)) diff --git a/net/can/raw.c b/net/can/raw.c index 6e0663f..b3a978b 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -618,6 +618,9 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock, struct raw_sock *ro = raw_sk(sk); struct sk_buff *skb; struct net_device *dev; + union ktime tstamp = { + .tv64 = 0. + }; int ifindex; int err; @@ -639,6 +642,10 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock, if (!dev) return -ENXIO; + err = sock_tx_timestamp(msg, sk, &tstamp); + if (err < 0) + return err; + skb = sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT, &err); if (!skb) { @@ -654,6 +661,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock, } skb->dev = dev; skb->sk = sk; + skb->tstamp = tstamp; err = can_send(skb, ro->loopback); diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 55c355e..27cd661 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c @@ -375,6 +375,7 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb) inet->tos = ip_hdr(skb)->tos; daddr = ipc.addr = rt->rt_src; ipc.opt = NULL; + ipc.tstamp.tv64 = 0; if (icmp_param->replyopts.optlen) { ipc.opt = &icmp_param->replyopts; if (ipc.opt->srr) @@ -532,6 +533,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) inet_sk(sk)->tos = tos; ipc.addr = iph->saddr; ipc.opt = &icmp_param.replyopts; + ipc.tstamp.tv64 = 0; { struct flowi fl = { diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index d533a89..437906d 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -939,6 +939,7 @@ alloc_new_skb: skb->ip_summed = csummode; skb->csum = 0; skb_reserve(skb, hh_len); + skb->tstamp = ipc->tstamp; /* * Find where to start putting bytes. @@ -1353,6 +1354,7 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *ar daddr = ipc.addr = rt->rt_src; ipc.opt = NULL; + ipc.tstamp.tv64 = 0; if (replyopts.opt.optlen) { ipc.opt = &replyopts.opt; diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index cd97574..2120ac5 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -493,6 +493,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, ipc.addr = inet->saddr; ipc.opt = NULL; + ipc.tstamp.tv64 = 0; ipc.oif = sk->sk_bound_dev_if; if (msg->msg_controllen) { diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 57e26fa..6b9c544 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -557,6 +557,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, return -EOPNOTSUPP; ipc.opt = NULL; + ipc.tstamp.tv64 = 0; if (up->pending) { /* @@ -604,6 +605,9 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, ipc.addr = inet->saddr; ipc.oif = sk->sk_bound_dev_if; + err = sock_tx_timestamp(msg, sk, &ipc.tstamp); + if (err) + return err; if (msg->msg_controllen) { err = ip_cmsg_send(sock_net(sk), msg, &ipc); if (err)