mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
bpf, samples: Remove AF_XDP samples
Remove the AF_XDP samples from samples/bpf/ as they are dependent on the AF_XDP support in libbpf. This support has now been removed in the 1.0 release, so these samples cannot be compiled anymore. Please start to use libxdp instead. It is backwards compatible with the AF_XDP support that was offered in libbpf. New samples can be found in the various xdp-project repositories connected to libxdp and by googling. Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Toke Høiland-Jørgensen <toke@redhat.com> Acked-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> Acked-by: Jesper Dangaard Brouer <brouer@redhat.com> Link: https://lore.kernel.org/bpf/20220630093717.8664-1-magnus.karlsson@gmail.com
This commit is contained in:
parent
990a6194f7
commit
cfb5a2dbf1
@ -21749,8 +21749,6 @@ F: include/uapi/linux/if_xdp.h
|
||||
F: include/uapi/linux/xdp_diag.h
|
||||
F: include/net/netns/xdp.h
|
||||
F: net/xdp/
|
||||
F: samples/bpf/xdpsock*
|
||||
F: tools/lib/bpf/xsk*
|
||||
|
||||
XEN BLOCK SUBSYSTEM
|
||||
M: Roger Pau Monné <roger.pau@citrix.com>
|
||||
|
@ -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
|
||||
|
@ -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
Loading…
Reference in New Issue
Block a user