xref: /OK3568_Linux_fs/kernel/samples/bpf/sockex1_kern.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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*4882a593Smuzhiyun int 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