diff --git a/src/sf_global.c b/src/sf_global.c index d4aff47..b13ef9a 100644 --- a/src/sf_global.c +++ b/src/sf_global.c @@ -439,6 +439,8 @@ static int load_rdma_apis(SFNetworkHandler *handler) return EFAULT; } + LOAD_API(handler, get_connection_size); + LOAD_API(handler, init_connection); LOAD_API(handler, create_server); LOAD_API(handler, close_server); LOAD_API(handler, accept_connection); diff --git a/src/sf_nio.c b/src/sf_nio.c index c465286..9d0c98a 100644 --- a/src/sf_nio.c +++ b/src/sf_nio.c @@ -654,24 +654,7 @@ ssize_t sf_socket_recv_data(struct fast_task_info *task, SFCommAction *action) return bytes; } - if (SF_CTX->set_body_length(task) != 0) { - return -1; - } - if (task->length < 0) { - logError("file: "__FILE__", line: %d, " - "client ip: %s, pkg length: %d < 0", - __LINE__, task->client_ip, - task->length); - return -1; - } - - task->length += SF_CTX->header_size; - if (task->length > g_sf_global_vars.max_pkg_size) { - logError("file: "__FILE__", line: %d, " - "client ip: %s, pkg length: %d > " - "max pkg size: %d", __LINE__, - task->client_ip, task->length, - g_sf_global_vars.max_pkg_size); + if (sf_set_body_length(task) != 0) { return -1; } diff --git a/src/sf_nio.h b/src/sf_nio.h index 7b35415..026d4f4 100644 --- a/src/sf_nio.h +++ b/src/sf_nio.h @@ -92,6 +92,32 @@ void sf_task_switch_thread(struct fast_task_info *task, void sf_task_detach_thread(struct fast_task_info *task); +static inline int sf_set_body_length(struct fast_task_info *task) +{ + if (SF_CTX->set_body_length(task) != 0) { + return -1; + } + if (task->length < 0) { + logError("file: "__FILE__", line: %d, " + "client ip: %s, pkg length: %d < 0", + __LINE__, task->client_ip, + task->length); + return -1; + } + + task->length += SF_CTX->header_size; + if (task->length > g_sf_global_vars.max_pkg_size) { + logError("file: "__FILE__", line: %d, " + "client ip: %s, pkg length: %d > " + "max pkg size: %d", __LINE__, + task->client_ip, task->length, + g_sf_global_vars.max_pkg_size); + return -1; + } + + return 0; +} + int sf_socket_async_connect_server(struct fast_task_info *task); int sf_socket_connect_server_done(struct fast_task_info *task); diff --git a/src/sf_types.h b/src/sf_types.h index 1fd0159..a88b317 100644 --- a/src/sf_types.h +++ b/src/sf_types.h @@ -60,6 +60,9 @@ typedef enum { } SFCommAction; struct sf_listener; + +typedef int (*sf_get_connection_size_callback)(); +typedef int (*sf_init_connection_callback)(struct fast_task_info *task, void *arg); 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); @@ -99,6 +102,8 @@ typedef struct sf_network_handler { SFListener outer; /* for server side */ + sf_get_connection_size_callback get_connection_size; + sf_init_connection_callback init_connection; sf_create_server_callback create_server; sf_close_server_callback close_server; sf_accept_connection_callback accept_connection;