diff --git a/lib/src/dev/mt_af_xdp.c b/lib/src/dev/mt_af_xdp.c index 5cb5f184c..f457f6247 100644 --- a/lib/src/dev/mt_af_xdp.c +++ b/lib/src/dev/mt_af_xdp.c @@ -90,21 +90,6 @@ struct mt_xdp_priv { bool has_ctrl; }; -static int xdp_connect_control_sock() { - int sock = socket(AF_UNIX, SOCK_STREAM, 0); - if (sock <= 0) return -1; - struct sockaddr_un server; - server.sun_family = AF_UNIX; - snprintf(server.sun_path, sizeof(server.sun_path), MTL_XDP_CTRL_SOCK_PATH); - - if (connect(sock, (struct sockaddr*)&server, sizeof(struct sockaddr_un)) < 0) { - close(sock); - return -1; - } - - return sock; -} - static int xdp_queue_tx_max_rate(struct mt_xdp_priv* xdp, struct mt_xdp_queue* xq, uint32_t rate_kbps) { enum mtl_port port = xq->port; @@ -461,64 +446,17 @@ static int xdp_socket_update_xskmap(struct mtl_main_impl* impl, struct mt_xdp_qu enum mtl_port port = xq->port; uint16_t q = xq->q; int ret; - int xsks_map_fd = -1; - - if (mt_is_manager_connected(impl)) { - xsks_map_fd = mt_instance_request_xsks_map_fd(impl, if_nametoindex(ifname)); - } else { - int sock = xdp_connect_control_sock(); - if (sock < 0) { - err("%s(%d,%u), unix socket create fail, %s\n", __func__, port, q, strerror(errno)); - return errno; - } - - char command[64]; - snprintf(command, sizeof(command), "imtl:if:%s:get_xsk_map", ifname); - send(sock, command, sizeof(command), 0); - - char cms[CMSG_SPACE(sizeof(int))]; - struct cmsghdr* cmsg; - struct msghdr msg; - struct iovec iov; - int value; - int len; - - iov.iov_base = &value; - iov.iov_len = sizeof(int); - - memset(&msg, 0, sizeof(msg)); - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - msg.msg_control = (caddr_t)cms; - msg.msg_controllen = sizeof(cms); - - len = recvmsg(sock, &msg, 0); - - close(sock); - - if (len <= 0) { - err("%s(%d,%u), recvmsg wrong length %d\n", __func__, port, q, len); - return -EINVAL; - } - - cmsg = CMSG_FIRSTHDR(&msg); - if (cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS || - cmsg->cmsg_len != CMSG_LEN(sizeof(int))) { - err("%s(%d,%u), invalid cmsg for map fd\n", __func__, port, q); - return -EINVAL; - } - xsks_map_fd = *(int*)CMSG_DATA(cmsg); - } + int xsks_map_fd = mt_instance_request_xsks_map_fd(impl, if_nametoindex(ifname)); if (xsks_map_fd < 0) { - err("%s(%d,%u), get xsks_map_fd fail, %s\n", __func__, port, q, strerror(errno)); - return errno; + err("%s(%d,%u), get xsks_map_fd fail\n", __func__, port, q); + return -EIO; } ret = xsk_socket__update_xskmap(xq->socket, xsks_map_fd); if (ret) { - err("%s(%d,%u), get xsks_map_fd fail, %d\n", __func__, port, q, ret); + err("%s(%d,%u), update xsks_map fail, %d\n", __func__, port, q, ret); return ret; } @@ -547,7 +485,7 @@ static int xdp_socket_init(struct mt_xdp_priv* xdp, struct mt_xdp_queue* xq) { &cfg); if (ret < 0) { if (ret == -EPERM) { - err("%s(%d,%u), please run with control server or root user\n", __func__, port, q); + err("%s(%d,%u), please run with mtl manager or root user\n", __func__, port, q); return ret; } warn("%s(%d,%u), xsk create with zero copy fail %d(%s), try copy mode\n", __func__, @@ -557,8 +495,7 @@ static int xdp_socket_init(struct mt_xdp_priv* xdp, struct mt_xdp_queue* xq) { &xq->tx_prod, &cfg); if (ret < 0) { if (ret == -EPERM) { - err("%s(%d,%u), please run with control server or root user\n", __func__, port, - q); + err("%s(%d,%u), please run with mtl manager or root user\n", __func__, port, q); } err("%s(%d,%u), xsk create fail %d(%s)\n", __func__, port, q, ret, strerror(ret)); return ret; @@ -876,18 +813,6 @@ int mt_dev_xdp_init(struct mt_interface* inf) { xdp_parse_drv_name(xdp); - if (!mt_is_privileged(impl)) { - int ctrl_sock = xdp_connect_control_sock(); - if (ctrl_sock > 0) { - char buf[10]; - snprintf(buf, sizeof(buf), "imtl:ping"); - send(ctrl_sock, buf, sizeof(buf), 0); - recv(ctrl_sock, buf, sizeof(buf), 0); - if (strncmp(buf, "pong", 4) == 0) xdp->has_ctrl = true; - close(ctrl_sock); - } - } - if (mt_is_manager_connected(impl)) xdp->has_ctrl = true; xdp_parse_combined_info(xdp); @@ -1059,27 +984,9 @@ uint16_t mt_tx_xdp_burst(struct mt_tx_xdp_entry* entry, struct rte_mbuf** tx_pkt return xdp_tx(entry->parent, entry->xq, tx_pkts, nb_pkts); } -static int xdp_socket_update_dp(struct mtl_main_impl* impl, const char* if_name, - uint16_t dp, bool add) { - if (mt_is_manager_connected(impl)) - return mt_instance_update_udp_dp_filter(impl, if_nametoindex(if_name), dp, add); - - int sock = xdp_connect_control_sock(); - if (sock < 0) { - err("%s, unix socket create fail, %s\n", __func__, strerror(errno)); - return errno; - } - - char command[64]; - if (add) - snprintf(command, sizeof(command), "imtl:if:%s:dp_add_filter:%u", if_name, dp); - else - snprintf(command, sizeof(command), "imtl:if:%s:dp_del_filter:%u", if_name, dp); - - send(sock, command, sizeof(command), 0); - - close(sock); - return 0; +static inline int xdp_socket_update_dp(struct mtl_main_impl* impl, const char* if_name, + uint16_t dp, bool add) { + return mt_instance_update_udp_dp_filter(impl, if_nametoindex(if_name), dp, add); } struct mt_rx_xdp_entry* mt_rx_xdp_get(struct mtl_main_impl* impl, enum mtl_port port, diff --git a/lib/src/dev/mt_af_xdp.h b/lib/src/dev/mt_af_xdp.h index d553fed47..fb177f248 100644 --- a/lib/src/dev/mt_af_xdp.h +++ b/lib/src/dev/mt_af_xdp.h @@ -7,8 +7,6 @@ #include "../mt_main.h" -#define MTL_XDP_CTRL_SOCK_PATH "/var/run/et_xdp.sock" - struct mt_tx_xdp_get_args { bool queue_match; uint16_t queue_id; diff --git a/manager/mtl_instance.hpp b/manager/mtl_instance.hpp index 44f893858..747d6cfbe 100644 --- a/manager/mtl_instance.hpp +++ b/manager/mtl_instance.hpp @@ -190,42 +190,29 @@ std::shared_ptr mtl_instance::get_interface(const unsigned int if int mtl_instance::handle_message_request_map_fd( mtl_request_map_fd_message_t* request_map_fd_msg) { + int fd = -1; unsigned int ifindex = ntohl(request_map_fd_msg->ifindex); auto interface = get_interface(ifindex); + if (interface != nullptr) fd = interface->get_xsks_map_fd(); - struct msghdr msg; + struct msghdr msg = {0}; struct iovec iov[1]; - struct cmsghdr* cmsg = NULL; - char ctrl_buf[CMSG_SPACE(sizeof(int))]; - char data[1]; + char control[CMSG_SPACE(sizeof(int))] = {0}; + char data[1] = {' '}; - memset(&msg, 0, sizeof(struct msghdr)); - memset(ctrl_buf, 0, CMSG_SPACE(sizeof(int))); - - data[0] = ' '; iov[0].iov_base = data; iov[0].iov_len = sizeof(data); - msg.msg_name = NULL; - msg.msg_namelen = 0; msg.msg_iov = iov; msg.msg_iovlen = 1; msg.msg_controllen = CMSG_SPACE(sizeof(int)); - msg.msg_control = ctrl_buf; + msg.msg_control = control; - cmsg = CMSG_FIRSTHDR(&msg); + struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; cmsg->cmsg_len = CMSG_LEN(sizeof(int)); - - if (interface == nullptr) { - log(log_level::ERROR, "Failed to get interface " + std::to_string(ifindex)); - *((int*)CMSG_DATA(cmsg)) = -1; - sendmsg(conn_fd, &msg, 0); - return -1; - } - - *((int*)CMSG_DATA(cmsg)) = interface->get_xsks_map_fd(); + *((int*)CMSG_DATA(cmsg)) = fd; return sendmsg(conn_fd, &msg, 0); } diff --git a/manager/mtl_manager.cpp b/manager/mtl_manager.cpp index a0dd314d2..26d85dca6 100644 --- a/manager/mtl_manager.cpp +++ b/manager/mtl_manager.cpp @@ -114,7 +114,8 @@ int main() { goto out; } - logger::log(log_level::INFO, "MTL Manager is running. Press Ctrl+C to stop it."); + logger::log(log_level::INFO, + "MTL Manager is running. Press Ctrl+C or use SIGINT to stop it."); while (is_running) { struct epoll_event events[clients.size() + 2]; diff --git a/tools/ebpf/README.md b/tools/ebpf/README.md index 25cadcf50..cfbfbf8ba 100644 --- a/tools/ebpf/README.md +++ b/tools/ebpf/README.md @@ -18,13 +18,7 @@ fentry: a simple program to trace udp_send_skb calls, requires kernel > 5.5. sudo ./et --prog fentry [--print] ``` -xdp: a privileged program to load afxdp bpf program and send the xsk_map_fd to other processes by socket. - -```bash -sudo ./et --prog xdp --ifname ens785f0 -``` - -load a custom program for xdp: +xdp: a privileged program to load custom xdp bpf program: ```bash sudo ./et --prog xdp --ifname ens785f0,ens785f1 --xdp_path xsk.xdp.o diff --git a/tools/ebpf/et.c b/tools/ebpf/et.c index 2d5fe7a7f..df09ff87e 100644 --- a/tools/ebpf/et.c +++ b/tools/ebpf/et.c @@ -12,10 +12,8 @@ #include #include #include -#include #include #include -#include #include #include #include @@ -91,37 +89,6 @@ static int et_fentry_loop() { return ret; } -static int send_fd(int sock, int fd) { - struct msghdr msg; - struct iovec iov[1]; - struct cmsghdr* cmsg = NULL; - char ctrl_buf[CMSG_SPACE(sizeof(int))]; - char data[1]; - - memset(&msg, 0, sizeof(struct msghdr)); - memset(ctrl_buf, 0, CMSG_SPACE(sizeof(int))); - - data[0] = ' '; - iov[0].iov_base = data; - iov[0].iov_len = sizeof(data); - - msg.msg_name = NULL; - msg.msg_namelen = 0; - msg.msg_iov = iov; - msg.msg_iovlen = 1; - msg.msg_controllen = CMSG_SPACE(sizeof(int)); - msg.msg_control = ctrl_buf; - - 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; - - return sendmsg(sock, &msg, 0); -} - static int et_xdp_loop(struct et_ctx* ctx) { int ret = 0; int if_cnt = ctx->xdp_if_cnt; @@ -131,121 +98,30 @@ static int et_xdp_loop(struct et_ctx* ctx) { return -EIO; } - struct sockaddr_un addr; - int xsks_map_fd[if_cnt]; - int sock = -1, conn; struct xdp_program* prog[if_cnt]; /* load xdp program for each interface */ for (int i = 0; i < if_cnt; i++) { - if (ctx->xdp_path) { - prog[i] = xdp_program__open_file(ctx->xdp_path, "xdp", NULL); - ret = libxdp_get_error(prog[i]); - if (ret) { - printf("failed to load xdp program\n"); - goto cleanup; - } - } - int ifindex = ctx->xdp_ifindex[i]; - if (prog[i]) { - ret = xdp_program__attach(prog[i], ifindex, XDP_MODE_NATIVE, 0); - if (ret < 0) { - printf("xdp_program__attach failed\n"); - goto cleanup; - } + prog[i] = xdp_program__open_file(ctx->xdp_path, "xdp", NULL); + ret = libxdp_get_error(prog[i]); + if (ret) { + printf("xdp_program__open_file failed, please specify the right path\n"); + goto cleanup; } - ret = xsk_setup_xdp_prog(ifindex, &xsks_map_fd[i]); - if (ret || xsks_map_fd[i] < 0) { - printf("xsk_socket__bind failed\n"); + int ifindex = ctx->xdp_ifindex[i]; + ret = xdp_program__attach(prog[i], ifindex, XDP_MODE_NATIVE, 0); + if (ret < 0) { + printf("xdp_program__attach failed\n"); goto cleanup; } } - sock = socket(AF_UNIX, SOCK_STREAM, 0); - unlink(ET_XDP_UNIX_SOCKET_PATH); - - int flags = fcntl(sock, F_GETFL, 0); - fcntl(sock, F_SETFL, flags | O_NONBLOCK); - - memset(&addr, 0, sizeof(addr)); - addr.sun_family = AF_UNIX; - strcpy(addr.sun_path, ET_XDP_UNIX_SOCKET_PATH); - bind(sock, (struct sockaddr*)&addr, sizeof(addr)); - - chmod(ET_XDP_UNIX_SOCKET_PATH, 0666); /* allow non-root user to connect */ - - listen(sock, 1); - - printf("waiting socket connection...\n"); while (!stop) { - conn = accept(sock, NULL, 0); - if (conn < 0) { - if (errno != EAGAIN && errno != EWOULDBLOCK) { - perror("accept error"); - ret = -1; - goto cleanup; - } - sleep(1); - continue; - } - printf("\nsocket connection %d accepted\n", conn); - char command[64]; - recv(conn, command, sizeof(command), 0); - if (command[0]) { - printf("command: %s\n", command); - char* magic = strtok(command, ":"); - if (strncmp(magic, "imtl", strlen("imtl")) == 0) { - char* type = strtok(NULL, ":"); - if (strncmp(type, "if", strlen("if")) == 0) { - char* ifname = strtok(NULL, ":"); - int ifindex = if_nametoindex(ifname); - int if_id = -1; - for (int i = 0; i < if_cnt; i++) { - if (ctx->xdp_ifindex[i] == ifindex) { - if_id = i; - break; - } - } - if (if_id != -1) { - char* action = strtok(NULL, ":"); - if (strncmp(action, "get_xsk_map", strlen("get_xsk_map")) == 0) { - int map_fd = xsks_map_fd[if_id]; - if (map_fd >= 0) { - send_fd(conn, map_fd); - printf("map_fd %d sent\n", map_fd); - } - } else if (strncmp(action, "dp_add_filter", strlen("dp_add_filter")) == 0 || - strncmp(action, "dp_del_filter", strlen("dp_del_filter")) == 0) { - /* update dest port for udp4_dp_filter array map */ - char* port = strtok(NULL, ":"); - int port_num = atoi(port); - if (prog[if_id] && port_num > 0 && port_num < 65535) { - int map_fd = bpf_map__fd(bpf_object__find_map_by_name( - xdp_program__bpf_obj(prog[if_id]), "udp4_dp_filter")); - if (map_fd >= 0) { - int value = 1; - if (strncmp(type, "dp_del_filter", strlen("dp_del_filter")) == 0) - value = 0; - ret = bpf_map_update_elem(map_fd, &port_num, &value, BPF_ANY); - if (ret < 0) printf("bpf_map_update_elem failed\n"); - } - } - } - } - } else if (strncmp(type, "ping", strlen("ping")) == 0) { - char buf[5]; - snprintf(buf, sizeof(buf), "pong"); - send(conn, buf, 5, 0); - } - } - } - - close(conn); + sleep(1); } cleanup: - if (sock >= 0) close(sock); for (int i = 0; i < if_cnt; i++) { int ifindex = ctx->xdp_ifindex[i]; if (prog[i] && !libxdp_get_error(prog[i])) { @@ -277,11 +153,9 @@ static void et_print_help() { printf("\n Prog Commands:\n"); printf(" --prog Attach to program of \n"); printf( - " --prog xdp --ifname Attach XDP program to specified " - "interface names\n"); - printf( - " --prog xdp --xdp_path /path/to/xdp.o Load a custom XDP kernel program from " - "the specified path\n"); + " --prog xdp --ifname --xdp_path /path/to/xdp.o Load a custom " + "XDP kernel program from the specified path and attach it to specified " + "interfaces\n"); printf("\n"); } diff --git a/tools/ebpf/et.h b/tools/ebpf/et.h index 4d3fe652a..5c6744a84 100644 --- a/tools/ebpf/et.h +++ b/tools/ebpf/et.h @@ -5,8 +5,6 @@ #ifndef __ET_H #define __ET_H -#define ET_XDP_UNIX_SOCKET_PATH "/var/run/et_xdp.sock" - #define XDP_METADATA_SECTION "xdp_metadata" #define XSK_PROG_VERSION 1