From 5a29dffc50139d07a3b6745e0ce2c4ebe10a7c5b Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Tue, 5 Sep 2023 07:27:15 +0800 Subject: [PATCH] load RDMA APIs from library --- src/sf_global.c | 58 ++++++++++++++++++++++++++++++++++++++++-------- src/sf_nio.c | 4 ++-- src/sf_nio.h | 4 ++-- src/sf_service.c | 22 +++++++++--------- src/sf_service.h | 9 ++++---- src/sf_types.h | 4 ++-- 6 files changed, 72 insertions(+), 29 deletions(-) diff --git a/src/sf_global.c b/src/sf_global.c index 45831f4..d4aff47 100644 --- a/src/sf_global.c +++ b/src/sf_global.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -412,6 +413,44 @@ int sf_load_config_ex(const char *server_name, SFContextIniConfig *config, return sf_load_context_from_config_ex(&g_sf_context, config); } +#define API_PREFIX_NAME "fast_rdma_" + +#define LOAD_API(handler, fname) \ + do { \ + handler->fname = dlsym(dlhandle, API_PREFIX_NAME#fname); \ + if (handler->fname == NULL) { \ + logError("file: "__FILE__", line: %d, " \ + "dlsym api %s fail, error info: %s", \ + __LINE__, API_PREFIX_NAME#fname, dlerror()); \ + return ENOENT; \ + } \ + } while (0) + +static int load_rdma_apis(SFNetworkHandler *handler) +{ + const char *library = "libfastrdma.so"; + void *dlhandle; + + dlhandle = dlopen(library, RTLD_LAZY); + if (dlhandle == NULL) { + logError("file: "__FILE__", line: %d, " + "dlopen %s fail, error info: %s", + __LINE__, library, dlerror()); + return EFAULT; + } + + LOAD_API(handler, create_server); + LOAD_API(handler, close_server); + LOAD_API(handler, accept_connection); + LOAD_API(handler, async_connect_server); + LOAD_API(handler, connect_server_done); + LOAD_API(handler, close_connection); + LOAD_API(handler, send_data); + LOAD_API(handler, recv_data); + + return 0; +} + static int init_network_handler(SFNetworkHandler *handler, SFContext *sf_context) { @@ -424,19 +463,20 @@ static int init_network_handler(SFNetworkHandler *handler, if (handler->type == fc_network_type_sock) { handler->inner.sock = -1; handler->outer.sock = -1; - handler->create_server = sf_create_socket_server; - handler->close_server = sf_close_socket_server; - handler->accept_connection = sf_accept_socket_connection; - handler->async_connect_server = sf_async_connect_socket_server; - handler->connect_server_done = sf_connect_socket_server_done; - handler->close_connection = sf_close_socket_connection; + handler->create_server = sf_socket_create_server; + handler->close_server = sf_socket_close_server; + handler->accept_connection = sf_socket_accept_connection; + handler->async_connect_server = sf_socket_async_connect_server; + handler->connect_server_done = sf_socket_connect_server_done; + handler->close_connection = sf_socket_close_connection; handler->send_data = sf_socket_send_data; handler->recv_data = sf_socket_recv_data; + return 0; } else { - //TODO + handler->inner.id = NULL; + handler->outer.id = NULL; + return load_rdma_apis(handler); } - - return 0; } int sf_load_context_from_config_ex(SFContext *sf_context, diff --git a/src/sf_nio.c b/src/sf_nio.c index ce7acce..c465286 100644 --- a/src/sf_nio.c +++ b/src/sf_nio.c @@ -190,7 +190,7 @@ static inline int sf_nio_init(struct fast_task_info *task) task->network_timeout); } -int sf_connect_socket_server_done(struct fast_task_info *task) +int sf_socket_connect_server_done(struct fast_task_info *task) { int result; socklen_t len; @@ -229,7 +229,7 @@ static int sf_client_sock_connect(int sock, short event, void *arg) return SF_CTX->deal_task(task, SF_NIO_STAGE_HANDSHAKE); } -int sf_async_connect_socket_server(struct fast_task_info *task) +int sf_socket_async_connect_server(struct fast_task_info *task) { int result; if ((task->event.fd=socketCreateEx2(AF_UNSPEC, task->server_ip, diff --git a/src/sf_nio.h b/src/sf_nio.h index c608371..7b35415 100644 --- a/src/sf_nio.h +++ b/src/sf_nio.h @@ -92,8 +92,8 @@ void sf_task_switch_thread(struct fast_task_info *task, void sf_task_detach_thread(struct fast_task_info *task); -int sf_async_connect_socket_server(struct fast_task_info *task); -int sf_connect_socket_server_done(struct fast_task_info *task); +int sf_socket_async_connect_server(struct fast_task_info *task); +int sf_socket_connect_server_done(struct fast_task_info *task); ssize_t sf_socket_send_data(struct fast_task_info *task, SFCommAction *action); ssize_t sf_socket_recv_data(struct fast_task_info *task, SFCommAction *action); diff --git a/src/sf_service.c b/src/sf_service.c index d466e55..ec48d01 100644 --- a/src/sf_service.c +++ b/src/sf_service.c @@ -339,11 +339,12 @@ static void *worker_thread_entrance(void *arg) return NULL; } -int sf_create_socket_server(SFListener *listener, const char *bind_addr) +int sf_socket_create_server(SFListener *listener, + int af, const char *bind_addr) { int result; - listener->sock = socketServer(bind_addr, listener->port, &result); + listener->sock = socketServer2(af, bind_addr, listener->port, &result); if (listener->sock < 0) { return result; } @@ -358,6 +359,7 @@ int sf_create_socket_server(SFListener *listener, const char *bind_addr) int sf_socket_server_ex(SFContext *sf_context) { int result; + int af = AF_INET; bool dual_ports; const char *bind_addr; SFNetworkHandler *handler; @@ -376,7 +378,7 @@ int sf_socket_server_ex(SFContext *sf_context) *sf_context->inner_bind_addr == '\0') { bind_addr = ""; if ((result=handler->create_server(&handler-> - outer, bind_addr)) != 0) + outer, af, bind_addr)) != 0) { return result; } @@ -387,14 +389,14 @@ int sf_socket_server_ex(SFContext *sf_context) bind_addr = sf_context->outer_bind_addr; if (is_private_ip(bind_addr)) { if ((result=handler->create_server(&handler-> - inner, bind_addr)) != 0) + inner, af, bind_addr)) != 0) { return result; } handler->inner.enabled = true; } else { if ((result=handler->create_server(&handler-> - outer, bind_addr)) != 0) + outer, af, bind_addr)) != 0) { return result; } @@ -409,13 +411,13 @@ int sf_socket_server_ex(SFContext *sf_context) } if (dual_ports) { - if ((result=handler->create_server(&handler->outer, + if ((result=handler->create_server(&handler->outer, af, sf_context->outer_bind_addr)) != 0) { return result; } - if ((result=handler->create_server(&handler->inner, + if ((result=handler->create_server(&handler->inner, af, sf_context->inner_bind_addr)) != 0) { return result; @@ -436,7 +438,7 @@ int sf_socket_server_ex(SFContext *sf_context) return 0; } -void sf_close_socket_server(SFListener *listener) +void sf_socket_close_server(SFListener *listener) { if (listener->sock >= 0) { close(listener->sock); @@ -444,7 +446,7 @@ void sf_close_socket_server(SFListener *listener) } } -struct fast_task_info *sf_accept_socket_connection(SFListener *listener) +struct fast_task_info *sf_socket_accept_connection(SFListener *listener) { int incomesock; int port; @@ -481,7 +483,7 @@ struct fast_task_info *sf_accept_socket_connection(SFListener *listener) return task; } -void sf_close_socket_connection(struct fast_task_info *task) +void sf_socket_close_connection(struct fast_task_info *task) { close(task->event.fd); task->event.fd = -1; diff --git a/src/sf_service.h b/src/sf_service.h index c4585dc..64d573c 100644 --- a/src/sf_service.h +++ b/src/sf_service.h @@ -83,11 +83,12 @@ int sf_add_slow_log_schedule(SFSlowLogContext *slowlog_ctx); void sf_set_current_time(); -int sf_create_socket_server(SFListener *listener, const char *bind_addr); -void sf_close_socket_server(SFListener *listener); -struct fast_task_info *sf_accept_socket_connection(SFListener *listener); +int sf_socket_create_server(SFListener *listener, + int af, const char *bind_addr); +void sf_socket_close_server(SFListener *listener); +struct fast_task_info *sf_socket_accept_connection(SFListener *listener); -void sf_close_socket_connection(struct fast_task_info *task); +void sf_socket_close_connection(struct fast_task_info *task); int sf_socket_server_ex(SFContext *sf_context); #define sf_socket_server() sf_socket_server_ex(&g_sf_context) diff --git a/src/sf_types.h b/src/sf_types.h index bf8a9bf..4791e4f 100644 --- a/src/sf_types.h +++ b/src/sf_types.h @@ -60,8 +60,8 @@ typedef enum { } SFCommAction; struct sf_listener; -typedef int (*sf_create_server_callback)(struct sf_listener *listener, - const char *bind_addr); +typedef int (*sf_create_server_callback)(struct sf_listener + *listener, int af, const char *bind_addr); typedef void (*sf_close_server_callback)(struct sf_listener *listener); typedef struct fast_task_info * (*sf_accept_connection_callback)( struct sf_listener *listener);