2021-05-25 11:59:31 +08:00
|
|
|
/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Libbpf legacy APIs (either discouraged or deprecated, as mentioned in [0])
|
|
|
|
*
|
|
|
|
* [0] https://docs.google.com/document/d/1UyjTZuPFWiPFyKk1tV5an11_iaRuec6U-ZESZ54nNTY
|
|
|
|
*
|
|
|
|
* Copyright (C) 2021 Facebook
|
|
|
|
*/
|
|
|
|
#ifndef __LIBBPF_LEGACY_BPF_H
|
|
|
|
#define __LIBBPF_LEGACY_BPF_H
|
|
|
|
|
|
|
|
#include <linux/bpf.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "libbpf_common.h"
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
enum libbpf_strict_mode {
|
|
|
|
/* Turn on all supported strict features of libbpf to simulate libbpf
|
|
|
|
* v1.0 behavior.
|
|
|
|
* This will be the default behavior in libbpf v1.0.
|
|
|
|
*/
|
|
|
|
LIBBPF_STRICT_ALL = 0xffffffff,
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Disable any libbpf 1.0 behaviors. This is the default before libbpf
|
|
|
|
* v1.0. It won't be supported anymore in v1.0, please update your
|
|
|
|
* code so that it handles LIBBPF_STRICT_ALL mode before libbpf v1.0.
|
|
|
|
*/
|
|
|
|
LIBBPF_STRICT_NONE = 0x00,
|
2021-05-25 11:59:33 +08:00
|
|
|
/*
|
|
|
|
* Return NULL pointers on error, not ERR_PTR(err).
|
|
|
|
* Additionally, libbpf also always sets errno to corresponding Exx
|
|
|
|
* (positive) error code.
|
|
|
|
*/
|
|
|
|
LIBBPF_STRICT_CLEAN_PTRS = 0x01,
|
|
|
|
/*
|
|
|
|
* Return actual error codes from low-level APIs directly, not just -1.
|
|
|
|
* Additionally, libbpf also always sets errno to corresponding Exx
|
|
|
|
* (positive) error code.
|
|
|
|
*/
|
|
|
|
LIBBPF_STRICT_DIRECT_ERRS = 0x02,
|
2021-05-25 11:59:31 +08:00
|
|
|
|
libbpf: Add opt-in strict BPF program section name handling logic
Implement strict ELF section name handling for BPF programs. It utilizes
`libbpf_set_strict_mode()` framework and adds new flag: LIBBPF_STRICT_SEC_NAME.
If this flag is set, libbpf will enforce exact section name matching for
a lot of program types that previously allowed just partial prefix
match. E.g., if previously SEC("xdp_whatever_i_want") was allowed, now
in strict mode only SEC("xdp") will be accepted, which makes SEC("")
definitions cleaner and more structured. SEC() now won't be used as yet
another way to uniquely encode BPF program identifier (for that
C function name is better and is guaranteed to be unique within
bpf_object). Now SEC() is strictly BPF program type and, depending on
program type, extra load/attach parameter specification.
Libbpf completely supports multiple BPF programs in the same ELF
section, so multiple BPF programs of the same type/specification easily
co-exist together within the same bpf_object scope.
Additionally, a new (for now internal) convention is introduced: section
name that can be a stand-alone exact BPF program type specificator, but
also could have extra parameters after '/' delimiter. An example of such
section is "struct_ops", which can be specified by itself, but also
allows to specify the intended operation to be attached to, e.g.,
"struct_ops/dctcp_init". Note, that "struct_ops_some_op" is not allowed.
Such section definition is specified as "struct_ops+".
This change is part of libbpf 1.0 effort ([0], [1]).
[0] Closes: https://github.com/libbpf/libbpf/issues/271
[1] https://github.com/libbpf/libbpf/wiki/Libbpf:-the-road-to-v1.0#stricter-and-more-uniform-bpf-program-section-name-sec-handling
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Dave Marchevsky <davemarchevsky@fb.com>
Link: https://lore.kernel.org/bpf/20210928161946.2512801-10-andrii@kernel.org
2021-09-29 00:19:45 +08:00
|
|
|
/*
|
|
|
|
* Enforce strict BPF program section (SEC()) names.
|
|
|
|
* E.g., while prefiously SEC("xdp_whatever") or SEC("perf_event_blah") were
|
|
|
|
* allowed, with LIBBPF_STRICT_SEC_PREFIX this will become
|
|
|
|
* unrecognized by libbpf and would have to be just SEC("xdp") and
|
|
|
|
* SEC("xdp") and SEC("perf_event").
|
|
|
|
*/
|
|
|
|
LIBBPF_STRICT_SEC_NAME = 0x04,
|
|
|
|
|
2021-05-25 11:59:31 +08:00
|
|
|
__LIBBPF_STRICT_LAST,
|
|
|
|
};
|
|
|
|
|
|
|
|
LIBBPF_API int libbpf_set_strict_mode(enum libbpf_strict_mode mode);
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
} /* extern "C" */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* __LIBBPF_LEGACY_BPF_H */
|