diff options
Diffstat (limited to 'src/flowood_main.c')
| -rw-r--r-- | src/flowood_main.c | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/flowood_main.c b/src/flowood_main.c new file mode 100644 index 0000000..7deb452 --- /dev/null +++ b/src/flowood_main.c @@ -0,0 +1,155 @@ +#include "flowood.h" +#include "flowood_fun.h" +#include "MESA_handle_logger.h" +#include "MESA_prof_load.h" +#include <assert.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <unistd.h> +#include <pthread.h> + +/* + IP����ϵͳ, + ģ�鿪������: flowood, + IP����ϵͳ�IJ�����Ϊ��Դ�ڳ���"�ƻ���ľ", flower->wood, ƴ�ճ�һ����: flowood. +*/ + +int flowood_version_VERSION_20181019; + +flwd_global_val_t flwd_global_val; /* ȫ�ֱ��� */ +flwd_global_cfg_t flwd_cfg_val; /* ���ò��� */ +flwd_global_thread_t flwd_thread_val[FLWD_MAX_THREAD_NUM]; + +/* + ���ֲ����ļ��, ��ֹ������������, ������д��! +*/ +static int flwd_validity_check(void) +{ + if((sizeof(flwd_global_thread_t) % 64) != 0){ + printf("sizeof(flwd_global_thread_t) size is %u, % 64 is %u\n", sizeof(flwd_global_thread_t) , sizeof(flwd_global_thread_t) % 64); + abort(); + } + + /* NOTE: �������껹���������±�, ����һ��trick, �����0��ʼ, �������ⶨ��, ���˾���! */ + assert(FLWD_IP_ADDR_TYPE_V4 == 0); + assert(FLWD_IP_ADDR_TYPE_V6 == 1); + + /* NOTE: �������껹���������±�, �����0��ʼ, �������ⶨ��, ���˾���! */ + assert(FLWD_IP_REGION_INLAND == 0); + assert(FLWD_IP_REGION_OUTLAND == 1); + + assert(flwd_cfg_val.current_access_gateway_id <= flwd_cfg_val.global_access_gateway_num); + + assert(flwd_cfg_val.current_access_gateway_id <= 4); /* ���֧��4̨, ��FLWD_SPORT_ACC_ID_MASK���� */ + + return 0; +} + +static void flwd_run(void) +{ + flwd_log(RLOG_LV_DEBUG, "flowood ready to run......"); + + flwd_packet_io_run(); +} + +static int flwd_init(void) +{ + int i, ret, int_tmp; + int log_level; + pthread_t pid; + + flwd_validity_check(); + + memset((void *)&flwd_global_val.zero_ipv6_addr, 0, sizeof(struct in6_addr)); + memset((void *)&flwd_global_val.zero_mac_addr, 0, 6); + + MESA_load_profile_int_def(FLWD_CONFIG_FILE, "log", "log_level", &flwd_cfg_val.flwd_log_level, 20); + + flwd_global_val.flwd_log_handle = MESA_create_runtime_log_handle("./log/ip_reuse.log", log_level); + flwd_global_val.maat_log_handle = MESA_create_runtime_log_handle("./log/ip_reuse_maat.log", log_level); + + MESA_load_profile_int_def(FLWD_CONFIG_FILE, "main", "thread_num", &int_tmp, 1); + if(int_tmp < 1 || int_tmp > FLWD_MAX_THREAD_NUM){ + flwd_log(RLOG_LV_FATAL, "conf->thread_num invalid!"); + return -1; + } + flwd_cfg_val.tot_thread_count = int_tmp; + for(i = 0; i < __TOPO_MODE_MAX; i++){ + flwd_global_val.global_io_handle[i].tot_thread_count = int_tmp; + } + + MESA_load_profile_int_def(FLWD_CONFIG_FILE, "main", "global_access_gateway_num", &flwd_cfg_val.global_access_gateway_num, 1); + MESA_load_profile_int_def(FLWD_CONFIG_FILE, "main", "current_access_gateway_id", &flwd_cfg_val.current_access_gateway_id, 1); + if(flwd_cfg_val.current_access_gateway_id <= 0 || flwd_cfg_val.current_access_gateway_id > flwd_cfg_val.global_access_gateway_num){ + flwd_log(RLOG_LV_FATAL, "conf->current_access_gateway_id invalid!"); + return -1; + } + + MESA_load_profile_int_def(FLWD_CONFIG_FILE, "main", "use_static_pool_ip_if_no_dynamic", &flwd_cfg_val.use_static_pool_ip_if_no_dynamic, 0); + MESA_load_profile_int_def(FLWD_CONFIG_FILE, "main", "use_dynamic_pool_ip_if_no_static", &flwd_cfg_val.use_dynamic_pool_ip_if_no_static, 0); + + ret = flwd_gateway_init(); + if(ret < 0){ + return -1; + } + + ret = flwd_arp_table_init(); + if(ret < 0){ + return -1; + } + + pthread_create(&pid, NULL, flwd_stat_thread, NULL); + + return 0; +} + + +#if FLWD_RUN_AS_SAPP_PLUG && COMPILE_FORWARD +#ifdef __cplusplus +extern "C" { +#endif + +/* ת�������Բ����ʽ���ص�sapp */ +int IR_FWD_INIT(void) +{ + int ret; + + ret = flwd_init(); + if(ret < 0){ + return -1; + } + + flwd_log(RLOG_LV_DEBUG, "flwd_init() success!"); + + flwd_run(); + + return 0; +} +#ifdef __cplusplus +} +#endif + +#else +int main(void) +{ + int ret; + + ret = flwd_init(); + if(ret < 0){ + return -1; + } + + flwd_log(RLOG_LV_DEBUG, "flwd_init() success!"); + + flwd_run(); + + while(1){ + pause(); + } + + return 0; +} +#endif + + |
