forked from mirrors/linux
		
	ipv4: tcp: give socket pointer to control skbs
ip_send_unicast_reply() send orphaned 'control packets'. These are RST packets and also ACK packets sent from TIME_WAIT. Some eBPF programs would prefer to have a meaningful skb->sk pointer as much as possible. This means that TCP can now attach TIME_WAIT sockets to outgoing skbs. Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com> Reviewed-by: Brian Vazquez <brianvv@google.com> Link: https://patch.msgid.link/20241010174817.1543642-6-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
		
							parent
							
								
									507a96737d
								
							
						
					
					
						commit
						79636038d3
					
				
					 3 changed files with 8 additions and 4 deletions
				
			
		| 
						 | 
					@ -288,7 +288,8 @@ static inline __u8 ip_reply_arg_flowi_flags(const struct ip_reply_arg *arg)
 | 
				
			||||||
	return (arg->flags & IP_REPLY_ARG_NOSRCCHECK) ? FLOWI_FLAG_ANYSRC : 0;
 | 
						return (arg->flags & IP_REPLY_ARG_NOSRCCHECK) ? FLOWI_FLAG_ANYSRC : 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb,
 | 
					void ip_send_unicast_reply(struct sock *sk, const struct sock *orig_sk,
 | 
				
			||||||
 | 
								   struct sk_buff *skb,
 | 
				
			||||||
			   const struct ip_options *sopt,
 | 
								   const struct ip_options *sopt,
 | 
				
			||||||
			   __be32 daddr, __be32 saddr,
 | 
								   __be32 daddr, __be32 saddr,
 | 
				
			||||||
			   const struct ip_reply_arg *arg,
 | 
								   const struct ip_reply_arg *arg,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1596,7 +1596,8 @@ static int ip_reply_glue_bits(void *dptr, char *to, int offset,
 | 
				
			||||||
 *	Generic function to send a packet as reply to another packet.
 | 
					 *	Generic function to send a packet as reply to another packet.
 | 
				
			||||||
 *	Used to send some TCP resets/acks so far.
 | 
					 *	Used to send some TCP resets/acks so far.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb,
 | 
					void ip_send_unicast_reply(struct sock *sk, const struct sock *orig_sk,
 | 
				
			||||||
 | 
								   struct sk_buff *skb,
 | 
				
			||||||
			   const struct ip_options *sopt,
 | 
								   const struct ip_options *sopt,
 | 
				
			||||||
			   __be32 daddr, __be32 saddr,
 | 
								   __be32 daddr, __be32 saddr,
 | 
				
			||||||
			   const struct ip_reply_arg *arg,
 | 
								   const struct ip_reply_arg *arg,
 | 
				
			||||||
| 
						 | 
					@ -1662,6 +1663,8 @@ void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb,
 | 
				
			||||||
			  arg->csumoffset) = csum_fold(csum_add(nskb->csum,
 | 
								  arg->csumoffset) = csum_fold(csum_add(nskb->csum,
 | 
				
			||||||
								arg->csum));
 | 
													arg->csum));
 | 
				
			||||||
		nskb->ip_summed = CHECKSUM_NONE;
 | 
							nskb->ip_summed = CHECKSUM_NONE;
 | 
				
			||||||
 | 
							if (orig_sk)
 | 
				
			||||||
 | 
								skb_set_owner_edemux(nskb, (struct sock *)orig_sk);
 | 
				
			||||||
		if (transmit_time)
 | 
							if (transmit_time)
 | 
				
			||||||
			nskb->tstamp_type = SKB_CLOCK_MONOTONIC;
 | 
								nskb->tstamp_type = SKB_CLOCK_MONOTONIC;
 | 
				
			||||||
		if (txhash)
 | 
							if (txhash)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -907,7 +907,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb,
 | 
				
			||||||
		ctl_sk->sk_mark = 0;
 | 
							ctl_sk->sk_mark = 0;
 | 
				
			||||||
		ctl_sk->sk_priority = 0;
 | 
							ctl_sk->sk_priority = 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ip_send_unicast_reply(ctl_sk,
 | 
						ip_send_unicast_reply(ctl_sk, sk,
 | 
				
			||||||
			      skb, &TCP_SKB_CB(skb)->header.h4.opt,
 | 
								      skb, &TCP_SKB_CB(skb)->header.h4.opt,
 | 
				
			||||||
			      ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
 | 
								      ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
 | 
				
			||||||
			      &arg, arg.iov[0].iov_len,
 | 
								      &arg, arg.iov[0].iov_len,
 | 
				
			||||||
| 
						 | 
					@ -1021,7 +1021,7 @@ static void tcp_v4_send_ack(const struct sock *sk,
 | 
				
			||||||
	ctl_sk->sk_priority = (sk->sk_state == TCP_TIME_WAIT) ?
 | 
						ctl_sk->sk_priority = (sk->sk_state == TCP_TIME_WAIT) ?
 | 
				
			||||||
			   inet_twsk(sk)->tw_priority : READ_ONCE(sk->sk_priority);
 | 
								   inet_twsk(sk)->tw_priority : READ_ONCE(sk->sk_priority);
 | 
				
			||||||
	transmit_time = tcp_transmit_time(sk);
 | 
						transmit_time = tcp_transmit_time(sk);
 | 
				
			||||||
	ip_send_unicast_reply(ctl_sk,
 | 
						ip_send_unicast_reply(ctl_sk, sk,
 | 
				
			||||||
			      skb, &TCP_SKB_CB(skb)->header.h4.opt,
 | 
								      skb, &TCP_SKB_CB(skb)->header.h4.opt,
 | 
				
			||||||
			      ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
 | 
								      ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
 | 
				
			||||||
			      &arg, arg.iov[0].iov_len,
 | 
								      &arg, arg.iov[0].iov_len,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue