1*4882a593Smuzhiyun #include <uapi/linux/bpf.h> 2*4882a593Smuzhiyun #include <uapi/linux/if_ether.h> 3*4882a593Smuzhiyun #include <uapi/linux/if_packet.h> 4*4882a593Smuzhiyun #include <uapi/linux/ip.h> 5*4882a593Smuzhiyun #include <bpf/bpf_helpers.h> 6*4882a593Smuzhiyun #include "bpf_legacy.h" 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun struct { 9*4882a593Smuzhiyun __uint(type, BPF_MAP_TYPE_ARRAY); 10*4882a593Smuzhiyun __type(key, u32); 11*4882a593Smuzhiyun __type(value, long); 12*4882a593Smuzhiyun __uint(max_entries, 256); 13*4882a593Smuzhiyun } my_map SEC(".maps"); 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun SEC("socket1") bpf_prog1(struct __sk_buff * skb)16*4882a593Smuzhiyunint bpf_prog1(struct __sk_buff *skb) 17*4882a593Smuzhiyun { 18*4882a593Smuzhiyun int index = load_byte(skb, ETH_HLEN + offsetof(struct iphdr, protocol)); 19*4882a593Smuzhiyun long *value; 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun if (skb->pkt_type != PACKET_OUTGOING) 22*4882a593Smuzhiyun return 0; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun value = bpf_map_lookup_elem(&my_map, &index); 25*4882a593Smuzhiyun if (value) 26*4882a593Smuzhiyun __sync_fetch_and_add(value, skb->len); 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun return 0; 29*4882a593Smuzhiyun } 30*4882a593Smuzhiyun char _license[] SEC("license") = "GPL"; 31