On Tue, 4 Sep 2007 06:35:25 +0100
Stephen Hemminger <[EMAIL PROTECTED]> wrote:

> Andi mentioned he did something like this already, but never
> submitted it.
> 
> The dhcp client application uses AF_PACKET with a packet filter to
> receive data. The application doesn't even use timestamps, but because
> the AF_PACKET API has timestamps, they get turned on globally which
> causes an expensive time of day lookup for every packet received
> on any system that uses the standard DHCP client.
> 
> The fix is to not enable the timestamp (but use if if available).
> This causes the time lookup to only occur on those packets
> that are destined for the AF_PACKET socket. 
> The timestamping occurs after packet filtering
> so all packets dropped by filtering to not cause a clock call.
> 
> The one downside of this a a few microseconds additional delay
> added from the normal timestamping location (netif_rx) until the
> receive callback in AF_PACKET. But since the offset is fairly consistent
> it should not upset applications that do want really use timestamps,
> like wireshark.

This patch seems the correct fix for this longstanding problem.

Please note that if wireshark/tcpdump processes really want precise timestamps, 
they still can ask this by using setsockopt(SO_TIMESTAMP or SO_TIMESTAMPNS) on 
their private socket.

(We already know that running a sniffer has a cost anyway)

> 
> Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]>
> 
> 
> --- a/net/packet/af_packet.c  2007-07-23 09:31:26.000000000 +0100
> +++ b/net/packet/af_packet.c  2007-09-03 14:55:00.000000000 +0100
> @@ -640,11 +640,10 @@ static int tpacket_rcv(struct sk_buff *s
>       h->tp_snaplen = snaplen;
>       h->tp_mac = macoff;
>       h->tp_net = netoff;
> -     if (skb->tstamp.tv64 == 0) {
> -             __net_timestamp(skb);
> -             sock_enable_timestamp(sk);
> -     }
> -     tv = ktime_to_timeval(skb->tstamp);
> +     if (skb->tstamp.tv64)
> +             tv = ktime_to_timeval(skb->tstamp);
> +     else
> +             do_gettimeofday(&tv);
>       h->tp_sec = tv.tv_sec;
>       h->tp_usec = tv.tv_usec;
>  

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to