diff options
author | Alexei Starovoitov <ast@plumgrid.com> | 2014-12-02 02:06:38 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-12-06 08:47:33 +0300 |
commit | a80857822b0c2ed608c93504bd3687b78f20c619 (patch) | |
tree | 8fb218a13a13a16d5083c7b831398f967137f152 /samples/bpf/sockex1_kern.c | |
parent | 249b812d8005ec38e351ee763ceb85d56b155064 (diff) | |
download | linux-a80857822b0c2ed608c93504bd3687b78f20c619.tar.xz |
samples: bpf: trivial eBPF program in C
this example does the same task as previous socket example
in assembler, but this one does it in C.
eBPF program in kernel does:
/* assume that packet is IPv4, load one byte of IP->proto */
int index = load_byte(skb, ETH_HLEN + offsetof(struct iphdr, protocol));
long *value;
value = bpf_map_lookup_elem(&my_map, &index);
if (value)
__sync_fetch_and_add(value, 1);
Corresponding user space reads map[tcp], map[udp], map[icmp]
and prints protocol stats every second
Signed-off-by: Alexei Starovoitov <ast@plumgrid.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'samples/bpf/sockex1_kern.c')
-rw-r--r-- | samples/bpf/sockex1_kern.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/samples/bpf/sockex1_kern.c b/samples/bpf/sockex1_kern.c new file mode 100644 index 000000000000..066892662915 --- /dev/null +++ b/samples/bpf/sockex1_kern.c @@ -0,0 +1,25 @@ +#include <uapi/linux/bpf.h> +#include <uapi/linux/if_ether.h> +#include <uapi/linux/ip.h> +#include "bpf_helpers.h" + +struct bpf_map_def SEC("maps") my_map = { + .type = BPF_MAP_TYPE_ARRAY, + .key_size = sizeof(u32), + .value_size = sizeof(long), + .max_entries = 256, +}; + +SEC("socket1") +int bpf_prog1(struct sk_buff *skb) +{ + int index = load_byte(skb, ETH_HLEN + offsetof(struct iphdr, protocol)); + long *value; + + value = bpf_map_lookup_elem(&my_map, &index); + if (value) + __sync_fetch_and_add(value, 1); + + return 0; +} +char _license[] SEC("license") = "GPL"; |