aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/sock.h29
-rw-r--r--net/core/sock.c25
-rw-r--r--net/socket.c8
3 files changed, 17 insertions, 45 deletions
diff --git a/include/net/sock.h b/include/net/sock.h
index 02f5b35e65f1..a21129716aae 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -67,6 +67,7 @@
67#include <linux/atomic.h> 67#include <linux/atomic.h>
68#include <net/dst.h> 68#include <net/dst.h>
69#include <net/checksum.h> 69#include <net/checksum.h>
70#include <linux/net_tstamp.h>
70 71
71struct cgroup; 72struct cgroup;
72struct cgroup_subsys; 73struct cgroup_subsys;
@@ -278,6 +279,7 @@ struct cg_proto;
278 * @sk_protinfo: private area, net family specific, when not using slab 279 * @sk_protinfo: private area, net family specific, when not using slab
279 * @sk_timer: sock cleanup timer 280 * @sk_timer: sock cleanup timer
280 * @sk_stamp: time stamp of last packet received 281 * @sk_stamp: time stamp of last packet received
282 * @sk_tsflags: SO_TIMESTAMPING socket options
281 * @sk_socket: Identd and reporting IO signals 283 * @sk_socket: Identd and reporting IO signals
282 * @sk_user_data: RPC layer private data 284 * @sk_user_data: RPC layer private data
283 * @sk_frag: cached page frag 285 * @sk_frag: cached page frag
@@ -411,6 +413,7 @@ struct sock {
411 void *sk_protinfo; 413 void *sk_protinfo;
412 struct timer_list sk_timer; 414 struct timer_list sk_timer;
413 ktime_t sk_stamp; 415 ktime_t sk_stamp;
416 u16 sk_tsflags;
414 struct socket *sk_socket; 417 struct socket *sk_socket;
415 void *sk_user_data; 418 void *sk_user_data;
416 struct page_frag sk_frag; 419 struct page_frag sk_frag;
@@ -701,12 +704,7 @@ enum sock_flags {
701 SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */ 704 SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */
702 SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */ 705 SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */
703 SOCK_MEMALLOC, /* VM depends on this socket for swapping */ 706 SOCK_MEMALLOC, /* VM depends on this socket for swapping */
704 SOCK_TIMESTAMPING_TX_HARDWARE, /* %SOF_TIMESTAMPING_TX_HARDWARE */
705 SOCK_TIMESTAMPING_TX_SOFTWARE, /* %SOF_TIMESTAMPING_TX_SOFTWARE */
706 SOCK_TIMESTAMPING_RX_HARDWARE, /* %SOF_TIMESTAMPING_RX_HARDWARE */
707 SOCK_TIMESTAMPING_RX_SOFTWARE, /* %SOF_TIMESTAMPING_RX_SOFTWARE */ 707 SOCK_TIMESTAMPING_RX_SOFTWARE, /* %SOF_TIMESTAMPING_RX_SOFTWARE */
708 SOCK_TIMESTAMPING_SOFTWARE, /* %SOF_TIMESTAMPING_SOFTWARE */
709 SOCK_TIMESTAMPING_RAW_HARDWARE, /* %SOF_TIMESTAMPING_RAW_HARDWARE */
710 SOCK_FASYNC, /* fasync() active */ 708 SOCK_FASYNC, /* fasync() active */
711 SOCK_RXQ_OVFL, 709 SOCK_RXQ_OVFL,
712 SOCK_ZEROCOPY, /* buffers from userspace */ 710 SOCK_ZEROCOPY, /* buffers from userspace */
@@ -2160,20 +2158,17 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
2160 2158
2161 /* 2159 /*
2162 * generate control messages if 2160 * generate control messages if
2163 * - receive time stamping in software requested (SOCK_RCVTSTAMP 2161 * - receive time stamping in software requested
2164 * or SOCK_TIMESTAMPING_RX_SOFTWARE)
2165 * - software time stamp available and wanted 2162 * - software time stamp available and wanted
2166 * (SOCK_TIMESTAMPING_SOFTWARE)
2167 * - hardware time stamps available and wanted 2163 * - hardware time stamps available and wanted
2168 * SOCK_TIMESTAMPING_RAW_HARDWARE
2169 */ 2164 */
2170 if (sock_flag(sk, SOCK_RCVTSTAMP) || 2165 if (sock_flag(sk, SOCK_RCVTSTAMP) ||
2171 sock_flag(sk, SOCK_TIMESTAMPING_RX_SOFTWARE) || 2166 (sk->sk_tsflags & SOF_TIMESTAMPING_RX_SOFTWARE) ||
2172 (kt.tv64 && 2167 (kt.tv64 &&
2173 (sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE) || 2168 (sk->sk_tsflags & SOF_TIMESTAMPING_SOFTWARE ||
2174 skb_shinfo(skb)->tx_flags & SKBTX_ANY_SW_TSTAMP)) || 2169 skb_shinfo(skb)->tx_flags & SKBTX_ANY_SW_TSTAMP)) ||
2175 (hwtstamps->hwtstamp.tv64 && 2170 (hwtstamps->hwtstamp.tv64 &&
2176 sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE))) 2171 (sk->sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE)))
2177 __sock_recv_timestamp(msg, sk, skb); 2172 __sock_recv_timestamp(msg, sk, skb);
2178 else 2173 else
2179 sk->sk_stamp = kt; 2174 sk->sk_stamp = kt;
@@ -2189,11 +2184,11 @@ static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
2189 struct sk_buff *skb) 2184 struct sk_buff *skb)
2190{ 2185{
2191#define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \ 2186#define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \
2192 (1UL << SOCK_RCVTSTAMP) | \ 2187 (1UL << SOCK_RCVTSTAMP))
2193 (1UL << SOCK_TIMESTAMPING_SOFTWARE) | \ 2188#define TSFLAGS_ANY (SOF_TIMESTAMPING_SOFTWARE | \
2194 (1UL << SOCK_TIMESTAMPING_RAW_HARDWARE)) 2189 SOF_TIMESTAMPING_RAW_HARDWARE)
2195 2190
2196 if (sk->sk_flags & FLAGS_TS_OR_DROPS) 2191 if (sk->sk_flags & FLAGS_TS_OR_DROPS || sk->sk_tsflags & TSFLAGS_ANY)
2197 __sock_recv_ts_and_drops(msg, sk, skb); 2192 __sock_recv_ts_and_drops(msg, sk, skb);
2198 else 2193 else
2199 sk->sk_stamp = skb->tstamp; 2194 sk->sk_stamp = skb->tstamp;
@@ -2203,8 +2198,6 @@ static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
2203 * sock_tx_timestamp - checks whether the outgoing packet is to be time stamped 2198 * sock_tx_timestamp - checks whether the outgoing packet is to be time stamped
2204 * @sk: socket sending this packet 2199 * @sk: socket sending this packet
2205 * @tx_flags: filled with instructions for time stamping 2200 * @tx_flags: filled with instructions for time stamping
2206 *
2207 * Currently only depends on SOCK_TIMESTAMPING* flags.
2208 */ 2201 */
2209void sock_tx_timestamp(struct sock *sk, __u8 *tx_flags); 2202void sock_tx_timestamp(struct sock *sk, __u8 *tx_flags);
2210 2203
diff --git a/net/core/sock.c b/net/core/sock.c
index a741163568fa..47c9377e14b9 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -848,22 +848,13 @@ set_rcvbuf:
848 ret = -EINVAL; 848 ret = -EINVAL;
849 break; 849 break;
850 } 850 }
851 sock_valbool_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE, 851 sk->sk_tsflags = val;
852 val & SOF_TIMESTAMPING_TX_HARDWARE);
853 sock_valbool_flag(sk, SOCK_TIMESTAMPING_TX_SOFTWARE,
854 val & SOF_TIMESTAMPING_TX_SOFTWARE);
855 sock_valbool_flag(sk, SOCK_TIMESTAMPING_RX_HARDWARE,
856 val & SOF_TIMESTAMPING_RX_HARDWARE);
857 if (val & SOF_TIMESTAMPING_RX_SOFTWARE) 852 if (val & SOF_TIMESTAMPING_RX_SOFTWARE)
858 sock_enable_timestamp(sk, 853 sock_enable_timestamp(sk,
859 SOCK_TIMESTAMPING_RX_SOFTWARE); 854 SOCK_TIMESTAMPING_RX_SOFTWARE);
860 else 855 else
861 sock_disable_timestamp(sk, 856 sock_disable_timestamp(sk,
862 (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE)); 857 (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE));
863 sock_valbool_flag(sk, SOCK_TIMESTAMPING_SOFTWARE,
864 val & SOF_TIMESTAMPING_SOFTWARE);
865 sock_valbool_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE,
866 val & SOF_TIMESTAMPING_RAW_HARDWARE);
867 break; 858 break;
868 859
869 case SO_RCVLOWAT: 860 case SO_RCVLOWAT:
@@ -1089,19 +1080,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
1089 break; 1080 break;
1090 1081
1091 case SO_TIMESTAMPING: 1082 case SO_TIMESTAMPING:
1092 v.val = 0; 1083 v.val = sk->sk_tsflags;
1093 if (sock_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE))
1094 v.val |= SOF_TIMESTAMPING_TX_HARDWARE;
1095 if (sock_flag(sk, SOCK_TIMESTAMPING_TX_SOFTWARE))
1096 v.val |= SOF_TIMESTAMPING_TX_SOFTWARE;
1097 if (sock_flag(sk, SOCK_TIMESTAMPING_RX_HARDWARE))
1098 v.val |= SOF_TIMESTAMPING_RX_HARDWARE;
1099 if (sock_flag(sk, SOCK_TIMESTAMPING_RX_SOFTWARE))
1100 v.val |= SOF_TIMESTAMPING_RX_SOFTWARE;
1101 if (sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE))
1102 v.val |= SOF_TIMESTAMPING_SOFTWARE;
1103 if (sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE))
1104 v.val |= SOF_TIMESTAMPING_RAW_HARDWARE;
1105 break; 1084 break;
1106 1085
1107 case SO_RCVTIMEO: 1086 case SO_RCVTIMEO:
diff --git a/net/socket.c b/net/socket.c
index dc0cc5d95ee5..255d9b802723 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -613,9 +613,9 @@ EXPORT_SYMBOL(sock_release);
613void sock_tx_timestamp(struct sock *sk, __u8 *tx_flags) 613void sock_tx_timestamp(struct sock *sk, __u8 *tx_flags)
614{ 614{
615 *tx_flags = 0; 615 *tx_flags = 0;
616 if (sock_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE)) 616 if (sk->sk_tsflags & SOF_TIMESTAMPING_TX_HARDWARE)
617 *tx_flags |= SKBTX_HW_TSTAMP; 617 *tx_flags |= SKBTX_HW_TSTAMP;
618 if (sock_flag(sk, SOCK_TIMESTAMPING_TX_SOFTWARE)) 618 if (sk->sk_tsflags & SOF_TIMESTAMPING_TX_SOFTWARE)
619 *tx_flags |= SKBTX_SW_TSTAMP; 619 *tx_flags |= SKBTX_SW_TSTAMP;
620 if (sock_flag(sk, SOCK_WIFI_STATUS)) 620 if (sock_flag(sk, SOCK_WIFI_STATUS))
621 *tx_flags |= SKBTX_WIFI_STATUS; 621 *tx_flags |= SKBTX_WIFI_STATUS;
@@ -723,12 +723,12 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
723 } 723 }
724 724
725 memset(&tss, 0, sizeof(tss)); 725 memset(&tss, 0, sizeof(tss));
726 if ((sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE) || 726 if ((sk->sk_tsflags & SOF_TIMESTAMPING_SOFTWARE ||
727 skb_shinfo(skb)->tx_flags & SKBTX_ANY_SW_TSTAMP) && 727 skb_shinfo(skb)->tx_flags & SKBTX_ANY_SW_TSTAMP) &&
728 ktime_to_timespec_cond(skb->tstamp, tss.ts + 0)) 728 ktime_to_timespec_cond(skb->tstamp, tss.ts + 0))
729 empty = 0; 729 empty = 0;
730 if (shhwtstamps && 730 if (shhwtstamps &&
731 sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE) && 731 (sk->sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE) &&
732 ktime_to_timespec_cond(shhwtstamps->hwtstamp, tss.ts + 2)) 732 ktime_to_timespec_cond(shhwtstamps->hwtstamp, tss.ts + 2))
733 empty = 0; 733 empty = 0;
734 if (!empty) 734 if (!empty)