Skip to content

Commit

Permalink
net: TX timestamps for IPv6 UDP packets
Browse files Browse the repository at this point in the history
Enabling TX timestamps (SO_TIMESTAMPING) for IPv6 UDP packets, in
the same fashion as for IPv4. Necessary in order for NICs such as
Intel 82580 to timestamp IPv6 packets.

Signed-off-by: Anders Berggren <anders@halon.se>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Anders Berggren authored and David S. Miller committed Feb 28, 2011
1 parent eaaa3a7 commit a693e69
Showing 1 changed file with 17 additions and 0 deletions.
17 changes: 17 additions & 0 deletions net/ipv6/ip6_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -1118,6 +1118,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
int err;
int offset = 0;
int csummode = CHECKSUM_NONE;
__u8 tx_flags = 0;

if (flags&MSG_PROBE)
return 0;
Expand Down Expand Up @@ -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.
* Use MTU if total length of the message fits into the MTU.
Expand Down Expand Up @@ -1306,6 +1314,12 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
sk->sk_allocation);
if (unlikely(skb == NULL))
err = -ENOBUFS;
else {
/* Only the initial fragment
* is time stamped.
*/
tx_flags = 0;
}
}
if (skb == NULL)
goto error;
Expand All @@ -1317,6 +1331,9 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
/* reserve for fragmentation */
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
*/
Expand Down

0 comments on commit a693e69

Please sign in to comment.