net: TX timestamps for IPv6 UDP packets
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>
This commit is contained in:
		
					parent
					
						
							
								eaaa3a7c4d
							
						
					
				
			
			
				commit
				
					
						a693e69897
					
				
			
		
					 1 changed files with 17 additions and 0 deletions
				
			
		| 
						 | 
					@ -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
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue