summaryrefslogtreecommitdiff
path: root/src/lua_module_manage.c
blob: 35848a9f672059ebaec6b2f1b07597ad597ae314 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "lua_module_manage_internal.h"
#include "lua_binding_function.h"

#include "stellar/utils.h"

#define GLOBAL_BASIC_SPACE_NAME "lua_module_manager_space"
#define MQ_SCHEMA_SPACE_NAME "mq_schema_space"
#define MQ_RUNTIME_SPACE_NAME "mq_runtime_space"
#define MODULE_MANAGER_SPACE_NAME "stellar_module_manager_space"
#define PACKET_SPACE_NAME "packet_space"
#define PACKET_MANAGER_SPACE_NAME "packet_manager_space"
#define SESSION_SPACE_NAME "session_space"
#define SESSION_MANAGER_SPACE_NAME "session_manager_space"

struct lua_state_cbind_func_spec lua_bind_function[] = {
    {lua_get_lua_module_manager, GLOBAL_BASIC_SPACE_NAME, "get_lua_module_manager"},
    {lua_get_stellar_module_manager, GLOBAL_BASIC_SPACE_NAME, "get_stellar_module_manager"},
    {lua_get_mq_schema, GLOBAL_BASIC_SPACE_NAME, "get_mq_schema"},
    {lua_get_mq_runtime, GLOBAL_BASIC_SPACE_NAME, "get_mq_runtime"},
    {lua_get_logger, GLOBAL_BASIC_SPACE_NAME, "get_logger"},
    {lua_get_packet_manager, GLOBAL_BASIC_SPACE_NAME, "get_pacekt_manager"},
    {lua_get_session_manager, GLOBAL_BASIC_SPACE_NAME, "get_session_manager"},
    {lua_get_current_thread_id, GLOBAL_BASIC_SPACE_NAME, "get_current_thread_id"},
    {lua_get_max_thread_num, GLOBAL_BASIC_SPACE_NAME, "get_max_thread_num"},

    {lua_mq_schema_get_topic_id, MQ_SCHEMA_SPACE_NAME, "get_topic_id"},
    {lua_mq_schema_create_topic, MQ_SCHEMA_SPACE_NAME, "create_topic"},
    {lua_mq_schema_update_topic, MQ_SCHEMA_SPACE_NAME, "update_topic"},
    {lua_mq_shcema_destory_topic, MQ_SCHEMA_SPACE_NAME, "destory_topic"},
    {lua_mq_schema_subscribe, MQ_SCHEMA_SPACE_NAME, "subcribe"},
    {lua_mq_runtime_publish_message, MQ_RUNTIME_SPACE_NAME, "publish_message"},

    {lua_packet_get_direction, PACKET_SPACE_NAME, "get_direction"},
    {lua_packet_get_payload, PACKET_SPACE_NAME, "get_payload"},
    {lua_packet_get_payload_len, PACKET_SPACE_NAME, "get_payload_len"},

    {lua_packet_manager_subscribe, PACKET_MANAGER_SPACE_NAME, "subscribe"},

    {lua_session_get0_current_packet, SESSION_SPACE_NAME, "get0_current_payload"},

    {lua_session_manager_subscribe_tcp, SESSION_MANAGER_SPACE_NAME, "subscribe_tcp"},
    {lua_session_manager_subscribe_udp, SESSION_MANAGER_SPACE_NAME, "subscribe_udp"},
    {lua_session_manager_subscribe_control_packet, SESSION_MANAGER_SPACE_NAME, "subscribe_control_packet"},
    {lua_session_manager_subscribe_tcp_stream, SESSION_MANAGER_SPACE_NAME, "subscribe_tcp_stream"},
    {NULL, NULL, NULL},
};

#define ENUM_PACKET_STAGE_SPACE_NAME "packet_stage"

struct lua_state_cbind_data_spec lua_bind_data[] = {
    {DATATYPE_INT, "0", ENUM_PACKET_STAGE_SPACE_NAME, "prerouting"},
    {DATATYPE_INT, "1", ENUM_PACKET_STAGE_SPACE_NAME, "input"},
    {DATATYPE_INT, "2", ENUM_PACKET_STAGE_SPACE_NAME, "forward"},
    {DATATYPE_INT, "3", ENUM_PACKET_STAGE_SPACE_NAME, "output"},
    {DATATYPE_INT, "4", ENUM_PACKET_STAGE_SPACE_NAME, "postrouting"},
    {DATATYPE_END, NULL, NULL, NULL},
};

struct stellar_module *lua_module_manager_on_init(struct stellar_module_manager *mod_mgr)
{
    struct lua_module_manager *new_lua_mod_mgr = lua_module_manager_new(mod_mgr);
    if (lua_module_manager_state_create(
            new_lua_mod_mgr,
            lua_bind_function,
            sizeof(lua_bind_function) / sizeof(struct lua_state_cbind_func_spec),
            lua_bind_data,
            sizeof(lua_bind_data) / sizeof(struct lua_state_cbind_data_spec)))
        goto err;

    if (lua_module_manager_load_config(new_lua_mod_mgr, LUA_MODULE_MANAGE_CONF_PATH))
        goto err;

    if (lua_module_manager_call_init(new_lua_mod_mgr))
        goto err;

    if (lua_module_manager_duplicate_state(new_lua_mod_mgr))
        goto err;

    struct stellar_module *module = stellar_module_new(LUA_MODULE_MANAGE_MODULE_NAME, (void *)new_lua_mod_mgr);
    return module;
err:
    lua_module_manager_free(new_lua_mod_mgr);
    return NULL;
}

void lua_module_manager_on_exit(struct stellar_module_manager *mod_mgr __unused, struct stellar_module *mod)
{
    if (mod)
    {
        struct lua_module_manager *lua_mod_mgr = (struct lua_module_manager *)stellar_module_get_ctx(mod);
        lua_module_manager_free(lua_mod_mgr);
        stellar_module_free(mod);
    }
    return;
}