From 227d65a235e48ee2ade516161988aa3c8d3e82b8 Mon Sep 17 00:00:00 2001 From: quackerd Date: Tue, 14 Mar 2023 14:30:03 +0100 Subject: [PATCH] master slave mode working --- CMakeLists.txt | 4 ++-- dsmbr/dmsg.cc | 2 +- dsmbr/dmsg.hh | 2 +- dsmbr/dsmbr.cc | 35 +++++++++++++++-------------------- include/msg.hh | 9 +++++---- ppd/ppd.cc | 12 ++++++------ 6 files changed, 30 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d6f1282..d42bf4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,8 +6,8 @@ find_package(PkgConfig REQUIRED) find_package(OpenSSL REQUIRED) pkg_check_modules(bsock REQUIRED bsock) -set(CXXFLAGS -Wall -Wextra -Werror -std=c++20 -O3 -g) -set(CFLAGS -Wall -Wextra -Werror -std=c2x -O3 -g) +set(CXXFLAGS -Wall -Wextra -Werror -std=c++17 -Og -g) +set(CFLAGS -Wall -Wextra -Werror -std=c2x -Og -g) add_library(common OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/common/io.cc) target_link_directories(common PRIVATE ${bsock_LIBRARY_DIRS}) diff --git a/dsmbr/dmsg.cc b/dsmbr/dmsg.cc index 8dbbe24..10f07e7 100644 --- a/dsmbr/dmsg.cc +++ b/dsmbr/dmsg.cc @@ -13,7 +13,7 @@ dsmbr_send_ctrl_msg(int sockfd, struct dsmbr_ctrl_msg * msg) msg->data[i] = htobe64(msg->data[i]); } - return ppd_writebuf(sockfd, &msg, sizeof(struct dsmbr_ctrl_msg)); + return ppd_writebuf(sockfd, msg, sizeof(struct dsmbr_ctrl_msg)); } int diff --git a/dsmbr/dmsg.hh b/dsmbr/dmsg.hh index 553ada8..2d8329a 100644 --- a/dsmbr/dmsg.hh +++ b/dsmbr/dmsg.hh @@ -10,7 +10,7 @@ static constexpr int CTRL_STOP = 0x3456; static constexpr int CTRL_STAT = 0x4567; static constexpr int DSMBR_MSG_MAX_DATA = 16; -struct dsmbr_ctrl_msg { +struct __attribute__((packed)) dsmbr_ctrl_msg { uint32_t code; uint64_t data[DSMBR_MSG_MAX_DATA]; }; diff --git a/dsmbr/dsmbr.cc b/dsmbr/dsmbr.cc index 319472a..4e3daa0 100755 --- a/dsmbr/dsmbr.cc +++ b/dsmbr/dsmbr.cc @@ -46,7 +46,7 @@ static constexpr int MAX_MOD_ARGS = 32; static constexpr int MAX_MOD_ARG_LEN = 128; static constexpr int MAX_SLAVES = 32; static constexpr int NEVENT = 64; -static constexpr int CTRL_PORT = 15367; +static constexpr int CTRL_PORT = 15545; static constexpr int CTRL_TIMEOUT = 3; static constexpr int CTRL_BACKLOG = 4096; static constexpr int BSOCK_BUF_SZ = 4096; @@ -519,21 +519,21 @@ dsmbr_slave_ctrl_sock_create(void) int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (fd < 0) { - E("socket() returned %d", errno); + E("socket() returned %d\n", errno); } if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &enable, sizeof(enable)) < 0) { - E("setsockopt() NODELAY %d", errno); + E("setsockopt() NODELAY %d\n", errno); } status = bind(fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (status < 0) { - E("bind() returned %d", errno); + E("bind() returned %d\n", errno); } status = listen(fd, CTRL_BACKLOG); if (status < 0) { - E("listen() returned %d", errno); + E("listen() returned %d\n", errno); } return fd; @@ -567,8 +567,6 @@ dsmbr_slave_accept_master(int slave_ctrl_sock) int conn_fd; struct sockaddr addr; socklen_t addrlen; - char ip[INET_ADDRSTRLEN]; - struct in_addr inaddr = ((struct sockaddr_in *)&addr)->sin_addr; ret = accept(slave_ctrl_sock, &addr, &addrlen); if (ret < 0) { @@ -576,11 +574,7 @@ dsmbr_slave_accept_master(int slave_ctrl_sock) } conn_fd = ret; - if (inet_ntop(AF_INET, &inaddr, ip, INET_ADDRSTRLEN) == NULL) { - E("inet_ntop failed with %d\n", errno); - } - - V("Accepted master connection %d from %s.", conn_fd, ip); + V("Accepted master connection %d.\n", conn_fd); return conn_fd; } @@ -677,7 +671,7 @@ dsmbr_getopt(int argc, char *argv[]) } static void -dsmbr_send_ctrl_code(int sock, int code) +dsmbr_send_ctrl_code(int sock, uint32_t code) { int ret; struct dsmbr_ctrl_msg msg; @@ -690,7 +684,7 @@ dsmbr_send_ctrl_code(int sock, int code) } static void -dsmbr_wait_ctrl_code(int sock, int code) +dsmbr_wait_ctrl_code(int sock, uint32_t code) { int ret; struct dsmbr_ctrl_msg msg; @@ -698,8 +692,8 @@ dsmbr_wait_ctrl_code(int sock, int code) if (ret != 0) { E("Failed to recv ctrl message %d\n", errno); } - if (msg.code != CTRL_SYNC) { - E("Unexpected message code %d, expected %d\n", msg.code, code); + if (msg.code != code) { + E("Unexpected message code 0x%x, expected 0x%x\n", msg.code, code); } return; } @@ -771,13 +765,14 @@ main(int argc, char *argv[]) V("S: waiting for master connection...\n"); master_ctrl_conn = dsmbr_slave_accept_master(slave_ctrl_sock); // add to kqueue + V("S: waiting for master SYNC %d...\n", master_ctrl_conn); + dsmbr_wait_ctrl_code(master_ctrl_conn, CTRL_SYNC); + struct kevent kev; EV_SET(&kev, master_ctrl_conn, EVFILT_READ, EV_ADD, 0, 0, NULL); if (kevent(kqfd, &kev, 1, NULL, 0, NULL) == -1) { E("kevent() failed: %d\n", errno); } - V("S: waiting for master SYNC...\n"); - dsmbr_wait_ctrl_code(master_ctrl_conn, CTRL_SYNC); } // here slaves and master are on the same page */ @@ -907,14 +902,14 @@ main(int argc, char *argv[]) ctrl_msg.data[0] = total_req; ctrl_msg.data[1] = end_ts - start_ts; ctrl_msg.data[2] = total_send; - ctrl_msg.data[4] = total_recv; + ctrl_msg.data[3] = total_recv; if (dsmbr_send_ctrl_msg(master_ctrl_conn, &ctrl_msg) != 0) { E("dsmbr_send_ctrl_msg failed with %d.\n", errno); } } - V("Saving results to %s ...\n", options.output_file); if (!options.slave_mode) { + V("Saving results to %s ...\n", options.output_file); for (int i = 0; i < options.num_slaves; i++) { fprintf(resp_fp_csv, "S,%lu,%lu,%lu,%lu\n", slaves[i].reqs, slaves[i].time, slaves[i].send_sz, slaves[i].recv_sz); diff --git a/include/msg.hh b/include/msg.hh index 2f9add7..341db41 100644 --- a/include/msg.hh +++ b/include/msg.hh @@ -1,15 +1,16 @@ #pragma once #include +#include // Max 16MB per message -struct ppd_msg { +struct __attribute__((packed)) ppd_msg { uint32_t size; char data[0]; -} __attribute__((packed)); +}; -static constexpr int PPD_MSG_MAX_SZ = (1024 * 16 * 1024); -static constexpr int PPD_MSG_HDR_SZ = offsetof(struct ppd_msg, data); +static constexpr int PPD_MSG_MAX_SZ = 1024 * 16 * 1024; +static constexpr int PPD_MSG_HDR_SZ = offsetof(ppd_msg, data); static_assert(PPD_MSG_HDR_SZ == sizeof(struct ppd_msg)); static constexpr int PPD_MSG_MAX_DATA_SZ = (PPD_MSG_MAX_SZ - PPD_MSG_HDR_SZ); diff --git a/ppd/ppd.cc b/ppd/ppd.cc index 69e87cb..4051d3b 100755 --- a/ppd/ppd.cc +++ b/ppd/ppd.cc @@ -190,29 +190,29 @@ listen_socket_create(std::vector *socks) for (int i = 0; i < 1; i++) { int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (fd < 0) { - E("socket() returned %d", errno); + E("socket() returned %d\n", errno); } if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable)) < 0) { - E("setsockopt() reuseaddr %d", errno); + E("setsockopt() reuseaddr %d\n", errno); } if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &enable, sizeof(enable)) < 0) { - E("setsockopt() reuseport %d", errno); + E("setsockopt() reuseport %d\n", errno); } if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &enable, sizeof(enable)) < 0) { - E("setsockopt() NODELAY %d", errno); + E("setsockopt() NODELAY %d\n", errno); } status = bind(fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (status < 0) { - E("bind() returned %d", errno); + E("bind() returned %d\n", errno); } status = listen(fd, SOCK_BACKLOG); if (status < 0) { - E("listen() returned %d", errno); + E("listen() returned %d\n", errno); } socks->push_back(fd);