1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/bpf.h>
3 #include <bpf/bpf_helpers.h>
4 #include <bpf/bpf_endian.h>
5
6 long process_byte = 0;
7 int verdict_dir = 0;
8 int dropped = 0;
9 int pkt_size = 0;
10 struct {
11 __uint(type, BPF_MAP_TYPE_SOCKMAP);
12 __uint(max_entries, 20);
13 __type(key, int);
14 __type(value, int);
15 } sock_map_rx SEC(".maps");
16
17 struct {
18 __uint(type, BPF_MAP_TYPE_SOCKMAP);
19 __uint(max_entries, 20);
20 __type(key, int);
21 __type(value, int);
22 } sock_map_tx SEC(".maps");
23
24 SEC("sk_skb/stream_parser")
prog_skb_parser(struct __sk_buff * skb)25 int prog_skb_parser(struct __sk_buff *skb)
26 {
27 return pkt_size;
28 }
29
30 SEC("sk_skb/stream_verdict")
prog_skb_verdict(struct __sk_buff * skb)31 int prog_skb_verdict(struct __sk_buff *skb)
32 {
33 int one = 1;
34 int ret = bpf_sk_redirect_map(skb, &sock_map_rx, one, verdict_dir);
35
36 if (ret == SK_DROP)
37 dropped++;
38 __sync_fetch_and_add(&process_byte, skb->len);
39 return ret;
40 }
41
42 SEC("sk_skb/stream_verdict")
prog_skb_pass(struct __sk_buff * skb)43 int prog_skb_pass(struct __sk_buff *skb)
44 {
45 __sync_fetch_and_add(&process_byte, skb->len);
46 return SK_PASS;
47 }
48
49 SEC("sk_msg")
prog_skmsg_verdict(struct sk_msg_md * msg)50 int prog_skmsg_verdict(struct sk_msg_md *msg)
51 {
52 int one = 1;
53
54 __sync_fetch_and_add(&process_byte, msg->size);
55 return bpf_msg_redirect_map(msg, &sock_map_tx, one, verdict_dir);
56 }
57
58 SEC("sk_msg")
prog_skmsg_pass(struct sk_msg_md * msg)59 int prog_skmsg_pass(struct sk_msg_md *msg)
60 {
61 __sync_fetch_and_add(&process_byte, msg->size);
62 return SK_PASS;
63 }
64
65 char _license[] SEC("license") = "GPL";
66