|
@@ -67,6 +67,7 @@
|
|
#include <linux/atomic.h>
|
|
#include <linux/atomic.h>
|
|
#include <net/dst.h>
|
|
#include <net/dst.h>
|
|
#include <net/checksum.h>
|
|
#include <net/checksum.h>
|
|
|
|
+#include <linux/net_tstamp.h>
|
|
|
|
|
|
struct cgroup;
|
|
struct cgroup;
|
|
struct cgroup_subsys;
|
|
struct cgroup_subsys;
|
|
@@ -278,6 +279,8 @@ struct cg_proto;
|
|
* @sk_protinfo: private area, net family specific, when not using slab
|
|
* @sk_protinfo: private area, net family specific, when not using slab
|
|
* @sk_timer: sock cleanup timer
|
|
* @sk_timer: sock cleanup timer
|
|
* @sk_stamp: time stamp of last packet received
|
|
* @sk_stamp: time stamp of last packet received
|
|
|
|
+ * @sk_tsflags: SO_TIMESTAMPING socket options
|
|
|
|
+ * @sk_tskey: counter to disambiguate concurrent tstamp requests
|
|
* @sk_socket: Identd and reporting IO signals
|
|
* @sk_socket: Identd and reporting IO signals
|
|
* @sk_user_data: RPC layer private data
|
|
* @sk_user_data: RPC layer private data
|
|
* @sk_frag: cached page frag
|
|
* @sk_frag: cached page frag
|
|
@@ -411,6 +414,8 @@ struct sock {
|
|
void *sk_protinfo;
|
|
void *sk_protinfo;
|
|
struct timer_list sk_timer;
|
|
struct timer_list sk_timer;
|
|
ktime_t sk_stamp;
|
|
ktime_t sk_stamp;
|
|
|
|
+ u16 sk_tsflags;
|
|
|
|
+ u32 sk_tskey;
|
|
struct socket *sk_socket;
|
|
struct socket *sk_socket;
|
|
void *sk_user_data;
|
|
void *sk_user_data;
|
|
struct page_frag sk_frag;
|
|
struct page_frag sk_frag;
|
|
@@ -701,12 +706,7 @@ enum sock_flags {
|
|
SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */
|
|
SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */
|
|
SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */
|
|
SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */
|
|
SOCK_MEMALLOC, /* VM depends on this socket for swapping */
|
|
SOCK_MEMALLOC, /* VM depends on this socket for swapping */
|
|
- SOCK_TIMESTAMPING_TX_HARDWARE, /* %SOF_TIMESTAMPING_TX_HARDWARE */
|
|
|
|
- SOCK_TIMESTAMPING_TX_SOFTWARE, /* %SOF_TIMESTAMPING_TX_SOFTWARE */
|
|
|
|
- SOCK_TIMESTAMPING_RX_HARDWARE, /* %SOF_TIMESTAMPING_RX_HARDWARE */
|
|
|
|
SOCK_TIMESTAMPING_RX_SOFTWARE, /* %SOF_TIMESTAMPING_RX_SOFTWARE */
|
|
SOCK_TIMESTAMPING_RX_SOFTWARE, /* %SOF_TIMESTAMPING_RX_SOFTWARE */
|
|
- SOCK_TIMESTAMPING_SOFTWARE, /* %SOF_TIMESTAMPING_SOFTWARE */
|
|
|
|
- SOCK_TIMESTAMPING_RAW_HARDWARE, /* %SOF_TIMESTAMPING_RAW_HARDWARE */
|
|
|
|
SOCK_FASYNC, /* fasync() active */
|
|
SOCK_FASYNC, /* fasync() active */
|
|
SOCK_RXQ_OVFL,
|
|
SOCK_RXQ_OVFL,
|
|
SOCK_ZEROCOPY, /* buffers from userspace */
|
|
SOCK_ZEROCOPY, /* buffers from userspace */
|
|
@@ -2160,18 +2160,17 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
|
|
|
|
|
|
/*
|
|
/*
|
|
* generate control messages if
|
|
* generate control messages if
|
|
- * - receive time stamping in software requested (SOCK_RCVTSTAMP
|
|
|
|
- * or SOCK_TIMESTAMPING_RX_SOFTWARE)
|
|
|
|
|
|
+ * - receive time stamping in software requested
|
|
* - software time stamp available and wanted
|
|
* - software time stamp available and wanted
|
|
- * (SOCK_TIMESTAMPING_SOFTWARE)
|
|
|
|
* - hardware time stamps available and wanted
|
|
* - hardware time stamps available and wanted
|
|
- * SOCK_TIMESTAMPING_RAW_HARDWARE
|
|
|
|
*/
|
|
*/
|
|
if (sock_flag(sk, SOCK_RCVTSTAMP) ||
|
|
if (sock_flag(sk, SOCK_RCVTSTAMP) ||
|
|
- sock_flag(sk, SOCK_TIMESTAMPING_RX_SOFTWARE) ||
|
|
|
|
- (kt.tv64 && sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE)) ||
|
|
|
|
|
|
+ (sk->sk_tsflags & SOF_TIMESTAMPING_RX_SOFTWARE) ||
|
|
|
|
+ (kt.tv64 &&
|
|
|
|
+ (sk->sk_tsflags & SOF_TIMESTAMPING_SOFTWARE ||
|
|
|
|
+ skb_shinfo(skb)->tx_flags & SKBTX_ANY_SW_TSTAMP)) ||
|
|
(hwtstamps->hwtstamp.tv64 &&
|
|
(hwtstamps->hwtstamp.tv64 &&
|
|
- sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE)))
|
|
|
|
|
|
+ (sk->sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE)))
|
|
__sock_recv_timestamp(msg, sk, skb);
|
|
__sock_recv_timestamp(msg, sk, skb);
|
|
else
|
|
else
|
|
sk->sk_stamp = kt;
|
|
sk->sk_stamp = kt;
|
|
@@ -2187,11 +2186,11 @@ static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
|
|
struct sk_buff *skb)
|
|
struct sk_buff *skb)
|
|
{
|
|
{
|
|
#define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \
|
|
#define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \
|
|
- (1UL << SOCK_RCVTSTAMP) | \
|
|
|
|
- (1UL << SOCK_TIMESTAMPING_SOFTWARE) | \
|
|
|
|
- (1UL << SOCK_TIMESTAMPING_RAW_HARDWARE))
|
|
|
|
|
|
+ (1UL << SOCK_RCVTSTAMP))
|
|
|
|
+#define TSFLAGS_ANY (SOF_TIMESTAMPING_SOFTWARE | \
|
|
|
|
+ SOF_TIMESTAMPING_RAW_HARDWARE)
|
|
|
|
|
|
- if (sk->sk_flags & FLAGS_TS_OR_DROPS)
|
|
|
|
|
|
+ if (sk->sk_flags & FLAGS_TS_OR_DROPS || sk->sk_tsflags & TSFLAGS_ANY)
|
|
__sock_recv_ts_and_drops(msg, sk, skb);
|
|
__sock_recv_ts_and_drops(msg, sk, skb);
|
|
else
|
|
else
|
|
sk->sk_stamp = skb->tstamp;
|
|
sk->sk_stamp = skb->tstamp;
|
|
@@ -2201,8 +2200,6 @@ static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
|
|
* sock_tx_timestamp - checks whether the outgoing packet is to be time stamped
|
|
* sock_tx_timestamp - checks whether the outgoing packet is to be time stamped
|
|
* @sk: socket sending this packet
|
|
* @sk: socket sending this packet
|
|
* @tx_flags: filled with instructions for time stamping
|
|
* @tx_flags: filled with instructions for time stamping
|
|
- *
|
|
|
|
- * Currently only depends on SOCK_TIMESTAMPING* flags.
|
|
|
|
*/
|
|
*/
|
|
void sock_tx_timestamp(struct sock *sk, __u8 *tx_flags);
|
|
void sock_tx_timestamp(struct sock *sk, __u8 *tx_flags);
|
|
|
|
|