flow_dissector: Make 'bpf_flow_dissect' return the bpf program retcode
authorShmulik Ladkani <shmulik.ladkani@gmail.com>
Sun, 21 Aug 2022 11:35:16 +0000 (14:35 +0300)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 23 Aug 2022 20:47:42 +0000 (22:47 +0200)
Let 'bpf_flow_dissect' callers know the BPF program's retcode and act
accordingly.

Signed-off-by: Shmulik Ladkani <shmulik.ladkani@gmail.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Reviewed-by: Stanislav Fomichev <sdf@google.com>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20220821113519.116765-2-shmulik.ladkani@gmail.com
include/linux/skbuff.h
net/bpf/test_run.c
net/core/flow_dissector.c

index ca8afa3..8792199 100644 (file)
@@ -1460,8 +1460,8 @@ void skb_flow_dissector_init(struct flow_dissector *flow_dissector,
                             unsigned int key_count);
 
 struct bpf_flow_dissector;
-bool bpf_flow_dissect(struct bpf_prog *prog, struct bpf_flow_dissector *ctx,
-                     __be16 proto, int nhoff, int hlen, unsigned int flags);
+u32 bpf_flow_dissect(struct bpf_prog *prog, struct bpf_flow_dissector *ctx,
+                    __be16 proto, int nhoff, int hlen, unsigned int flags);
 
 bool __skb_flow_dissect(const struct net *net,
                        const struct sk_buff *skb,
index 25d8ecf..51c4794 100644 (file)
@@ -1445,7 +1445,7 @@ int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog,
        bpf_test_timer_enter(&t);
        do {
                retval = bpf_flow_dissect(prog, &ctx, eth->h_proto, ETH_HLEN,
-                                         size, flags);
+                                         size, flags) == BPF_OK;
        } while (bpf_test_timer_continue(&t, 1, repeat, &ret, &duration));
        bpf_test_timer_leave(&t);
 
index 764c4cb..a01817f 100644 (file)
@@ -866,8 +866,8 @@ static void __skb_flow_bpf_to_target(const struct bpf_flow_keys *flow_keys,
        }
 }
 
-bool bpf_flow_dissect(struct bpf_prog *prog, struct bpf_flow_dissector *ctx,
-                     __be16 proto, int nhoff, int hlen, unsigned int flags)
+u32 bpf_flow_dissect(struct bpf_prog *prog, struct bpf_flow_dissector *ctx,
+                    __be16 proto, int nhoff, int hlen, unsigned int flags)
 {
        struct bpf_flow_keys *flow_keys = ctx->flow_keys;
        u32 result;
@@ -892,7 +892,7 @@ bool bpf_flow_dissect(struct bpf_prog *prog, struct bpf_flow_dissector *ctx,
        flow_keys->thoff = clamp_t(u16, flow_keys->thoff,
                                   flow_keys->nhoff, hlen);
 
-       return result == BPF_OK;
+       return result;
 }
 
 static bool is_pppoe_ses_hdr_valid(const struct pppoe_hdr *hdr)
@@ -1008,6 +1008,7 @@ bool __skb_flow_dissect(const struct net *net,
                        };
                        __be16 n_proto = proto;
                        struct bpf_prog *prog;
+                       u32 result;
 
                        if (skb) {
                                ctx.skb = skb;
@@ -1019,12 +1020,12 @@ bool __skb_flow_dissect(const struct net *net,
                        }
 
                        prog = READ_ONCE(run_array->items[0].prog);
-                       ret = bpf_flow_dissect(prog, &ctx, n_proto, nhoff,
-                                              hlen, flags);
+                       result = bpf_flow_dissect(prog, &ctx, n_proto, nhoff,
+                                                 hlen, flags);
                        __skb_flow_bpf_to_target(&flow_keys, flow_dissector,
                                                 target_container);
                        rcu_read_unlock();
-                       return ret;
+                       return result == BPF_OK;
                }
                rcu_read_unlock();
        }