summaryrefslogtreecommitdiff
path: root/src/flowood_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/flowood_main.c')
-rw-r--r--src/flowood_main.c155
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
+
+