aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorWillem de Bruijn <willemb@google.com>2014-08-04 22:11:46 -0400
committerDavid S. Miller <davem@davemloft.net>2014-08-05 19:35:54 -0400
commitb9f40e21ef4298650ab33e35740fa85bd57706d5 (patch)
tree1d1904c9f89dc77eae767a8a8895698d644cff1a /net
parentf24b9be5957b38bb420b838115040dc2031b7d0c (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.c25
-rw-r--r--net/socket.c8
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);
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)