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