Currently, af_packet does not allow disabling timestamps. This patch changes
that but doesn't force global timestamps on.

This shows up in bugzilla as:
        http://bugzilla.kernel.org/show_bug.cgi?id=4809

Patch against net-2.6.24 tree.

Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]>

--- a/net/core/sock.c   2007-09-12 15:08:43.000000000 +0200
+++ b/net/core/sock.c   2007-09-13 12:10:19.000000000 +0200
@@ -259,7 +259,8 @@ static void sock_disable_timestamp(struc
 {
        if (sock_flag(sk, SOCK_TIMESTAMP)) {
                sock_reset_flag(sk, SOCK_TIMESTAMP);
-               net_disable_timestamp();
+               if (sk->sk_family != PF_PACKET)
+                       net_disable_timestamp();
        }
 }
 
@@ -1645,7 +1646,8 @@ void sock_enable_timestamp(struct sock *
 {
        if (!sock_flag(sk, SOCK_TIMESTAMP)) {
                sock_set_flag(sk, SOCK_TIMESTAMP);
-               net_enable_timestamp();
+               if (sk->sk_family != PF_PACKET)
+                       net_enable_timestamp();
        }
 }
 EXPORT_SYMBOL(sock_enable_timestamp);
--- a/net/packet/af_packet.c    2007-09-12 17:07:00.000000000 +0200
+++ b/net/packet/af_packet.c    2007-09-13 12:09:10.000000000 +0200
@@ -572,7 +572,6 @@ static int tpacket_rcv(struct sk_buff *s
        unsigned long status = TP_STATUS_LOSING|TP_STATUS_USER;
        unsigned short macoff, netoff;
        struct sk_buff *copy_skb = NULL;
-       struct timeval tv;
 
        if (dev->nd_net != &init_net)
                goto drop;
@@ -650,12 +649,19 @@ static int tpacket_rcv(struct sk_buff *s
        h->tp_snaplen = snaplen;
        h->tp_mac = macoff;
        h->tp_net = netoff;
-       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;
+
+       if (sock_flag(sk, SOCK_TIMESTAMP)) {
+               struct timeval tv;
+               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;
+       } else {
+               h->tp_sec = 0;
+               h->tp_usec = 0;
+       }
 
        sll = (struct sockaddr_ll*)((u8*)h + TPACKET_ALIGN(sizeof(*h)));
        sll->sll_halen = 0;
@@ -1014,6 +1020,7 @@ static int packet_create(struct net *net
                sock->ops = &packet_ops_spkt;
 
        sock_init_data(sock, sk);
+       sock_set_flag(sk, SOCK_TIMESTAMP);
 
        po = pkt_sk(sk);
        sk->sk_family = PF_PACKET;
-
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