aboutsummaryrefslogtreecommitdiffstats
path: root/tc/tc_bpf.h
diff options
context:
space:
mode:
authorDaniel Borkmann <daniel@iogearbox.net>2015-11-26 15:38:45 +0100
committerStephen Hemminger <shemming@brocade.com>2015-11-29 11:55:16 -0800
commit91d88eeb10cd4f51e3b5c675c7aee4ae1e41ff16 (patch)
treefa50387975ee257832c7e802d1eaf361b78a8891 /tc/tc_bpf.h
parentf6793eec4600a9f9428026ed75c50a44eeb3c83f (diff)
downloadandroid_external_iproute2-91d88eeb10cd4f51e3b5c675c7aee4ae1e41ff16.tar.gz
android_external_iproute2-91d88eeb10cd4f51e3b5c675c7aee4ae1e41ff16.tar.bz2
android_external_iproute2-91d88eeb10cd4f51e3b5c675c7aee4ae1e41ff16.zip
{f,m}_bpf: allow updates on program arrays
Since we have all infrastructure in place now, allow atomic live updates on program arrays. This can be very useful e.g. in case programs that are being tail-called need to be replaced, f.e. when classifier functionality needs to be changed, new protocols added/removed during runtime, etc. Thus, provide a way for in-place code updates, minimal example: Given is an object file cls.o that contains the entry point in section 'classifier', has a globally pinned program array 'jmp' with 2 slots and id of 0, and two tail called programs under section '0/0' (prog array key 0) and '0/1' (prog array key 1), the section encoding for the loader is <id/key>. Adding the filter loads everything into cls_bpf: tc filter add dev foo parent ffff: bpf da obj cls.o Now, the program under section '0/1' needs to be replaced with an updated version that resides in the same section (also full path to tc's subfolder of the mount point can be passed, e.g. /sys/fs/bpf/tc/globals/jmp): tc exec bpf graft m:globals/jmp obj cls.o sec 0/1 In case the program resides under a different section 'foo', it can also be injected into the program array like: tc exec bpf graft m:globals/jmp key 1 obj cls.o sec foo If the new tail called classifier program is already available as a pinned object somewhere (here: /sys/fs/bpf/tc/progs/parser), it can be injected into the prog array like: tc exec bpf graft m:globals/jmp key 1 fd m:progs/parser In the kernel, the program on key 1 is being atomically replaced and the old one's refcount dropped. Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'tc/tc_bpf.h')
-rw-r--r--tc/tc_bpf.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/tc/tc_bpf.h b/tc/tc_bpf.h
index dea3c3b..526d0b1 100644
--- a/tc/tc_bpf.h
+++ b/tc/tc_bpf.h
@@ -55,6 +55,7 @@ const char *bpf_default_section(const enum bpf_prog_type type);
int bpf_parse_common(int *ptr_argc, char ***ptr_argv, const int *nla_tbl,
enum bpf_prog_type type, const char **ptr_object,
const char **ptr_uds_name, struct nlmsghdr *n);
+int bpf_graft_map(const char *map_path, uint32_t *key, int argc, char **argv);
void bpf_print_ops(FILE *f, struct rtattr *bpf_ops, __u16 len);