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 78107e1..479d474 100644 --- a/sdk/example/plugins/custom_event_plugin/custom_event_plugin.inf +++ b/sdk/example/plugins/custom_event_plugin/custom_event_plugin.inf @@ -1,13 +1,16 @@ [PLUGINFO] INIT_FUNC=custom_plugin_init -DESTROY_FUNC=custom_plugin_destroy -LIBARY_PATH=./plugins/custom_event_plugin/custom_event_plugin.so +EXIT_FUNC=custom_plugin_exit +LIBRARY_PATH=./plugins/custom_event_plugin/custom_event_plugin.so +# Support SESSION_EVENT_TYPE +# OPENING,RAWPKT,ORDPKT,META,CLOSING,ALL + [SESSION_TYPE.TCP] SESSION_EVENT_TYPE=ALL SESSION_EVENT_CALLBACK=custom_plugin_entry [SESSION_TYPE.CUSTOM_A] -SESSION_EVENT_TYPE=ALL +SESSION_EVENT_TYPE=OPENING,ORDPKT,CLOSING SESSION_EVENT_CALLBACK=custom_event_plugin_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 62b7a4a..4609300 100644 --- a/sdk/example/plugins/http_event_plugin/http_event_plugin.inf +++ b/sdk/example/plugins/http_event_plugin/http_event_plugin.inf @@ -1,9 +1,8 @@ [PLUGINFO] INIT_FUNC=http_event_plugin_init -DESTROY_FUNC=http_event_plugin_destroy -LIBARY_PATH=./plugins/http_event_plugin/http_event_plugin.so +EXIT_FUNC=http_event_plugin_exit +LIBRARY_PATH=./plugins/http_event_plugin/http_event_plugin.so - -[SESSION_TYPE_HTTP] +[SESSION_TYPE.HTTP] SESSION_EVENT_TYPE=ALL SESSION_EVENT_CALLBACK=http_event_plugin_entry \ No newline at end of file diff --git a/sdk/include/http.h b/sdk/include/http.h index 62b1fbd..d7f3fbf 100644 --- a/sdk/include/http.h +++ b/sdk/include/http.h @@ -3,4 +3,4 @@ #include "packet.h" #include "session.h" -int http_decoder(const struct stellar_session *s, int what, struct stellar_packet *p, const char *payload, uint32_t len, void **pme); +void http_decoder(const struct stellar_session *s, int what, struct stellar_packet *p, const char *payload, uint16_t len, void **pme); \ No newline at end of file diff --git a/sdk/include/plugin.h b/sdk/include/plugin.h index 11d55cc..ac3b279 100644 --- a/sdk/include/plugin.h +++ b/sdk/include/plugin.h @@ -2,5 +2,8 @@ #include "session.h" +typedef int plugin_init_callback(void **pme); +typedef void plugin_exit_callback(void *pme); + void plugin_remove_from_session_event(struct stellar_event *ev, struct stellar_session *s); \ No newline at end of file diff --git a/sdk/include/session.h b/sdk/include/session.h index e2ed19e..b497fab 100644 --- a/sdk/include/session.h +++ b/sdk/include/session.h @@ -23,22 +23,22 @@ enum stellar_session_type SESSION_TYPE_MAX, }; -enum stellar_session_event_type +enum session_event_type { - SESSION_EVENT_OPENING = 1<<1, - SESSION_EVENT_RAW_PKT = 1<<2, - SESSION_EVENT_ORDERED_PKT = 1<<3, - SESSION_EVENT_META = 1<<4, - SESSION_EVENT_TIMEOUT = 1<<5, - SESSION_EVENT_CLOSING = 1<<6, + SESSION_EVENT_OPENING = (0x01 << 1), + SESSION_EVENT_RAWPKT = (0x01 << 2), + SESSION_EVENT_ORDPKT = (0x01 << 3), + SESSION_EVENT_META = (0x01 << 4), + SESSION_EVENT_CLOSING = (0x01 << 5), + SESSION_EVENT_ALL = (0x01 << 1 | 0x01 << 2 | 0x01 << 3 | 0x01 << 4 | 0x01 << 5), }; struct stellar_session_event_extras; -typedef int (*fn_session_event_callback)(const struct stellar_session *s, int what, struct stellar_packet *p, const char *payload, uint32_t len, void **pme); +typedef void (fn_session_event_callback)(const struct stellar_session *s, int what, struct stellar_packet *p, const char *payload, uint16_t len, void **pme); void session_manager_trigger_event(struct stellar_session *s, - stellar_session_event_type type, + enum session_event_type type, struct stellar_session_event_extras *info); struct stellar_session *session_manager_session_derive(const struct stellar_session *this_session, diff --git a/src/main.cpp b/src/main.cpp index 891300a..5071278 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -56,12 +56,14 @@ int main(int argc, char ** argv) { //manager_init struct session_manager *session_mgr = session_manager_init(); - struct plugin_manager *plug_mgr = plugin_manager_init(); + struct plugin_manager *plug_mgr = plugin_manager_create(); + + // register build-in plugin + plugin_manager_register(plug_mgr, "HTTP", http_decoder); - //register build-in plugin - plugin_manager_event_register(plug_mgr, "HTTP", http_decoder, nullptr); // load external plugins - plugin_manager_load("./plugins.inf"); + char absolute_plugin_file[] = "/op/tsg/sapp/plug/plugins.inf"; + plugin_manager_load(plug_mgr, absolute_plugin_file); //packet_io_init struct packet_io_device *dev = packet_io_init(1, "stellar", "cap0"); @@ -75,6 +77,8 @@ int main(int argc, char ** argv) /* main loop code */ usleep(1); } + + plugin_manager_destory(plug_mgr); return 0; } diff --git a/src/plugin_manager/plugin_manager.cpp b/src/plugin_manager/plugin_manager.cpp index 4fba201..1755cc4 100644 --- a/src/plugin_manager/plugin_manager.cpp +++ b/src/plugin_manager/plugin_manager.cpp @@ -1,97 +1,153 @@ -#include -#include - #include "deps/uthash/uthash.h" #include "sdk/include/session.h" +#include "sdk/include/plugin.h" #include "session_manager.h" +#include "plugin_manager.h" -#if 0 -struct session_event_callback +#include +#include + +/****************************************************************************** + * CallBack Static Hash Table (For Global) + ******************************************************************************/ + +struct session_event_callback_static { - const char *session_name; - fn_session_event_callback callback; - TAILQ_ENTRY(session_event_callback) entries; - UT_hash_handle hh; + enum session_event_type event; + fn_session_event_callback *callback; }; -TAILQ_HEAD(session_event_callback_list, session_event_callback); - -struct session_event_callback_map +/* + * Hast table + * + * key: string -> session_type + * val: array -> event_cbs + */ +struct managed_session_event_callback { - struct session_event_callback_list session_ev_cb_list; - UT_hash_handle hh; + char session_type[16]; + struct session_event_callback_static event_cbs[0]; // dynamic array + // Record the number of callback functions that want to process the current session + int event_cbs_num; + UT_hash_handle hh; +}; + +/****************************************************************************** + * CallBack Runtime Array (For Per Session) + ******************************************************************************/ + +struct session_event_callback_runtime +{ + int skip; // for skip this plugin callback + void *callback_args; + + enum session_event_type event; + fn_session_event_callback *callback; +}; + +struct session_plugin_ctx +{ + int event_cbs_num; + struct session_event_callback_runtime event_cbs[0]; // dynamic array +}; + +/****************************************************************************** + * struct plugin_manager + ******************************************************************************/ + +/* + * Each plugin has an init_cb and an exit_cb, but may have multiple entry_cb. + * entry_cb is stored in the global_session_callback_ctx. + */ +struct plugin_ctx +{ + char *name; + char *library; + /* + * Stores the context generated by the plugin initialization, + * which is used to release resources when the plugin ends. + */ + void *pme; + plugin_init_callback *init_cb; + plugin_exit_callback *exit_cb; }; struct plugin_manager { - struct session_event_callback_list fixed_event_cbs[SESSION_TYPE_MAX]; - struct session_event_callback_map *session_ev_cb_map; + struct managed_session_event_callback *cb_table; + struct plugin_ctx plugins[MAX_PLUGIN_NUM]; }; -#endif +/****************************************************************************** + * Private API + ******************************************************************************/ -struct stellar_plugin_ctx +static void plugin_manager_handle_opening_event(struct plugin_manager *plug_mgr, struct stellar_event *event) { - void *call_back_arg; - const struct timeval timeout; - fn_session_event_callback call_back; - TAILQ_ENTRY(stellar_plugin_ctx) tqe; -}; - -TAILQ_HEAD(stellar_plugin_ctx_list, stellar_plugin_ctx); - -struct stellar_plugin_data -{ - stellar_plugin_ctx_list plugin_ctx_list; -}; - -struct plugin_manager_handle *plugin_manager_init() -{ - return nullptr; } -int plugin_manager_load(const char *plugin_conf_path) +static void plugin_manager_handle_data_event(struct plugin_manager *plug_mgr, struct stellar_event *event) +{ +} + +static void plugin_manager_handle_closing_event(struct plugin_manager *plug_mgr, struct stellar_event *event) +{ +} + +/****************************************************************************** + * Public API + ******************************************************************************/ + +struct plugin_manager *plugin_manager_create() +{ + struct plugin_manager *plug_mgr = NULL; + + return plug_mgr; +} + +void plugin_manager_destory(struct plugin_manager *plug_mgr) +{ + if (plug_mgr) + { + } +} + +int plugin_manager_load(struct plugin_manager *plug_mgr, const char *plugin_file) { return 0; } -int plugin_manager_event_register(struct plugin_manager *h, - const char *session_type_name, - fn_session_event_callback call_back, - const struct timeval *timeout) +void plugin_manager_unload(struct plugin_manager *plug_mgr) +{ +} + +int plugin_manager_register(struct plugin_manager *plug_mgr, const char *session_type, fn_session_event_callback *callback) { return 0; } -void plugin_manager_dispatch(struct plugin_manager *h, struct stellar_event *event) +void plugin_manager_dispatch(struct plugin_manager *plug_mgr, struct stellar_event *event) { -#if 0 - struct session *s = container_of(event, struct session, cur_ev); - struct session_event_callback_map *t_map; - struct session_event_callback *session_ev_cb; - HASH_FIND(hh, g_plug_mgr.session_ev_cb_map, s->name, strlen(s->name), t_map); - if(!t_map) return; - switch (s->state) + assert(event); + struct stellar_session_event_data *event_data = event->session_event_data; + assert(event_data); + session_event_type type = event_data->type; + + switch (type) { case SESSION_EVENT_OPENING: - TAILQ_FOREACH(session_ev_cb, &t_map->session_ev_cb_list, session_event_cb_tq_entries) - { - struct session_event *ev = ALLOC(struct session_event, 1); - ev->callback = session_ev_cb->callback; - ev->callback(s, SESSION_EVENT_OPENING, NULL, NULL, 0, &ev->cb_pme); - if(ev->state == 1) - { - TAILQ_INSERT_TAIL(&s->ev_list, ev, session_event_tq_entries); - } - else - { - FREE(&ev);// TODO; - } - } + plugin_manager_handle_opening_event(plug_mgr, event); + break; + case SESSION_EVENT_RAWPKT: /* fall through */ + case SESSION_EVENT_ORDPKT: /* fall through */ + case SESSION_EVENT_META: /* fall through */ + plugin_manager_handle_data_event(plug_mgr, event); + break; + case SESSION_EVENT_CLOSING: + plugin_manager_handle_closing_event(plug_mgr, event); break; default: + // TODO log error break; } -#endif - return; } \ No newline at end of file diff --git a/src/plugin_manager/plugin_manager.h b/src/plugin_manager/plugin_manager.h index cfe2905..f6a12a3 100644 --- a/src/plugin_manager/plugin_manager.h +++ b/src/plugin_manager/plugin_manager.h @@ -1,20 +1,20 @@ #pragma once - - #include "sdk/include/session.h" -#include "sdk/include/plugin.h" +#define MAX_PLUGIN_NUM 256 +struct per_session_event_cbs; struct plugin_manager; -struct plugin_manager *plugin_manager_init(); -int plugin_manager_event_register(struct plugin_manager *h, - const char *session_type_name, - fn_session_event_callback call_back, - const struct timeval *timeout); +struct plugin_manager *plugin_manager_create(); +void plugin_manager_destory(struct plugin_manager *plug_mgr); -int plugin_manager_load(const char *plugin_conf_path); +// return 0: success +// return -1: error +int plugin_manager_load(struct plugin_manager *plug_mgr, const char *plugin_file); +void plugin_manager_unload(struct plugin_manager *plug_mgr); -void plugin_manager_dispatch(struct plugin_manager *h, struct stellar_event *ev); \ No newline at end of file +int plugin_manager_register(struct plugin_manager *plug_mgr, const char *session_type, fn_session_event_callback *callback); +void plugin_manager_dispatch(struct plugin_manager *plug_mgr, struct stellar_event *event); \ No newline at end of file diff --git a/src/protocol_decoder/http/http.cpp b/src/protocol_decoder/http/http.cpp index 13fd4d6..408f149 100644 --- a/src/protocol_decoder/http/http.cpp +++ b/src/protocol_decoder/http/http.cpp @@ -1,13 +1,12 @@ #include "http.h" #include "session_manager.h" -int http_decoder(const struct stellar_session *s, int what, struct stellar_packet *p, const char *payload, uint32_t len, void **pme) +void http_decoder(const struct stellar_session *s, int what, struct stellar_packet *p, const char *payload, uint16_t len, void **pme) { struct stellar_session_event_extras *info; struct stellar_session *new_session=session_manager_session_derive(s, "HTTP"); session_manager_trigger_event(new_session, SESSION_EVENT_OPENING, info); session_manager_trigger_event(new_session, SESSION_EVENT_META, info); - return 0; } int http_peek(const struct stellar_session *s, const char *payload, uint32_t len) diff --git a/src/session_manager/session_manager.cpp b/src/session_manager/session_manager.cpp index ff10c3e..ab70071 100644 --- a/src/session_manager/session_manager.cpp +++ b/src/session_manager/session_manager.cpp @@ -12,7 +12,7 @@ struct session_manager *session_manager_init() void session_manager_trigger_event(struct stellar_session *s, - stellar_session_event_type type, + enum session_event_type type, struct stellar_session_event_extras *info) { return; diff --git a/src/session_manager/session_manager.h b/src/session_manager/session_manager.h index 047d8c5..6d17e79 100644 --- a/src/session_manager/session_manager.h +++ b/src/session_manager/session_manager.h @@ -2,14 +2,14 @@ #include "sdk/include/session.h" -struct stellar_plugin_data; +struct per_session_evcb_runtime_ctx; struct stellar_session_event_data { struct stellar_session *s; - stellar_session_event_type type; + enum session_event_type type; long last_active; - struct stellar_plugin_data *plugin_data; + struct session_plugin_ctx *plugin_ctx; }; struct session_manager; @@ -18,6 +18,10 @@ struct session_manager *session_manager_init(); struct stellar_event *session_manager_commit(struct session_manager *session_mgr, struct stellar_packet *pkt); struct stellar_event *session_manager_fetch_event(struct session_manager *session_mgr); +// interfaces for data interaction between stellar event and plugin manager +struct session_plugin_ctx *stellar_event_get_plugin_ctx(struct stellar_event *event); +void stellar_event_set_plugin_ctx(struct stellar_event *event, struct session_plugin_ctx *plugin_ctx); + struct stellar_session { stellar_session_type type;