]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
bpf: Add CHECKSUM_COMPLETE to bpf test progs
authorVadim Fedorenko <vadfed@meta.com>
Thu, 6 Jun 2024 14:58:50 +0000 (07:58 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 13 Jun 2024 12:29:47 +0000 (14:29 +0200)
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
include/uapi/linux/bpf.h
net/bpf/test_run.c
tools/include/uapi/linux/bpf.h

index 25ea393cf084b953f31c7dbf5e710bcde068c116..35bcf52dbc6526469a933f67af8a2374cad88f50 100644 (file)
@@ -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 {
index 36ae54f57bf5743b37c5c785baa7c4aa8e871024..3c965e32fc3332ad3e2c7e3c1e7c5208c9a0e9bb 100644 (file)
@@ -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;
index 25ea393cf084b953f31c7dbf5e710bcde068c116..35bcf52dbc6526469a933f67af8a2374cad88f50 100644 (file)
@@ -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 {