From patchwork Tue Apr 23 10:39:29 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Borkmann X-Patchwork-Id: 238859 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 CCA1F2C00F9 for ; Tue, 23 Apr 2013 20:42:13 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756048Ab3DWKmJ (ORCPT ); Tue, 23 Apr 2013 06:42:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:20516 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755515Ab3DWKmI (ORCPT ); Tue, 23 Apr 2013 06:42:08 -0400 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r3NAfT8A031578 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 23 Apr 2013 06:41:29 -0400 Received: from localhost (vpn1-7-20.ams2.redhat.com [10.36.7.20]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r3NAenfO013353; Tue, 23 Apr 2013 06:40:53 -0400 From: Daniel Borkmann To: davem@davemloft.net Cc: netdev@vger.kernel.org, willemb@google.com, Paul.Chavent@onera.fr, richardcochran@gmail.com Subject: [PATCH net-next 2/5] packet: enable hardware tx timestamping on tpacket ring Date: Tue, 23 Apr 2013 12:39:29 +0200 Message-Id: <1366713572-11978-3-git-send-email-dborkman@redhat.com> In-Reply-To: <1366713572-11978-1-git-send-email-dborkman@redhat.com> References: <1366713572-11978-1-git-send-email-dborkman@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Currently, we only have software timestamping for the TX ring buffer path, but this limitation stems rather from the implementation. By just reusing tpacket_get_timestamp(), we can also allow hardware timestamping just as in the RX path. Signed-off-by: Daniel Borkmann Acked-by: Willem de Bruijn --- net/packet/af_packet.c | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 1f792ab..e7892a4 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -339,14 +339,33 @@ static int __packet_get_status(struct packet_sock *po, void *frame) } } +static bool tpacket_get_timestamp(struct sk_buff *skb, struct timespec *ts, + unsigned int flags) +{ + struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb); + + if (shhwtstamps) { + if ((flags & SOF_TIMESTAMPING_SYS_HARDWARE) && + ktime_to_timespec_cond(shhwtstamps->syststamp, ts)) + return true; + if ((flags & SOF_TIMESTAMPING_RAW_HARDWARE) && + ktime_to_timespec_cond(shhwtstamps->hwtstamp, ts)) + return true; + } + + if (ktime_to_timespec_cond(skb->tstamp, ts)) + return true; + + return false; +} + static void __packet_set_timestamp(struct packet_sock *po, void *frame, - ktime_t tstamp) + struct sk_buff *skb) { union tpacket_uhdr h; struct timespec ts; - if (!ktime_to_timespec_cond(tstamp, &ts) || - !sock_flag(&po->sk, SOCK_TIMESTAMPING_SOFTWARE)) + if (!tpacket_get_timestamp(skb, &ts, po->tp_tstamp)) return; h.raw = frame; @@ -1688,26 +1707,6 @@ drop: return 0; } -static void tpacket_get_timestamp(struct sk_buff *skb, struct timespec *ts, - unsigned int flags) -{ - struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb); - - if (shhwtstamps) { - if ((flags & SOF_TIMESTAMPING_SYS_HARDWARE) && - ktime_to_timespec_cond(shhwtstamps->syststamp, ts)) - return; - if ((flags & SOF_TIMESTAMPING_RAW_HARDWARE) && - ktime_to_timespec_cond(shhwtstamps->hwtstamp, ts)) - return; - } - - if (ktime_to_timespec_cond(skb->tstamp, ts)) - return; - - getnstimeofday(ts); -} - static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { @@ -1804,7 +1803,8 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, spin_unlock(&sk->sk_receive_queue.lock); skb_copy_bits(skb, 0, h.raw + macoff, snaplen); - tpacket_get_timestamp(skb, &ts, po->tp_tstamp); + if (!tpacket_get_timestamp(skb, &ts, po->tp_tstamp)) + getnstimeofday(&ts); switch (po->tp_version) { case TPACKET_V1: @@ -1908,7 +1908,7 @@ static void tpacket_destruct_skb(struct sk_buff *skb) ph = skb_shinfo(skb)->destructor_arg; BUG_ON(atomic_read(&po->tx_ring.pending) == 0); atomic_dec(&po->tx_ring.pending); - __packet_set_timestamp(po, ph, skb->tstamp); + __packet_set_timestamp(po, ph, skb); __packet_set_status(po, ph, TP_STATUS_AVAILABLE); }