summaryrefslogtreecommitdiffstats
path: root/headers/xdp/libxdp.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--headers/xdp/libxdp.h174
1 files changed, 174 insertions, 0 deletions
diff --git a/headers/xdp/libxdp.h b/headers/xdp/libxdp.h
new file mode 100644
index 0000000..c1a6066
--- /dev/null
+++ b/headers/xdp/libxdp.h
@@ -0,0 +1,174 @@
+// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
+
+/*
+ * XDP management utility functions
+ *
+ * Copyright (C) 2020 Toke Høiland-Jørgensen <toke@redhat.com>
+ */
+
+#ifndef __LIBXDP_LIBXDP_H
+#define __LIBXDP_LIBXDP_H
+
+#include <stdio.h>
+#include <linux/bpf.h>
+#include <bpf/libbpf.h>
+#include <bpf/bpf.h>
+#include "xdp_helpers.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define XDP_BPFFS_ENVVAR "LIBXDP_BPFFS"
+#define XDP_BPFFS_MOUNT_ENVVAR "LIBXDP_BPFFS_AUTOMOUNT"
+#define XDP_OBJECT_ENVVAR "LIBXDP_OBJECT_PATH"
+
+enum xdp_attach_mode {
+ XDP_MODE_UNSPEC = 0,
+ XDP_MODE_NATIVE,
+ XDP_MODE_SKB,
+ XDP_MODE_HW
+};
+
+/* This is compatible with libbpf logging levels */
+enum libxdp_print_level {
+ LIBXDP_WARN,
+ LIBXDP_INFO,
+ LIBXDP_DEBUG,
+};
+typedef int (*libxdp_print_fn_t)(enum libxdp_print_level level,
+ const char *, va_list ap);
+
+libxdp_print_fn_t libxdp_set_print(libxdp_print_fn_t fn);
+
+
+struct xdp_program;
+struct xdp_multiprog;
+
+long libxdp_get_error(const void *ptr);
+int libxdp_strerror(int err, char *buf, size_t size);
+int libxdp_clean_references(int ifindex);
+
+
+struct xdp_program *xdp_program__from_bpf_obj(struct bpf_object *obj,
+ const char *section_name);
+struct xdp_program *xdp_program__find_file(const char *filename,
+ const char *section_name,
+ struct bpf_object_open_opts *opts);
+struct xdp_program *xdp_program__open_file(const char *filename,
+ const char *section_name,
+ struct bpf_object_open_opts *opts);
+struct xdp_program *xdp_program__from_fd(int fd);
+struct xdp_program *xdp_program__from_id(__u32 prog_id);
+struct xdp_program *xdp_program__from_pin(const char *pin_path);
+struct xdp_program *xdp_program__clone(struct xdp_program *xdp_prog,
+ unsigned int flags);
+
+void xdp_program__close(struct xdp_program *xdp_prog);
+int xdp_program__test_run(struct xdp_program *xdp_prog,
+ struct bpf_test_run_opts *opts,
+ unsigned int flags);
+
+enum xdp_attach_mode xdp_program__is_attached(const struct xdp_program *xdp_prog,
+ int ifindex);
+const char *xdp_program__name(const struct xdp_program *xdp_prog);
+const unsigned char *xdp_program__tag(const struct xdp_program *xdp_prog);
+struct bpf_object *xdp_program__bpf_obj(struct xdp_program *xdp_prog);
+const struct btf *xdp_program__btf(struct xdp_program *xdp_prog);
+uint32_t xdp_program__id(const struct xdp_program *xdp_prog);
+int xdp_program__fd(const struct xdp_program *xdp_prog);
+unsigned int xdp_program__run_prio(const struct xdp_program *xdp_prog);
+int xdp_program__set_run_prio(struct xdp_program *xdp_prog,
+ unsigned int run_prio);
+bool xdp_program__chain_call_enabled(const struct xdp_program *xdp_prog,
+ enum xdp_action action);
+int xdp_program__set_chain_call_enabled(struct xdp_program *prog,
+ unsigned int action,
+ bool enabled);
+int xdp_program__print_chain_call_actions(const struct xdp_program *prog,
+ char *buf,
+ size_t buf_len);
+bool xdp_program__xdp_frags_support(const struct xdp_program *prog);
+int xdp_program__set_xdp_frags_support(struct xdp_program *prog, bool frags);
+
+int xdp_program__pin(struct xdp_program *xdp_prog, const char *pin_path);
+int xdp_program__attach(struct xdp_program *xdp_prog,
+ int ifindex, enum xdp_attach_mode mode,
+ unsigned int flags);
+int xdp_program__attach_multi(struct xdp_program **progs, size_t num_progs,
+ int ifindex, enum xdp_attach_mode mode,
+ unsigned int flags);
+int xdp_program__detach(struct xdp_program *xdp_prog,
+ int ifindex, enum xdp_attach_mode mode,
+ unsigned int flags);
+int xdp_program__detach_multi(struct xdp_program **progs, size_t num_progs,
+ int ifindex, enum xdp_attach_mode mode,
+ unsigned int flags);
+
+struct xdp_multiprog *xdp_multiprog__get_from_ifindex(int ifindex);
+struct xdp_program *xdp_multiprog__next_prog(const struct xdp_program *prog,
+ const struct xdp_multiprog *mp);
+void xdp_multiprog__close(struct xdp_multiprog *mp);
+int xdp_multiprog__detach(struct xdp_multiprog *mp);
+enum xdp_attach_mode xdp_multiprog__attach_mode(const struct xdp_multiprog *mp);
+struct xdp_program *xdp_multiprog__main_prog(const struct xdp_multiprog *mp);
+struct xdp_program *xdp_multiprog__hw_prog(const struct xdp_multiprog *mp);
+bool xdp_multiprog__is_legacy(const struct xdp_multiprog *mp);
+int xdp_multiprog__program_count(const struct xdp_multiprog *mp);
+bool xdp_multiprog__xdp_frags_support(const struct xdp_multiprog *mp);
+
+/* Only following members can be set at once:
+ *
+ * @obj, @prog_name
+ * Create using BPF program with name @prog_name in BPF object @obj
+ *
+ * @prog_name is optional. In absence of @prog_name, first program of BPF
+ * object is picked.
+ *
+ * @find_filename, @prog_name, @opts
+ * Create using BPF program with name @prog_name in BPF object located in
+ * LIBXDP_OBJECT_PATH with filename @find_filename, using
+ * bpf_object_open_opts @opts.
+ *
+ * @prog_name and @opts is optional. In absence of @prog_name, first
+ * program of BPF object is picked.
+ *
+ * @open_filename, @prog_name, @opts
+ * Create using BPF program with name @prog_name in BPF object located at
+ * path @open_filename, using bpf_object_open_opts @opts.
+ *
+ * @prog_name and @opts is optional. In absence of @prog_name, first
+ * program of BPF object is picked.
+ *
+ * @id
+ * Load from BPF program with ID @id
+ *
+ * @fd
+ * Load from BPF program with fd @fd
+ *
+ * When one of these combinations is set, all other members of the opts struct
+ * must be zeroed out.
+ */
+struct xdp_program_opts {
+ size_t sz;
+ struct bpf_object *obj;
+ struct bpf_object_open_opts *opts;
+ const char *prog_name;
+ const char *find_filename;
+ const char *open_filename;
+ const char *pin_path;
+ __u32 id;
+ int fd;
+ size_t :0;
+};
+#define xdp_program_opts__last_field fd
+
+#define DECLARE_LIBXDP_OPTS DECLARE_LIBBPF_OPTS
+
+struct xdp_program *xdp_program__create(struct xdp_program_opts *opts);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif