load RDMA APIs from library

support_rdma
YuQing 2023-09-05 07:27:15 +08:00
parent 2839183433
commit 5a29dffc50
6 changed files with 72 additions and 29 deletions

View File

@ -23,6 +23,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <fcntl.h> #include <fcntl.h>
#include <dlfcn.h>
#include <errno.h> #include <errno.h>
#include <grp.h> #include <grp.h>
#include <pwd.h> #include <pwd.h>
@ -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); 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, static int init_network_handler(SFNetworkHandler *handler,
SFContext *sf_context) SFContext *sf_context)
{ {
@ -424,19 +463,20 @@ static int init_network_handler(SFNetworkHandler *handler,
if (handler->type == fc_network_type_sock) { if (handler->type == fc_network_type_sock) {
handler->inner.sock = -1; handler->inner.sock = -1;
handler->outer.sock = -1; handler->outer.sock = -1;
handler->create_server = sf_create_socket_server; handler->create_server = sf_socket_create_server;
handler->close_server = sf_close_socket_server; handler->close_server = sf_socket_close_server;
handler->accept_connection = sf_accept_socket_connection; handler->accept_connection = sf_socket_accept_connection;
handler->async_connect_server = sf_async_connect_socket_server; handler->async_connect_server = sf_socket_async_connect_server;
handler->connect_server_done = sf_connect_socket_server_done; handler->connect_server_done = sf_socket_connect_server_done;
handler->close_connection = sf_close_socket_connection; handler->close_connection = sf_socket_close_connection;
handler->send_data = sf_socket_send_data; handler->send_data = sf_socket_send_data;
handler->recv_data = sf_socket_recv_data; handler->recv_data = sf_socket_recv_data;
return 0;
} else { } 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, int sf_load_context_from_config_ex(SFContext *sf_context,

View File

@ -190,7 +190,7 @@ static inline int sf_nio_init(struct fast_task_info *task)
task->network_timeout); 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; int result;
socklen_t len; 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); 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; int result;
if ((task->event.fd=socketCreateEx2(AF_UNSPEC, task->server_ip, if ((task->event.fd=socketCreateEx2(AF_UNSPEC, task->server_ip,

View File

@ -92,8 +92,8 @@ void sf_task_switch_thread(struct fast_task_info *task,
void sf_task_detach_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_socket_async_connect_server(struct fast_task_info *task);
int sf_connect_socket_server_done(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_send_data(struct fast_task_info *task, SFCommAction *action);
ssize_t sf_socket_recv_data(struct fast_task_info *task, SFCommAction *action); ssize_t sf_socket_recv_data(struct fast_task_info *task, SFCommAction *action);

View File

@ -339,11 +339,12 @@ static void *worker_thread_entrance(void *arg)
return NULL; 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; int result;
listener->sock = socketServer(bind_addr, listener->port, &result); listener->sock = socketServer2(af, bind_addr, listener->port, &result);
if (listener->sock < 0) { if (listener->sock < 0) {
return result; 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 sf_socket_server_ex(SFContext *sf_context)
{ {
int result; int result;
int af = AF_INET;
bool dual_ports; bool dual_ports;
const char *bind_addr; const char *bind_addr;
SFNetworkHandler *handler; SFNetworkHandler *handler;
@ -376,7 +378,7 @@ int sf_socket_server_ex(SFContext *sf_context)
*sf_context->inner_bind_addr == '\0') { *sf_context->inner_bind_addr == '\0') {
bind_addr = ""; bind_addr = "";
if ((result=handler->create_server(&handler-> if ((result=handler->create_server(&handler->
outer, bind_addr)) != 0) outer, af, bind_addr)) != 0)
{ {
return result; return result;
} }
@ -387,14 +389,14 @@ int sf_socket_server_ex(SFContext *sf_context)
bind_addr = sf_context->outer_bind_addr; bind_addr = sf_context->outer_bind_addr;
if (is_private_ip(bind_addr)) { if (is_private_ip(bind_addr)) {
if ((result=handler->create_server(&handler-> if ((result=handler->create_server(&handler->
inner, bind_addr)) != 0) inner, af, bind_addr)) != 0)
{ {
return result; return result;
} }
handler->inner.enabled = true; handler->inner.enabled = true;
} else { } else {
if ((result=handler->create_server(&handler-> if ((result=handler->create_server(&handler->
outer, bind_addr)) != 0) outer, af, bind_addr)) != 0)
{ {
return result; return result;
} }
@ -409,13 +411,13 @@ int sf_socket_server_ex(SFContext *sf_context)
} }
if (dual_ports) { if (dual_ports) {
if ((result=handler->create_server(&handler->outer, if ((result=handler->create_server(&handler->outer, af,
sf_context->outer_bind_addr)) != 0) sf_context->outer_bind_addr)) != 0)
{ {
return result; return result;
} }
if ((result=handler->create_server(&handler->inner, if ((result=handler->create_server(&handler->inner, af,
sf_context->inner_bind_addr)) != 0) sf_context->inner_bind_addr)) != 0)
{ {
return result; return result;
@ -436,7 +438,7 @@ int sf_socket_server_ex(SFContext *sf_context)
return 0; return 0;
} }
void sf_close_socket_server(SFListener *listener) void sf_socket_close_server(SFListener *listener)
{ {
if (listener->sock >= 0) { if (listener->sock >= 0) {
close(listener->sock); 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 incomesock;
int port; int port;
@ -481,7 +483,7 @@ struct fast_task_info *sf_accept_socket_connection(SFListener *listener)
return task; 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); close(task->event.fd);
task->event.fd = -1; task->event.fd = -1;

View File

@ -83,11 +83,12 @@ int sf_add_slow_log_schedule(SFSlowLogContext *slowlog_ctx);
void sf_set_current_time(); void sf_set_current_time();
int sf_create_socket_server(SFListener *listener, const char *bind_addr); int sf_socket_create_server(SFListener *listener,
void sf_close_socket_server(SFListener *listener); int af, const char *bind_addr);
struct fast_task_info *sf_accept_socket_connection(SFListener *listener); 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); int sf_socket_server_ex(SFContext *sf_context);
#define sf_socket_server() sf_socket_server_ex(&g_sf_context) #define sf_socket_server() sf_socket_server_ex(&g_sf_context)

View File

@ -60,8 +60,8 @@ typedef enum {
} SFCommAction; } SFCommAction;
struct sf_listener; struct sf_listener;
typedef int (*sf_create_server_callback)(struct sf_listener *listener, typedef int (*sf_create_server_callback)(struct sf_listener
const char *bind_addr); *listener, int af, const char *bind_addr);
typedef void (*sf_close_server_callback)(struct sf_listener *listener); typedef void (*sf_close_server_callback)(struct sf_listener *listener);
typedef struct fast_task_info * (*sf_accept_connection_callback)( typedef struct fast_task_info * (*sf_accept_connection_callback)(
struct sf_listener *listener); struct sf_listener *listener);