From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 60BB0294A03 for ; Mon, 21 Jul 2025 10:53:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.51 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753095223; cv=none; b=giZVOvMgGgGrxICUq1bNgcRr3wXakyFD4D47fOgn4un+141q7z/INtcnRZPfL3vrJ80DeVdogiv0tGKRw3RKz4gRZjJW5BshTvyTGnDkiHnhubqAe7SlTs2q36qJKZFbgPnWvb1fuaT6WT6ODe1nLPRbfc2C/6k3zDlxhYwLioM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753095223; c=relaxed/simple; bh=duMKK44JnKpe4MGN8M6YKC4qDTC52JONh/TP9d9AdL4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ew8uCnFnuhpXfYYCuXMJfAhi5AsdFlZRKIR6hLc7tbk4TOVByjmtzq+lKpz+aFEIddcTu1nsH6JwdbbtqG4rLM+ZmwYVelDHJL1etKEmIwmN/xmkc9hjAyZnGogK2+BHx3HPsheNeHH/hsDph3yGsvOku30nfAtaXJtR9BSnO/o= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com; spf=pass smtp.mailfrom=cloudflare.com; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b=fCKJB0wX; arc=none smtp.client-ip=209.85.208.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b="fCKJB0wX" Received: by mail-ed1-f51.google.com with SMTP id 4fb4d7f45d1cf-612b67dcb89so5666036a12.1 for ; Mon, 21 Jul 2025 03:53:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloudflare.com; s=google09082023; t=1753095220; x=1753700020; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=xvuGGpBWHPa+xyjonBcXXcpvK68Zk52Wi7ziORp+6ao=; b=fCKJB0wXFagYmy1Rov8SNNaQLjZWL/M2JC5yJpV/aVRp3kdpQDAhTgj3SViR2ExHo4 I2tIPDA6J7tV6BuIBnYoB8BbSOzUzDhDRF5a8Gz0HHq+9CYWcjxk06dXUjXIQACkERZb fTaNAsz0zz5HtOVwuqxJutqtT7yoxO38GwgAbrH7a4UbCTzc6oSuaFSl0neORWYP5YCU VejAWnIB8Dc/lGvrYrGI6f3r9BqrFU3nfOEZsA3HKpmOCwrW+VPc441BVYL8EkhRYSEc YIGCnRQnRpXr3hQ3MxSkzgMWPdsXvWdoUQYGNmZHFst7lROGnmXD+K6/LCFVYSfmAfSF GVjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753095220; x=1753700020; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xvuGGpBWHPa+xyjonBcXXcpvK68Zk52Wi7ziORp+6ao=; b=OxWmERVjaifFmzV1LVXH8qTq/npN/l3fp753UEJmve7n0604odVHllgjF/CLtqFb6m D7WghiSxB1m3sMqix6WvpwDe2Tey0+yIn54Jj7bj1oLfAP6IXqugQgKKxckJRN29n/+J qyks3VfX454F44lCqpKiwO1C7HKW36QCg1Bq2q9dQEKN0vSV4xE8rXBxi3db+IGs7q42 7USKa2qRmXk1zMCt6oDLVQknB5fBRomaxWNz0Mkjb9mLrsFQAr5KBKWEqThPbe1mrnL3 B1gUpoiDHFYrx9l7B/BmRMaUyXavQEsFIZyxMPfe3q87iLR9Sj8Rgq6FP/CLSTj9YBoQ u6ig== X-Forwarded-Encrypted: i=1; AJvYcCVtAcbsPguLvyfdClPrHDztIeOl1LGmXQUfuYvKHotarj0MyKYK6v9LOFAZjZZ4qTygQrfZMEU=@vger.kernel.org X-Gm-Message-State: AOJu0YyxchI38zSAVHgQKsobWyXMCAX1E5fc3keN9HCiE3r/Mkzez6fd oVu/RSm7fPnBG7dorBQpXH8nXCsT/v5q3/3fGrwLjmP6sjH7SgiNzf0tZRdOH+lOQxM= X-Gm-Gg: ASbGnctFKjGqvQcXy3RtlUv88NZawO3w6sCRuvj8jcAkz0XpBYRFK3vIHlEIjWFwres qKslWf0K1BYEeOcZPZyaqKmQyZyFrMf4RrZhevt5P+qKu3nxxRfJTpvIUNrVCHJJ9zGi5BehXsw xchaeoyImYKXquNb2Q338rRpvQJvaK3UkZfDTPV11Enmmy7dt86kcOGtyGH0wt0KKogOGDXweqX A/uh7wHQFfy8a3aXTbcMmak8wVE+9ZmiZ87s4vBvh5Yy29g9h7yrICmHszL9MiRiqlYtEjkipRu V6xYfzfJOOn96qjHzoxMy2dmQveYU91wdr6g5T40LxdmaCJw0VGoN39tkJLRsnc4hDUMtk/gxs4 bpHehT2c8q2qtYA== X-Google-Smtp-Source: AGHT+IFAoidyNVqKZ7GAejKUZ+B0AVj6CgjEFfUPywn4GX2Om1tQCrB3MkvYFjo6kxay0MG6toDHew== X-Received: by 2002:a17:906:c105:b0:ae4:107f:dba2 with SMTP id a640c23a62f3a-ae9cddf128dmr1900275066b.13.1753095219671; Mon, 21 Jul 2025 03:53:39 -0700 (PDT) Received: from cloudflare.com ([2a09:bac5:5063:2dc::49:217]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-aec6ca2f19csm652127766b.70.2025.07.21.03.53.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Jul 2025 03:53:38 -0700 (PDT) From: Jakub Sitnicki Date: Mon, 21 Jul 2025 12:52:48 +0200 Subject: [PATCH bpf-next v3 10/10] selftests/bpf: Cover read/write to skb metadata at an offset Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20250721-skb-metadata-thru-dynptr-v3-10-e92be5534174@cloudflare.com> References: <20250721-skb-metadata-thru-dynptr-v3-0-e92be5534174@cloudflare.com> In-Reply-To: <20250721-skb-metadata-thru-dynptr-v3-0-e92be5534174@cloudflare.com> To: bpf@vger.kernel.org Cc: Alexei Starovoitov , Andrii Nakryiko , Arthur Fabre , Daniel Borkmann , Eric Dumazet , Jakub Kicinski , Jesper Dangaard Brouer , Jesse Brandeburg , Joanne Koong , Lorenzo Bianconi , Martin KaFai Lau , =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= , Yan Zhai , kernel-team@cloudflare.com, netdev@vger.kernel.org, Jakub Sitnicki , Stanislav Fomichev X-Mailer: b4 0.15-dev-07fe9 Exercise r/w access to skb metadata through an offset-adjusted dynptr, read/write helper with an offset argument, and a slice starting at an offset. Signed-off-by: Jakub Sitnicki --- .../bpf/prog_tests/xdp_context_test_run.c | 5 ++ tools/testing/selftests/bpf/progs/test_xdp_meta.c | 73 ++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_context_test_run.c b/tools/testing/selftests/bpf/prog_tests/xdp_context_test_run.c index 79c4c58276e6..602fa69afecb 100644 --- a/tools/testing/selftests/bpf/prog_tests/xdp_context_test_run.c +++ b/tools/testing/selftests/bpf/prog_tests/xdp_context_test_run.c @@ -375,6 +375,11 @@ void test_xdp_context_tuntap(void) skel->progs.ing_cls_dynptr_slice_rdwr, skel->progs.ing_cls_dynptr_slice, skel->maps.test_result); + if (test__start_subtest("dynptr_offset")) + test_tuntap(skel->progs.ing_xdp_zalloc_meta, + skel->progs.ing_cls_dynptr_offset_wr, + skel->progs.ing_cls_dynptr_offset_rd, + skel->maps.test_result); test_xdp_meta__destroy(skel); } diff --git a/tools/testing/selftests/bpf/progs/test_xdp_meta.c b/tools/testing/selftests/bpf/progs/test_xdp_meta.c index e7879860f403..8f61aa997f74 100644 --- a/tools/testing/selftests/bpf/progs/test_xdp_meta.c +++ b/tools/testing/selftests/bpf/progs/test_xdp_meta.c @@ -122,6 +122,79 @@ int ing_cls_dynptr_slice_rdwr(struct __sk_buff *ctx) return TC_ACT_UNSPEC; /* pass */ } +/* + * Read skb metadata in chunks from various offsets in different ways. + */ +SEC("tc") +int ing_cls_dynptr_offset_rd(struct __sk_buff *ctx) +{ + struct bpf_dynptr meta; + const __u32 chunk_len = META_SIZE / 4; + const __u32 zero = 0; + __u8 *dst, *src; + + dst = bpf_map_lookup_elem(&test_result, &zero); + if (!dst) + return TC_ACT_SHOT; + + /* 1. Regular read */ + bpf_dynptr_from_skb_meta(ctx, 0, &meta); + bpf_dynptr_read(dst, chunk_len, &meta, 0, 0); + dst += chunk_len; + + /* 2. Read from an offset-adjusted dynptr */ + bpf_dynptr_adjust(&meta, chunk_len, bpf_dynptr_size(&meta)); + bpf_dynptr_read(dst, chunk_len, &meta, 0, 0); + dst += chunk_len; + + /* 3. Read at an offset */ + bpf_dynptr_read(dst, chunk_len, &meta, chunk_len, 0); + dst += chunk_len; + + /* 4. Read from a slice starting at an offset */ + src = bpf_dynptr_slice(&meta, 2 * chunk_len, NULL, chunk_len); + if (!src) + return TC_ACT_SHOT; + __builtin_memcpy(dst, src, chunk_len); + + return TC_ACT_SHOT; +} + +/* Write skb metadata in chunks at various offsets in different ways. */ +SEC("tc") +int ing_cls_dynptr_offset_wr(struct __sk_buff *ctx) +{ + const __u32 chunk_len = META_SIZE / 4; + __u8 payload[META_SIZE]; + struct bpf_dynptr meta; + __u8 *dst, *src; + + bpf_skb_load_bytes(ctx, sizeof(struct ethhdr), payload, sizeof(payload)); + src = payload; + + /* 1. Regular write */ + bpf_dynptr_from_skb_meta(ctx, 0, &meta); + bpf_dynptr_write(&meta, 0, src, chunk_len, 0); + src += chunk_len; + + /* 2. Write to an offset-adjusted dynptr */ + bpf_dynptr_adjust(&meta, chunk_len, bpf_dynptr_size(&meta)); + bpf_dynptr_write(&meta, 0, src, chunk_len, 0); + src += chunk_len; + + /* 3. Write at an offset */ + bpf_dynptr_write(&meta, chunk_len, src, chunk_len, 0); + src += chunk_len; + + /* 4. Write to a slice starting at an offset */ + dst = bpf_dynptr_slice_rdwr(&meta, 2 * chunk_len, NULL, chunk_len); + if (!dst) + return TC_ACT_SHOT; + __builtin_memcpy(dst, src, chunk_len); + + return TC_ACT_UNSPEC; /* pass */ +} + /* Reserve and clear space for metadata but don't populate it */ SEC("xdp") int ing_xdp_zalloc_meta(struct xdp_md *ctx) -- 2.43.0