diff options
| author | luwenpeng <[email protected]> | 2022-08-03 19:46:43 +0800 |
|---|---|---|
| committer | luwenpeng <[email protected]> | 2022-08-04 17:30:03 +0800 |
| commit | 5c790085ebbf5812a34f6fcbc9c2e4398a723667 (patch) | |
| tree | e3c9f40624e136dc292d7cae7d893c89fd28f2f5 | |
| parent | 50111e7cd09ff83ecbd53017d0edf6d33b84a801 (diff) | |
Plugin management support pm_session_dettach_me and pm_session_dettach_others
Add test cases for pm_session_dettach_me and pm_session_dettach_others
26 files changed, 1305 insertions, 339 deletions
@@ -39,12 +39,26 @@ packet_io_loop() ## Plugin Manager Plugin Management APIs + ``` -pm_session_dettach_me(pm, session); -pm_session_dettach_others(pm, session); +/* + * The plugin manager just set the skip flag and don't call this event callback next. + * Before calling pm_session_dettach_me, the current plugin must release related resources for the current session. + */ +pm_session_dettach_me(session); + +/* + * The plugin manager uses ERROR_EVENT_DETTACH to call other plugin error callbacks, + * and when the plugin error callback handler is called, + * the error callback handler must release the relevant resources for the current session. + */ +pm_session_dettach_others(session); ``` + ## Session Manager + Session Management APIs + ``` session_drop_current_packet(session); session_set_ratelimit_group(session, rl_group_id); diff --git a/sdk/example/custom_event_plugin.cpp b/sdk/example/custom_event_plugin.cpp index 0d7f1c4..a1d4d03 100644 --- a/sdk/example/custom_event_plugin.cpp +++ b/sdk/example/custom_event_plugin.cpp @@ -5,6 +5,7 @@ #include <stddef.h> #include <stdlib.h> #include <stdio.h> +#include <string.h> static char *g_handler = NULL; @@ -13,29 +14,121 @@ static void *custom_decode(const char *payload, uint16_t len, void **pme) return NULL; } -extern "C" void custom_plugin_tcp_entry(const struct stellar_session *s, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) +struct tcp_session_pme { - char **per_session_pme = (char **)pme; + char data[16]; + /* data */ +}; - printf("RUN custom_plugin_tcp_entry, event: %d\n", event); +struct custom_session_pme +{ + char data[16]; + /* data */ +}; + +static struct tcp_session_pme *tcp_session_pme_create() +{ + struct tcp_session_pme *pme = (struct tcp_session_pme *)calloc(1, sizeof(struct tcp_session_pme)); + return pme; +} + +static void tcp_session_pme_destory(struct tcp_session_pme *pme) +{ + if (pme) + { + free(pme); + pme = NULL; + } +} + +static struct custom_session_pme *custom_session_pme_create() +{ + struct custom_session_pme *pme = (struct custom_session_pme *)calloc(1, sizeof(struct custom_session_pme)); + return pme; +} + +static void custom_session_pme_destory(struct custom_session_pme *pme) +{ + if (pme) + { + free(pme); + pme = NULL; + } +} + +extern "C" void custom_event_plugin_error(const struct stellar_session *session, enum error_event_type event, void **pme) +{ + if (strcmp(stellar_session_get_name(session), "TCP") == 0) + { + struct tcp_session_pme **per_tcp_session_pme = (struct tcp_session_pme **)pme; + printf("RUN custom_event_plugin_error, session_name: 'TCP', error_event_type: %d, pme->data: %s\n", event, (*per_tcp_session_pme) == NULL ? "NULL" : (*per_tcp_session_pme)->data); + tcp_session_pme_destory(*per_tcp_session_pme); + } - struct stellar_session_event_extras *info = (struct stellar_session_event_extras *)custom_decode(payload, len, pme); - struct stellar_session *new_session = session_manager_session_derive(s, "CUSTOM"); + if (strcmp(stellar_session_get_name(session), "CUSTOM") == 0) + { + struct custom_session_pme **per_custom_session_pme = (struct custom_session_pme **)pme; + printf("RUN custom_event_plugin_error, session_name: 'CUSTOM', error_event_type: %d, pme->data: %s\n", event, (*per_custom_session_pme) == NULL ? "NULL" : (*per_custom_session_pme)->data); + custom_session_pme_destory(*per_custom_session_pme); + } +} + +extern "C" void custom_event_plugin_tcp_entry(const struct stellar_session *session, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) +{ + struct tcp_session_pme **per_tcp_session_pme = (struct tcp_session_pme **)pme; + + printf("RUN custom_event_plugin_tcp_entry, event: %d\n", event); + + if (event & SESSION_EVENT_OPENING) + { + if (*per_tcp_session_pme == NULL) + { + struct tcp_session_pme *cur_ctx = tcp_session_pme_create(); + snprintf(cur_ctx->data, 6, "tcp******"); + *per_tcp_session_pme = *&cur_ctx; + } + } + + if (event & SESSION_EVENT_ORDPKT) + { + struct stellar_session_event_extras *info = (struct stellar_session_event_extras *)custom_decode(payload, len, pme); + struct stellar_session *new_session = session_manager_session_derive(session, "CUSTOM"); - session_manager_trigger_event(new_session, SESSION_EVENT_OPENING, info); - session_manager_trigger_event(new_session, SESSION_EVENT_META, info); + session_manager_trigger_event(new_session, SESSION_EVENT_OPENING, info); + session_manager_trigger_event(new_session, SESSION_EVENT_META, info); + } + + if (event & SESSION_EVENT_CLOSING) + { + tcp_session_pme_destory(*per_tcp_session_pme); + } } -extern "C" void custom_plugin_custom_entry(const struct stellar_session *s, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) +extern "C" void custom_event_plugin_custom_entry(const struct stellar_session *session, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) { - char **per_session_pme = (char **)pme; + struct custom_session_pme **per_custom_session_pme = (struct custom_session_pme **)pme; + + printf("RUN custom_event_plugin_custom_entry, event: %d\n", event); - printf("RUN custom_plugin_custom_entry, event: %d\n", event); + if (event & SESSION_EVENT_OPENING) + { + if (*per_custom_session_pme == NULL) + { + struct custom_session_pme *cur_ctx = custom_session_pme_create(); + snprintf(cur_ctx->data, 6, "custom******"); + *per_custom_session_pme = *&cur_ctx; + } + } + + if (event & SESSION_EVENT_CLOSING) + { + custom_session_pme_destory(*per_custom_session_pme); + } } -extern "C" int custom_plugin_init(void) +extern "C" int custom_event_plugin_init(void) { - printf("RUN custom_plugin_init\n"); + printf("RUN custom_event_plugin_init\n"); if (g_handler == NULL) { @@ -46,9 +139,9 @@ extern "C" int custom_plugin_init(void) return 0; } -extern "C" void custom_plugin_exit(void) +extern "C" void custom_event_plugin_exit(void) { - printf("RUN custom_plugin_exit\n"); + printf("RUN custom_event_plugin_exit\n"); if (g_handler) { diff --git a/sdk/example/http_event_plugin.cpp b/sdk/example/http_event_plugin.cpp index e41d8b6..0cf5364 100644 --- a/sdk/example/http_event_plugin.cpp +++ b/sdk/example/http_event_plugin.cpp @@ -4,56 +4,77 @@ #include <stdlib.h> #include <stdio.h> +#include <string.h> static char *g_handler = NULL; -struct per_session_pme_info +struct http_session_pme { - int flag; char data[16]; + /* data */; }; -extern "C" void http_event_plugin_entry(const struct stellar_session *s, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) +static struct http_session_pme *http_session_pme_create() { - struct per_session_pme_info **per_session_pme = (struct per_session_pme_info **)pme; + struct http_session_pme *pme = (struct http_session_pme *)calloc(1, sizeof(struct http_session_pme)); + return pme; +} + +static void http_session_pme_destory(struct http_session_pme *pme) +{ + if (pme) + { + free(pme); + pme = NULL; + } +} + +extern "C" void http_event_plugin_error(const struct stellar_session *session, enum error_event_type event, void **pme) +{ + if (strcmp(stellar_session_get_name(session), "HTTP") == 0) + { + struct http_session_pme **per_http_session_pme = (struct http_session_pme **)pme; + printf("RUN http_event_plugin_error, session_name: 'HTTP', error_event_type: %d, pme->data: %s\n", event, (*per_http_session_pme) == NULL ? "NULL" : (*per_http_session_pme)->data); + http_session_pme_destory(*per_http_session_pme); + } +} + +extern "C" void http_event_plugin_entry(const struct stellar_session *session, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) +{ + struct http_session_pme **per_http_session_pme = (struct http_session_pme **)pme; printf("RUN http_event_plugin_entry, event: %d\n", event); if (event & SESSION_EVENT_OPENING) { - if (*per_session_pme == NULL) + if (*per_http_session_pme == NULL) { - struct per_session_pme_info *cur_ctx = (struct per_session_pme_info *)malloc(sizeof(struct per_session_pme_info)); - snprintf(cur_ctx->data, 6, "******"); - *per_session_pme = *&cur_ctx; - printf("http_event_plugin_entry->opening_handler\n"); + struct http_session_pme *cur_ctx = http_session_pme_create(); + snprintf(cur_ctx->data, 6, "http******"); + *per_http_session_pme = *&cur_ctx; } } if (event & SESSION_EVENT_RAWPKT) { - printf("http_event_plugin_entry->rawpkt_handler\n"); + // TODO + pm_session_dettach_me(session); } if (event & SESSION_EVENT_ORDPKT) { - printf("http_event_plugin_entry->ordpkt_handler\n"); + // TODO + pm_session_dettach_others(session); } if (event & SESSION_EVENT_META) { - printf("http_event_plugin_entry->meta_handler\n"); + // TODO } if (event & SESSION_EVENT_CLOSING) { - if (*per_session_pme) - { - printf("http_event_plugin_entry->closing_hanler\n"); - - free(*per_session_pme); - *per_session_pme = NULL; - } + http_session_pme_destory(*per_http_session_pme); } } diff --git a/sdk/example/plugins/custom_event_plugin/custom_event_plugin.inf b/sdk/example/plugins/custom_event_plugin/custom_event_plugin.inf index c7d3fe3..3718be0 100644 --- a/sdk/example/plugins/custom_event_plugin/custom_event_plugin.inf +++ b/sdk/example/plugins/custom_event_plugin/custom_event_plugin.inf @@ -1,14 +1,15 @@ [PLUGINFO] -INIT_FUNC="custom_plugin_init" -EXIT_FUNC="custom_plugin_exit" +INIT_FUNC="custom_event_plugin_init" +EXIT_FUNC="custom_event_plugin_exit" +ERROR_FUNC="custom_event_plugin_error" LIBRARY_PATH="./plugins/custom_event_plugin/custom_event_plugin.so" # Support SESSION_EVENT_TYPE: "SESSION_EVENT_OPENING", "SESSION_EVENT_RAWPKT", "SESSION_EVENT_ORDPKT", "SESSION_EVENT_META", "SESSION_EVENT_CLOSING", "SESSION_EVENT_ALL" [SESSION_NAME.TCP] SESSION_EVENT_TYPE=["SESSION_EVENT_ALL"] -SESSION_EVENT_CALLBACK="custom_plugin_tcp_entry" +SESSION_EVENT_CALLBACK="custom_event_plugin_tcp_entry" [SESSION_NAME.CUSTOM] SESSION_EVENT_TYPE=["SESSION_EVENT_OPENING","SESSION_EVENT_ORDPKT","SESSION_EVENT_CLOSING"] -SESSION_EVENT_CALLBACK="custom_plugin_custom_entry"
\ No newline at end of file +SESSION_EVENT_CALLBACK="custom_event_plugin_custom_entry"
\ No newline at end of file diff --git a/sdk/example/plugins/http_event_plugin/http_event_plugin.inf b/sdk/example/plugins/http_event_plugin/http_event_plugin.inf index a58a405..e0f2704 100644 --- a/sdk/example/plugins/http_event_plugin/http_event_plugin.inf +++ b/sdk/example/plugins/http_event_plugin/http_event_plugin.inf @@ -1,6 +1,7 @@ [PLUGINFO] INIT_FUNC="http_event_plugin_init" EXIT_FUNC="http_event_plugin_exit" +ERROR_FUNC="http_event_plugin_error" LIBRARY_PATH="./plugins/http_event_plugin/http_event_plugin.so" # Support SESSION_EVENT_TYPE: "SESSION_EVENT_OPENING", "SESSION_EVENT_RAWPKT", "SESSION_EVENT_ORDPKT", "SESSION_EVENT_META", "SESSION_EVENT_CLOSING", "SESSION_EVENT_ALL" diff --git a/sdk/include/http.h b/sdk/include/http.h index 6250055..4db1126 100644 --- a/sdk/include/http.h +++ b/sdk/include/http.h @@ -2,4 +2,5 @@ #include "session.h" -void http_decoder(const struct stellar_session *s, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme);
\ No newline at end of file +void http_decoder(const struct stellar_session *s, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme); +void http_error_cb(const struct stellar_session *s, enum error_event_type event, void **pme);
\ No newline at end of file diff --git a/sdk/include/plugin.h b/sdk/include/plugin.h index d213f7c..0d6c346 100644 --- a/sdk/include/plugin.h +++ b/sdk/include/plugin.h @@ -1,15 +1,25 @@ -#pragma once +#ifndef _PLUGIN_H +#define _PLUGIN_H + +#ifdef __cpluscplus +extern "C" +{ +#endif #include "session.h" typedef int plugin_init_callback(void); typedef void plugin_exit_callback(void); -void plugin_remove_from_session_event(struct stellar_event *ev, struct stellar_session *s); - /****************************************************************************** - * Public API: between plugin and plugin_manager + * Public API For Plugin ******************************************************************************/ -// TODO -// TODO
\ No newline at end of file +void pm_session_dettach_me(const struct stellar_session *session); +void pm_session_dettach_others(const struct stellar_session *session); + +#ifdef __cpluscplus +} +#endif + +#endif
\ No newline at end of file diff --git a/sdk/include/session.h b/sdk/include/session.h index 19bb566..8c4b25f 100644 --- a/sdk/include/session.h +++ b/sdk/include/session.h @@ -1,4 +1,10 @@ -#pragma once +#ifndef _SESSION_H +#define _SESSION_H + +#ifdef __cpluscplus +extern "C" +{ +#endif #include "packet.h" #include "event.h" @@ -34,9 +40,23 @@ enum session_event_type SESSION_EVENT_ALL = (0x01 << 1 | 0x01 << 2 | 0x01 << 3 | 0x01 << 4 | 0x01 << 5), }; +enum error_event_type +{ + ERROR_EVENT_DETTACH = (0x1 << 10), +}; + struct stellar_session_event_extras; +typedef void(fn_session_error_callback)(const struct stellar_session *s, enum error_event_type event, void **pme); typedef void(fn_session_event_callback)(const struct stellar_session *s, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme); void session_manager_trigger_event(struct stellar_session *s, enum session_event_type type, struct stellar_session_event_extras *info); -struct stellar_session *session_manager_session_derive(const struct stellar_session *this_session, const char *session_name);
\ No newline at end of file +struct stellar_session *session_manager_session_derive(const struct stellar_session *this_session, const char *session_name); + +const char *stellar_session_get_name(const struct stellar_session *session); + +#ifdef __cpluscplus +} +#endif + +#endif
\ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 8d1655d..2b1d541 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -59,12 +59,11 @@ int main(int argc, char ** argv) struct plugin_manager *plug_mgr = plugin_manager_create(); // register build-in plugin - plugin_manager_register(plug_mgr, "HTTP", SESSION_EVENT_ALL, http_decoder); + plugin_manager_register(plug_mgr, "HTTP", SESSION_EVENT_ALL, http_decoder, http_error_cb); // load external plugins - char prefix_path[] = "/op/tsg/stellar/"; char file_path[] = "./plugs/plugins.inf"; - plugin_manager_load(plug_mgr, prefix_path, file_path); + plugin_manager_load(plug_mgr, file_path); //packet_io_init struct packet_io_device *dev = packet_io_init(1, "stellar", "cap0"); diff --git a/src/plugin_manager/plugin_manager.cpp b/src/plugin_manager/plugin_manager.cpp index 7b6492a..6baaad6 100644 --- a/src/plugin_manager/plugin_manager.cpp +++ b/src/plugin_manager/plugin_manager.cpp @@ -1,48 +1,49 @@ -#include "deps/uthash/uthash.h" -#include "session_manager.h" -#include "plugin_manager_util.h" -#include "plugin_manager_config.h" -#include "plugin_manager_module.h" - #include <assert.h> #include <errno.h> +#include "uthash/uthash.h" + +#include "session_manager.h" +#include "plugin_manager_module.h" + /****************************************************************************** * CallBack Runtime (For Per Session) ******************************************************************************/ -struct eventcb_runtime +struct callback_runtime { int skip; void *cb_args; enum session_event_type event; - fn_session_event_callback *cb; + fn_session_event_callback *event_cb; + fn_session_error_callback *error_cb; }; struct session_plugin_ctx { - int current_plugin_index; - int eventcb_num; - struct eventcb_runtime *eventcbs; + int callback_index; + int callback_num; + struct callback_runtime *callbacks; }; /****************************************************************************** * CallBack Static (For Per Plugin Manager) ******************************************************************************/ -struct eventcb_static +struct callback_static { enum session_event_type event; - fn_session_event_callback *cb; + fn_session_event_callback *event_cb; + fn_session_error_callback *error_cb; }; struct plugin_manager_eventcb { char session_name[MAX_SESSION_NAME_LENGTH]; // key - int eventcb_num; // val size - struct eventcb_static *eventcbs; // val: dynamic array + int callback_num; // val size + struct callback_static *callbacks; // val: dynamic array UT_hash_handle hh; }; @@ -84,15 +85,16 @@ static struct session_plugin_ctx *plugin_manager_create_plugin_ctx(struct plugin else { struct session_plugin_ctx *plug_ctx = safe_alloc(struct session_plugin_ctx, 1); - plug_ctx->eventcb_num = elem->eventcb_num; - plug_ctx->eventcbs = safe_alloc(struct eventcb_runtime, plug_ctx->eventcb_num); + plug_ctx->callback_num = elem->callback_num; + plug_ctx->callbacks = safe_alloc(struct callback_runtime, plug_ctx->callback_num); - for (int i = 0; i < plug_ctx->eventcb_num; i++) + for (int i = 0; i < plug_ctx->callback_num; i++) { - plug_ctx->eventcbs[i].skip = 0; - plug_ctx->eventcbs[i].event = elem->eventcbs[i].event; - plug_ctx->eventcbs[i].cb = elem->eventcbs[i].cb; - plug_ctx->eventcbs[i].cb_args = NULL; + plug_ctx->callbacks[i].skip = 0; + plug_ctx->callbacks[i].event = elem->callbacks[i].event; + plug_ctx->callbacks[i].event_cb = elem->callbacks[i].event_cb; + plug_ctx->callbacks[i].error_cb = elem->callbacks[i].error_cb; + plug_ctx->callbacks[i].cb_args = NULL; } return plug_ctx; @@ -103,7 +105,7 @@ static void plugin_manager_destory_plugin_ctx(struct session_plugin_ctx *plug_ct { if (plug_ctx) { - safe_free(plug_ctx->eventcbs); + safe_free(plug_ctx->callbacks); safe_free(plug_ctx); } } @@ -112,26 +114,20 @@ static void plugin_manager_destory_plugin_ctx(struct session_plugin_ctx *plug_ct * Tools for managing plugins ******************************************************************************/ -static int plugin_manager_parse_plugins(struct plugin_manager *plug_mgr, const char *prefix, const char *file) +static int plugin_manager_parse_plugins(struct plugin_manager *plug_mgr, const char *file) { - char plugin_inf[4096] = {0}; char line_buffer[4096] = {0}; - if (strlen(prefix) <= 0) - { - plugin_manager_log(ERROR, "Invalid parameter, plugin config file prefix cannot be empty"); - return -1; - } + if (strlen(file) <= 0) { plugin_manager_log(ERROR, "Invalid parameter, plugin config file name cannot be empty"); return -1; } - strcat_prefix_and_file(prefix, file, plugin_inf, sizeof(plugin_inf)); - FILE *fp = fopen(plugin_inf, "r"); + FILE *fp = fopen(file, "r"); if (fp == NULL) { - plugin_manager_log(ERROR, "can't open %s, %s", plugin_inf, strerror(errno)); + plugin_manager_log(ERROR, "can't open %s, %s", file, strerror(errno)); return -1; } @@ -142,6 +138,7 @@ static int plugin_manager_parse_plugins(struct plugin_manager *plug_mgr, const c memset(line_buffer, 0, sizeof(line_buffer)); continue; } + line_buffer[strcspn(line_buffer, "\r\n")] = 0; if (plug_mgr->used_config_num >= MAX_PLUGIN_NUM) { @@ -150,7 +147,7 @@ static int plugin_manager_parse_plugins(struct plugin_manager *plug_mgr, const c } struct plugin_manager_config *config = plugin_mangager_config_create(); - if (plugin_mangager_config_parse(config, prefix, line_buffer) == -1) + if (plugin_mangager_config_parse(config, line_buffer) == -1) { plugin_mangager_config_destory(config); goto err; @@ -186,6 +183,8 @@ static int plugin_manager_open_plugins(struct plugin_manager *plug_mgr) { return -1; } + plugin_manager_module_dump(module, config); + plug_mgr->modules[plug_mgr->used_module_num] = module; plug_mgr->used_module_num++; } @@ -267,9 +266,9 @@ static void plugin_manager_deparse_plugins(struct plugin_manager *plug_mgr) * Public API for managing plugins ******************************************************************************/ -int plugin_manager_load(struct plugin_manager *plug_mgr, const char *prefix, const char *file) +int plugin_manager_load(struct plugin_manager *plug_mgr, const char *file) { - if (plugin_manager_parse_plugins(plug_mgr, prefix, file) == -1) + if (plugin_manager_parse_plugins(plug_mgr, file) == -1) { return -1; } @@ -324,7 +323,7 @@ void plugin_manager_destory(struct plugin_manager *plug_mgr) { HASH_DEL(plug_mgr->evcb_htable, elem); - safe_free(elem->eventcbs); + safe_free(elem->callbacks); safe_free(elem); } @@ -337,7 +336,7 @@ void plugin_manager_destory(struct plugin_manager *plug_mgr) } } -int plugin_manager_register(struct plugin_manager *plug_mgr, const char *session_name, enum session_event_type event, fn_session_event_callback *cb) +int plugin_manager_register(struct plugin_manager *plug_mgr, const char *session_name, enum session_event_type event, fn_session_event_callback *event_cb, fn_session_error_callback *error_cb) { if (strlen(session_name) <= 0) { @@ -351,23 +350,30 @@ int plugin_manager_register(struct plugin_manager *plug_mgr, const char *session return -1; } - if (cb == NULL) + if (event_cb == NULL) { - plugin_manager_log(ERROR, "invalid parameter, the callback corresponding to the session name '%s' is null", session_name); + plugin_manager_log(ERROR, "invalid parameter, the event callback corresponding to the session name '%s' is null", session_name); + return -1; + } + + if (error_cb == NULL) + { + plugin_manager_log(ERROR, "invalid parameter, the error callback corresponding to the session name '%s' is null", session_name); return -1; } struct plugin_manager_eventcb *elem; HASH_FIND_STR(plug_mgr->evcb_htable, session_name, elem); - // session_name exists, add a new cb to the end of the eventcbs dynamic array + // session_name exists, add a new cb to the end of the callbacks dynamic array if (elem) { - elem->eventcbs = (struct eventcb_static *)realloc(elem->eventcbs, (elem->eventcb_num + 1) * sizeof(struct eventcb_static)); + elem->callbacks = (struct callback_static *)realloc(elem->callbacks, (elem->callback_num + 1) * sizeof(struct callback_static)); - elem->eventcbs[elem->eventcb_num].event = event; - elem->eventcbs[elem->eventcb_num].cb = cb; + elem->callbacks[elem->callback_num].event = event; + elem->callbacks[elem->callback_num].event_cb = event_cb; + elem->callbacks[elem->callback_num].error_cb = error_cb; - elem->eventcb_num++; + elem->callback_num++; } // session_name does not exist, allocate a new node elem, and add elem to the hash table else @@ -375,12 +381,13 @@ int plugin_manager_register(struct plugin_manager *plug_mgr, const char *session elem = safe_alloc(struct plugin_manager_eventcb, 1); memcpy(elem->session_name, session_name, strlen(session_name)); - elem->eventcbs = (struct eventcb_static *)realloc(elem->eventcbs, (elem->eventcb_num + 1) * sizeof(struct eventcb_static)); + elem->callbacks = (struct callback_static *)realloc(elem->callbacks, (elem->callback_num + 1) * sizeof(struct callback_static)); - elem->eventcbs[elem->eventcb_num].event = event; - elem->eventcbs[elem->eventcb_num].cb = cb; + elem->callbacks[elem->callback_num].event = event; + elem->callbacks[elem->callback_num].event_cb = event_cb; + elem->callbacks[elem->callback_num].error_cb = error_cb; - elem->eventcb_num++; + elem->callback_num++; HASH_ADD_STR(plug_mgr->evcb_htable, session_name, elem); } @@ -401,6 +408,9 @@ void plugin_manager_dispatch(struct plugin_manager *plug_mgr, struct stellar_eve assert(seesion); assert(session_name); + char event_str_buffer[1024] = {0}; + session_event_type_int2str(event_type, event_str_buffer, 1024); + // the same session may trigger multi times opening events if (event_type & SESSION_EVENT_OPENING) { @@ -418,18 +428,20 @@ void plugin_manager_dispatch(struct plugin_manager *plug_mgr, struct stellar_eve if (plug_ctx) { - for (int i = 0; i < plug_ctx->eventcb_num; i++) + for (int i = 0; i < plug_ctx->callback_num; i++) { - plug_ctx->current_plugin_index = i; - struct eventcb_runtime *runtime = &plug_ctx->eventcbs[i]; - if (runtime->skip) + struct callback_runtime *runtime = &plug_ctx->callbacks[i]; + if (runtime->skip == 1) { + plugin_manager_log(DEBUG, "dispatch, skip event_cb: %p, session: %s, event: (%d, %s)", runtime->event_cb, session_name, event_type, event_str_buffer); continue; } if (runtime->event & event_type) { - runtime->cb(seesion, event_type, packet, payload, payload_len, &runtime->cb_args); + plug_ctx->callback_index = i; + plugin_manager_log(DEBUG, "dispatch, run event_cb: %p, session: %s, event: (%d, %s)", runtime->event_cb, session_name, event_type, event_str_buffer); + runtime->event_cb(seesion, event_type, packet, payload, payload_len, &runtime->cb_args); } } } @@ -447,6 +459,55 @@ void plugin_manager_dispatch(struct plugin_manager *plug_mgr, struct stellar_eve } /****************************************************************************** + * Public API For Plugin + ******************************************************************************/ + +void pm_session_dettach_me(const struct stellar_session *session) +{ + struct session_plugin_ctx *plugin_ctx = stellar_session_get_plugin_ctx(session); + assert(plugin_ctx); + struct callback_runtime *runtime_me = &plugin_ctx->callbacks[plugin_ctx->callback_index]; + + /* + * Just set the skip flag and don't call this event callback next. + * The plugin is closed before calling pm_session_dettach_me. + */ + runtime_me->skip = 1; + plugin_manager_log(DEBUG, "%p dettach me, disable event_cb: %p, session: %s", runtime_me->event_cb, runtime_me->event_cb, stellar_session_get_name(session)); +} + +void pm_session_dettach_others(const struct stellar_session *session) +{ + struct session_plugin_ctx *plugin_ctx = stellar_session_get_plugin_ctx(session); + assert(plugin_ctx); + struct callback_runtime *runtime_me = &plugin_ctx->callbacks[plugin_ctx->callback_index]; + + for (int i = 0; i < plugin_ctx->callback_num; i++) + { + if (i != plugin_ctx->callback_index) + { + struct callback_runtime *runtime_other = &plugin_ctx->callbacks[i]; + runtime_other->skip = 1; + plugin_manager_log(DEBUG, "%p dettach others, run error_cb: %p, session: %s", runtime_me->event_cb, runtime_other->error_cb, stellar_session_get_name(session)); + runtime_other->error_cb(session, ERROR_EVENT_DETTACH, &runtime_other->cb_args); + } + } +} + +/****************************************************************************** + * Util For Gtest + ******************************************************************************/ + +void *pm_session_get_plugin_pme(const struct stellar_session *session) +{ + struct session_plugin_ctx *plugin_ctx = stellar_session_get_plugin_ctx(session); + assert(plugin_ctx); + struct callback_runtime *runtime_me = &plugin_ctx->callbacks[plugin_ctx->callback_index]; + + return runtime_me->cb_args; +} + +/****************************************************************************** * Suppport LUA plugins ******************************************************************************/ diff --git a/src/plugin_manager/plugin_manager.h b/src/plugin_manager/plugin_manager.h index 4e96b06..2827483 100644 --- a/src/plugin_manager/plugin_manager.h +++ b/src/plugin_manager/plugin_manager.h @@ -1,4 +1,10 @@ -#pragma once +#ifndef _PLUGIN_MANAGER_H +#define _PLUGIN_MANAGER_H + +#ifdef __cpluscplus +extern "C" +{ +#endif #include "sdk/include/session.h" @@ -7,10 +13,17 @@ struct plugin_manager; struct plugin_manager *plugin_manager_create(); void plugin_manager_destory(struct plugin_manager *plug_mgr); -// return 0: success -// return -1: error -int plugin_manager_load(struct plugin_manager *plug_mgr, const char *prefix, const char *file); +int plugin_manager_load(struct plugin_manager *plug_mgr, const char *file); void plugin_manager_unload(struct plugin_manager *plug_mgr); -int plugin_manager_register(struct plugin_manager *plug_mgr, const char *session_name, enum session_event_type event, fn_session_event_callback *callback); -void plugin_manager_dispatch(struct plugin_manager *plug_mgr, struct stellar_event *event);
\ No newline at end of file +int plugin_manager_register(struct plugin_manager *plug_mgr, const char *session_name, enum session_event_type event, fn_session_event_callback *event_cb, fn_session_error_callback *error_cb); +void plugin_manager_dispatch(struct plugin_manager *plug_mgr, struct stellar_event *event); + +// only use for gtest +void *pm_session_get_plugin_pme(const struct stellar_session *session); + +#ifdef __cpluscplus +} +#endif + +#endif
\ No newline at end of file diff --git a/src/plugin_manager/plugin_manager_config.cpp b/src/plugin_manager/plugin_manager_config.cpp index f36512c..89dd39b 100644 --- a/src/plugin_manager/plugin_manager_config.cpp +++ b/src/plugin_manager/plugin_manager_config.cpp @@ -1,64 +1,9 @@ #include <errno.h> -#include <stdlib.h> #include <string.h> #include "toml/toml.h" -#include "sdk/include/session.h" -#include "plugin_manager_util.h" -#include "plugin_manager_config.h" - -struct event_type_map -{ - const char *type_str; - enum session_event_type type_int; -}; - -static struct event_type_map evtype_map[] = - { - {"SESSION_EVENT_OPENING", SESSION_EVENT_OPENING}, - {"SESSION_EVENT_RAWPKT", SESSION_EVENT_RAWPKT}, - {"SESSION_EVENT_ORDPKT", SESSION_EVENT_ORDPKT}, - {"SESSION_EVENT_META", SESSION_EVENT_META}, - {"SESSION_EVENT_CLOSING", SESSION_EVENT_CLOSING}, - {"SESSION_EVENT_ALL", SESSION_EVENT_ALL}, -}; - -/****************************************************************************** - * Private API (For Event Type) - ******************************************************************************/ - -static enum session_event_type event_type_str2int(const char *evtype_str) -{ - int num = sizeof(evtype_map) / sizeof(evtype_map[0]); - - for (int i = 0; i < num; i++) - { - if (strcmp(evtype_str, evtype_map[i].type_str) == 0) - { - return evtype_map[i].type_int; - } - } - - return SESSION_EVENT_UNKNOWN; -} -static void event_type_int2str(enum session_event_type evtype_int, char *buffer, int size) -{ - int used = 0; - int num = sizeof(evtype_map) / sizeof(evtype_map[0]); - - for (int i = 0; i < num; i++) - { - if (evtype_map[i].type_int & evtype_int) - { - if (evtype_map[i].type_int == SESSION_EVENT_ALL && evtype_int != SESSION_EVENT_ALL) - { - continue; - } - used += snprintf(buffer + used, size - used, "%s ", evtype_map[i].type_str); - } - } -} +#include "plugin_manager_config.h" /****************************************************************************** * Private API (For Parse) @@ -117,6 +62,11 @@ static int toml_parse_plugin_section(toml_table_t *root, struct plugin_manager_c return -1; } + if (toml_parse_string(plugin_section, "ERROR_FUNC", file, &config->plugin_section.error_func_name) == -1) + { + return -1; + } + if (toml_parse_string(plugin_section, "LIBRARY_PATH", file, &config->plugin_section.lib_path) == -1) { return -1; @@ -193,7 +143,7 @@ static int toml_parse_session_section(toml_table_t *root, struct plugin_manager_ return -1; } - type_int = event_type_str2int(type_str.u.s); + type_int = session_event_type_str2int(type_str.u.s); if (type_int == SESSION_EVENT_UNKNOWN) { plugin_manager_log(ERROR, "invalid value '%s' for 'SESSION_EVENT_TYPE' configuration item in '[SESSION_NAME.%s]' section of %s", type_str.u.s, session_name, file); @@ -219,12 +169,12 @@ struct plugin_manager_config *plugin_mangager_config_create() { struct plugin_manager_config *config = safe_alloc(struct plugin_manager_config, 1); - config->prefix_path = NULL; config->file_path = NULL; config->session_section_num = 0; config->session_section = NULL; config->plugin_section.init_func_name = NULL; config->plugin_section.exit_func_name = NULL; + config->plugin_section.error_func_name = NULL; config->plugin_section.lib_path = NULL; return config; @@ -234,11 +184,11 @@ void plugin_mangager_config_destory(struct plugin_manager_config *config) { if (config) { - safe_free(config->prefix_path); safe_free(config->file_path); safe_free(config->plugin_section.init_func_name); safe_free(config->plugin_section.exit_func_name); + safe_free(config->plugin_section.error_func_name); safe_free(config->plugin_section.lib_path); if (config->session_section) @@ -260,10 +210,10 @@ void plugin_mangager_config_dump(struct plugin_manager_config *config) { if (config) { - plugin_manager_log(DEBUG, "[CONFIG_PREFIX] : %s", config->prefix_path); - plugin_manager_log(DEBUG, "[CONFIG_FILE] : %s", config->file_path); - plugin_manager_log(DEBUG, "[PLUGINFO]->INIT_FUNC : %s", config->plugin_section.init_func_name); - plugin_manager_log(DEBUG, "[PLUGINFO]->EXIT_FUNC : %s", config->plugin_section.exit_func_name); + plugin_manager_log(DEBUG, "[CONFIG_FILE] : %s", config->file_path); + plugin_manager_log(DEBUG, "[PLUGINFO]->INIT_FUNC : %s", config->plugin_section.init_func_name); + plugin_manager_log(DEBUG, "[PLUGINFO]->EXIT_FUNC : %s", config->plugin_section.exit_func_name); + plugin_manager_log(DEBUG, "[PLUGINFO]->ERROR_FUNC : %s", config->plugin_section.error_func_name); plugin_manager_log(DEBUG, "[PLUGINFO]->LIBRARY_PATH : %s", config->plugin_section.lib_path); if (config->session_section) @@ -272,29 +222,26 @@ void plugin_mangager_config_dump(struct plugin_manager_config *config) { char tmp_buffer[1024] = {0}; struct session_section_config *temp = &config->session_section[i]; - event_type_int2str(temp->event, tmp_buffer, 1024); - plugin_manager_log(DEBUG, "[SESSION_NAME.%s]->SESSION_EVENT_TYPE : %d, %s", temp->session_name, temp->event, tmp_buffer); + session_event_type_int2str(temp->event, tmp_buffer, 1024); + plugin_manager_log(DEBUG, "[SESSION_NAME.%s]->SESSION_EVENT_TYPE : %d, %s", temp->session_name, temp->event, tmp_buffer); plugin_manager_log(DEBUG, "[SESSION_NAME.%s]->SESSION_EVENT_CALLBACK : %s", temp->session_name, temp->cb_func_name); } } } } -int plugin_mangager_config_parse(struct plugin_manager_config *config, const char *prefix, const char *file) +int plugin_mangager_config_parse(struct plugin_manager_config *config, const char *file) { FILE *fp = NULL; toml_table_t *root = NULL; char errbuf[200] = {0}; - char tmp_buffer[4096] = {0}; - config->prefix_path = safe_dup(prefix); config->file_path = safe_dup(file); - strcat_prefix_and_file(prefix, file, tmp_buffer, sizeof(tmp_buffer)); - fp = fopen(tmp_buffer, "r"); + fp = fopen(config->file_path, "r"); if (fp == NULL) { - plugin_manager_log(ERROR, "can't open %s, %s", tmp_buffer, strerror(errno)); + plugin_manager_log(ERROR, "can't open %s, %s", config->file_path, strerror(errno)); return -1; } @@ -318,6 +265,8 @@ int plugin_mangager_config_parse(struct plugin_manager_config *config, const cha toml_free(root); fclose(fp); + plugin_manager_log(INFO, "plugin config file '%s' parse success", config->file_path); + return 0; err: @@ -333,26 +282,4 @@ err: } return -1; -} - -/****************************************************************************** - * Test - ******************************************************************************/ - -#ifdef PLUGIN_MANAGER_TEST -int main(int argc, char *argv[]) -{ - struct plugin_manager_config *config = plugin_mangager_config_create(); - - if (plugin_mangager_config_parse(config, argv[1], argv[2]) == -1) - { - plugin_manager_log(ERROR, "can't parser %s %s", argv[1], argv[2]); - } - - plugin_mangager_config_dump(config); - - plugin_mangager_config_destory(config); - - return 0; -} -#endif
\ No newline at end of file +}
\ No newline at end of file diff --git a/src/plugin_manager/plugin_manager_config.h b/src/plugin_manager/plugin_manager_config.h index fa9164d..16a62ba 100644 --- a/src/plugin_manager/plugin_manager_config.h +++ b/src/plugin_manager/plugin_manager_config.h @@ -1,4 +1,10 @@ -#pragma once +#ifndef _PLUGIN_MANAGER_CONFIG_H +#define _PLUGIN_MANAGER_CONFIG_H + +#ifdef __cpluscplus +extern "C" +{ +#endif #include "plugin_manager_util.h" #include "sdk/include/session.h" @@ -14,13 +20,13 @@ struct plugin_section_config { char *init_func_name; char *exit_func_name; + char *error_func_name; char *lib_path; }; struct plugin_manager_config { - char *prefix_path; // absolute path to stellar installation - char *file_path; // relative path to stellar installation + char *file_path; int session_section_num; struct session_section_config *session_section; // array @@ -30,5 +36,11 @@ struct plugin_manager_config struct plugin_manager_config *plugin_mangager_config_create(); void plugin_mangager_config_destory(struct plugin_manager_config *config); -int plugin_mangager_config_parse(struct plugin_manager_config *config, const char *prefix, const char *file); -void plugin_mangager_config_dump(struct plugin_manager_config *config);
\ No newline at end of file +int plugin_mangager_config_parse(struct plugin_manager_config *config, const char *file); +void plugin_mangager_config_dump(struct plugin_manager_config *config); + +#ifdef __cpluscplus +} +#endif + +#endif
\ No newline at end of file diff --git a/src/plugin_manager/plugin_manager_module.cpp b/src/plugin_manager/plugin_manager_module.cpp index 1e3011b..def9343 100644 --- a/src/plugin_manager/plugin_manager_module.cpp +++ b/src/plugin_manager/plugin_manager_module.cpp @@ -1,11 +1,9 @@ #include <time.h> #include <dlfcn.h> -#include <stdlib.h> #include <string.h> #include "sdk/include/plugin.h" -#include "plugin_manager_util.h" -#include "plugin_manager_config.h" +#include "plugin_manager_module.h" #include "plugin_manager.h" struct plugin_manager_module_evcb @@ -17,12 +15,12 @@ struct plugin_manager_module_evcb struct plugin_manager_module { - char *prefix; char *lib_path; void *dl_handle; plugin_init_callback *init_cb_ptr; plugin_exit_callback *exit_cb_ptr; + fn_session_error_callback *error_cb_ptr; struct plugin_manager_module_evcb *evcbs; int evcbs_num; @@ -43,7 +41,6 @@ void plugin_manager_module_close(struct plugin_manager_module *module) module->dl_handle = NULL; } - safe_free(module->prefix); safe_free(module->lib_path); safe_free(module->evcbs); module->evcbs_num = 0; @@ -59,18 +56,16 @@ struct plugin_manager_module *plugin_manager_module_open(struct plugin_manager_c return NULL; } - char dynamic_lib_path[4096] = {0}; struct plugin_manager_module *module = safe_alloc(struct plugin_manager_module, 1); - module->prefix = safe_dup(config->prefix_path); module->lib_path = safe_dup(config->plugin_section.lib_path); - strcat_prefix_and_file(module->prefix, module->lib_path, dynamic_lib_path, sizeof(dynamic_lib_path)); + // RTLD_NOW | RTLD_GLOBAL module->evcbs_num = 0; - module->dl_handle = dlopen(dynamic_lib_path, RTLD_LAZY | RTLD_GLOBAL | RTLD_DEEPBIND); + module->dl_handle = dlopen(module->lib_path, RTLD_NOW | RTLD_GLOBAL | RTLD_DEEPBIND); if (module->dl_handle == NULL) { - plugin_manager_log(ERROR, "can't dlopen %s, %s", dynamic_lib_path, dlerror()); + plugin_manager_log(ERROR, "can't dlopen %s, %s", module->lib_path, dlerror()); goto err; } @@ -78,7 +73,7 @@ struct plugin_manager_module *plugin_manager_module_open(struct plugin_manager_c if (module->init_cb_ptr == NULL) { plugin_manager_log(ERROR, "can't find symbol name of '%s' in dynamic library %s, %s", - config->plugin_section.init_func_name, dynamic_lib_path, dlerror()); + config->plugin_section.init_func_name, module->lib_path, dlerror()); goto err; } @@ -86,7 +81,15 @@ struct plugin_manager_module *plugin_manager_module_open(struct plugin_manager_c if (module->exit_cb_ptr == NULL) { plugin_manager_log(ERROR, "can't find symbol name of '%s' in dynamic library %s, %s", - config->plugin_section.exit_func_name, dynamic_lib_path, dlerror()); + config->plugin_section.exit_func_name, module->lib_path, dlerror()); + goto err; + } + + module->error_cb_ptr = (fn_session_error_callback *)(dlsym(module->dl_handle, config->plugin_section.error_func_name)); + if (module->error_cb_ptr == NULL) + { + plugin_manager_log(ERROR, "can't find symbol name of '%s' in dynamic library %s, %s", + config->plugin_section.error_func_name, module->lib_path, dlerror()); goto err; } @@ -106,12 +109,14 @@ struct plugin_manager_module *plugin_manager_module_open(struct plugin_manager_c if (event_cb->event_cb_ptr == NULL) { plugin_manager_log(ERROR, "can't find symbol name of '%s' in dynamic library %s, %s", - session_config->cb_func_name, dynamic_lib_path, dlerror()); + session_config->cb_func_name, module->lib_path, dlerror()); goto err; } } } + plugin_manager_log(INFO, "plugin dynamic library '%s' dlopen success", module->lib_path); + return module; err: @@ -120,25 +125,6 @@ err: return NULL; } -int plugin_manager_module_register(struct plugin_manager *plug_mgr, struct plugin_manager_module *module) -{ - if (module && module->evcbs) - { - for (int i = 0; i < module->evcbs_num; i++) - { - struct plugin_manager_module_evcb *event_cb = &module->evcbs[i]; - - if (plugin_manager_register(plug_mgr, event_cb->session_name, event_cb->event, event_cb->event_cb_ptr) == -1) - { - plugin_manager_log(ERROR, "dynamic library '%s' failed to register the event callback function of session '%s'", module->lib_path, event_cb->session_name); - return -1; - } - } - } - - return 0; -} - int plugin_manager_module_init(struct plugin_manager_module *module) { struct timespec start; @@ -146,23 +132,72 @@ int plugin_manager_module_init(struct plugin_manager_module *module) clock_gettime(CLOCK_MONOTONIC, &start); int ret = module->init_cb_ptr(); + clock_gettime(CLOCK_MONOTONIC, &end); if (ret == -1) { plugin_manager_log(ERROR, "dynamic library '%s' initialization failed", module->lib_path); return -1; } - clock_gettime(CLOCK_MONOTONIC, &end); long elapsed = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_nsec - start.tv_nsec) / 1000; - plugin_manager_log(INFO, "plugin '%s' init success, using '%lld' us", module->lib_path, elapsed); + plugin_manager_log(INFO, "plugin dynamic library '%s' init success, using '%lld' us", module->lib_path, elapsed); return 0; } void plugin_manager_module_exit(struct plugin_manager_module *module) { + struct timespec start; + struct timespec end; + if (module && module->exit_cb_ptr) { + clock_gettime(CLOCK_MONOTONIC, &start); module->exit_cb_ptr(); + clock_gettime(CLOCK_MONOTONIC, &end); + module->exit_cb_ptr = NULL; + + long elapsed = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_nsec - start.tv_nsec) / 1000; + plugin_manager_log(INFO, "plugin dynamic library '%s' exit success, using '%lld' us", module->lib_path, elapsed); } } + +int plugin_manager_module_register(struct plugin_manager *plug_mgr, struct plugin_manager_module *module) +{ + if (module && module->evcbs) + { + for (int i = 0; i < module->evcbs_num; i++) + { + struct plugin_manager_module_evcb *event_cb = &module->evcbs[i]; + + if (plugin_manager_register(plug_mgr, event_cb->session_name, event_cb->event, event_cb->event_cb_ptr, module->error_cb_ptr) == -1) + { + plugin_manager_log(ERROR, "dynamic library '%s' failed to register the event callback function of session '%s'", module->lib_path, event_cb->session_name); + return -1; + } + } + } + + return 0; +} + +void plugin_manager_module_dump(struct plugin_manager_module *module, struct plugin_manager_config *config) +{ + if (module) + { + plugin_manager_log(DEBUG, "[LIBRARY] : %s, %p", config->plugin_section.lib_path, module->dl_handle); + plugin_manager_log(DEBUG, "[INIT_FUNC] : %s, %p", config->plugin_section.init_func_name, module->init_cb_ptr); + plugin_manager_log(DEBUG, "[EXIT_FUNC] : %s, %p", config->plugin_section.exit_func_name, module->exit_cb_ptr); + plugin_manager_log(DEBUG, "[ERROR_FUNC] : %s, %p", config->plugin_section.error_func_name, module->error_cb_ptr); + + for (int i = 0; i < module->evcbs_num; i++) + { + struct session_section_config *session_config = &config->session_section[i]; + struct plugin_manager_module_evcb *event_cb = &module->evcbs[i]; + + char event_str_buffer[1024] = {0}; + session_event_type_int2str(event_cb->event, event_str_buffer, 1024); + plugin_manager_log(DEBUG, "[EVENT_FUNC] : %s, %p, %s, (%d: %s)", session_config->cb_func_name, event_cb->event_cb_ptr, event_cb->session_name, event_cb->event, event_str_buffer); + } + } +}
\ No newline at end of file diff --git a/src/plugin_manager/plugin_manager_module.h b/src/plugin_manager/plugin_manager_module.h index d765b4a..0bc468c 100644 --- a/src/plugin_manager/plugin_manager_module.h +++ b/src/plugin_manager/plugin_manager_module.h @@ -1,12 +1,26 @@ -#pragma once +#ifndef _PLUGIN_MANAGER_MODULE_H +#define _PLUGIN_MANAGER_MODULE_H + +#ifdef __cpluscplus +extern "C" +{ +#endif #include "plugin_manager_config.h" struct plugin_manager_module; struct plugin_manager_module *plugin_manager_module_open(struct plugin_manager_config *config); -int plugin_manager_module_register(struct plugin_manager *plug_mgr, struct plugin_manager_module *module); -int plugin_manager_module_init(struct plugin_manager_module *module); +void plugin_manager_module_close(struct plugin_manager_module *module); +int plugin_manager_module_init(struct plugin_manager_module *module); void plugin_manager_module_exit(struct plugin_manager_module *module); -void plugin_manager_module_close(struct plugin_manager_module *module);
\ No newline at end of file + +void plugin_manager_module_dump(struct plugin_manager_module *module, struct plugin_manager_config *config); +int plugin_manager_module_register(struct plugin_manager *plug_mgr, struct plugin_manager_module *module); + +#ifdef __cpluscplus +} +#endif + +#endif
\ No newline at end of file diff --git a/src/plugin_manager/plugin_manager_util.cpp b/src/plugin_manager/plugin_manager_util.cpp index 1c4337d..08f903f 100644 --- a/src/plugin_manager/plugin_manager_util.cpp +++ b/src/plugin_manager/plugin_manager_util.cpp @@ -1,8 +1,11 @@ #include <string.h> -#include <stdlib.h> #include "plugin_manager_util.h" +/****************************************************************************** + * Malloc + ******************************************************************************/ + char *safe_dup(const char *str) { if (str == NULL) @@ -16,25 +19,81 @@ char *safe_dup(const char *str) return dup; } -void strcat_prefix_and_file(const char *prefix, const char *file, char *buff, int size) +/****************************************************************************** + * Session Event Type + ******************************************************************************/ + +struct event_type_map { - char prefix_buffer[4096] = {0}; - char file_buffer[4096] = {0}; - char *ptr = NULL; + const char *type_str; + enum session_event_type type_int; +}; - memcpy(prefix_buffer, prefix, strlen(prefix)); - memcpy(file_buffer, file, strlen(file)); +static struct event_type_map evtype_map[] = + { + {"SESSION_EVENT_UNKNOWN", SESSION_EVENT_UNKNOWN}, + {"SESSION_EVENT_OPENING", SESSION_EVENT_OPENING}, + {"SESSION_EVENT_RAWPKT", SESSION_EVENT_RAWPKT}, + {"SESSION_EVENT_ORDPKT", SESSION_EVENT_ORDPKT}, + {"SESSION_EVENT_META", SESSION_EVENT_META}, + {"SESSION_EVENT_CLOSING", SESSION_EVENT_CLOSING}, + {"SESSION_EVENT_ALL", SESSION_EVENT_ALL}, +}; + +enum session_event_type session_event_type_str2int(const char *evtype_str) +{ + enum session_event_type evtype_int = SESSION_EVENT_UNKNOWN; + int num = sizeof(evtype_map) / sizeof(evtype_map[0]); - if (prefix_buffer[strlen(prefix_buffer) - 1] != '/') + char *buffer = safe_dup(evtype_str); + char *token = strtok(buffer, "|"); + while (token) { - prefix_buffer[strlen(prefix_buffer)] = '/'; + for (int i = 0; i < num; i++) + { + if (strcmp(token, evtype_map[i].type_str) == 0) + { + evtype_int = (enum session_event_type)(evtype_int | evtype_map[i].type_int); + } + } + token = strtok(NULL, "|"); } - file_buffer[strcspn(file_buffer, "\r\n")] = 0; + safe_free(buffer); - ptr = file_buffer; - if (file_buffer[0] == '.' && file_buffer[1] == '/') + return evtype_int; +} + +void session_event_type_int2str(enum session_event_type evtype_int, char *buffer, int size) +{ + int used = 0; + int num = sizeof(evtype_map) / sizeof(evtype_map[0]); + + if (evtype_int == SESSION_EVENT_UNKNOWN) { - ptr += 2; + snprintf(buffer, size, "%s", "SESSION_EVENT_UNKNOWN"); + return; } - snprintf(buff, size, "%s%s", prefix_buffer, ptr); -}
\ No newline at end of file + + if (evtype_int == SESSION_EVENT_ALL) + { + snprintf(buffer, size, "%s", "SESSION_EVENT_ALL"); + return; + } + + for (int i = 0; i < num; i++) + { + if (evtype_map[i].type_int & evtype_int) + { + if (evtype_map[i].type_int == SESSION_EVENT_ALL && evtype_int != SESSION_EVENT_ALL) + { + continue; + } + used += snprintf(buffer + used, size - used, "%s|", evtype_map[i].type_str); + } + } + + if (used) + { + buffer[used - 1] = '\0'; + } +} diff --git a/src/plugin_manager/plugin_manager_util.h b/src/plugin_manager/plugin_manager_util.h index 9c6c0fb..13b85db 100644 --- a/src/plugin_manager/plugin_manager_util.h +++ b/src/plugin_manager/plugin_manager_util.h @@ -1,6 +1,15 @@ -#pragma once +#ifndef _PLUGIN_MANAGER_UTIL_H +#define _PLUGIN_MANAGER_UTIL_H + +#ifdef __cpluscplus +extern "C" +{ +#endif #include <stdio.h> +#include <stdlib.h> + +#include "sdk/include/session.h" #define MAX_PLUGIN_NUM 512 #define MAX_SESSION_NAME_LENGTH 32 @@ -55,7 +64,14 @@ enum plugin_manager_log_level #endif /****************************************************************************** - * Str + * Session Event Type ******************************************************************************/ -void strcat_prefix_and_file(const char *prefix, const char *file, char *buff, int size); +enum session_event_type session_event_type_str2int(const char *evtype_str); +void session_event_type_int2str(enum session_event_type evtype_int, char *buffer, int size); + +#ifdef __cpluscplus +} +#endif + +#endif
\ No newline at end of file diff --git a/src/plugin_manager/test/CMakeLists.txt b/src/plugin_manager/test/CMakeLists.txt index 7a1a880..82bc6d6 100644 --- a/src/plugin_manager/test/CMakeLists.txt +++ b/src/plugin_manager/test/CMakeLists.txt @@ -11,6 +11,9 @@ target_link_libraries( dl ) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--export-dynamic") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--export-dynamic") + include(GoogleTest) gtest_discover_tests(gtest_plugin_manager) diff --git a/src/plugin_manager/test/gtest_plugin_manager.cpp b/src/plugin_manager/test/gtest_plugin_manager.cpp index 8107b41..efc95b2 100644 --- a/src/plugin_manager/test/gtest_plugin_manager.cpp +++ b/src/plugin_manager/test/gtest_plugin_manager.cpp @@ -1,23 +1,150 @@ #include <gtest/gtest.h> +#include "sdk/include/session.h" + +#include "../plugin_manager_util.h" #include "../plugin_manager_config.h" +#include "../plugin_manager_module.h" #include "../plugin_manager.h" #include "session_manager.h" -TEST(PLUGIN_MANAGER_TEST, plugin_manager_config_HTTP) +/****************************************************************************** + * Test plugin_mangager_util API + ******************************************************************************/ + +#if 1 +TEST(PLUGIN_MANAGER_TEST, plugin_mangager_util_int2str) +{ + enum session_event_type type_int; + char buffer[1024] = {0}; + + type_int = SESSION_EVENT_UNKNOWN; + memset(buffer, 0, sizeof(buffer)); + session_event_type_int2str(type_int, buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "SESSION_EVENT_UNKNOWN"); + + type_int = SESSION_EVENT_OPENING; + memset(buffer, 0, sizeof(buffer)); + session_event_type_int2str(type_int, buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "SESSION_EVENT_OPENING"); + + type_int = SESSION_EVENT_RAWPKT; + memset(buffer, 0, sizeof(buffer)); + session_event_type_int2str(type_int, buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "SESSION_EVENT_RAWPKT"); + + type_int = SESSION_EVENT_ORDPKT; + memset(buffer, 0, sizeof(buffer)); + session_event_type_int2str(type_int, buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "SESSION_EVENT_ORDPKT"); + + type_int = SESSION_EVENT_META; + memset(buffer, 0, sizeof(buffer)); + session_event_type_int2str(type_int, buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "SESSION_EVENT_META"); + + type_int = SESSION_EVENT_CLOSING; + memset(buffer, 0, sizeof(buffer)); + session_event_type_int2str(type_int, buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "SESSION_EVENT_CLOSING"); + + type_int = SESSION_EVENT_ALL; + memset(buffer, 0, sizeof(buffer)); + session_event_type_int2str(type_int, buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "SESSION_EVENT_ALL"); + + type_int = (enum session_event_type)(SESSION_EVENT_OPENING | SESSION_EVENT_RAWPKT); + memset(buffer, 0, sizeof(buffer)); + session_event_type_int2str(type_int, buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "SESSION_EVENT_OPENING|SESSION_EVENT_RAWPKT"); + + type_int = (enum session_event_type)(SESSION_EVENT_OPENING | SESSION_EVENT_RAWPKT | SESSION_EVENT_ORDPKT); + memset(buffer, 0, sizeof(buffer)); + session_event_type_int2str(type_int, buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "SESSION_EVENT_OPENING|SESSION_EVENT_RAWPKT|SESSION_EVENT_ORDPKT"); + + type_int = (enum session_event_type)(SESSION_EVENT_OPENING | SESSION_EVENT_RAWPKT | SESSION_EVENT_ORDPKT | SESSION_EVENT_META); + memset(buffer, 0, sizeof(buffer)); + session_event_type_int2str(type_int, buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "SESSION_EVENT_OPENING|SESSION_EVENT_RAWPKT|SESSION_EVENT_ORDPKT|SESSION_EVENT_META"); + + type_int = (enum session_event_type)(SESSION_EVENT_OPENING | SESSION_EVENT_RAWPKT | SESSION_EVENT_ORDPKT | SESSION_EVENT_META | SESSION_EVENT_CLOSING); + memset(buffer, 0, sizeof(buffer)); + session_event_type_int2str(type_int, buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "SESSION_EVENT_ALL"); +} +#endif + +#if 1 +TEST(PLUGIN_MANAGER_TEST, plugin_mangager_util_str2int) +{ + enum session_event_type type_int; + + const char *type_str1 = "SESSION_EVENT_UNKNOWN"; + const char *type_str2 = "SESSION_EVENT_OPENING"; + const char *type_str3 = "SESSION_EVENT_RAWPKT"; + const char *type_str4 = "SESSION_EVENT_ORDPKT"; + const char *type_str5 = "SESSION_EVENT_META"; + const char *type_str6 = "SESSION_EVENT_CLOSING"; + const char *type_str7 = "SESSION_EVENT_ALL"; + const char *type_str8 = "SESSION_EVENT_OPENING|SESSION_EVENT_RAWPKT"; + const char *type_str9 = "SESSION_EVENT_OPENING|SESSION_EVENT_RAWPKT|SESSION_EVENT_ORDPKT"; + const char *type_str10 = "SESSION_EVENT_OPENING|SESSION_EVENT_RAWPKT|SESSION_EVENT_ORDPKT|SESSION_EVENT_META"; + const char *type_str11 = "SESSION_EVENT_OPENING|SESSION_EVENT_RAWPKT|SESSION_EVENT_ORDPKT|SESSION_EVENT_META|SESSION_EVENT_CLOSING"; + + type_int = session_event_type_str2int(type_str1); + EXPECT_TRUE(type_int == SESSION_EVENT_UNKNOWN); + + type_int = session_event_type_str2int(type_str2); + EXPECT_TRUE(type_int == SESSION_EVENT_OPENING); + + type_int = session_event_type_str2int(type_str3); + EXPECT_TRUE(type_int == SESSION_EVENT_RAWPKT); + + type_int = session_event_type_str2int(type_str4); + EXPECT_TRUE(type_int == SESSION_EVENT_ORDPKT); + + type_int = session_event_type_str2int(type_str5); + EXPECT_TRUE(type_int == SESSION_EVENT_META); + + type_int = session_event_type_str2int(type_str6); + EXPECT_TRUE(type_int == SESSION_EVENT_CLOSING); + + type_int = session_event_type_str2int(type_str7); + EXPECT_TRUE(type_int == SESSION_EVENT_ALL); + + type_int = session_event_type_str2int(type_str8); + EXPECT_TRUE(type_int == (SESSION_EVENT_OPENING | SESSION_EVENT_RAWPKT)); + + type_int = session_event_type_str2int(type_str9); + EXPECT_TRUE(type_int == (SESSION_EVENT_OPENING | SESSION_EVENT_RAWPKT | SESSION_EVENT_ORDPKT)); + + type_int = session_event_type_str2int(type_str10); + EXPECT_TRUE(type_int == (SESSION_EVENT_OPENING | SESSION_EVENT_RAWPKT | SESSION_EVENT_ORDPKT | SESSION_EVENT_META)); + + type_int = session_event_type_str2int(type_str11); + EXPECT_TRUE(type_int == SESSION_EVENT_ALL); +} +#endif + +/****************************************************************************** + * Test plugin_mangager_config API + ******************************************************************************/ + +#if 1 +TEST(PLUGIN_MANAGER_TEST, plugin_mangager_config_HTTP) { - char prefix_path[] = "./"; char file_path[] = "./plugins_config/http_event_plugin/http_event_plugin.inf"; struct plugin_manager_config *config = plugin_mangager_config_create(); EXPECT_TRUE(config != nullptr); - EXPECT_TRUE(plugin_mangager_config_parse(config, prefix_path, file_path) == 0); + EXPECT_TRUE(plugin_mangager_config_parse(config, file_path) == 0); - EXPECT_STREQ(config->prefix_path, "./"); EXPECT_STREQ(config->file_path, "./plugins_config/http_event_plugin/http_event_plugin.inf"); EXPECT_STREQ(config->plugin_section.init_func_name, "http_event_plugin_init"); EXPECT_STREQ(config->plugin_section.exit_func_name, "http_event_plugin_exit"); + EXPECT_STREQ(config->plugin_section.error_func_name, "http_event_plugin_error"); EXPECT_STREQ(config->plugin_section.lib_path, "./test_plugins/plugins_library/http_event_plugin_test.so"); EXPECT_TRUE(config->session_section_num == 1); @@ -28,127 +155,421 @@ TEST(PLUGIN_MANAGER_TEST, plugin_manager_config_HTTP) plugin_mangager_config_dump(config); plugin_mangager_config_destory(config); } +#endif -TEST(PLUGIN_MANAGER_TEST, plugin_manager_config_CUSTOM) +#if 1 +TEST(PLUGIN_MANAGER_TEST, plugin_mangager_config_CUSTOM) { - char prefix_path[] = "./"; char file_path[] = "./plugins_config/custom_event_plugin/custom_event_plugin.inf"; struct plugin_manager_config *config = plugin_mangager_config_create(); EXPECT_TRUE(config != nullptr); - EXPECT_TRUE(plugin_mangager_config_parse(config, prefix_path, file_path) == 0); + EXPECT_TRUE(plugin_mangager_config_parse(config, file_path) == 0); - EXPECT_STREQ(config->prefix_path, "./"); EXPECT_STREQ(config->file_path, "./plugins_config/custom_event_plugin/custom_event_plugin.inf"); - EXPECT_STREQ(config->plugin_section.init_func_name, "custom_plugin_init"); - EXPECT_STREQ(config->plugin_section.exit_func_name, "custom_plugin_exit"); + EXPECT_STREQ(config->plugin_section.init_func_name, "custom_event_plugin_init"); + EXPECT_STREQ(config->plugin_section.exit_func_name, "custom_event_plugin_exit"); + EXPECT_STREQ(config->plugin_section.error_func_name, "custom_event_plugin_error"); EXPECT_STREQ(config->plugin_section.lib_path, "./test_plugins/plugins_library/custom_event_plugin_test.so"); - EXPECT_TRUE(config->session_section_num == 2); + EXPECT_TRUE(config->session_section_num == 3); EXPECT_STREQ(config->session_section[0].session_name, "TCP"); - EXPECT_STREQ(config->session_section[0].cb_func_name, "custom_plugin_tcp_entry"); + EXPECT_STREQ(config->session_section[0].cb_func_name, "custom_event_plugin_tcp_entry"); EXPECT_TRUE(config->session_section[0].event == (0x01 << 1 | 0x01 << 2 | 0x01 << 3 | 0x01 << 4 | 0x01 << 5)); - EXPECT_STREQ(config->session_section[1].session_name, "CUSTOM"); - EXPECT_STREQ(config->session_section[1].cb_func_name, "custom_plugin_custom_entry"); - EXPECT_TRUE(config->session_section[1].event == (0x01 << 1) | (0x01 << 3) | (0x01 << 5)); + + EXPECT_STREQ(config->session_section[1].session_name, "HTTP"); + EXPECT_STREQ(config->session_section[1].cb_func_name, "custom_event_plugin_http_entry"); + EXPECT_TRUE(config->session_section[1].event == (0x01 << 1 | 0x01 << 2 | 0x01 << 3 | 0x01 << 4 | 0x01 << 5)); + + EXPECT_STREQ(config->session_section[2].session_name, "CUSTOM"); + EXPECT_STREQ(config->session_section[2].cb_func_name, "custom_event_plugin_custom_entry"); + EXPECT_TRUE(config->session_section[2].event == (0x01 << 1) | (0x01 << 3) | (0x01 << 5)); plugin_mangager_config_dump(config); plugin_mangager_config_destory(config); } +#endif + +/****************************************************************************** + * Test plugin_mangager_module API + ******************************************************************************/ + +#if 1 +TEST(PLUGIN_MANAGER_TEST, plugin_mangager_module_HTTP) +{ + char file_path[] = "./plugins_config/http_event_plugin/http_event_plugin.inf"; + + struct plugin_manager_config *config = plugin_mangager_config_create(); + EXPECT_TRUE(config != nullptr); + EXPECT_TRUE(plugin_mangager_config_parse(config, file_path) == 0); + + struct plugin_manager_module *module = plugin_manager_module_open(config); + EXPECT_TRUE(module != nullptr); + EXPECT_TRUE(plugin_manager_module_init(module) == 0); + plugin_manager_module_dump(module, config); + plugin_manager_module_exit(module); + plugin_manager_module_close(module); + + plugin_mangager_config_destory(config); +} +#endif +#if 1 +TEST(PLUGIN_MANAGER_TEST, plugin_mangager_module_CUSTOM) +{ + char file_path[] = "./plugins_config/custom_event_plugin/custom_event_plugin.inf"; + + struct plugin_manager_config *config = plugin_mangager_config_create(); + EXPECT_TRUE(config != nullptr); + EXPECT_TRUE(plugin_mangager_config_parse(config, file_path) == 0); + + struct plugin_manager_module *module = plugin_manager_module_open(config); + EXPECT_TRUE(module != nullptr); + EXPECT_TRUE(plugin_manager_module_init(module) == 0); + plugin_manager_module_dump(module, config); + plugin_manager_module_exit(module); + plugin_manager_module_close(module); + + plugin_mangager_config_destory(config); +} +#endif + +/****************************************************************************** + * Test plugin_mangager API + ******************************************************************************/ + +#if 1 TEST(PLUGIN_MANAGER_TEST, plugin_manager_load) { - char prefix_path[] = "./"; char file_path[] = "./plugins_config/plugins.inf"; struct plugin_manager *plug_mgr = plugin_manager_create(); EXPECT_TRUE(plug_mgr != nullptr); - EXPECT_TRUE(plugin_manager_load(plug_mgr, prefix_path, file_path) == 0); + EXPECT_TRUE(plugin_manager_load(plug_mgr, file_path) == 0); plugin_manager_unload(plug_mgr); plugin_manager_destory(plug_mgr); } +#endif -TEST(PLUGIN_MANAGER_TEST, plugin_manager_dispatch_HTTP) +#if 1 +// only SESSION_EVENT_OPENING | SESSION_EVENT_ORDPKT | SESSION_EVENT_CLOSING can trigger event callback +TEST(PLUGIN_MANAGER_TEST, plugin_manager_dispatch_CUSTOM) { - char prefix_path[] = "./"; + /* + * [SESSION_NAME.CUSTOM] + * SESSION_EVENT_TYPE=["SESSION_EVENT_OPENING","SESSION_EVENT_ORDPKT","SESSION_EVENT_CLOSING"] + * SESSION_EVENT_CALLBACK="custom_event_plugin_custom_entry" + */ + + struct custom_session_pme + { + char data[64]; + int flags; + /* data */ + }; + + struct custom_session_pme *pme; char file_path[] = "./plugins_config/plugins.inf"; - const char *session_name = "HTTP"; + const char *session_name = "CUSTOM"; + struct stellar_session session; session.name = session_name; + struct stellar_session_event_data event_data; event_data.s = &session; event_data.plugin_ctx = NULL; // must be init to NULL + struct stellar_event event; event.session_event_data = &event_data; + session.event_data = &event_data; // must be set + struct plugin_manager *plug_mgr = plugin_manager_create(); EXPECT_TRUE(plug_mgr != nullptr); - EXPECT_TRUE(plugin_manager_load(plug_mgr, prefix_path, file_path) == 0); + EXPECT_TRUE(plugin_manager_load(plug_mgr, file_path) == 0); + // run evencb event_data.type = SESSION_EVENT_OPENING; plugin_manager_dispatch(plug_mgr, &event); + pme = (struct custom_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_OPENING); + EXPECT_STREQ(pme->data, "custom_event_plugin_custom_entry"); + // unrun evencb event_data.type = SESSION_EVENT_RAWPKT; plugin_manager_dispatch(plug_mgr, &event); + pme = (struct custom_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_OPENING); + EXPECT_STREQ(pme->data, "custom_event_plugin_custom_entry"); + // run evencb event_data.type = SESSION_EVENT_ORDPKT; plugin_manager_dispatch(plug_mgr, &event); + pme = (struct custom_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_ORDPKT); + EXPECT_STREQ(pme->data, "custom_event_plugin_custom_entry"); + // unrun evencb event_data.type = SESSION_EVENT_META; plugin_manager_dispatch(plug_mgr, &event); + pme = (struct custom_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_ORDPKT); + EXPECT_STREQ(pme->data, "custom_event_plugin_custom_entry"); + // run evencb event_data.type = SESSION_EVENT_CLOSING; plugin_manager_dispatch(plug_mgr, &event); + EXPECT_TRUE(stellar_session_get_plugin_ctx(&session) == nullptr); + // run evencb event_data.type = SESSION_EVENT_ALL; plugin_manager_dispatch(plug_mgr, &event); + EXPECT_TRUE(stellar_session_get_plugin_ctx(&session) == nullptr); plugin_manager_unload(plug_mgr); plugin_manager_destory(plug_mgr); } +#endif -TEST(PLUGIN_MANAGER_TEST, plugin_manager_dispatch_CUSTOM) +#if 1 +// ALL SESSION_EVENT can trigger event callback +TEST(PLUGIN_MANAGER_TEST, plugin_manager_dispatch_TCP) { - char prefix_path[] = "./"; + /* + * [SESSION_NAME.TCP] + * SESSION_EVENT_TYPE=["SESSION_EVENT_ALL"] + * SESSION_EVENT_CALLBACK="custom_event_plugin_tcp_entry" + */ + + struct tcp_session_pme + { + char data[64]; + int flags; + /* data */ + }; + struct tcp_session_pme *pme; + char file_path[] = "./plugins_config/plugins.inf"; - const char *session_name = "CUSTOM"; + const char *session_name = "TCP"; + struct stellar_session session; session.name = session_name; + struct stellar_session_event_data event_data; event_data.s = &session; event_data.plugin_ctx = NULL; // must be init to NULL + struct stellar_event event; event.session_event_data = &event_data; + session.event_data = &event_data; // must be set + struct plugin_manager *plug_mgr = plugin_manager_create(); EXPECT_TRUE(plug_mgr != nullptr); - EXPECT_TRUE(plugin_manager_load(plug_mgr, prefix_path, file_path) == 0); + EXPECT_TRUE(plugin_manager_load(plug_mgr, file_path) == 0); + // run evencb event_data.type = SESSION_EVENT_OPENING; plugin_manager_dispatch(plug_mgr, &event); + pme = (struct tcp_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_OPENING); + EXPECT_STREQ(pme->data, "tcp***"); + // run evencb event_data.type = SESSION_EVENT_RAWPKT; plugin_manager_dispatch(plug_mgr, &event); + pme = (struct tcp_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_RAWPKT); + EXPECT_STREQ(pme->data, "tcp***"); + + // run evencb + event_data.type = SESSION_EVENT_ORDPKT; + plugin_manager_dispatch(plug_mgr, &event); + pme = (struct tcp_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_ORDPKT); + EXPECT_STREQ(pme->data, "tcp***"); + + // run evencb + event_data.type = SESSION_EVENT_META; + plugin_manager_dispatch(plug_mgr, &event); + pme = (struct tcp_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_META); + EXPECT_STREQ(pme->data, "tcp***"); + + // run evencb + event_data.type = SESSION_EVENT_CLOSING; + plugin_manager_dispatch(plug_mgr, &event); + EXPECT_TRUE(stellar_session_get_plugin_ctx(&session) == nullptr); + + // run evencb + event_data.type = SESSION_EVENT_ALL; + plugin_manager_dispatch(plug_mgr, &event); + EXPECT_TRUE(stellar_session_get_plugin_ctx(&session) == nullptr); + + plugin_manager_unload(plug_mgr); + plugin_manager_destory(plug_mgr); +} +#endif + +#if 1 +// http_event_plugin_entry + SESSION_EVENT_RAWPKT ==> pm_session_dettach_me +TEST(PLUGIN_MANAGER_TEST, plugin_manager_dispatch_HTTP_dettach_me) +{ + /* + * [SESSION_NAME.HTTP] + * SESSION_EVENT_TYPE=["SESSION_EVENT_ALL"] + * SESSION_EVENT_CALLBACK="http_event_plugin_entry" + * + * [SESSION_NAME.HTTP] + * SESSION_EVENT_TYPE=["SESSION_EVENT_ALL"] + * SESSION_EVENT_CALLBACK="custom_event_plugin_http_entry" + */ + + struct http_session_pme + { + char data[64]; + int flags; + /* data */; + }; + + struct http_session_pme *pme = NULL; + char file_path[] = "./plugins_config/plugins.inf"; + + const char *session_name = "HTTP"; + + struct stellar_session session; + session.name = session_name; + + struct stellar_session_event_data event_data; + event_data.s = &session; + event_data.plugin_ctx = NULL; // must be init to NULL + + struct stellar_event event; + event.session_event_data = &event_data; + + session.event_data = &event_data; // must be set + + struct plugin_manager *plug_mgr = plugin_manager_create(); + EXPECT_TRUE(plug_mgr != nullptr); + EXPECT_TRUE(plugin_manager_load(plug_mgr, file_path) == 0); + + // run evencb + event_data.type = SESSION_EVENT_OPENING; + plugin_manager_dispatch(plug_mgr, &event); + pme = (struct http_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_OPENING); + EXPECT_STREQ(pme->data, "custom_event_plugin_http_entry"); + + // http_event_plugin_entry + SESSION_EVENT_RAWPKT ==> pm_session_dettach_me + event_data.type = SESSION_EVENT_RAWPKT; + plugin_manager_dispatch(plug_mgr, &event); + pme = (struct http_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_RAWPKT); + EXPECT_STREQ(pme->data, "custom_event_plugin_http_entry"); + + // run evencb + event_data.type = SESSION_EVENT_META; + plugin_manager_dispatch(plug_mgr, &event); + pme = (struct http_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_META); + EXPECT_STREQ(pme->data, "custom_event_plugin_http_entry"); + + // run evencb + event_data.type = SESSION_EVENT_CLOSING; + plugin_manager_dispatch(plug_mgr, &event); + EXPECT_TRUE(stellar_session_get_plugin_ctx(&session) == nullptr); + + // run evencb + event_data.type = SESSION_EVENT_ALL; + plugin_manager_dispatch(plug_mgr, &event); + EXPECT_TRUE(stellar_session_get_plugin_ctx(&session) == nullptr); + + plugin_manager_unload(plug_mgr); + plugin_manager_destory(plug_mgr); +} +#endif + +#if 1 +// http_event_plugin_entry + SESSION_EVENT_ORDPKT ==> pm_session_dettach_others +TEST(PLUGIN_MANAGER_TEST, plugin_manager_dispatch_HTTP_dettach_other) +{ + /* + * [SESSION_NAME.HTTP] + * SESSION_EVENT_TYPE=["SESSION_EVENT_ALL"] + * SESSION_EVENT_CALLBACK="http_event_plugin_entry" + * + * [SESSION_NAME.HTTP] + * SESSION_EVENT_TYPE=["SESSION_EVENT_ALL"] + * SESSION_EVENT_CALLBACK="custom_event_plugin_http_entry" + */ + + struct http_session_pme + { + char data[64]; + int flags; + /* data */; + }; + + struct http_session_pme *pme = NULL; + char file_path[] = "./plugins_config/plugins.inf"; + + const char *session_name = "HTTP"; + + struct stellar_session session; + session.name = session_name; + + struct stellar_session_event_data event_data; + event_data.s = &session; + event_data.plugin_ctx = NULL; // must be init to NULL + + struct stellar_event event; + event.session_event_data = &event_data; + + session.event_data = &event_data; // must be set + + struct plugin_manager *plug_mgr = plugin_manager_create(); + EXPECT_TRUE(plug_mgr != nullptr); + EXPECT_TRUE(plugin_manager_load(plug_mgr, file_path) == 0); + + // run evencb + event_data.type = SESSION_EVENT_OPENING; + plugin_manager_dispatch(plug_mgr, &event); + pme = (struct http_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_OPENING); + EXPECT_STREQ(pme->data, "custom_event_plugin_http_entry"); + // http_event_plugin_entry + SESSION_EVENT_ORDPKT ==> pm_session_dettach_others event_data.type = SESSION_EVENT_ORDPKT; plugin_manager_dispatch(plug_mgr, &event); + pme = (struct http_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_ORDPKT); + EXPECT_STREQ(pme->data, "http_event_plugin_entry"); + // run evencb event_data.type = SESSION_EVENT_META; plugin_manager_dispatch(plug_mgr, &event); + pme = (struct http_session_pme *)pm_session_get_plugin_pme(&session); + EXPECT_TRUE(pme->flags == SESSION_EVENT_META); + EXPECT_STREQ(pme->data, "http_event_plugin_entry"); + // run evencb event_data.type = SESSION_EVENT_CLOSING; plugin_manager_dispatch(plug_mgr, &event); + EXPECT_TRUE(stellar_session_get_plugin_ctx(&session) == nullptr); + // run evencb event_data.type = SESSION_EVENT_ALL; plugin_manager_dispatch(plug_mgr, &event); + EXPECT_TRUE(stellar_session_get_plugin_ctx(&session) == nullptr); plugin_manager_unload(plug_mgr); plugin_manager_destory(plug_mgr); } +#endif int main(int argc, char **argv) { diff --git a/src/plugin_manager/test/test_plugins/plugins_config/custom_event_plugin/custom_event_plugin.inf b/src/plugin_manager/test/test_plugins/plugins_config/custom_event_plugin/custom_event_plugin.inf index 26ba914..5df88aa 100644 --- a/src/plugin_manager/test/test_plugins/plugins_config/custom_event_plugin/custom_event_plugin.inf +++ b/src/plugin_manager/test/test_plugins/plugins_config/custom_event_plugin/custom_event_plugin.inf @@ -1,14 +1,19 @@ [PLUGINFO] -INIT_FUNC="custom_plugin_init" -EXIT_FUNC="custom_plugin_exit" +INIT_FUNC="custom_event_plugin_init" +EXIT_FUNC="custom_event_plugin_exit" +ERROR_FUNC="custom_event_plugin_error" LIBRARY_PATH="./test_plugins/plugins_library/custom_event_plugin_test.so" # Support SESSION_EVENT_TYPE: "SESSION_EVENT_OPENING", "SESSION_EVENT_RAWPKT", "SESSION_EVENT_ORDPKT", "SESSION_EVENT_META", "SESSION_EVENT_CLOSING", "SESSION_EVENT_ALL" [SESSION_NAME.TCP] SESSION_EVENT_TYPE=["SESSION_EVENT_ALL"] -SESSION_EVENT_CALLBACK="custom_plugin_tcp_entry" +SESSION_EVENT_CALLBACK="custom_event_plugin_tcp_entry" + +[SESSION_NAME.HTTP] +SESSION_EVENT_TYPE=["SESSION_EVENT_ALL"] +SESSION_EVENT_CALLBACK="custom_event_plugin_http_entry" [SESSION_NAME.CUSTOM] SESSION_EVENT_TYPE=["SESSION_EVENT_OPENING","SESSION_EVENT_ORDPKT","SESSION_EVENT_CLOSING"] -SESSION_EVENT_CALLBACK="custom_plugin_custom_entry"
\ No newline at end of file +SESSION_EVENT_CALLBACK="custom_event_plugin_custom_entry"
\ No newline at end of file diff --git a/src/plugin_manager/test/test_plugins/plugins_config/http_event_plugin/http_event_plugin.inf b/src/plugin_manager/test/test_plugins/plugins_config/http_event_plugin/http_event_plugin.inf index 1dd124b..cf0d16b 100644 --- a/src/plugin_manager/test/test_plugins/plugins_config/http_event_plugin/http_event_plugin.inf +++ b/src/plugin_manager/test/test_plugins/plugins_config/http_event_plugin/http_event_plugin.inf @@ -1,6 +1,7 @@ [PLUGINFO] INIT_FUNC="http_event_plugin_init" EXIT_FUNC="http_event_plugin_exit" +ERROR_FUNC="http_event_plugin_error" LIBRARY_PATH="./test_plugins/plugins_library/http_event_plugin_test.so" # Support SESSION_EVENT_TYPE: "SESSION_EVENT_OPENING", "SESSION_EVENT_RAWPKT", "SESSION_EVENT_ORDPKT", "SESSION_EVENT_META", "SESSION_EVENT_CLOSING", "SESSION_EVENT_ALL" diff --git a/src/plugin_manager/test/test_plugins/plugins_library/custom_event_plugin.cpp b/src/plugin_manager/test/test_plugins/plugins_library/custom_event_plugin.cpp index 0d7f1c4..fbeed57 100644 --- a/src/plugin_manager/test/test_plugins/plugins_library/custom_event_plugin.cpp +++ b/src/plugin_manager/test/test_plugins/plugins_library/custom_event_plugin.cpp @@ -2,9 +2,9 @@ #include "packet.h" #include "plugin.h" -#include <stddef.h> #include <stdlib.h> #include <stdio.h> +#include <string.h> static char *g_handler = NULL; @@ -13,30 +13,214 @@ static void *custom_decode(const char *payload, uint16_t len, void **pme) return NULL; } -extern "C" void custom_plugin_tcp_entry(const struct stellar_session *s, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) +struct tcp_session_pme { - char **per_session_pme = (char **)pme; + char data[64]; + int flags; + /* data */ +}; - printf("RUN custom_plugin_tcp_entry, event: %d\n", event); +struct custom_session_pme +{ + char data[64]; + int flags; + /* data */ +}; + +struct http_session_pme +{ + char data[64]; + int flags; + /* data */; +}; + +static struct tcp_session_pme *tcp_session_pme_create() +{ + struct tcp_session_pme *pme = (struct tcp_session_pme *)calloc(1, sizeof(struct tcp_session_pme)); + return pme; +} + +static void tcp_session_pme_destory(struct tcp_session_pme *pme) +{ + if (pme) + { + free(pme); + pme = NULL; + } +} + +static struct custom_session_pme *custom_session_pme_create() +{ + struct custom_session_pme *pme = (struct custom_session_pme *)calloc(1, sizeof(struct custom_session_pme)); + return pme; +} + +static void custom_session_pme_destory(struct custom_session_pme *pme) +{ + if (pme) + { + free(pme); + pme = NULL; + } +} + +static struct http_session_pme *http_session_pme_create() +{ + struct http_session_pme *pme = (struct http_session_pme *)calloc(1, sizeof(struct http_session_pme)); + return pme; +} + +static void http_session_pme_destory(struct http_session_pme *pme) +{ + if (pme) + { + free(pme); + pme = NULL; + } +} + +extern "C" void custom_event_plugin_error(const struct stellar_session *session, enum error_event_type event, void **pme) +{ + if (strcmp(stellar_session_get_name(session), "TCP") == 0) + { + struct tcp_session_pme **per_tcp_session_pme = (struct tcp_session_pme **)pme; + printf("RUN custom_event_plugin_error, session_name: 'TCP', error_event_type: %d, pme->data: %s\n", event, (*per_tcp_session_pme) == NULL ? "NULL" : (*per_tcp_session_pme)->data); + tcp_session_pme_destory(*per_tcp_session_pme); + } + + if (strcmp(stellar_session_get_name(session), "CUSTOM") == 0) + { + struct custom_session_pme **per_custom_session_pme = (struct custom_session_pme **)pme; + printf("RUN custom_event_plugin_error, session_name: 'CUSTOM', error_event_type: %d, pme->data: %s\n", event, (*per_custom_session_pme) == NULL ? "NULL" : (*per_custom_session_pme)->data); + custom_session_pme_destory(*per_custom_session_pme); + } + + if (strcmp(stellar_session_get_name(session), "HTTP") == 0) + { + struct http_session_pme **per_http_session_pme = (struct http_session_pme **)pme; + printf("RUN custom_event_plugin_error, session_name: 'HTTP', error_event_type: %d, pme->data: %s\n", event, (*per_http_session_pme) == NULL ? "NULL" : (*per_http_session_pme)->data); + http_session_pme_destory(*per_http_session_pme); + } +} + +extern "C" void custom_event_plugin_tcp_entry(const struct stellar_session *session, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) +{ + struct tcp_session_pme **per_tcp_session_pme = (struct tcp_session_pme **)pme; + + if (event & SESSION_EVENT_OPENING) + { + if (*per_tcp_session_pme == NULL) + { + struct tcp_session_pme *cur_ctx = tcp_session_pme_create(); + memcpy(cur_ctx->data, "tcp***", 6); + cur_ctx->flags = SESSION_EVENT_OPENING; + *per_tcp_session_pme = *&cur_ctx; + } + } - struct stellar_session_event_extras *info = (struct stellar_session_event_extras *)custom_decode(payload, len, pme); - struct stellar_session *new_session = session_manager_session_derive(s, "CUSTOM"); + if (event & SESSION_EVENT_RAWPKT) + { + (*per_tcp_session_pme)->flags = SESSION_EVENT_RAWPKT; + } + + if (event & SESSION_EVENT_ORDPKT) + { + (*per_tcp_session_pme)->flags = SESSION_EVENT_ORDPKT; + + struct stellar_session_event_extras *info = (struct stellar_session_event_extras *)custom_decode(payload, len, pme); + struct stellar_session *new_session = session_manager_session_derive(session, "CUSTOM"); - session_manager_trigger_event(new_session, SESSION_EVENT_OPENING, info); - session_manager_trigger_event(new_session, SESSION_EVENT_META, info); + session_manager_trigger_event(new_session, SESSION_EVENT_OPENING, info); + session_manager_trigger_event(new_session, SESSION_EVENT_META, info); + } + + if (event & SESSION_EVENT_META) + { + (*per_tcp_session_pme)->flags = SESSION_EVENT_META; + } + + if (event & SESSION_EVENT_CLOSING) + { + tcp_session_pme_destory(*per_tcp_session_pme); + *per_tcp_session_pme = NULL; + } } -extern "C" void custom_plugin_custom_entry(const struct stellar_session *s, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) +extern "C" void custom_event_plugin_custom_entry(const struct stellar_session *session, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) { - char **per_session_pme = (char **)pme; + struct custom_session_pme **per_custom_session_pme = (struct custom_session_pme **)pme; + + if (event & SESSION_EVENT_OPENING) + { + if (*per_custom_session_pme == NULL) + { + struct custom_session_pme *cur_ctx = custom_session_pme_create(); + memcpy(cur_ctx->data, "custom_event_plugin_custom_entry", strlen("custom_event_plugin_custom_entry")); + cur_ctx->flags = SESSION_EVENT_OPENING; + *per_custom_session_pme = *&cur_ctx; + } + } - printf("RUN custom_plugin_custom_entry, event: %d\n", event); + if (event & SESSION_EVENT_RAWPKT) + { + (*per_custom_session_pme)->flags = SESSION_EVENT_RAWPKT; + } + if (event & SESSION_EVENT_ORDPKT) + { + (*per_custom_session_pme)->flags = SESSION_EVENT_ORDPKT; + } + + if (event & SESSION_EVENT_META) + { + (*per_custom_session_pme)->flags = SESSION_EVENT_META; + } + + if (event & SESSION_EVENT_CLOSING) + { + custom_session_pme_destory(*per_custom_session_pme); + *per_custom_session_pme = NULL; + } } -extern "C" int custom_plugin_init(void) +extern "C" void custom_event_plugin_http_entry(const struct stellar_session *session, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) { - printf("RUN custom_plugin_init\n"); + struct http_session_pme **per_http_session_pme = (struct http_session_pme **)pme; + + if (event & SESSION_EVENT_OPENING) + { + if (*per_http_session_pme == NULL) + { + struct http_session_pme *cur_ctx = http_session_pme_create(); + memcpy(cur_ctx->data, "custom_event_plugin_http_entry", strlen("custom_event_plugin_http_entry")); + cur_ctx->flags = SESSION_EVENT_OPENING; + *per_http_session_pme = *&cur_ctx; + } + } + if (event & SESSION_EVENT_RAWPKT) + { + (*per_http_session_pme)->flags = SESSION_EVENT_RAWPKT; + } + + if (event & SESSION_EVENT_ORDPKT) + { + (*per_http_session_pme)->flags = SESSION_EVENT_ORDPKT; + } + + if (event & SESSION_EVENT_META) + { + (*per_http_session_pme)->flags = SESSION_EVENT_META; + } + + if (event & SESSION_EVENT_CLOSING) + { + http_session_pme_destory(*per_http_session_pme); + *per_http_session_pme = NULL; + } +} + +extern "C" int custom_event_plugin_init(void) +{ if (g_handler == NULL) { g_handler = (char *)malloc(1024); @@ -46,10 +230,8 @@ extern "C" int custom_plugin_init(void) return 0; } -extern "C" void custom_plugin_exit(void) +extern "C" void custom_event_plugin_exit(void) { - printf("RUN custom_plugin_exit\n"); - if (g_handler) { free(g_handler); diff --git a/src/plugin_manager/test/test_plugins/plugins_library/http_event_plugin.cpp b/src/plugin_manager/test/test_plugins/plugins_library/http_event_plugin.cpp index e41d8b6..487d6bf 100644 --- a/src/plugin_manager/test/test_plugins/plugins_library/http_event_plugin.cpp +++ b/src/plugin_manager/test/test_plugins/plugins_library/http_event_plugin.cpp @@ -4,63 +4,92 @@ #include <stdlib.h> #include <stdio.h> +#include <string.h> static char *g_handler = NULL; -struct per_session_pme_info +struct http_session_pme { - int flag; - char data[16]; + char data[64]; + int flags; + /* data */; }; -extern "C" void http_event_plugin_entry(const struct stellar_session *s, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) +static struct http_session_pme *http_session_pme_create() { - struct per_session_pme_info **per_session_pme = (struct per_session_pme_info **)pme; + struct http_session_pme *pme = (struct http_session_pme *)calloc(1, sizeof(struct http_session_pme)); + return pme; +} - printf("RUN http_event_plugin_entry, event: %d\n", event); +static void http_session_pme_destory(struct http_session_pme *pme) +{ + if (pme) + { + free(pme); + pme = NULL; + } +} + +extern "C" void http_event_plugin_error(const struct stellar_session *session, enum error_event_type event, void **pme) +{ + if (strcmp(stellar_session_get_name(session), "HTTP") == 0) + { + struct http_session_pme **per_http_session_pme = (struct http_session_pme **)pme; + printf("RUN http_event_plugin_error, session_name: 'HTTP', error_event_type: %d, pme->data: %s\n", event, (*per_http_session_pme) == NULL ? "NULL" : (*per_http_session_pme)->data); + http_session_pme_destory(*per_http_session_pme); + } +} + +extern "C" void http_event_plugin_entry(const struct stellar_session *session, enum session_event_type event, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) +{ + struct http_session_pme **per_http_session_pme = (struct http_session_pme **)pme; if (event & SESSION_EVENT_OPENING) { - if (*per_session_pme == NULL) + if (*per_http_session_pme == NULL) { - struct per_session_pme_info *cur_ctx = (struct per_session_pme_info *)malloc(sizeof(struct per_session_pme_info)); - snprintf(cur_ctx->data, 6, "******"); - *per_session_pme = *&cur_ctx; - printf("http_event_plugin_entry->opening_handler\n"); + struct http_session_pme *cur_ctx = http_session_pme_create(); + memcpy(cur_ctx->data, "http_event_plugin_entry", strlen("http_event_plugin_entry")); + cur_ctx->flags = SESSION_EVENT_OPENING; + *per_http_session_pme = *&cur_ctx; } } if (event & SESSION_EVENT_RAWPKT) { - printf("http_event_plugin_entry->rawpkt_handler\n"); + /* + * Note: pm_session_dettach_me() + * The plugin manager just set the skip flag and don't call this event callback next. + * Before calling pm_session_dettach_me, the current plugin must release related resources for the current session. + */ + http_session_pme_destory(*per_http_session_pme); + *per_http_session_pme = NULL; + pm_session_dettach_me(session); + return; } if (event & SESSION_EVENT_ORDPKT) { - printf("http_event_plugin_entry->ordpkt_handler\n"); + // TODO + (*per_http_session_pme)->flags = SESSION_EVENT_ORDPKT; + pm_session_dettach_others(session); } if (event & SESSION_EVENT_META) { - printf("http_event_plugin_entry->meta_handler\n"); + // TODO + (*per_http_session_pme)->flags = SESSION_EVENT_META; } if (event & SESSION_EVENT_CLOSING) { - if (*per_session_pme) - { - printf("http_event_plugin_entry->closing_hanler\n"); - - free(*per_session_pme); - *per_session_pme = NULL; - } + http_session_pme_destory(*per_http_session_pme); + *per_http_session_pme = NULL; } } extern "C" int http_event_plugin_init(void) { - printf("RUN http_event_plugin_init\n"); - if (g_handler == NULL) { g_handler = (char *)malloc(1024); @@ -72,8 +101,6 @@ extern "C" int http_event_plugin_init(void) extern "C" void http_event_plugin_exit(void) { - printf("RUN http_event_plugin_exit\n"); - if (g_handler) { free(g_handler); diff --git a/src/protocol_decoder/http/http.cpp b/src/protocol_decoder/http/http.cpp index b3a9205..b24fffd 100644 --- a/src/protocol_decoder/http/http.cpp +++ b/src/protocol_decoder/http/http.cpp @@ -7,4 +7,8 @@ void http_decoder(const struct stellar_session *s, enum session_event_type event session_manager_trigger_event(new_session, SESSION_EVENT_OPENING, info); session_manager_trigger_event(new_session, SESSION_EVENT_META, info); +} + +void http_error_cb(const struct stellar_session *s, enum error_event_type event, void **pme) +{ }
\ No newline at end of file diff --git a/src/session_manager/session_manager.cpp b/src/session_manager/session_manager.cpp index 7ea5643..91e2405 100644 --- a/src/session_manager/session_manager.cpp +++ b/src/session_manager/session_manager.cpp @@ -35,7 +35,7 @@ struct stellar_event *session_manager_fetch_event(struct session_manager *h) } /****************************************************************************** - * API: between stellar_event and plugin_manager + * stellar_event API For Plugin Manager ******************************************************************************/ struct session_plugin_ctx *stellar_event_get_plugin_ctx(struct stellar_event *event) @@ -80,3 +80,22 @@ uint16_t stellar_event_get_payload_length(struct stellar_event *event) { return 0; } + +/****************************************************************************** + * stellar_session API For Plugin Manager + ******************************************************************************/ + +struct session_plugin_ctx *stellar_session_get_plugin_ctx(const struct stellar_session *session) +{ + struct stellar_session_event_data *evdata = session->event_data; + return evdata->plugin_ctx; +} + +/****************************************************************************** + * stellar_session API For Plugin + ******************************************************************************/ + +const char *stellar_session_get_name(const struct stellar_session *session) +{ + return session->name; +}
\ No newline at end of file diff --git a/src/session_manager/session_manager.h b/src/session_manager/session_manager.h index 1bef25f..ec8ac60 100644 --- a/src/session_manager/session_manager.h +++ b/src/session_manager/session_manager.h @@ -22,10 +22,11 @@ struct stellar_session const char *name; void *addr; void *data; + struct stellar_session_event_data *event_data; }; /****************************************************************************** - * API: between stellar_event and plugin_manager + * stellar_event API For Plugin Manager ******************************************************************************/ struct session_plugin_ctx *stellar_event_get_plugin_ctx(struct stellar_event *event); @@ -37,4 +38,10 @@ const struct stellar_session *stellar_event_get_session(struct stellar_event *ev struct stellar_packet *stellar_event_get_packet(struct stellar_event *event); const char *stellar_event_get_payload(struct stellar_event *event); -uint16_t stellar_event_get_payload_length(struct stellar_event *event);
\ No newline at end of file +uint16_t stellar_event_get_payload_length(struct stellar_event *event); + +/****************************************************************************** + * stellar_session API For Plugin Manager + ******************************************************************************/ + +struct session_plugin_ctx *stellar_session_get_plugin_ctx(const struct stellar_session *session);
\ No newline at end of file |
