--- linux-2.6.21-rc2/include/linux/skbuff.h 2007-02-28 20:54:35.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/linux/skbuff.h 2007-03-01 13:15:07.000000000 +0100 @@ -156,9 +156,13 @@ struct skb_shared_info { #define SKB_DATAREF_SHIFT 16 #define SKB_DATAREF_MASK ((1 << SKB_DATAREF_SHIFT) - 1) -struct skb_timeval { +/* + * We use a special timespec like structure, because ABI constraints + * make 'struct timespec' being 16 bytes on 64bit platforms. + */ +struct skb_timespec { u32 off_sec; - u32 off_usec; + u32 off_nsec; }; @@ -186,7 +190,7 @@ enum { * @next: Next buffer in list * @prev: Previous buffer in list * @sk: Socket we are owned by - * @tstamp: Time we arrived + * @tstampns: Time we arrived * @dev: Device we arrived on/are leaving by * @input_dev: Device we arrived on * @h: Transport layer header @@ -233,7 +237,7 @@ struct sk_buff { struct sk_buff *prev; struct sock *sk; - struct skb_timeval tstamp; + struct skb_timespec tstampns; struct net_device *dev; struct net_device *input_dev; @@ -1350,6 +1354,20 @@ extern void skb_init(void); extern void skb_add_mtu(int mtu); /** + * skb_get_timestampns - get timestamp from a skb + * @skb: skb to get stamp from + * @stampns: pointer to struct timespec to store stamp in + * + * Timestamps are stored in the skb as offsets to a base timestamp. + * This function converts the offset back to a struct timespec and stores + * it in stamp. + */ +static inline void skb_get_timestampns(const struct sk_buff *skb, struct timespec *stampns) +{ + stampns->tv_sec = skb->tstampns.off_sec; + stampns->tv_nsec = skb->tstampns.off_nsec; +} +/** * skb_get_timestamp - get timestamp from a skb * @skb: skb to get stamp from * @stamp: pointer to struct timeval to store stamp in @@ -1360,23 +1378,23 @@ extern void skb_add_mtu(int mtu); */ static inline void skb_get_timestamp(const struct sk_buff *skb, struct timeval *stamp) { - stamp->tv_sec = skb->tstamp.off_sec; - stamp->tv_usec = skb->tstamp.off_usec; + stamp->tv_sec = skb->tstampns.off_sec; + stamp->tv_usec = skb->tstampns.off_nsec/1000; } /** - * skb_set_timestamp - set timestamp of a skb + * skb_set_timestampns - set timestamp of a skb * @skb: skb to set stamp of - * @stamp: pointer to struct timeval to get stamp from + * @stamp: pointer to struct timespec to get stamp from * * Timestamps are stored in the skb as offsets to a base timestamp. - * This function converts a struct timeval to an offset and stores + * This function converts a struct timespec to an offset and stores * it in the skb. */ -static inline void skb_set_timestamp(struct sk_buff *skb, const struct timeval *stamp) +static inline void skb_set_timestampns(struct sk_buff *skb, const struct timespec *stampns) { - skb->tstamp.off_sec = stamp->tv_sec; - skb->tstamp.off_usec = stamp->tv_usec; + skb->tstampns.off_sec = stampns->tv_sec; + skb->tstampns.off_nsec = stampns->tv_nsec; } extern void __net_timestamp(struct sk_buff *skb); --- linux-2.6.21-rc2/include/net/sock.h 2007-02-28 20:54:35.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/net/sock.h 2007-03-01 11:37:34.000000000 +0100 @@ -244,7 +244,7 @@ struct sock { struct sk_filter *sk_filter; void *sk_protinfo; struct timer_list sk_timer; - struct timeval sk_stamp; + struct timespec sk_stampns; struct socket *sk_socket; void *sk_user_data; struct page *sk_sndmsg_page; @@ -1307,19 +1307,22 @@ static inline int sock_intr_errno(long t static __inline__ void sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb) { + struct timespec stampns; struct timeval stamp; - skb_get_timestamp(skb, &stamp); + skb_get_timestampns(skb, &stampns); if (sock_flag(sk, SOCK_RCVTSTAMP)) { /* Race occurred between timestamp enabling and packet receiving. Fill in the current time for now. */ - if (stamp.tv_sec == 0) - do_gettimeofday(&stamp); - skb_set_timestamp(skb, &stamp); + if (stampns.tv_sec == 0) + getnstimeofday(&stampns); + skb_set_timestampns(skb, &stampns); + stamp.tv_sec = stampns.tv_sec; + stamp.tv_usec = stampns.tv_nsec/1000; put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP, sizeof(struct timeval), &stamp); } else - sk->sk_stamp = stamp; + sk->sk_stampns = stampns; } /** @@ -1350,6 +1353,7 @@ static inline void sk_eat_skb(struct soc extern void sock_enable_timestamp(struct sock *sk); extern int sock_get_timestamp(struct sock *, struct timeval __user *); +extern int sock_get_timestampns(struct sock *, struct timespec __user *); /* * Enable debug/info messages --- linux-2.6.21-rc2/include/net/compat.h 2007-02-28 20:54:35.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/net/compat.h 2007-02-28 20:54:35.000000000 +0100 @@ -25,6 +25,7 @@ struct compat_cmsghdr { }; extern int compat_sock_get_timestamp(struct sock *, struct timeval __user *); +extern int compat_sock_get_timestampns(struct sock *, struct timespec __user *); #else /* defined(CONFIG_COMPAT) */ #define compat_msghdr msghdr /* to avoid compiler warnings */ --- linux-2.6.21-rc2/net/core/sock.c 2007-02-28 20:54:35.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/core/sock.c 2007-02-28 21:16:43.000000000 +0100 @@ -1512,8 +1512,8 @@ void sock_init_data(struct socket *sock, sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT; sk->sk_sndtimeo = MAX_SCHEDULE_TIMEOUT; - sk->sk_stamp.tv_sec = -1L; - sk->sk_stamp.tv_usec = -1L; + sk->sk_stampns.tv_sec = -1L; + sk->sk_stampns.tv_nsec = -1L; atomic_set(&sk->sk_refcnt, 1); } @@ -1554,17 +1554,33 @@ EXPORT_SYMBOL(release_sock); int sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp) { + struct timeval tstamp; if (!sock_flag(sk, SOCK_TIMESTAMP)) sock_enable_timestamp(sk); - if (sk->sk_stamp.tv_sec == -1) + if (sk->sk_stampns.tv_sec == -1) return -ENOENT; - if (sk->sk_stamp.tv_sec == 0) - do_gettimeofday(&sk->sk_stamp); - return copy_to_user(userstamp, &sk->sk_stamp, sizeof(struct timeval)) ? + if (sk->sk_stampns.tv_sec == 0) + getnstimeofday(&sk->sk_stampns); + tstamp.tv_sec = sk->sk_stampns.tv_sec; + tstamp.tv_usec = sk->sk_stampns.tv_nsec/1000; + return copy_to_user(userstamp, &tstamp, sizeof(struct timeval)) ? -EFAULT : 0; } EXPORT_SYMBOL(sock_get_timestamp); +int sock_get_timestampns(struct sock *sk, struct timespec __user *userstamp) +{ + if (!sock_flag(sk, SOCK_TIMESTAMP)) + sock_enable_timestamp(sk); + if (sk->sk_stampns.tv_sec == -1) + return -ENOENT; + if (sk->sk_stampns.tv_sec == 0) + getnstimeofday(&sk->sk_stampns); + return copy_to_user(userstamp, &sk->sk_stampns, sizeof(struct timespec)) ? + -EFAULT : 0; +} +EXPORT_SYMBOL(sock_get_timestampns); + void sock_enable_timestamp(struct sock *sk) { if (!sock_flag(sk, SOCK_TIMESTAMP)) { --- linux-2.6.21-rc2/net/core/dev.c 2007-02-28 21:16:43.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/core/dev.c 2007-03-01 11:43:38.000000000 +0100 @@ -1036,10 +1036,10 @@ void net_disable_timestamp(void) void __net_timestamp(struct sk_buff *skb) { - struct timeval tv; + struct timespec ts; - do_gettimeofday(&tv); - skb_set_timestamp(skb, &tv); + getnstimeofday(&ts); + skb_set_timestampns(skb, &ts); } EXPORT_SYMBOL(__net_timestamp); @@ -1048,8 +1048,8 @@ static inline void net_timestamp(struct if (atomic_read(&netstamp_needed)) __net_timestamp(skb); else { - skb->tstamp.off_sec = 0; - skb->tstamp.off_usec = 0; + skb->tstampns.off_sec = 0; + skb->tstampns.off_nsec = 0; } } @@ -1580,7 +1580,7 @@ int netif_rx(struct sk_buff *skb) if (netpoll_rx(skb)) return NET_RX_DROP; - if (!skb->tstamp.off_sec) + if (!skb->tstampns.off_sec) net_timestamp(skb); /* @@ -1772,7 +1772,7 @@ int netif_receive_skb(struct sk_buff *sk if (skb->dev->poll && netpoll_rx(skb)) return NET_RX_DROP; - if (!skb->tstamp.off_sec) + if (!skb->tstampns.off_sec) net_timestamp(skb); if (!skb->input_dev) --- linux-2.6.21-rc2/net/core/skbuff.c 2007-03-01 11:41:01.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/core/skbuff.c 2007-03-01 11:41:25.000000000 +0100 @@ -449,7 +449,7 @@ struct sk_buff *skb_clone(struct sk_buff n->next = n->prev = NULL; n->sk = NULL; - C(tstamp); + C(tstampns); C(dev); C(h); C(nh); @@ -534,7 +534,7 @@ static void copy_skb_header(struct sk_bu new->local_df = old->local_df; new->fclone = SKB_FCLONE_UNAVAILABLE; new->pkt_type = old->pkt_type; - new->tstamp = old->tstamp; + new->tstampns = old->tstampns; new->destructor = NULL; new->mark = old->mark; #ifdef CONFIG_NETFILTER --- linux-2.6.21-rc2/net/ipv4/ip_fragment.c 2007-02-28 20:54:35.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/ipv4/ip_fragment.c 2007-03-01 11:45:09.000000000 +0100 @@ -92,7 +92,7 @@ struct ipq { spinlock_t lock; atomic_t refcnt; struct timer_list timer; /* when will this queue expire? */ - struct timeval stamp; + struct timespec stampns; int iif; unsigned int rid; struct inet_peer *peer; @@ -592,7 +592,7 @@ static void ip_frag_queue(struct ipq *qp if (skb->dev) qp->iif = skb->dev->ifindex; skb->dev = NULL; - skb_get_timestamp(skb, &qp->stamp); + skb_get_timestampns(skb, &qp->stampns); qp->meat += skb->len; atomic_add(skb->truesize, &ip_frag_mem); if (offset == 0) @@ -674,7 +674,7 @@ static struct sk_buff *ip_frag_reasm(str head->next = NULL; head->dev = dev; - skb_set_timestamp(head, &qp->stamp); + skb_set_timestampns(head, &qp->stampns); iph = head->nh.iph; iph->frag_off = 0; --- linux-2.6.21-rc2/net/ipv4/af_inet.c 2007-02-28 20:54:35.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/ipv4/af_inet.c 2007-02-28 20:54:35.000000000 +0100 @@ -755,6 +755,9 @@ int inet_ioctl(struct socket *sock, unsi case SIOCGSTAMP: err = sock_get_timestamp(sk, (struct timeval __user *)arg); break; + case SIOCGSTAMPNS: + err = sock_get_timestampns(sk, (struct timespec __user *)arg); + break; case SIOCADDRT: case SIOCDELRT: case SIOCRTMSG: --- linux-2.6.21-rc2/net/ipv4/tcp_output.c 2007-03-01 11:45:09.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/ipv4/tcp_output.c 2007-03-01 11:45:09.000000000 +0100 @@ -661,7 +661,7 @@ int tcp_fragment(struct sock *sk, struct * skbs, which it never sent before. --ANK */ TCP_SKB_CB(buff)->when = TCP_SKB_CB(skb)->when; - buff->tstamp = skb->tstamp; + buff->tstampns = skb->tstampns; old_factor = tcp_skb_pcount(skb); --- linux-2.6.21-rc2/net/ipv6/af_inet6.c 2007-03-01 12:34:35.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/ipv6/af_inet6.c 2007-03-01 12:34:35.000000000 +0100 @@ -437,6 +437,9 @@ int inet6_ioctl(struct socket *sock, uns case SIOCGSTAMP: return sock_get_timestamp(sk, (struct timeval __user *)arg); + case SIOCGSTAMPNS: + return sock_get_timestampns(sk, (struct timespec __user *)arg); + case SIOCADDRT: case SIOCDELRT: --- linux-2.6.21-rc2/net/packet/af_packet.c 2007-02-28 21:23:12.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/packet/af_packet.c 2007-03-01 12:32:56.000000000 +0100 @@ -656,12 +656,12 @@ static int tpacket_rcv(struct sk_buff *s h->tp_snaplen = snaplen; h->tp_mac = macoff; h->tp_net = netoff; - if (skb->tstamp.off_sec == 0) { + if (skb->tstampns.off_sec == 0) { __net_timestamp(skb); sock_enable_timestamp(sk); } - h->tp_sec = skb->tstamp.off_sec; - h->tp_usec = skb->tstamp.off_usec; + h->tp_sec = skb->tstampns.off_sec; + h->tp_usec = skb->tstampns.off_nsec/1000; sll = (struct sockaddr_ll*)((u8*)h + TPACKET_ALIGN(sizeof(*h))); sll->sll_halen = 0; @@ -1543,6 +1543,8 @@ static int packet_ioctl(struct socket *s } case SIOCGSTAMP: return sock_get_timestamp(sk, (struct timeval __user *)arg); + case SIOCGSTAMPNS: + return sock_get_timestampns(sk, (struct timespec __user *)arg); #ifdef CONFIG_INET case SIOCADDRT: --- linux-2.6.21-rc2/net/sunrpc/svcsock.c 2007-02-28 20:54:35.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/sunrpc/svcsock.c 2007-03-01 13:15:07.000000000 +0100 @@ -806,15 +806,14 @@ svc_udp_recvfrom(struct svc_rqst *rqstp) dprintk("svc: recvfrom returned error %d\n", -err); } if (skb->tstamp.off_sec == 0) { - struct timeval tv; + struct timespec ts; - tv.tv_sec = xtime.tv_sec; - tv.tv_usec = xtime.tv_nsec / NSEC_PER_USEC; - skb_set_timestamp(skb, &tv); + ts = current_kernel_time(); + skb_set_timestampns(skb, &ts); /* Don't enable netstamp, sunrpc doesn't need that much accuracy */ } - skb_get_timestamp(skb, &svsk->sk_sk->sk_stamp); + skb_get_timestampns(skb, &svsk->sk_sk->sk_stampns); set_bit(SK_DATA, &svsk->sk_flags); /* there may be more data... */ /* --- linux-2.6.21-rc2/net/compat.c 2007-02-28 20:54:35.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/compat.c 2007-03-01 12:56:02.000000000 +0100 @@ -545,20 +545,41 @@ int compat_sock_get_timestamp(struct soc struct compat_timeval __user *ctv = (struct compat_timeval __user*) userstamp; int err = -ENOENT; + long usec; if (!sock_flag(sk, SOCK_TIMESTAMP)) sock_enable_timestamp(sk); - if (sk->sk_stamp.tv_sec == -1) + if (sk->sk_stampns.tv_sec == -1) return err; - if (sk->sk_stamp.tv_sec == 0) - do_gettimeofday(&sk->sk_stamp); - if (put_user(sk->sk_stamp.tv_sec, &ctv->tv_sec) || - put_user(sk->sk_stamp.tv_usec, &ctv->tv_usec)) + if (sk->sk_stampns.tv_sec == 0) + getnstimeofday(&sk->sk_stampns); + usec = sk->sk_stampns.tv_nsec / 1000; + if (put_user(sk->sk_stampns.tv_sec, &ctv->tv_sec) || + put_user(usec, &ctv->tv_usec)) err = -EFAULT; return err; } EXPORT_SYMBOL(compat_sock_get_timestamp); +int compat_sock_get_timestampns(struct sock *sk, struct timespec __user *userstamp) +{ + struct compat_timespec __user *ctv = + (struct compat_timespec __user*) userstamp; + int err = -ENOENT; + + if (!sock_flag(sk, SOCK_TIMESTAMP)) + sock_enable_timestamp(sk); + if (sk->sk_stampns.tv_sec == -1) + return err; + if (sk->sk_stampns.tv_sec == 0) + getnstimeofday(&sk->sk_stampns); + if (put_user(sk->sk_stampns.tv_sec, &ctv->tv_sec) || + put_user(sk->sk_stampns.tv_nsec, &ctv->tv_nsec)) + err = -EFAULT; + return err; +} +EXPORT_SYMBOL(compat_sock_get_timestampns); + asmlinkage long compat_sys_getsockopt(int fd, int level, int optname, char __user *optval, int __user *optlen) { --- linux-2.6.21-rc2/fs/compat_ioctl.c 2007-03-01 13:01:27.000000000 +0100 +++ linux-2.6.21-rc2-ed/fs/compat_ioctl.c 2007-03-01 13:01:27.000000000 +0100 @@ -265,6 +265,22 @@ static int do_siocgstamp(unsigned int fd } return err; } +static int do_siocgstampns(unsigned int fd, unsigned int cmd, unsigned long arg) +{ + struct compat_timespec __user *up = compat_ptr(arg); + struct timespec ktv; + mm_segment_t old_fs = get_fs(); + int err; + + set_fs(KERNEL_DS); + err = sys_ioctl(fd, cmd, (unsigned long)&ktv); + set_fs(old_fs); + if(!err) { + err = put_user(ktv.tv_sec, &up->tv_sec); + err |= __put_user(ktv.tv_nsec, &up->tv_nsec); + } + return err; +} struct ifmap32 { compat_ulong_t mem_start; @@ -2437,6 +2453,7 @@ HANDLE_IOCTL(SIOCBRDELIF, dev_ifsioc) /* Note SIOCRTMSG is no longer, so this is safe and * the user would have seen just an -EINVAL anyways. */ HANDLE_IOCTL(SIOCRTMSG, ret_einval) HANDLE_IOCTL(SIOCGSTAMP, do_siocgstamp) +HANDLE_IOCTL(SIOCGSTAMPNS, do_siocgstampns) #endif #ifdef CONFIG_BLOCK HANDLE_IOCTL(HDIO_GETGEO, hdio_getgeo) --- linux-2.6.21-rc2/net/appletalk/ddp.c 2007-03-01 12:56:02.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/appletalk/ddp.c 2007-03-01 12:56:02.000000000 +0100 @@ -1768,6 +1768,9 @@ static int atalk_ioctl(struct socket *so case SIOCGSTAMP: rc = sock_get_timestamp(sk, argp); break; + case SIOCGSTAMPNS: + rc = sock_get_timestampns(sk, argp); + break; /* Routing */ case SIOCADDRT: case SIOCDELRT: --- linux-2.6.21-rc2/net/ax25/af_ax25.c 2007-03-01 12:56:02.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/ax25/af_ax25.c 2007-03-01 12:56:02.000000000 +0100 @@ -1711,6 +1711,10 @@ static int ax25_ioctl(struct socket *soc res = sock_get_timestamp(sk, argp); break; + case SIOCGSTAMPNS: + res = sock_get_timestampns(sk, argp); + break; + case SIOCAX25ADDUID: /* Add a uid to the uid/call map table */ case SIOCAX25DELUID: /* Delete a uid from the uid/call map table */ case SIOCAX25GETUID: { --- linux-2.6.21-rc2/net/atm/ioctl.c 2007-03-01 12:56:02.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/atm/ioctl.c 2007-03-01 12:56:02.000000000 +0100 @@ -82,6 +82,9 @@ int vcc_ioctl(struct socket *sock, unsig case SIOCGSTAMP: /* borrowed from IP */ error = sock_get_timestamp(sk, argp); goto done; + case SIOCGSTAMPNS: /* borrowed from IP */ + error = sock_get_timestampns(sk, argp); + goto done; case ATM_SETSC: printk(KERN_WARNING "ATM_SETSC is obsolete\n"); error = 0; --- linux-2.6.21-rc2/net/econet/af_econet.c 2007-02-28 20:54:35.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/econet/af_econet.c 2007-03-01 12:56:02.000000000 +0100 @@ -162,7 +162,7 @@ static int econet_recvmsg(struct kiocb * err = memcpy_toiovec(msg->msg_iov, skb->data, copied); if (err) goto out_free; - skb_get_timestamp(skb, &sk->sk_stamp); + skb_get_timestampns(skb, &sk->sk_stampns); if (msg->msg_name) memcpy(msg->msg_name, skb->cb, msg->msg_namelen); @@ -726,6 +726,8 @@ static int econet_ioctl(struct socket *s switch(cmd) { case SIOCGSTAMP: return sock_get_timestamp(sk, argp); + case SIOCGSTAMPNS: + return sock_get_timestampns(sk, argp); case SIOCSIFADDR: case SIOCGIFADDR: --- linux-2.6.21-rc2/net/ipx/af_ipx.c 2007-02-28 20:54:35.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/ipx/af_ipx.c 2007-03-01 11:34:07.000000000 +0100 @@ -1808,7 +1808,7 @@ static int ipx_recvmsg(struct kiocb *ioc if (rc) goto out_free; if (skb->tstamp.off_sec) - skb_get_timestamp(skb, &sk->sk_stamp); + skb_get_timestampns(skb, &sk->sk_stampns); msg->msg_namelen = sizeof(*sipx); --- linux-2.6.21-rc2/net/netrom/af_netrom.c 2007-03-01 12:56:02.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/netrom/af_netrom.c 2007-03-01 12:56:02.000000000 +0100 @@ -1208,6 +1208,11 @@ static int nr_ioctl(struct socket *sock, ret = sock_get_timestamp(sk, argp); release_sock(sk); return ret; + case SIOCGSTAMPNS: + lock_sock(sk); + ret = sock_get_timestampns(sk, argp); + release_sock(sk); + return ret; case SIOCGIFADDR: case SIOCSIFADDR: --- linux-2.6.21-rc2/net/rose/af_rose.c 2007-03-01 12:56:02.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/rose/af_rose.c 2007-03-01 12:56:02.000000000 +0100 @@ -1271,6 +1271,8 @@ static int rose_ioctl(struct socket *soc case SIOCGSTAMP: return sock_get_timestamp(sk, (struct timeval __user *) argp); + case SIOCGSTAMPNS: + return sock_get_timestampns(sk, (struct timespec __user *) argp); case SIOCGIFADDR: case SIOCSIFADDR: --- linux-2.6.21-rc2/net/wanrouter/af_wanpipe.c 2007-03-01 12:56:02.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/wanrouter/af_wanpipe.c 2007-03-01 12:56:02.000000000 +0100 @@ -1770,6 +1770,9 @@ static int wanpipe_ioctl(struct socket * case SIOCGSTAMP: return sock_get_timestamp(sk, (struct timeval __user *)arg); + case SIOCGSTAMPNS: + return sock_get_timestampns(sk, (struct timespec __user *)arg); + case SIOC_WANPIPE_CHECK_TX: return atomic_read(&sk->sk_wmem_alloc); --- linux-2.6.21-rc2/net/x25/af_x25.c 2007-03-01 12:56:02.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/x25/af_x25.c 2007-03-01 12:56:02.000000000 +0100 @@ -1280,6 +1280,12 @@ static int x25_ioctl(struct socket *sock rc = sock_get_timestamp(sk, (struct timeval __user *)argp); break; + case SIOCGSTAMP: + rc = -EINVAL; + if (sk) + rc = sock_get_timestampns(sk, + (struct timespec __user *)argp); + break; case SIOCGIFADDR: case SIOCSIFADDR: case SIOCGIFDSTADDR: @@ -1521,6 +1527,12 @@ static int compat_x25_ioctl(struct socke rc = compat_sock_get_timestamp(sk, (struct timeval __user*)argp); break; + case SIOCGSTAMP: + rc = -EINVAL; + if (sk) + rc = compat_sock_get_timestampns(sk, + (struct timespec __user*)argp); + break; case SIOCGIFADDR: case SIOCSIFADDR: case SIOCGIFDSTADDR: --- linux-2.6.21-rc2/net/bridge/netfilter/ebt_ulog.c 2007-03-01 13:09:56.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/bridge/netfilter/ebt_ulog.c 2007-03-01 13:09:56.000000000 +0100 @@ -166,7 +166,7 @@ static void ebt_ulog_packet(unsigned int pm->version = EBT_ULOG_VERSION; do_gettimeofday(&pm->stamp); if (ub->qlen == 1) - skb_set_timestamp(ub->skb, &pm->stamp); + skb_set_timestampus(ub->skb, &pm->stamp); pm->data_len = copy_len; pm->mark = skb->mark; pm->hook = hooknr; --- linux-2.6.21-rc2/net/ipv6/netfilter/nf_conntrack_reasm.c 2007-03-01 13:09:56.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/ipv6/netfilter/nf_conntrack_reasm.c 2007-03-01 13:15:07.000000000 +0100 @@ -82,7 +82,7 @@ struct nf_ct_frag6_queue struct sk_buff *fragments; int len; int meat; - struct timeval stamp; + struct timespec stamp; unsigned int csum; __u8 last_in; /* has first/last segment arrived? */ #define COMPLETE 4 @@ -542,7 +542,7 @@ static int nf_ct_frag6_queue(struct nf_c fq->fragments = skb; skb->dev = NULL; - skb_get_timestamp(skb, &fq->stamp); + skb_get_timestampns(skb, &fq->stamp); fq->meat += skb->len; atomic_add(skb->truesize, &nf_ct_frag6_mem); @@ -648,7 +648,7 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_que head->next = NULL; head->dev = dev; - skb_set_timestamp(head, &fq->stamp); + skb_set_timestampns(head, &fq->stamp); head->nh.ipv6h->payload_len = htons(payload_len); /* Yes, and fold redundant checksum back. 8) */ --- linux-2.6.21-rc2/net/ipv6/reassembly.c 2007-03-01 13:15:07.000000000 +0100 +++ linux-2.6.21-rc2-ed/net/ipv6/reassembly.c 2007-03-01 13:15:07.000000000 +0100 @@ -88,7 +88,7 @@ struct frag_queue int len; int meat; int iif; - struct timeval stamp; + struct timespec stamp; unsigned int csum; __u8 last_in; /* has first/last segment arrived? */ #define COMPLETE 4 @@ -562,7 +562,7 @@ static void ip6_frag_queue(struct frag_q if (skb->dev) fq->iif = skb->dev->ifindex; skb->dev = NULL; - skb_get_timestamp(skb, &fq->stamp); + skb_get_timestampns(skb, &fq->stamp); fq->meat += skb->len; atomic_add(skb->truesize, &ip6_frag_mem); @@ -663,7 +663,7 @@ static int ip6_frag_reasm(struct frag_qu head->next = NULL; head->dev = dev; - skb_set_timestamp(head, &fq->stamp); + skb_set_timestampns(head, &fq->stamp); head->nh.ipv6h->payload_len = htons(payload_len); IP6CB(head)->nhoff = nhoff; --- linux-2.6.21-rc2/include/asm-i386/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-i386/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -7,6 +7,7 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif --- linux-2.6.21-rc2/include/asm-x86_64/sockios.h 2007-02-28 21:19:22.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-x86_64/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -7,6 +7,7 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif --- linux-2.6.21-rc2/include/asm-alpha/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-alpha/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -11,5 +11,6 @@ #define SIOCGPGRP _IOR('s', 9, pid_t) #define SIOCGSTAMP 0x8906 /* Get stamp - linux-specific */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif /* _ASM_ALPHA_SOCKIOS_H */ --- linux-2.6.21-rc2/include/asm-arm26/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-arm26/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -7,6 +7,7 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif --- linux-2.6.21-rc2/include/asm-avr32/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-avr32/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -7,6 +7,7 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif /* __ASM_AVR32_SOCKIOS_H */ --- linux-2.6.21-rc2/include/asm-cris/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-cris/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -7,6 +7,7 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif --- linux-2.6.21-rc2/include/asm-frv/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-frv/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -7,7 +7,8 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif /* _ASM_SOCKIOS__ */ --- linux-2.6.21-rc2/include/asm-h8300/sockios.h 2007-03-01 11:53:45.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-h8300/sockios.h 2007-03-01 11:53:45.000000000 +0100 @@ -7,6 +7,7 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif /* __ARCH_H8300_SOCKIOS__ */ --- linux-2.6.21-rc2/include/asm-ia64/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-ia64/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -14,6 +14,7 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif /* _ASM_IA64_SOCKIOS_H */ --- linux-2.6.21-rc2/include/asm-m32r/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-m32r/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -7,6 +7,7 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif /* _ASM_M32R_SOCKIOS_H */ --- linux-2.6.21-rc2/include/asm-m68k/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-m68k/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -7,6 +7,7 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif /* __ARCH_M68K_SOCKIOS__ */ --- linux-2.6.21-rc2/include/asm-mips/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-mips/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -20,6 +20,7 @@ #define SIOCSPGRP _IOW('s', 8, pid_t) #define SIOCGPGRP _IOR('s', 9, pid_t) -#define SIOCGSTAMP 0x8906 /* Get stamp - linux-specific */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif /* _ASM_SOCKIOS_H */ --- linux-2.6.21-rc2/include/asm-parisc/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-parisc/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -7,6 +7,7 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif --- linux-2.6.21-rc2/include/asm-powerpc/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-powerpc/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -14,6 +14,7 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif /* _ASM_POWERPC_SOCKIOS_H */ --- linux-2.6.21-rc2/include/asm-s390/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-s390/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -15,6 +15,7 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif --- linux-2.6.21-rc2/include/asm-sh/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-sh/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -10,4 +10,5 @@ #define SIOCGPGRP _IOR('s', 9, pid_t) #define SIOCGSTAMP _IOR('s', 100, struct timeval) /* Get stamp - linux-specific */ +#define SIOCGSTAMPNS _IOR('s', 101, struct timespec) /* Get stamp - linux-specific */ #endif /* __ASM_SH_SOCKIOS_H */ --- linux-2.6.21-rc2/include/asm-sh64/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-sh64/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -21,4 +21,5 @@ #define SIOCGPGRP _IOR('s', 9, pid_t) #define SIOCGSTAMP _IOR('s', 100, struct timeval) /* Get stamp - linux-specific */ +#define SIOCGSTAMPNS _IOR('s', 101, struct timespec) /* Get stamp - linux-specific */ #endif /* __ASM_SH64_SOCKIOS_H */ --- linux-2.6.21-rc2/include/asm-sparc/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-sparc/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -7,7 +7,8 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif /* !(_ASM_SPARC_SOCKIOS_H) */ --- linux-2.6.21-rc2/include/asm-sparc64/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-sparc64/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -7,7 +7,8 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif /* !(_ASM_SPARC64_SOCKIOS_H) */ --- linux-2.6.21-rc2/include/asm-v850/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-v850/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -7,6 +7,7 @@ #define FIOGETOWN 0x8903 #define SIOCGPGRP 0x8904 #define SIOCATMARK 0x8905 -#define SIOCGSTAMP 0x8906 /* Get stamp */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif /* __V850_SOCKIOS_H__ */ --- linux-2.6.21-rc2/include/asm-xtensa/sockios.h 2007-03-01 11:11:33.000000000 +0100 +++ linux-2.6.21-rc2-ed/include/asm-xtensa/sockios.h 2007-03-01 11:11:33.000000000 +0100 @@ -25,6 +25,7 @@ #define SIOCSPGRP _IOW('s', 8, pid_t) #define SIOCGPGRP _IOR('s', 9, pid_t) -#define SIOCGSTAMP 0x8906 /* Get stamp - linux-specific */ +#define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ +#define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ #endif /* _XTENSA_SOCKIOS_H */