|
@@ -1118,6 +1118,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|
int err;
|
|
int err;
|
|
int offset = 0;
|
|
int offset = 0;
|
|
int csummode = CHECKSUM_NONE;
|
|
int csummode = CHECKSUM_NONE;
|
|
|
|
+ __u8 tx_flags = 0;
|
|
|
|
|
|
if (flags&MSG_PROBE)
|
|
if (flags&MSG_PROBE)
|
|
return 0;
|
|
return 0;
|
|
@@ -1202,6 +1203,13 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /* For UDP, check if TX timestamp is enabled */
|
|
|
|
+ if (sk->sk_type == SOCK_DGRAM) {
|
|
|
|
+ err = sock_tx_timestamp(sk, &tx_flags);
|
|
|
|
+ if (err)
|
|
|
|
+ goto error;
|
|
|
|
+ }
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Let's try using as much space as possible.
|
|
* Let's try using as much space as possible.
|
|
* Use MTU if total length of the message fits into the MTU.
|
|
* Use MTU if total length of the message fits into the MTU.
|
|
@@ -1306,6 +1314,12 @@ alloc_new_skb:
|
|
sk->sk_allocation);
|
|
sk->sk_allocation);
|
|
if (unlikely(skb == NULL))
|
|
if (unlikely(skb == NULL))
|
|
err = -ENOBUFS;
|
|
err = -ENOBUFS;
|
|
|
|
+ else {
|
|
|
|
+ /* Only the initial fragment
|
|
|
|
+ * is time stamped.
|
|
|
|
+ */
|
|
|
|
+ tx_flags = 0;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
if (skb == NULL)
|
|
if (skb == NULL)
|
|
goto error;
|
|
goto error;
|
|
@@ -1317,6 +1331,9 @@ alloc_new_skb:
|
|
/* reserve for fragmentation */
|
|
/* reserve for fragmentation */
|
|
skb_reserve(skb, hh_len+sizeof(struct frag_hdr));
|
|
skb_reserve(skb, hh_len+sizeof(struct frag_hdr));
|
|
|
|
|
|
|
|
+ if (sk->sk_type == SOCK_DGRAM)
|
|
|
|
+ skb_shinfo(skb)->tx_flags = tx_flags;
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Find where to start putting bytes
|
|
* Find where to start putting bytes
|
|
*/
|
|
*/
|