mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	bpf: Add source ip in "struct bpf_tunnel_key"
Add tunnel source ip field in "struct bpf_tunnel_key". Add related code to set and get tunnel source field. Signed-off-by: Kaixi Fan <fankaixi.li@bytedance.com> Link: https://lore.kernel.org/r/20220430074844.69214-2-fankaixi.li@bytedance.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
		
							parent
							
								
									bd2331b375
								
							
						
					
					
						commit
						26101f5ab6
					
				
					 3 changed files with 17 additions and 0 deletions
				
			
		|  | @ -5604,6 +5604,10 @@ struct bpf_tunnel_key { | |||
| 	__u8 tunnel_ttl; | ||||
| 	__u16 tunnel_ext;	/* Padding, future use. */ | ||||
| 	__u32 tunnel_label; | ||||
| 	union { | ||||
| 		__u32 local_ipv4; | ||||
| 		__u32 local_ipv6[4]; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| /* user accessible mirror of in-kernel xfrm_state.
 | ||||
|  |  | |||
|  | @ -4498,6 +4498,7 @@ BPF_CALL_4(bpf_skb_get_tunnel_key, struct sk_buff *, skb, struct bpf_tunnel_key | |||
| 	if (unlikely(size != sizeof(struct bpf_tunnel_key))) { | ||||
| 		err = -EINVAL; | ||||
| 		switch (size) { | ||||
| 		case offsetof(struct bpf_tunnel_key, local_ipv6[0]): | ||||
| 		case offsetof(struct bpf_tunnel_key, tunnel_label): | ||||
| 		case offsetof(struct bpf_tunnel_key, tunnel_ext): | ||||
| 			goto set_compat; | ||||
|  | @ -4523,10 +4524,14 @@ set_compat: | |||
| 	if (flags & BPF_F_TUNINFO_IPV6) { | ||||
| 		memcpy(to->remote_ipv6, &info->key.u.ipv6.src, | ||||
| 		       sizeof(to->remote_ipv6)); | ||||
| 		memcpy(to->local_ipv6, &info->key.u.ipv6.dst, | ||||
| 		       sizeof(to->local_ipv6)); | ||||
| 		to->tunnel_label = be32_to_cpu(info->key.label); | ||||
| 	} else { | ||||
| 		to->remote_ipv4 = be32_to_cpu(info->key.u.ipv4.src); | ||||
| 		memset(&to->remote_ipv6[1], 0, sizeof(__u32) * 3); | ||||
| 		to->local_ipv4 = be32_to_cpu(info->key.u.ipv4.dst); | ||||
| 		memset(&to->local_ipv6[1], 0, sizeof(__u32) * 3); | ||||
| 		to->tunnel_label = 0; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -4597,6 +4602,7 @@ BPF_CALL_4(bpf_skb_set_tunnel_key, struct sk_buff *, skb, | |||
| 		return -EINVAL; | ||||
| 	if (unlikely(size != sizeof(struct bpf_tunnel_key))) { | ||||
| 		switch (size) { | ||||
| 		case offsetof(struct bpf_tunnel_key, local_ipv6[0]): | ||||
| 		case offsetof(struct bpf_tunnel_key, tunnel_label): | ||||
| 		case offsetof(struct bpf_tunnel_key, tunnel_ext): | ||||
| 		case offsetof(struct bpf_tunnel_key, remote_ipv6[1]): | ||||
|  | @ -4639,10 +4645,13 @@ BPF_CALL_4(bpf_skb_set_tunnel_key, struct sk_buff *, skb, | |||
| 		info->mode |= IP_TUNNEL_INFO_IPV6; | ||||
| 		memcpy(&info->key.u.ipv6.dst, from->remote_ipv6, | ||||
| 		       sizeof(from->remote_ipv6)); | ||||
| 		memcpy(&info->key.u.ipv6.src, from->local_ipv6, | ||||
| 		       sizeof(from->local_ipv6)); | ||||
| 		info->key.label = cpu_to_be32(from->tunnel_label) & | ||||
| 				  IPV6_FLOWLABEL_MASK; | ||||
| 	} else { | ||||
| 		info->key.u.ipv4.dst = cpu_to_be32(from->remote_ipv4); | ||||
| 		info->key.u.ipv4.src = cpu_to_be32(from->local_ipv4); | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
|  |  | |||
|  | @ -5604,6 +5604,10 @@ struct bpf_tunnel_key { | |||
| 	__u8 tunnel_ttl; | ||||
| 	__u16 tunnel_ext;	/* Padding, future use. */ | ||||
| 	__u32 tunnel_label; | ||||
| 	union { | ||||
| 		__u32 local_ipv4; | ||||
| 		__u32 local_ipv6[4]; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| /* user accessible mirror of in-kernel xfrm_state.
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Kaixi Fan
						Kaixi Fan