load RDMA APIs from library
parent
2839183433
commit
5a29dffc50
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue