1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2017 - 2018 Intel Corporation. */
10 #include <sys/socket.h>
18 /* libbpf APIs for AF_XDP are deprecated starting from v0.7 */
19 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
21 static const char *opt_if = "";
23 static struct option long_options[] = {
24 {"interface", required_argument, 0, 'i'},
28 static void usage(const char *prog)
31 " Usage: %s [OPTIONS]\n"
33 " -i, --interface=n Run on interface n\n"
35 fprintf(stderr, "%s\n", str);
40 static void parse_command_line(int argc, char **argv)
47 c = getopt_long(argc, argv, "i:",
48 long_options, &option_index);
57 usage(basename(argv[0]));
62 static int send_xsks_map_fd(int sock, int fd)
64 char cmsgbuf[CMSG_SPACE(sizeof(int))];
70 fprintf(stderr, "Incorrect fd = %d\n", fd);
73 iov.iov_base = &value;
74 iov.iov_len = sizeof(int);
81 msg.msg_control = cmsgbuf;
82 msg.msg_controllen = CMSG_LEN(sizeof(int));
84 struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg);
86 cmsg->cmsg_level = SOL_SOCKET;
87 cmsg->cmsg_type = SCM_RIGHTS;
88 cmsg->cmsg_len = CMSG_LEN(sizeof(int));
90 *(int *)CMSG_DATA(cmsg) = fd;
91 int ret = sendmsg(sock, &msg, 0);
94 fprintf(stderr, "Sendmsg failed with %s", strerror(errno));
102 main(int argc, char **argv)
104 struct sockaddr_un server;
114 parse_command_line(argc, argv);
116 ifindex = if_nametoindex(opt_if);
118 fprintf(stderr, "Unable to get ifindex for Interface %s. Reason:%s",
119 opt_if, strerror(errno));
123 sock = socket(AF_UNIX, SOCK_STREAM, 0);
125 fprintf(stderr, "Opening socket stream failed: %s", strerror(errno));
129 server.sun_family = AF_UNIX;
130 strcpy(server.sun_path, SOCKET_NAME);
132 setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int));
134 if (bind(sock, (struct sockaddr *)&server, sizeof(struct sockaddr_un))) {
135 fprintf(stderr, "Binding to socket stream failed: %s", strerror(errno));
139 listen(sock, MAX_NUM_OF_CLIENTS);
141 err = xsk_setup_xdp_prog(ifindex, &xsks_map_fd);
143 fprintf(stderr, "Setup of xdp program failed\n");
148 msgsock = accept(sock, 0, 0);
150 fprintf(stderr, "Error accepting connection: %s", strerror(errno));
154 err = send_xsks_map_fd(msgsock, xsks_map_fd);
156 fprintf(stderr, "Error %d sending xsks_map_fd\n", err);
160 rval = read(msgsock, &cmd, sizeof(int));
162 fprintf(stderr, "Error reading stream message");
164 if (cmd != CLOSE_CONN)
165 fprintf(stderr, "Recv unknown cmd = %d\n", cmd);
175 /* Unset fd for given ifindex */
176 err = bpf_xdp_detach(ifindex, 0, NULL);
178 fprintf(stderr, "Error when unsetting bpf prog_fd for ifindex(%d)\n", ifindex);