mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
Daniel Borkmann says:
====================
pull-request: bpf-next 2022-07-09
We've added 94 non-merge commits during the last 19 day(s) which contain
a total of 125 files changed, 5141 insertions(+), 6701 deletions(-).
The main changes are:
1) Add new way for performing BTF type queries to BPF, from Daniel Müller.
2) Add inlining of calls to bpf_loop() helper when its function callback is
statically known, from Eduard Zingerman.
3) Implement BPF TCP CC framework usability improvements, from Jörn-Thorben Hinz.
4) Add LSM flavor for attaching per-cgroup BPF programs to existing LSM
hooks, from Stanislav Fomichev.
5) Remove all deprecated libbpf APIs in prep for 1.0 release, from Andrii Nakryiko.
6) Add benchmarks around local_storage to BPF selftests, from Dave Marchevsky.
7) AF_XDP sample removal (given move to libxdp) and various improvements around AF_XDP
selftests, from Magnus Karlsson & Maciej Fijalkowski.
8) Add bpftool improvements for memcg probing and bash completion, from Quentin Monnet.
9) Add arm64 JIT support for BPF-2-BPF coupled with tail calls, from Jakub Sitnicki.
10) Sockmap optimizations around throughput of UDP transmissions which have been
improved by 61%, from Cong Wang.
11) Rework perf's BPF prologue code to remove deprecated functions, from Jiri Olsa.
12) Fix sockmap teardown path to avoid sleepable sk_psock_stop, from John Fastabend.
13) Fix libbpf's cleanup around legacy kprobe/uprobe on error case, from Chuang Wang.
14) Fix libbpf's bpf_helpers.h to work with gcc for the case of its sec/pragma
macro, from James Hilliard.
15) Fix libbpf's pt_regs macros for riscv to use a0 for RC register, from Yixun Lan.
16) Fix bpftool to show the name of type BPF_OBJ_LINK, from Yafang Shao.
* https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next: (94 commits)
selftests/bpf: Fix xdp_synproxy build failure if CONFIG_NF_CONNTRACK=m/n
bpf: Correctly propagate errors up from bpf_core_composites_match
libbpf: Disable SEC pragma macro on GCC
bpf: Check attach_func_proto more carefully in check_return_code
selftests/bpf: Add test involving restrict type qualifier
bpftool: Add support for KIND_RESTRICT to gen min_core_btf command
MAINTAINERS: Add entry for AF_XDP selftests files
selftests, xsk: Rename AF_XDP testing app
bpf, docs: Remove deprecated xsk libbpf APIs description
selftests/bpf: Add benchmark for local_storage RCU Tasks Trace usage
libbpf, riscv: Use a0 for RC register
libbpf: Remove unnecessary usdt_rel_ip assignments
selftests/bpf: Fix few more compiler warnings
selftests/bpf: Fix bogus uninitialized variable warning
bpftool: Remove zlib feature test from Makefile
libbpf: Cleanup the legacy uprobe_event on failed add/attach_event()
libbpf: Fix wrong variable used in perf_event_uprobe_open_legacy()
libbpf: Cleanup the legacy kprobe_event on failed add/attach_event()
selftests/bpf: Add type match test against kernel's task_struct
selftests/bpf: Add nested type to type based tests
...
====================
Link: https://lore.kernel.org/r/20220708233145.32365-1-daniel@iogearbox.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -45,9 +45,6 @@ tprogs-y += xdp_rxq_info
|
||||
tprogs-y += syscall_tp
|
||||
tprogs-y += cpustat
|
||||
tprogs-y += xdp_adjust_tail
|
||||
tprogs-y += xdpsock
|
||||
tprogs-y += xdpsock_ctrl_proc
|
||||
tprogs-y += xsk_fwd
|
||||
tprogs-y += xdp_fwd
|
||||
tprogs-y += task_fd_query
|
||||
tprogs-y += xdp_sample_pkts
|
||||
@@ -109,9 +106,6 @@ xdp_rxq_info-objs := xdp_rxq_info_user.o
|
||||
syscall_tp-objs := syscall_tp_user.o
|
||||
cpustat-objs := cpustat_user.o
|
||||
xdp_adjust_tail-objs := xdp_adjust_tail_user.o
|
||||
xdpsock-objs := xdpsock_user.o
|
||||
xdpsock_ctrl_proc-objs := xdpsock_ctrl_proc.o
|
||||
xsk_fwd-objs := xsk_fwd.o
|
||||
xdp_fwd-objs := xdp_fwd_user.o
|
||||
task_fd_query-objs := task_fd_query_user.o $(TRACE_HELPERS)
|
||||
xdp_sample_pkts-objs := xdp_sample_pkts_user.o
|
||||
@@ -179,7 +173,6 @@ always-y += xdp_sample_pkts_kern.o
|
||||
always-y += ibumad_kern.o
|
||||
always-y += hbm_out_kern.o
|
||||
always-y += hbm_edt_kern.o
|
||||
always-y += xdpsock_kern.o
|
||||
|
||||
ifeq ($(ARCH), arm)
|
||||
# Strip all except -D__LINUX_ARM_ARCH__ option needed to handle linux
|
||||
@@ -224,8 +217,6 @@ TPROGLDLIBS_tracex4 += -lrt
|
||||
TPROGLDLIBS_trace_output += -lrt
|
||||
TPROGLDLIBS_map_perf_test += -lrt
|
||||
TPROGLDLIBS_test_overhead += -lrt
|
||||
TPROGLDLIBS_xdpsock += -pthread -lcap
|
||||
TPROGLDLIBS_xsk_fwd += -pthread
|
||||
|
||||
# Allows pointing LLC/CLANG to a LLVM backend with bpf support, redefine on cmdline:
|
||||
# make M=samples/bpf LLC=~/git/llvm-project/llvm/build/bin/llc CLANG=~/git/llvm-project/llvm/build/bin/clang
|
||||
|
||||
@@ -39,11 +39,13 @@ static int parse_ipv6(void *data, u64 nh_off, void *data_end)
|
||||
return ip6h->nexthdr;
|
||||
}
|
||||
|
||||
SEC("xdp1")
|
||||
#define XDPBUFSIZE 64
|
||||
SEC("xdp.frags")
|
||||
int xdp_prog1(struct xdp_md *ctx)
|
||||
{
|
||||
void *data_end = (void *)(long)ctx->data_end;
|
||||
void *data = (void *)(long)ctx->data;
|
||||
__u8 pkt[XDPBUFSIZE] = {};
|
||||
void *data_end = &pkt[XDPBUFSIZE-1];
|
||||
void *data = pkt;
|
||||
struct ethhdr *eth = data;
|
||||
int rc = XDP_DROP;
|
||||
long *value;
|
||||
@@ -51,6 +53,9 @@ int xdp_prog1(struct xdp_md *ctx)
|
||||
u64 nh_off;
|
||||
u32 ipproto;
|
||||
|
||||
if (bpf_xdp_load_bytes(ctx, 0, pkt, sizeof(pkt)))
|
||||
return rc;
|
||||
|
||||
nh_off = sizeof(*eth);
|
||||
if (data + nh_off > data_end)
|
||||
return rc;
|
||||
|
||||
@@ -55,11 +55,13 @@ static int parse_ipv6(void *data, u64 nh_off, void *data_end)
|
||||
return ip6h->nexthdr;
|
||||
}
|
||||
|
||||
SEC("xdp1")
|
||||
#define XDPBUFSIZE 64
|
||||
SEC("xdp.frags")
|
||||
int xdp_prog1(struct xdp_md *ctx)
|
||||
{
|
||||
void *data_end = (void *)(long)ctx->data_end;
|
||||
void *data = (void *)(long)ctx->data;
|
||||
__u8 pkt[XDPBUFSIZE] = {};
|
||||
void *data_end = &pkt[XDPBUFSIZE-1];
|
||||
void *data = pkt;
|
||||
struct ethhdr *eth = data;
|
||||
int rc = XDP_DROP;
|
||||
long *value;
|
||||
@@ -67,6 +69,9 @@ int xdp_prog1(struct xdp_md *ctx)
|
||||
u64 nh_off;
|
||||
u32 ipproto;
|
||||
|
||||
if (bpf_xdp_load_bytes(ctx, 0, pkt, sizeof(pkt)))
|
||||
return rc;
|
||||
|
||||
nh_off = sizeof(*eth);
|
||||
if (data + nh_off > data_end)
|
||||
return rc;
|
||||
|
||||
@@ -212,7 +212,7 @@ static __always_inline int handle_ipv6(struct xdp_md *xdp)
|
||||
return XDP_TX;
|
||||
}
|
||||
|
||||
SEC("xdp_tx_iptunnel")
|
||||
SEC("xdp.frags")
|
||||
int _xdp_tx_iptunnel(struct xdp_md *xdp)
|
||||
{
|
||||
void *data_end = (void *)(long)xdp->data_end;
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* Copyright(c) 2019 Intel Corporation.
|
||||
*/
|
||||
|
||||
#ifndef XDPSOCK_H_
|
||||
#define XDPSOCK_H_
|
||||
|
||||
#define MAX_SOCKS 4
|
||||
|
||||
#define SOCKET_NAME "sock_cal_bpf_fd"
|
||||
#define MAX_NUM_OF_CLIENTS 10
|
||||
|
||||
#define CLOSE_CONN 1
|
||||
|
||||
typedef __u64 u64;
|
||||
typedef __u32 u32;
|
||||
|
||||
#endif /* XDPSOCK_H */
|
||||
@@ -1,190 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright(c) 2017 - 2018 Intel Corporation. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <getopt.h>
|
||||
#include <libgen.h>
|
||||
#include <net/if.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <bpf/bpf.h>
|
||||
#include <bpf/xsk.h>
|
||||
#include "xdpsock.h"
|
||||
|
||||
/* libbpf APIs for AF_XDP are deprecated starting from v0.7 */
|
||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
|
||||
static const char *opt_if = "";
|
||||
|
||||
static struct option long_options[] = {
|
||||
{"interface", required_argument, 0, 'i'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
static void usage(const char *prog)
|
||||
{
|
||||
const char *str =
|
||||
" Usage: %s [OPTIONS]\n"
|
||||
" Options:\n"
|
||||
" -i, --interface=n Run on interface n\n"
|
||||
"\n";
|
||||
fprintf(stderr, "%s\n", str);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static void parse_command_line(int argc, char **argv)
|
||||
{
|
||||
int option_index, c;
|
||||
|
||||
opterr = 0;
|
||||
|
||||
for (;;) {
|
||||
c = getopt_long(argc, argv, "i:",
|
||||
long_options, &option_index);
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c) {
|
||||
case 'i':
|
||||
opt_if = optarg;
|
||||
break;
|
||||
default:
|
||||
usage(basename(argv[0]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int send_xsks_map_fd(int sock, int fd)
|
||||
{
|
||||
char cmsgbuf[CMSG_SPACE(sizeof(int))];
|
||||
struct msghdr msg;
|
||||
struct iovec iov;
|
||||
int value = 0;
|
||||
|
||||
if (fd == -1) {
|
||||
fprintf(stderr, "Incorrect fd = %d\n", fd);
|
||||
return -1;
|
||||
}
|
||||
iov.iov_base = &value;
|
||||
iov.iov_len = sizeof(int);
|
||||
|
||||
msg.msg_name = NULL;
|
||||
msg.msg_namelen = 0;
|
||||
msg.msg_iov = &iov;
|
||||
msg.msg_iovlen = 1;
|
||||
msg.msg_flags = 0;
|
||||
msg.msg_control = cmsgbuf;
|
||||
msg.msg_controllen = CMSG_LEN(sizeof(int));
|
||||
|
||||
struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg);
|
||||
|
||||
cmsg->cmsg_level = SOL_SOCKET;
|
||||
cmsg->cmsg_type = SCM_RIGHTS;
|
||||
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
|
||||
|
||||
*(int *)CMSG_DATA(cmsg) = fd;
|
||||
int ret = sendmsg(sock, &msg, 0);
|
||||
|
||||
if (ret == -1) {
|
||||
fprintf(stderr, "Sendmsg failed with %s", strerror(errno));
|
||||
return -errno;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_un server;
|
||||
int listening = 1;
|
||||
int rval, msgsock;
|
||||
int ifindex = 0;
|
||||
int flag = 1;
|
||||
int cmd = 0;
|
||||
int sock;
|
||||
int err;
|
||||
int xsks_map_fd;
|
||||
|
||||
parse_command_line(argc, argv);
|
||||
|
||||
ifindex = if_nametoindex(opt_if);
|
||||
if (ifindex == 0) {
|
||||
fprintf(stderr, "Unable to get ifindex for Interface %s. Reason:%s",
|
||||
opt_if, strerror(errno));
|
||||
return -errno;
|
||||
}
|
||||
|
||||
sock = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (sock < 0) {
|
||||
fprintf(stderr, "Opening socket stream failed: %s", strerror(errno));
|
||||
return -errno;
|
||||
}
|
||||
|
||||
server.sun_family = AF_UNIX;
|
||||
strcpy(server.sun_path, SOCKET_NAME);
|
||||
|
||||
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int));
|
||||
|
||||
if (bind(sock, (struct sockaddr *)&server, sizeof(struct sockaddr_un))) {
|
||||
fprintf(stderr, "Binding to socket stream failed: %s", strerror(errno));
|
||||
return -errno;
|
||||
}
|
||||
|
||||
listen(sock, MAX_NUM_OF_CLIENTS);
|
||||
|
||||
err = xsk_setup_xdp_prog(ifindex, &xsks_map_fd);
|
||||
if (err) {
|
||||
fprintf(stderr, "Setup of xdp program failed\n");
|
||||
goto close_sock;
|
||||
}
|
||||
|
||||
while (listening) {
|
||||
msgsock = accept(sock, 0, 0);
|
||||
if (msgsock == -1) {
|
||||
fprintf(stderr, "Error accepting connection: %s", strerror(errno));
|
||||
err = -errno;
|
||||
goto close_sock;
|
||||
}
|
||||
err = send_xsks_map_fd(msgsock, xsks_map_fd);
|
||||
if (err <= 0) {
|
||||
fprintf(stderr, "Error %d sending xsks_map_fd\n", err);
|
||||
goto cleanup;
|
||||
}
|
||||
do {
|
||||
rval = read(msgsock, &cmd, sizeof(int));
|
||||
if (rval < 0) {
|
||||
fprintf(stderr, "Error reading stream message");
|
||||
} else {
|
||||
if (cmd != CLOSE_CONN)
|
||||
fprintf(stderr, "Recv unknown cmd = %d\n", cmd);
|
||||
listening = 0;
|
||||
break;
|
||||
}
|
||||
} while (rval > 0);
|
||||
}
|
||||
close(msgsock);
|
||||
close(sock);
|
||||
unlink(SOCKET_NAME);
|
||||
|
||||
/* Unset fd for given ifindex */
|
||||
err = bpf_xdp_detach(ifindex, 0, NULL);
|
||||
if (err) {
|
||||
fprintf(stderr, "Error when unsetting bpf prog_fd for ifindex(%d)\n", ifindex);
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
cleanup:
|
||||
close(msgsock);
|
||||
close_sock:
|
||||
close(sock);
|
||||
unlink(SOCKET_NAME);
|
||||
return err;
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/bpf.h>
|
||||
#include <bpf/bpf_helpers.h>
|
||||
#include "xdpsock.h"
|
||||
|
||||
/* This XDP program is only needed for the XDP_SHARED_UMEM mode.
|
||||
* If you do not use this mode, libbpf can supply an XDP program for you.
|
||||
*/
|
||||
|
||||
struct {
|
||||
__uint(type, BPF_MAP_TYPE_XSKMAP);
|
||||
__uint(max_entries, MAX_SOCKS);
|
||||
__uint(key_size, sizeof(int));
|
||||
__uint(value_size, sizeof(int));
|
||||
} xsks_map SEC(".maps");
|
||||
|
||||
static unsigned int rr;
|
||||
|
||||
SEC("xdp_sock") int xdp_sock_prog(struct xdp_md *ctx)
|
||||
{
|
||||
rr = (rr + 1) & (MAX_SOCKS - 1);
|
||||
|
||||
return bpf_redirect_map(&xsks_map, rr, XDP_DROP);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user