This small modification to Stephen's patch timestamps the skb when needed, so the timestamp can be reused by other af_packet sockets.
Signed-off-by: Unai Uribarri <[EMAIL PROTECTED]> --- a/net/core/sock.c +++ b/net/core/sock.c @@ -259,7 +259,8 @@ static void sock_disable_timestamp(struct sock *sk) { if (sock_flag(sk, SOCK_TIMESTAMP)) { sock_reset_flag(sk, SOCK_TIMESTAMP); - net_disable_timestamp(); + if (sk->sk_family != PF_PACKET) + net_disable_timestamp(); } } @@ -1655,7 +1656,8 @@ void sock_enable_timestamp(struct sock *sk) { 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 +++ b/net/packet/af_packet.c @@ -570,7 +570,6 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe 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; @@ -648,12 +647,18 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe h->tp_snaplen = snaplen; h->tp_mac = macoff; h->tp_net = netoff; - if (skb->tstamp.tv64) + + if (sock_flag(sk, SOCK_TIMESTAMP)) { + struct timeval tv; + if (skb->tstamp.tv64 == 0) + __net_timestamp(skb); tv = ktime_to_timeval(skb->tstamp); - else - do_gettimeofday(&tv); - h->tp_sec = tv.tv_sec; - h->tp_usec = tv.tv_usec; + 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 = dev_parse_header(skb, sll->sll_addr); @@ -1004,6 +1009,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol) 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; On jue, 2007-09-13 at 12:42 +0200, Stephen Hemminger wrote: > 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 > - 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