mirror of
https://git.kernel.org/pub/scm/network/iproute2/iproute2.git
synced 2024-11-16 14:35:34 +08:00
91d88eeb10
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>
80 lines
1.9 KiB
C
80 lines
1.9 KiB
C
/*
|
|
* tc_bpf.h BPF common code
|
|
*
|
|
* This program is free software; you can distribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*
|
|
* Authors: Daniel Borkmann <dborkman@redhat.com>
|
|
* Jiri Pirko <jiri@resnulli.us>
|
|
*/
|
|
|
|
#ifndef _TC_BPF_H_
|
|
#define _TC_BPF_H_ 1
|
|
|
|
#include <linux/netlink.h>
|
|
#include <linux/bpf.h>
|
|
#include <linux/magic.h>
|
|
|
|
#include "utils.h"
|
|
#include "bpf_scm.h"
|
|
|
|
enum {
|
|
BPF_NLA_OPS_LEN = 0,
|
|
BPF_NLA_OPS,
|
|
BPF_NLA_FD,
|
|
BPF_NLA_NAME,
|
|
__BPF_NLA_MAX,
|
|
};
|
|
|
|
#define BPF_NLA_MAX __BPF_NLA_MAX
|
|
|
|
#define BPF_ENV_UDS "TC_BPF_UDS"
|
|
#define BPF_ENV_MNT "TC_BPF_MNT"
|
|
#define BPF_ENV_NOLOG "TC_BPF_NOLOG"
|
|
|
|
#ifndef BPF_FS_MAGIC
|
|
# define BPF_FS_MAGIC 0xcafe4a11
|
|
#endif
|
|
|
|
#define BPF_DIR_MNT "/sys/fs/bpf"
|
|
|
|
#define BPF_DIR_TC "tc"
|
|
#define BPF_DIR_GLOBALS "globals"
|
|
|
|
#ifndef TRACEFS_MAGIC
|
|
# define TRACEFS_MAGIC 0x74726163
|
|
#endif
|
|
|
|
#define TRACE_DIR_MNT "/sys/kernel/tracing"
|
|
|
|
int bpf_trace_pipe(void);
|
|
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);
|
|
|
|
#ifdef HAVE_ELF
|
|
int bpf_send_map_fds(const char *path, const char *obj);
|
|
int bpf_recv_map_fds(const char *path, int *fds, struct bpf_map_aux *aux,
|
|
unsigned int entries);
|
|
#else
|
|
static inline int bpf_send_map_fds(const char *path, const char *obj)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int bpf_recv_map_fds(const char *path, int *fds,
|
|
struct bpf_map_aux *aux,
|
|
unsigned int entries)
|
|
{
|
|
return -1;
|
|
}
|
|
#endif /* HAVE_ELF */
|
|
#endif /* _TC_BPF_H_ */
|