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") 25 int prog_skb_parser(struct __sk_buff *skb) 26 { 27 return pkt_size; 28 } 29 30 SEC("sk_skb/stream_verdict") 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") 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") 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") 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