diff options
author | Willem de Bruijn <willemb@google.com> | 2014-08-04 22:11:46 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-08-05 19:35:54 -0400 |
commit | b9f40e21ef4298650ab33e35740fa85bd57706d5 (patch) | |
tree | 1d1904c9f89dc77eae767a8a8895698d644cff1a /include/net/sock.h | |
parent | f24b9be5957b38bb420b838115040dc2031b7d0c (diff) |
net-timestamp: move timestamp flags out of sk_flags
sk_flags is reaching its limit. New timestamping options will not fit.
Move all of them into a new field sk->sk_tsflags.
Added benefit is that this removes boilerplate code to convert between
SOF_TIMESTAMPING_.. and SOCK_TIMESTAMPING_.. in getsockopt/setsockopt.
SOCK_TIMESTAMPING_RX_SOFTWARE is also used to toggle the receive
timestamp logic (netstamp_needed). That can be simplified and this
last key removed, but will leave that for a separate patch.
Signed-off-by: Willem de Bruijn <willemb@google.com>
----
The u16 in sock can be moved into a 16-bit hole below sk_gso_max_segs,
though that scatters tstamp fields throughout the struct.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/sock.h')
-rw-r--r-- | include/net/sock.h | 29 |
1 files changed, 11 insertions, 18 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 | ||
71 | struct cgroup; | 72 | struct cgroup; |
72 | struct cgroup_subsys; | 73 | struct 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 | */ |
2209 | void sock_tx_timestamp(struct sock *sk, __u8 *tx_flags); | 2202 | void sock_tx_timestamp(struct sock *sk, __u8 *tx_flags); |
2210 | 2203 | ||