Re: [net-next RFC v2 8/9] samples/bpf: Add limit_connections, remap_bind checmate examples / tests
On Mon, Aug 29, 2016 at 04:47:46AM -0700, Sargun Dhillon wrote: > 1) limit_connections > This program performs connection limiting using a probablistic > datastructure. It ensures that for a given 2-tuple, there will never be > more than 10 connections. The parameters themselves are adjustable > to allow for trading off memory usage vs. collision likelihood. The > reason for not refcnting 2-tuples using atomic counters is the lack of > a safe free mechanism. > > In order to run this program, you may need to bump your ulimit -l. > > 2) remap_bind > This program rewrites binds from 6789 to 12345. It is meant to mimic > the usage of DNAT. these two are great examples of what lsm+bpf can be capable of. Thanks! > Signed-off-by: Sargun Dhillon> --- > samples/bpf/Makefile | 10 ++ > samples/bpf/bpf_helpers.h | 2 + > samples/bpf/bpf_load.c| 11 +- > samples/bpf/checmate_limit_connections_kern.c | 146 > ++ > samples/bpf/checmate_limit_connections_user.c | 113 > samples/bpf/checmate_remap_bind_kern.c| 28 + > samples/bpf/checmate_remap_bind_user.c| 82 +++ > 7 files changed, 389 insertions(+), 3 deletions(-) > create mode 100644 samples/bpf/checmate_limit_connections_kern.c > create mode 100644 samples/bpf/checmate_limit_connections_user.c > create mode 100644 samples/bpf/checmate_remap_bind_kern.c > create mode 100644 samples/bpf/checmate_remap_bind_user.c > > diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile > index 5d2c178..ee5de8c 100644 > --- a/samples/bpf/Makefile > +++ b/samples/bpf/Makefile > @@ -25,6 +25,8 @@ hostprogs-y += test_cgrp2_array_pin > hostprogs-y += xdp1 > hostprogs-y += xdp2 > hostprogs-y += test_current_task_under_cgroup > +hostprogs-y += checmate_remap_bind > +hostprogs-y += checmate_limit_connections > > test_verifier-objs := test_verifier.o libbpf.o > test_maps-objs := test_maps.o libbpf.o > @@ -52,6 +54,10 @@ xdp1-objs := bpf_load.o libbpf.o xdp1_user.o > xdp2-objs := bpf_load.o libbpf.o xdp1_user.o > test_current_task_under_cgroup-objs := bpf_load.o libbpf.o cgroup_helpers.o \ > test_current_task_under_cgroup_user.o > +checmate_remap_bind-objs := bpf_load.o libbpf.o cgroup_helpers.o \ > + checmate_remap_bind_user.o > +checmate_limit_connections-objs := bpf_load.o libbpf.o cgroup_helpers.o \ > +checmate_limit_connections_user.o > > # Tell kbuild to always build the programs > always := $(hostprogs-y) > @@ -79,6 +85,8 @@ always += test_cgrp2_tc_kern.o > always += xdp1_kern.o > always += xdp2_kern.o > always += test_current_task_under_cgroup_kern.o > +always += checmate_remap_bind_kern.o > +always += checmate_limit_connections_kern.o > > HOSTCFLAGS += -I$(objtree)/usr/include > > @@ -103,6 +111,8 @@ HOSTLOADLIBES_test_overhead += -lelf -lrt > HOSTLOADLIBES_xdp1 += -lelf > HOSTLOADLIBES_xdp2 += -lelf > HOSTLOADLIBES_test_current_task_under_cgroup += -lelf > +HOSTLOADLIBES_checmate_remap_bind += -lelf > +HOSTLOADLIBES_checmate_limit_connections += -lelf > > # Allows pointing LLC/CLANG to a LLVM backend with bpf support, redefine on > cmdline: > # make samples/bpf/ LLC=~/git/llvm/build/bin/llc > CLANG=~/git/llvm/build/bin/clang > diff --git a/samples/bpf/bpf_helpers.h b/samples/bpf/bpf_helpers.h > index bbdf62a..da97ced 100644 > --- a/samples/bpf/bpf_helpers.h > +++ b/samples/bpf/bpf_helpers.h > @@ -55,6 +55,8 @@ static int (*bpf_skb_get_tunnel_opt)(void *ctx, void *md, > int size) = > (void *) BPF_FUNC_skb_get_tunnel_opt; > static int (*bpf_skb_set_tunnel_opt)(void *ctx, void *md, int size) = > (void *) BPF_FUNC_skb_set_tunnel_opt; > +static int (*bpf_probe_write_checmate)(void *ctx, void *dst, void *src, int > len) = > + (void *) BPF_FUNC_probe_write_checmate; > > /* llvm builtin functions that eBPF C program may use to > * emit BPF_LD_ABS and BPF_LD_IND instructions > diff --git a/samples/bpf/bpf_load.c b/samples/bpf/bpf_load.c > index 0cfda23..e12460a 100644 > --- a/samples/bpf/bpf_load.c > +++ b/samples/bpf/bpf_load.c > @@ -51,6 +51,7 @@ static int load_and_attach(const char *event, struct > bpf_insn *prog, int size) > bool is_kretprobe = strncmp(event, "kretprobe/", 10) == 0; > bool is_tracepoint = strncmp(event, "tracepoint/", 11) == 0; > bool is_xdp = strncmp(event, "xdp", 3) == 0; > + bool is_checmate = strncmp(event, "checmate", 8) == 0; > enum bpf_prog_type prog_type; > char buf[256]; > int fd, efd, err, id; > @@ -69,6 +70,8 @@ static int load_and_attach(const char *event, struct > bpf_insn *prog, int size) > prog_type = BPF_PROG_TYPE_TRACEPOINT; > } else if (is_xdp) { > prog_type = BPF_PROG_TYPE_XDP; > + } else if (is_checmate) { > + prog_type =
[net-next RFC v2 8/9] samples/bpf: Add limit_connections, remap_bind checmate examples / tests
1) limit_connections This program performs connection limiting using a probablistic datastructure. It ensures that for a given 2-tuple, there will never be more than 10 connections. The parameters themselves are adjustable to allow for trading off memory usage vs. collision likelihood. The reason for not refcnting 2-tuples using atomic counters is the lack of a safe free mechanism. In order to run this program, you may need to bump your ulimit -l. 2) remap_bind This program rewrites binds from 6789 to 12345. It is meant to mimic the usage of DNAT. Signed-off-by: Sargun Dhillon--- samples/bpf/Makefile | 10 ++ samples/bpf/bpf_helpers.h | 2 + samples/bpf/bpf_load.c| 11 +- samples/bpf/checmate_limit_connections_kern.c | 146 ++ samples/bpf/checmate_limit_connections_user.c | 113 samples/bpf/checmate_remap_bind_kern.c| 28 + samples/bpf/checmate_remap_bind_user.c| 82 +++ 7 files changed, 389 insertions(+), 3 deletions(-) create mode 100644 samples/bpf/checmate_limit_connections_kern.c create mode 100644 samples/bpf/checmate_limit_connections_user.c create mode 100644 samples/bpf/checmate_remap_bind_kern.c create mode 100644 samples/bpf/checmate_remap_bind_user.c diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index 5d2c178..ee5de8c 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -25,6 +25,8 @@ hostprogs-y += test_cgrp2_array_pin hostprogs-y += xdp1 hostprogs-y += xdp2 hostprogs-y += test_current_task_under_cgroup +hostprogs-y += checmate_remap_bind +hostprogs-y += checmate_limit_connections test_verifier-objs := test_verifier.o libbpf.o test_maps-objs := test_maps.o libbpf.o @@ -52,6 +54,10 @@ xdp1-objs := bpf_load.o libbpf.o xdp1_user.o xdp2-objs := bpf_load.o libbpf.o xdp1_user.o test_current_task_under_cgroup-objs := bpf_load.o libbpf.o cgroup_helpers.o \ test_current_task_under_cgroup_user.o +checmate_remap_bind-objs := bpf_load.o libbpf.o cgroup_helpers.o \ + checmate_remap_bind_user.o +checmate_limit_connections-objs := bpf_load.o libbpf.o cgroup_helpers.o \ + checmate_limit_connections_user.o # Tell kbuild to always build the programs always := $(hostprogs-y) @@ -79,6 +85,8 @@ always += test_cgrp2_tc_kern.o always += xdp1_kern.o always += xdp2_kern.o always += test_current_task_under_cgroup_kern.o +always += checmate_remap_bind_kern.o +always += checmate_limit_connections_kern.o HOSTCFLAGS += -I$(objtree)/usr/include @@ -103,6 +111,8 @@ HOSTLOADLIBES_test_overhead += -lelf -lrt HOSTLOADLIBES_xdp1 += -lelf HOSTLOADLIBES_xdp2 += -lelf HOSTLOADLIBES_test_current_task_under_cgroup += -lelf +HOSTLOADLIBES_checmate_remap_bind += -lelf +HOSTLOADLIBES_checmate_limit_connections += -lelf # Allows pointing LLC/CLANG to a LLVM backend with bpf support, redefine on cmdline: # make samples/bpf/ LLC=~/git/llvm/build/bin/llc CLANG=~/git/llvm/build/bin/clang diff --git a/samples/bpf/bpf_helpers.h b/samples/bpf/bpf_helpers.h index bbdf62a..da97ced 100644 --- a/samples/bpf/bpf_helpers.h +++ b/samples/bpf/bpf_helpers.h @@ -55,6 +55,8 @@ static int (*bpf_skb_get_tunnel_opt)(void *ctx, void *md, int size) = (void *) BPF_FUNC_skb_get_tunnel_opt; static int (*bpf_skb_set_tunnel_opt)(void *ctx, void *md, int size) = (void *) BPF_FUNC_skb_set_tunnel_opt; +static int (*bpf_probe_write_checmate)(void *ctx, void *dst, void *src, int len) = + (void *) BPF_FUNC_probe_write_checmate; /* llvm builtin functions that eBPF C program may use to * emit BPF_LD_ABS and BPF_LD_IND instructions diff --git a/samples/bpf/bpf_load.c b/samples/bpf/bpf_load.c index 0cfda23..e12460a 100644 --- a/samples/bpf/bpf_load.c +++ b/samples/bpf/bpf_load.c @@ -51,6 +51,7 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size) bool is_kretprobe = strncmp(event, "kretprobe/", 10) == 0; bool is_tracepoint = strncmp(event, "tracepoint/", 11) == 0; bool is_xdp = strncmp(event, "xdp", 3) == 0; + bool is_checmate = strncmp(event, "checmate", 8) == 0; enum bpf_prog_type prog_type; char buf[256]; int fd, efd, err, id; @@ -69,6 +70,8 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size) prog_type = BPF_PROG_TYPE_TRACEPOINT; } else if (is_xdp) { prog_type = BPF_PROG_TYPE_XDP; + } else if (is_checmate) { + prog_type = BPF_PROG_TYPE_CHECMATE; } else { printf("Unknown event '%s'\n", event); return -1; @@ -82,7 +85,7 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size) prog_fd[prog_cnt++] = fd; - if (is_xdp) + if (is_xdp || is_checmate)