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 /net | |
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 'net')
-rw-r--r-- | net/core/sock.c | 25 | ||||
-rw-r--r-- | net/socket.c | 8 |
2 files changed, 6 insertions, 27 deletions
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); | |||
613 | void sock_tx_timestamp(struct sock *sk, __u8 *tx_flags) | 613 | void 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) |