mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-02 17:49:03 +02:00 
			
		
		
		
	bpf: Add CHECKSUM_COMPLETE to bpf test progs
Add special flag to validate that TC BPF program properly updates checksum information in skb. Signed-off-by: Vadim Fedorenko <vadfed@meta.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Reviewed-by: Jakub Kicinski <kuba@kernel.org> Acked-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20240606145851.229116-1-vadfed@meta.com
This commit is contained in:
		
							parent
							
								
									4ff5747158
								
							
						
					
					
						commit
						a3cfe84cca
					
				
					 3 changed files with 31 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -1425,6 +1425,8 @@ enum {
 | 
			
		|||
#define BPF_F_TEST_RUN_ON_CPU	(1U << 0)
 | 
			
		||||
/* If set, XDP frames will be transmitted after processing */
 | 
			
		||||
#define BPF_F_TEST_XDP_LIVE_FRAMES	(1U << 1)
 | 
			
		||||
/* If set, apply CHECKSUM_COMPLETE to skb and validate the checksum */
 | 
			
		||||
#define BPF_F_TEST_SKB_CHECKSUM_COMPLETE	(1U << 2)
 | 
			
		||||
 | 
			
		||||
/* type for BPF_ENABLE_STATS */
 | 
			
		||||
enum bpf_stats_type {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -983,7 +983,8 @@ int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
 | 
			
		|||
	void *data;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	if (kattr->test.flags || kattr->test.cpu || kattr->test.batch_size)
 | 
			
		||||
	if ((kattr->test.flags & ~BPF_F_TEST_SKB_CHECKSUM_COMPLETE) ||
 | 
			
		||||
	    kattr->test.cpu || kattr->test.batch_size)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	data = bpf_test_init(kattr, kattr->test.data_size_in,
 | 
			
		||||
| 
						 | 
				
			
			@ -1031,6 +1032,7 @@ int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
 | 
			
		|||
 | 
			
		||||
	skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
 | 
			
		||||
	__skb_put(skb, size);
 | 
			
		||||
 | 
			
		||||
	if (ctx && ctx->ifindex > 1) {
 | 
			
		||||
		dev = dev_get_by_index(net, ctx->ifindex);
 | 
			
		||||
		if (!dev) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1066,9 +1068,19 @@ int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
 | 
			
		|||
		__skb_push(skb, hh_len);
 | 
			
		||||
	if (is_direct_pkt_access)
 | 
			
		||||
		bpf_compute_data_pointers(skb);
 | 
			
		||||
 | 
			
		||||
	ret = convert___skb_to_skb(skb, ctx);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		goto out;
 | 
			
		||||
 | 
			
		||||
	if (kattr->test.flags & BPF_F_TEST_SKB_CHECKSUM_COMPLETE) {
 | 
			
		||||
		const int off = skb_network_offset(skb);
 | 
			
		||||
		int len = skb->len - off;
 | 
			
		||||
 | 
			
		||||
		skb->csum = skb_checksum(skb, off, len, 0);
 | 
			
		||||
		skb->ip_summed = CHECKSUM_COMPLETE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret = bpf_test_run(prog, skb, repeat, &retval, &duration, false);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		goto out;
 | 
			
		||||
| 
						 | 
				
			
			@ -1083,6 +1095,20 @@ int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
 | 
			
		|||
		}
 | 
			
		||||
		memset(__skb_push(skb, hh_len), 0, hh_len);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (kattr->test.flags & BPF_F_TEST_SKB_CHECKSUM_COMPLETE) {
 | 
			
		||||
		const int off = skb_network_offset(skb);
 | 
			
		||||
		int len = skb->len - off;
 | 
			
		||||
		__wsum csum;
 | 
			
		||||
 | 
			
		||||
		csum = skb_checksum(skb, off, len, 0);
 | 
			
		||||
 | 
			
		||||
		if (csum_fold(skb->csum) != csum_fold(csum)) {
 | 
			
		||||
			ret = -EBADMSG;
 | 
			
		||||
			goto out;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	convert_skb_to___skb(skb, ctx);
 | 
			
		||||
 | 
			
		||||
	size = skb->len;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1425,6 +1425,8 @@ enum {
 | 
			
		|||
#define BPF_F_TEST_RUN_ON_CPU	(1U << 0)
 | 
			
		||||
/* If set, XDP frames will be transmitted after processing */
 | 
			
		||||
#define BPF_F_TEST_XDP_LIVE_FRAMES	(1U << 1)
 | 
			
		||||
/* If set, apply CHECKSUM_COMPLETE to skb and validate the checksum */
 | 
			
		||||
#define BPF_F_TEST_SKB_CHECKSUM_COMPLETE	(1U << 2)
 | 
			
		||||
 | 
			
		||||
/* type for BPF_ENABLE_STATS */
 | 
			
		||||
enum bpf_stats_type {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue