summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlijie <[email protected]>2018-11-16 20:43:08 +0800
committerlijie <[email protected]>2018-11-16 20:43:08 +0800
commitb61723f018870507100d28c7671e3b6b7baa1e18 (patch)
treeb34d2be5ef855f5f744dc2c090303ef009e2349c
parent1d1886131c234808451d0cf07429742000377f6f (diff)
sapp可以运行,但是存在初始化顺序问题
-rw-r--r--bin/conf/all_ip_only_coun_v4.mmdbbin0 -> 4496685 bytes
-rw-r--r--bin/conf/mrl.conf42
-rw-r--r--bin/conf/mrl.inf13
-rw-r--r--bin/conf/table_info.conf4
-rw-r--r--bin/mrl.sobin0 -> 89144 bytes
-rw-r--r--include/mrl_main.h33
-rw-r--r--include/mrl_packet.h7
-rw-r--r--include/mrl_redis.h1
-rw-r--r--include/mrl_utils.h37
-rw-r--r--src/Makefile15
-rw-r--r--src/mrl.sobin0 -> 88928 bytes
-rw-r--r--src/mrl_main.c120
-rw-r--r--src/mrl_main.obin0 -> 47664 bytes
-rw-r--r--src/mrl_packet.c147
-rw-r--r--src/mrl_packet.obin0 -> 36104 bytes
-rw-r--r--src/mrl_redis.c126
-rw-r--r--src/mrl_redis.obin0 -> 45856 bytes
-rw-r--r--src/mrl_utils.c93
-rw-r--r--src/mrl_utils.obin0 -> 22040 bytes
19 files changed, 452 insertions, 186 deletions
diff --git a/bin/conf/all_ip_only_coun_v4.mmdb b/bin/conf/all_ip_only_coun_v4.mmdb
new file mode 100644
index 0000000..6c52c52
--- /dev/null
+++ b/bin/conf/all_ip_only_coun_v4.mmdb
Binary files differ
diff --git a/bin/conf/mrl.conf b/bin/conf/mrl.conf
index 624e519..58ee390 100644
--- a/bin/conf/mrl.conf
+++ b/bin/conf/mrl.conf
@@ -2,32 +2,30 @@
log_level=20
log_path=./log/mrl.log
[SOCK_INFO]
-mrl_port=8000
-mgw_port=8001
-mgw_ip=127.0.0.1
+mrl_port=23456
+mgw_port=33456
+mgw_ip=192.168.11.137
+mrl_ip=192.168.11.242
[MAAT_INFO]
-Maat_table_path=./conf/table_info.conf
-Maat_max_threads=2
+Maat_table_path=./mrl_conf/table_info.conf
+Maat_max_threads=1
Maat_redis_ip=192.168.10.180
Maat_redis_port=26379
Maat_stat_path=./log/Maat_stat.log
[HTABLE_INFO]
-ht_slots=100000
-ht_max_element_num=1000
+ht_slots=10000
+ht_max_element_num=40000
ht_mutex_num=5
[VXLAN_INFO]
-vxlan_gdev_num=3
-vxlan_gdev_mac=00:00:00:00:00:00,11:11:11:11:11:11,22:22:22:22:22:22
-vxlan_gdev_ip=1.1.1.1,2.2.2.2,3.3.3.3
-vxlan_gdev_port=8000,8001,8002
-vxlan_encap_type=0000,0000,0000
-vxlan_link_id=1,2,3
-vxlan_link_dir=0,0,0
-vxlan_inner_smac=33:33:33:33:33:33,44:44:44:44:44:44,55:55:55:55:55:55
-vxlan_inner_dmac=66:66:66:66:66:66,77:77:77:77:77:77,88:88:88:88:88:88
-vxlan_local_mac=AA:BB:CC:DD:EE:FF
-vxlan_local_ip=1.2.3.4
-vxlan_local_port=7999
-vxlan_inner_ip=4.3.2.1
-vxlan_inner_sport=7890
-vxlan_inner_dport=80 \ No newline at end of file
+vxlan_gdev_num=1
+vxlan_local_mac=e4:95:6e:20:0d:0as
+vxlan_gdev_mac=00:1e:73:6c:fa:43
+vxlan_local_ip=192.168.1.10
+vxlan_gdev_ip=10.1.1.1
+vxlan_local_port=4789
+vxlan_gdev_port=50710
+vxlan_encap_type=0
+vxlan_link_id=1
+vxlan_link_dir=1
+vxlan_inner_smac=60:67:20:2a:6a:b0
+vxlan_inner_dmac=e8:61:1f:13:70:7a \ No newline at end of file
diff --git a/bin/conf/mrl.inf b/bin/conf/mrl.inf
new file mode 100644
index 0000000..66e03a1
--- /dev/null
+++ b/bin/conf/mrl.inf
@@ -0,0 +1,13 @@
+[PLUGINFO]
+PLUGNAME=MRL
+SO_PATH=./plug/business/mrl/mrl.so
+INIT_FUNC=mrl_init
+DESTROY_FUNC=mrl_destroy
+
+[TCPALL]
+FUNC_FLAG=ALL
+FUNC_NAME=mrl_tcp_entry
+
+[UDP]
+FUNC_FLAG=ALL
+FUNC_NAME=mrl_udp_entry \ No newline at end of file
diff --git a/bin/conf/table_info.conf b/bin/conf/table_info.conf
index 12fe05e..42d2ead 100644
--- a/bin/conf/table_info.conf
+++ b/bin/conf/table_info.conf
@@ -15,5 +15,5 @@
#
#For expr/expr_plus Table
#id name type src_charset dst_charset do_merge cross_cache quick_mode
-0 IR_NOMINEE_IP plugin 4 --
-1 IR_CANDIDATE_IP plugin 4 -- \ No newline at end of file
+0 IR_NOMINEE_IP plugin 5 --
+1 IR_CANDIDATE_IP plugin 18 -- \ No newline at end of file
diff --git a/bin/mrl.so b/bin/mrl.so
new file mode 100644
index 0000000..f269249
--- /dev/null
+++ b/bin/mrl.so
Binary files differ
diff --git a/include/mrl_main.h b/include/mrl_main.h
index 5f47ad2..d3ab72c 100644
--- a/include/mrl_main.h
+++ b/include/mrl_main.h
@@ -11,13 +11,7 @@
#include "Maat_rule.h"
#include "Maat_command.h"
-#define MRL_STR_MAC_LEN 18
-#define MRL_STR_PORT_LEN 6
-#define MRL_STR_IP_LEN 16
-
-#define MRL_DATE_LEN 50
-
-#define MRL_MAX_PATH 50
+#include "mrl_utils.h"
struct mrl_global_cfg
{
@@ -25,22 +19,28 @@ struct mrl_global_cfg
char mrl_log_path[MRL_MAX_PATH];
int mrl_log_level;
+ //detect info
+ char detect_ip[MRL_STR_IP_LEN];
+ uint16_t detect_port;
+ uint16_t local_port;
+
//socket info
char mgw_ip[MRL_STR_IP_LEN];
- unsigned short mgw_port;//mgw listen udp port
- unsigned short mrl_port;//mrl listen udp port
+ char mrl_ip[MRL_STR_IP_LEN];
+ uint16_t mgw_port;//mgw listen udp port
+ uint16_t mrl_port;//mrl listen udp port
//maat info
char Maat_table_path[MRL_MAX_PATH];
char Maat_redis_ip[MRL_STR_IP_LEN];
- unsigned short Maat_redis_port;
+ uint16_t Maat_redis_port;
char Maat_stat_path[MRL_MAX_PATH];
unsigned int Maat_max_threads;
//htable info
unsigned int ht_slots;
unsigned int ht_max_element_num;
- int ht_mutex_num;
+ unsigned int ht_mutex_num;
/*vxlan info*/
unsigned int vxlan_gdev_num;
@@ -54,11 +54,10 @@ struct mrl_global_cfg
char **vxlan_link_id;
char **vxlan_link_dir;
char **vxlan_inner_smac;
- char **vxlan_inner_dmac;
-
- char vxlan_inner_dip[MRL_STR_IP_LEN];
- char vxlan_inner_dport[MRL_STR_PORT_LEN];
- char vxlan_inner_sport[MRL_STR_PORT_LEN];
+ char **vxlan_inner_dmac;
+ //char vxlan_inner_dip[MRL_STR_IP_LEN];
+ //char vxlan_inner_dport[MRL_STR_PORT_LEN];
+ //char vxlan_inner_sport[MRL_STR_PORT_LEN];
};
struct mrl_global_instance
@@ -72,6 +71,8 @@ struct mrl_global_instance
MESA_htable_handle ht_nominee;
MESA_htable_handle ht_candidate;
+ MMDB_s mrl_mmdb;
+
int *mrl_snd_fd;
int mrl_rcv_fd;
struct sockaddr_in mgw_addr;
diff --git a/include/mrl_packet.h b/include/mrl_packet.h
index da14d50..06069ae 100644
--- a/include/mrl_packet.h
+++ b/include/mrl_packet.h
@@ -2,17 +2,18 @@
#define __MRL_PACKET_H_
#include "stream.h"
-#include "mrl_redis.h"
void mrl_socket_init();
+void mrl_socket_close();
+
void mrl_send_to_gdev(int thread_seq, struct mrl_vxlan_info * vxlan_info, const char *payload, size_t payload_len);
bool mrl_pkt_signature_identify(struct streaminfo *mystream);
void *mrl_recv_mgw_action(void *arg);
void mrl_send_to_mgw(void *raw_pkt, int thread_seq);
void mrl_detect_init();
-void detect_ip_addr(const char *ip_addr);
-
+void mrl_detect_action(const char *ip_addr);
+bool mrl_pkt_signature_identify(struct streaminfo *mystream);
#endif
diff --git a/include/mrl_redis.h b/include/mrl_redis.h
index 84578f3..de6cdcb 100644
--- a/include/mrl_redis.h
+++ b/include/mrl_redis.h
@@ -51,6 +51,7 @@ void Maat_set_nominee_cmd_line(Maat_feather_t feather, struct mrl_nominee_item *
Maat_feather_t mrl_Maat_feather_init(const char * instance_name,const char *table_name, Maat_start_callback_t *start,Maat_update_callback_t *update,Maat_finish_callback_t *finish,void *u_para);
void nominee_update_cb(int table_id,const char* table_line,void* u_para);
void candidate_update_cb(int table_id,const char* table_line,void* u_para);
+void mrl_identify_nominee(struct streaminfo *mystream);
#endif
diff --git a/include/mrl_utils.h b/include/mrl_utils.h
index 63a489b..2bf05d8 100644
--- a/include/mrl_utils.h
+++ b/include/mrl_utils.h
@@ -1,9 +1,44 @@
#ifndef __MRL_UTILS_H_
#define __MRL_UTILS_H_
+#include "maxminddb.h"
+
+#define MRL_STR_MAC_LEN 18
+#define MRL_STR_PORT_LEN 6
+#define MRL_STR_IP_LEN 16
+#define MRL_STR_ENCAP_TYPE_LEN 5
+#define MRL_STR_LINK_ID_LEN 5
+#define MRL_STR_LINK_DIR_LEN 2
+
+
+#define MRL_DATE_LEN 50
+
+#define MRL_MAX_PATH 50
+#define MRL_IPV4_TYPE 4
+
+#define MRL_UDP_HDR_LEN 8
+#define MRL_IP_HDR_LEN 20
+
+#define MRL_MAC_LEN 6
+#define MRL_BUFF_LEN 3000
+#define MRL_IP_PKT_LEN 1500
+
+#define MRL_TCP_TYPE 6
+#define MRL_UDP_TYPE 17
+
+#define MRL_MAX_STRING 50
+
+#define RLOG_LV_DEBUG 10
+#define RLOG_LV_INFO 20
+#define RLOG_LV_FATAL 30
+
unsigned int mrl_split_str(char *str, const char *delim, char **dest);
-int mrl_mac_pton(const char *str, int delim, char *mac);
+int mrl_mac_pton(const char *str, int delim, uint8_t *mac);
void get_cur_time(char *time);
+unsigned short mrl_get_checksum(unsigned short * buffer, size_t len);
+
+void mrl_mmdb_init(const char *path);
+int mrl_search_ip_country(MMDB_s mmdb, const char *ip_address, const char *mycountry);
#endif
diff --git a/src/Makefile b/src/Makefile
index 173523b..f1e4639 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -8,15 +8,19 @@ CXXFLAGS = -Wall -g -fPIC
INCLUDES = -I ../include
+#INCLUDES += -I ../support/include
+
INCLUDES += -I /opt/MESA/include
INCLUDES += -I /opt/MESA/include/MESA
LIBS = -L /opt/MESA/lib
-LIBS += -lMESA_prof_load -lMESA_handle_logger -lpthread -lmaatframe -lMESA_htable
+#LIBS = -L ../support/lib
+
+LIBS += -lMESA_prof_load -lMESA_handle_logger -lpthread -lmaatframe -lMESA_htable -lmaxminddb
-TARGET = mrl
+TARGET = mrl.so
OBJS = mrl_main.o mrl_utils.o mrl_packet.o mrl_redis.o
@@ -25,7 +29,7 @@ OBJS = mrl_main.o mrl_utils.o mrl_packet.o mrl_redis.o
all:$(TARGET)
$(TARGET):$(OBJS)
- $(CXX) $(LIBS) $^ -o $@
+ $(CXX) -shared $(CXXFLAGS) $(OBJS) $(LIBS) -o $@
$(OBJS):%.o:%.c
$(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
@@ -34,4 +38,7 @@ clean:
rm -rf *.o
install:
- cp $(TARGET) ../bin
+ cp $(TARGET) /home/lijie/sapp/plug/business/mrl
+ cp ../bin/conf/mrl.inf /home/lijie/sapp/plug/business/mrl
+ cp ../bin/conf/*.conf /home/lijie/sapp/mrl_conf/
+ cp ../bin/conf/all_ip_only_coun_v4.mmdb /home/lijie/sapp/mrl_conf
diff --git a/src/mrl.so b/src/mrl.so
new file mode 100644
index 0000000..445ab26
--- /dev/null
+++ b/src/mrl.so
Binary files differ
diff --git a/src/mrl_main.c b/src/mrl_main.c
index 9662cb3..12153b2 100644
--- a/src/mrl_main.c
+++ b/src/mrl_main.c
@@ -5,20 +5,9 @@
#include <assert.h>
#include "mrl_main.h"
-#include "mrl_utils.h"
#include "mrl_redis.h"
#include "mrl_packet.h"
-#define MRL_MAX_STRING 50
-
-#define MRL_STR_ENCAP_TYPE_LEN 5
-#define MRL_STR_LINK_ID_LEN 5
-#define MRL_STR_LINK_DIR_LEN 2
-
-#define RLOG_LV_DEBUG 10
-#define RLOG_LV_INFO 20
-#define RLOG_LV_FATAL 30
-#define CMD_LINE_NUM 1
struct mrl_global_instance mrl_instance;
@@ -39,7 +28,17 @@ void mrl_cfg_init(const char *profile)
MESA_load_profile_int_def(profile, "LOG_INFO", "log_level", &(mrl_instance.mrl_cfg.mrl_log_level),RLOG_LV_DEBUG);
MESA_load_profile_string_def(profile, "LOG_INFO", "log_path", mrl_instance.mrl_cfg.mrl_log_path, MRL_MAX_PATH, "./log/mrl.log");
+ /********** load detect info **********/
+ MESA_load_profile_string_def(profile, "DETECT_INFO", "detect_ip", mrl_instance.mrl_cfg.detect_ip, MRL_STR_IP_LEN, "0.0.0.0");
+
+ MESA_load_profile_short_def(profile, "SOCK_INFO", "mrl_port",&(temp_port),8888);
+ assert(temp_port > 0 && temp_port <= 65535);
+ mrl_instance.mrl_cfg.detect_port = temp_port;
+ MESA_load_profile_short_def(profile, "SOCK_INFO", "mrl_port",&(temp_port),8888);
+ assert(temp_port > 0 && temp_port <= 65535);
+ mrl_instance.mrl_cfg.local_port = temp_port;
+
/********** load sock info **********/
MESA_load_profile_short_def(profile, "SOCK_INFO", "mrl_port",&(temp_port),8888);
assert(temp_port > 0 && temp_port <= 65535);
@@ -50,6 +49,7 @@ void mrl_cfg_init(const char *profile)
mrl_instance.mrl_cfg.mgw_port = temp_port;
MESA_load_profile_string_def(profile, "SOCK_INFO", "mgw_ip", mrl_instance.mrl_cfg.mgw_ip, MRL_STR_IP_LEN, "0.0.0.0");
+ MESA_load_profile_string_def(profile, "SOCK_INFO", "mrl_ip",mrl_instance.mrl_cfg.mrl_ip, MRL_STR_IP_LEN, "0.0.0.0");
/********** load maat info **********/
@@ -65,7 +65,7 @@ void mrl_cfg_init(const char *profile)
/********** load htable info *********/
MESA_load_profile_uint_def(profile, "HTABLE_INFO", "ht_slots", &(mrl_instance.mrl_cfg.ht_slots), 1048576);
MESA_load_profile_uint_def(profile, "HTABLE_INFO", "ht_max_element_num", &(mrl_instance.mrl_cfg.ht_max_element_num), 0);
- MESA_load_profile_int_def(profile, "HTABLE_INFO", "ht_mutex_num", &(mrl_instance.mrl_cfg.ht_mutex_num), 1);
+ MESA_load_profile_uint_def(profile, "HTABLE_INFO", "ht_mutex_num", &(mrl_instance.mrl_cfg.ht_mutex_num), 1);
/********** load gdev info **********/
@@ -79,7 +79,6 @@ void mrl_cfg_init(const char *profile)
temp_link_dir_str = (char *)calloc(mrl_instance.mrl_cfg.vxlan_gdev_num * MRL_STR_LINK_DIR_LEN, sizeof(char));
MESA_load_profile_string_def(profile, "VXLAN_INFO", "vxlan_gdev_mac",temp_mac_str, mrl_instance.mrl_cfg.vxlan_gdev_num*MRL_STR_MAC_LEN, "00:00:00:00:00:00");
- printf("temp mac string is %s\n",temp_mac_str);
mrl_instance.mrl_cfg.vxlan_outer_gdev_mac = (char **)malloc(sizeof(char *)*mrl_instance.mrl_cfg.vxlan_gdev_num);
for(i=0;i<mrl_instance.mrl_cfg.vxlan_gdev_num;i++)
{
@@ -154,11 +153,11 @@ void mrl_cfg_init(const char *profile)
MESA_load_profile_string_def(profile, "VXLAN_INFO", "vxlan_local_mac", mrl_instance.mrl_cfg.vxlan_outer_local_mac, MRL_STR_MAC_LEN, "00:00:00:00:00:00");
MESA_load_profile_string_def(profile, "VXLAN_INFO", "vxlan_local_ip", mrl_instance.mrl_cfg.vxlan_outer_local_ip, MRL_STR_IP_LEN, "0.0.0.0");
MESA_load_profile_string_def(profile, "VXLAN_INFO", "vxlan_local_port", mrl_instance.mrl_cfg.xvlan_outer_local_port,MRL_STR_PORT_LEN, "8888");
-
+/*
MESA_load_profile_string_def(profile, "VXLAN_INFO", "vxlan_inner_ip",mrl_instance.mrl_cfg.vxlan_inner_dip, MRL_STR_IP_LEN, "0.0.0.0");
MESA_load_profile_string_def(profile, "VXLAN_INFO", "vxlan_inner_sport", mrl_instance.mrl_cfg.vxlan_inner_sport,MRL_STR_PORT_LEN, "8888");
MESA_load_profile_string_def(profile, "VXLAN_INFO", "vxlan_inner_dport", mrl_instance.mrl_cfg.vxlan_inner_dport,MRL_STR_PORT_LEN, "8888");
-
+*/
free(temp_mac_str);
free(temp_ip_str);
free(temp_port_str);
@@ -166,11 +165,26 @@ void mrl_cfg_init(const char *profile)
free(temp_link_id_str);
free(temp_link_dir_str);
}
+void mrl_nominee_test_init()
+{
+ printf("mrl moninee_test init\n");
+ char src_ip[]="192.168.11.60";
+ const char date[]="2018/11/15/11:01:11";
+ struct mrl_nominee_item nominee_item;
+ memset(&nominee_item,0,sizeof(nominee_item));
+ nominee_item.config_id =(int)Maat_cmd_incrby(mrl_instance.nominee_feather,"TEST_PLUG_SEQ", 1);
+ nominee_item.group_id =1;
+ nominee_item.addr_type =4;
+ memcpy(nominee_item.ip_addr,src_ip,strlen(src_ip));
+ nominee_item.is_vaild = 1;
+ memcpy(nominee_item.op_time,date,strlen(date));
+ Maat_set_nominee_cmd_line(mrl_instance.nominee_feather, &nominee_item);
+}
extern "C" int mrl_init(void)
{
- mrl_cfg_init("./conf/mrl.conf");
+ mrl_cfg_init("./mrl_conf/mrl.conf");
mrl_instance.mrl_log_handle = MESA_create_runtime_log_handle(mrl_instance.mrl_cfg.mrl_log_path, mrl_instance.mrl_cfg.mrl_log_level);
if(mrl_instance.mrl_log_handle == NULL)
@@ -189,6 +203,10 @@ extern "C" int mrl_init(void)
//TODO:read from nominee table and candidate table ifno and construct the packet
//send to the speficied destination
mrl_detect_init();
+
+ mrl_mmdb_init("./mrl_conf/all_ip_only_coun_v4.mmdb");
+
+ mrl_nominee_test_init();
//���������߳̽��ղ�����mwg���͵����ݰ�
pthread_t pid;
if(pthread_create(&pid,NULL,mrl_recv_mgw_action,NULL) <0)
@@ -200,53 +218,37 @@ extern "C" int mrl_init(void)
return 1;
}
-int main()
+void mrl_destroy_cfg()
{
- mrl_init();
- int index = 0;
- char src_ip[]="192.168.11.23";
- /*
- struct mrl_nominee_item nominee_item;
- memset(&nominee_item,0,sizeof(nominee_item));
- nominee_item.config_id = 0;
- nominee_item.group_id =1;
- nominee_item.addr_type =4;
- memcpy(nominee_item.ip_addr,src_ip,strlen(src_ip));
- nominee_item.is_vaild = 1;
- get_cur_time(nominee_item.op_time);
- Maat_set_nominee_cmd_line(mrl_instance.nominee_feather, &nominee_item);
-*/
- struct mrl_candidate_item candidate_item;
- memset(&candidate_item, 0, sizeof(candidate_item));
- candidate_item.config_id = 0;
- candidate_item.group_id = 1;
- candidate_item.addr_type = 4 ;
- memcpy(candidate_item.ip_addr,src_ip,strlen(src_ip));
- candidate_item.location = 0;
- candidate_item.is_vaild= 1;
- get_cur_time(candidate_item.op_time);
- memcpy(candidate_item.mrl_ip, mrl_instance.mrl_cfg.vxlan_outer_local_ip,strlen(mrl_instance.mrl_cfg.vxlan_outer_local_ip));
- memcpy(candidate_item.vxlan_info.vxlan_inner_smac, mrl_instance.mrl_cfg.vxlan_inner_smac[index],strlen(mrl_instance.mrl_cfg.vxlan_inner_smac[index]));
- memcpy(candidate_item.vxlan_info.vxlan_inner_dmac, mrl_instance.mrl_cfg.vxlan_inner_dmac[index], strlen(mrl_instance.mrl_cfg.vxlan_inner_dmac[index]));
- candidate_item.vxlan_info.vxlan_encap_type = atoi(mrl_instance.mrl_cfg.vxlan_encap_type[index]);
- candidate_item.vxlan_info.vxlan_link_id = atoi(mrl_instance.mrl_cfg.vxlan_link_id[index]);
- candidate_item.vxlan_info.vxlan_link_dir = atoi(mrl_instance.mrl_cfg.vxlan_link_dir[index]);
- memcpy(candidate_item.vxlan_info.vxlan_outer_local_port, mrl_instance.mrl_cfg.xvlan_outer_local_port,strlen(mrl_instance.mrl_cfg.xvlan_outer_local_port));
- memcpy(candidate_item.vxlan_info.vxlan_outer_gdev_port , mrl_instance.mrl_cfg.vxlan_outer_gdev_port[index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_port[index]));
- memcpy(candidate_item.vxlan_info.vxlan_outer_local_ip, mrl_instance.mrl_cfg.vxlan_outer_local_ip,strlen(mrl_instance.mrl_cfg.vxlan_outer_local_ip));
- memcpy(candidate_item.vxlan_info.vxlan_outer_gdev_ip, mrl_instance.mrl_cfg.vxlan_outer_gdev_ip[index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_ip[index]));
- memcpy(candidate_item.vxlan_info.vxlan_outer_local_mac, mrl_instance.mrl_cfg.vxlan_outer_local_mac,strlen(mrl_instance.mrl_cfg.vxlan_outer_local_mac));
- memcpy(candidate_item.vxlan_info.vxlan_outer_gdev_mac, mrl_instance.mrl_cfg.vxlan_outer_gdev_mac[index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_mac[index]));
- Maat_set_cmd_line(mrl_instance.candidate_feather, &candidate_item);
- return 1;
+ unsigned int i=0;
+ for(i = 0; i<mrl_instance.mrl_cfg.vxlan_gdev_num;i++)
+ {
+ free(mrl_instance.mrl_cfg.vxlan_outer_gdev_mac[i]);
+ free(mrl_instance.mrl_cfg.vxlan_outer_gdev_ip[i]);
+ free(mrl_instance.mrl_cfg.vxlan_outer_gdev_port[i]);
+ free(mrl_instance.mrl_cfg.vxlan_encap_type[i]);
+ free(mrl_instance.mrl_cfg.vxlan_link_id[i]);
+ free(mrl_instance.mrl_cfg.vxlan_link_dir[i]);
+ free(mrl_instance.mrl_cfg.vxlan_inner_smac[i]);
+ free(mrl_instance.mrl_cfg.vxlan_inner_dmac[i]);
+ }
+ free(mrl_instance.mrl_cfg.vxlan_outer_gdev_mac);
+ free(mrl_instance.mrl_cfg.vxlan_outer_gdev_ip);
+ free(mrl_instance.mrl_cfg.vxlan_outer_gdev_port);
+ free(mrl_instance.mrl_cfg.vxlan_encap_type);
+ free(mrl_instance.mrl_cfg.vxlan_link_id);
+ free(mrl_instance.mrl_cfg.vxlan_link_dir);
+ free(mrl_instance.mrl_cfg.vxlan_inner_smac);
+ free(mrl_instance.mrl_cfg.vxlan_inner_dmac);
}
-/*
+
extern "C" void mrl_destroy(void)
{
- MESA_destroy_runtime_log_handle(instance.logger);
- Maat_burn_feather(instance.maat_father);
- free(mrl_instance.mrl_cfg);
+ MESA_destroy_runtime_log_handle(mrl_instance.mrl_log_handle);
+ Maat_burn_feather(mrl_instance.candidate_feather);
+ Maat_burn_feather(mrl_instance.nominee_feather);
+ mrl_destroy_cfg();
mrl_socket_close();
}
@@ -288,7 +290,6 @@ extern "C" char mrl_tcpall_entry(struct streaminfo *a_tcp,void **pme, int thread
extern "C" char mrl_udp_entry(struct streaminfo *a_udp, void **pme, int thread_seq, void *raw_packet)
{
char ret = APP_STATE_GIVEME;
- struct mrl_nominee_item *nominee_item = NULL;
switch(a_udp->pktstate){
case OP_STATE_PENDING:
if(mrl_pkt_signature_identify(a_udp))
@@ -318,5 +319,4 @@ extern "C" char mrl_udp_entry(struct streaminfo *a_udp, void **pme, int thread_
}
return ret;
}
-*/
diff --git a/src/mrl_main.o b/src/mrl_main.o
new file mode 100644
index 0000000..653c64f
--- /dev/null
+++ b/src/mrl_main.o
Binary files differ
diff --git a/src/mrl_packet.c b/src/mrl_packet.c
index 8871f91..fd00be2 100644
--- a/src/mrl_packet.c
+++ b/src/mrl_packet.c
@@ -2,6 +2,7 @@
#include <sys/types.h>
#include <assert.h>
#include<unistd.h>
+#include <stdio.h>
#include "stream.h"
#include "stream_inc/stream_control.h"
@@ -9,23 +10,20 @@
#include "mrl_packet.h"
#include "mrl_main.h"
#include "mrl_utils.h"
+#include "mrl_redis.h"
-#define MRL_MAC_LEN 6
-#define MRL_BUFF_LEN 3000
-
-#define PORT_MODE ((1<<10) -1)
-#define PORT_MASK (((1<<15) -1)^((1<<6) -1))
extern struct mrl_global_instance mrl_instance;
+extern void mrl_get_vxlan_info(struct mrl_vxlan_info *vxlan, unsigned int index);
void mrl_socket_init()
{
- //init send fd
+ printf("mrl socket init\n");
int i;
int thread_num = 0;
int len = sizeof(thread_num);
- thread_num = 5;
- //sapp_get_platform_opt(SPO_THREAD_COUNT,(void *) &thread_num, &len);
+ sapp_get_platform_opt(SPO_THREAD_COUNT,(void *) &thread_num, &len);
+ printf("sapp thread num is %d\n",thread_num);
mrl_instance.mrl_snd_fd = (int *) malloc (sizeof(int)*thread_num);
for(i = 0; i< thread_num;i++)
{
@@ -53,8 +51,8 @@ void mrl_socket_close()
int i;
int thread_num = 0;
int len = sizeof(thread_num);
- thread_num = 5;
- //sapp_get_platform_opt(SPO_THREAD_COUNT,(void *) &thread_num, &len);
+ sapp_get_platform_opt(SPO_THREAD_COUNT,(void *) &thread_num, &len);
+ printf("sapp thread num is %d\n",thread_num);
for(i = 0; i< thread_num;i++)
{
close(mrl_instance.mrl_snd_fd[i]);
@@ -123,9 +121,9 @@ void mrl_send_to_gdev(int thread_seq, struct mrl_vxlan_info * vxlan_info, const
SAPP_TLV_T option[32];
int option_num = 0;
- char temp_mac[MRL_MAC_LEN];
- unsigned int temp_ip;
- short temp_port;
+ uint8_t temp_mac[MRL_MAC_LEN];
+ uint32_t temp_ip;
+ uint16_t temp_port;
memset(temp_mac, 0, MRL_MAC_LEN);
mrl_mac_pton(vxlan_info->vxlan_outer_local_mac, ':', temp_mac);
@@ -216,44 +214,72 @@ void mrl_send_to_gdev(int thread_seq, struct mrl_vxlan_info * vxlan_info, const
memcpy(option[option_num].array_value, temp_mac, MRL_MAC_LEN);
option_num++;///////
-
- /*MESA_sendpacket_iplayer_options(thread_seq,
+ printf("send to gdev\n");
+ MESA_sendpacket_iplayer_options(thread_seq,
payload,
payload_len,
vxlan_info->vxlan_link_dir,
option,
- option_num);*/
+ option_num);
}
//�ж��Ƿ���IP���ð�
bool mrl_pkt_signature_identify(struct streaminfo *mystream)
{
- UINT16 sport,dport;
- UINT32 sip,dip;
- sport = ntohs(mystream->addr.tuple4_v4->source);
- dport = ntohs(mystream->addr.tuple4_v4->dest);
- sip = ntohl(mystream->addr.tuple4_v4->saddr);
- dip = ntohl(mystream->addr.tuple4_v4->daddr);
- if(((sport ^ sip ^dip)%PORT_MODE) == (dport & PORT_MASK))
+ printf("start to signature identify\n");
+ uint8_t type = 0;
+ uint16_t sport = 0,dport = 0;
+ uint32_t sip = 0,dip = 0;
+ sport = mystream->addr.tuple4_v4->source;
+ dport = mystream->addr.tuple4_v4->dest;
+ sip = mystream->addr.tuple4_v4->saddr;
+ dip = mystream->addr.tuple4_v4->daddr;
+ switch(mystream->type)
+ {
+ case STREAM_TYPE_TCP:
+ type = MRL_TCP_TYPE;
+ break;
+ case STREAM_TYPE_UDP:
+ type = MRL_UDP_TYPE;
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ printf("cur stream sport is %u and dport is %u and sip is %d and dip is %d and protocol is %d\n",sport,dport,sip,dip,type);
+ unsigned int hash_sport = sport ^ sip ^ dip ^type;
+ hash_sport = hash_sport & 0xff;
+ if(hash_sport == dport)
{
return true;
}
else
{
+ if(type == MRL_UDP_TYPE)
+ {
+ unsigned int hash_dport = dport ^ sip ^ dip ^type;
+ hash_dport = hash_dport & 0xff;
+ if(hash_dport == sport)
+ {
+ return true;
+ }
+ }
return false;
}
}
+
void mrl_send_to_mgw(void *raw_pkt, int thread_seq)
{
const char *pkt = (const char *)raw_pkt;
ssize_t pkt_len = strlen(pkt);
ssize_t send_len = 0;
send_len = mrl_sock_send(mrl_instance.mrl_snd_fd[thread_seq],pkt,pkt_len,&(mrl_instance.mgw_addr));
- if(send_len);
+ printf("send socket len is %ld\n",send_len);
}
+
void *mrl_recv_mgw_action(void *arg)
{
@@ -264,20 +290,78 @@ void *mrl_recv_mgw_action(void *arg)
while(1)
{
recv_len = mrl_sock_recv(mrl_instance.mrl_rcv_fd,rcv_buff, MRL_BUFF_LEN);
+ printf("recv from mgw len is %ld\n",recv_len);
struct mrl_vxlan_info *vxlan_info = (struct mrl_vxlan_info *)rcv_buff;
size_t vxlan_len = sizeof(struct mrl_vxlan_info);
temp_len = sizeof(thread_seq);
- thread_seq = 1;
- //sapp_get_platform_opt(SPO_INDEPENDENT_THREAD_ID, &thread_seq, &temp_len);
+ sapp_get_platform_opt(SPO_INDEPENDENT_THREAD_ID, &thread_seq, &temp_len);
+ printf("send to gdev thread seq is %d\n",thread_seq);
mrl_send_to_gdev(thread_seq,vxlan_info,rcv_buff + vxlan_len, recv_len - vxlan_len);
}
return NULL;
}
-void detect_ip_addr(const char *ip_addr)
+size_t mrl_build_ip_hdr(char *ip_pkt, const char *src_ip, const char *dst_ip, size_t udp_len)
+{
+ size_t ip_len = udp_len + MRL_IP_HDR_LEN;
+ struct iphdr *ip_hdr =(struct iphdr *)ip_pkt;
+ ip_hdr->ihl = 0x5;
+ ip_hdr->version=0x4;
+ ip_hdr->tos = 0x00;
+ ip_hdr->tot_len = ip_len;
+ ip_hdr->id = 0x325f;
+ ip_hdr->frag_off =0x0000;
+ ip_hdr->ttl = 0x80;
+ ip_hdr->protocol =0x11;
+ ip_hdr->check = 0x0000;
+ inet_pton(AF_INET,src_ip,&(ip_hdr->saddr));
+ inet_pton(AF_INET,dst_ip,&(ip_hdr->daddr));
+ ip_hdr->check = htons(mrl_get_checksum((uint16_t *)ip_pkt,MRL_IP_HDR_LEN));
+ return ip_len;
+}
+
+size_t mrl_build_udp_hdr(char *udp_pkt,size_t payload_len)
+{
+ struct udphdr *udp_hdr = (struct udphdr *)udp_pkt;
+ udp_hdr->source = htons(mrl_instance.mrl_cfg.local_port);
+ udp_hdr->dest = htons(mrl_instance.mrl_cfg.detect_port);
+ udp_hdr->len = payload_len + MRL_UDP_HDR_LEN;
+ udp_hdr->check = 0;
+ udp_hdr->check = htons(mrl_get_checksum((uint16_t *)udp_pkt,payload_len + MRL_UDP_HDR_LEN));
+ return payload_len + MRL_UDP_HDR_LEN;
+}
+
+size_t mrl_build_udp_payload(char *payload)
{
-
+ const char content[]="This is detect info";
+ size_t payload_len = strlen(content);
+ memcpy(payload,content,payload_len);
+ return payload_len;
+}
+void mrl_detect_action(const char *ip_addr)
+{
+ printf("start detect ip %s\n",ip_addr);
+ unsigned int i = 0;
+ int thread_seq = 0;
+ int temp_len = 0;
+ size_t udp_payload_len = 0;
+ size_t udp_len = 0;
+ size_t ip_len = 0;
+ char ip_pkt[MRL_IP_PKT_LEN];
+ memset(ip_pkt,0,MRL_IP_PKT_LEN);
+ struct mrl_vxlan_info vxlan_info;
+ sapp_get_platform_opt(SPO_INDEPENDENT_THREAD_ID, &thread_seq, &temp_len);
+ udp_payload_len = mrl_build_udp_payload(ip_pkt +MRL_UDP_HDR_LEN + MRL_IP_HDR_LEN);
+ udp_len = mrl_build_udp_hdr(ip_pkt + MRL_IP_HDR_LEN, udp_payload_len);
+ ip_len = mrl_build_ip_hdr(ip_pkt,ip_addr,mrl_instance.mrl_cfg.detect_ip,udp_len);
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_detect_action","detect pkt len is %d",ip_len);
+ for(i = 0; i< mrl_instance.mrl_cfg.vxlan_gdev_num;i++)
+ {
+ memset(&vxlan_info,0,sizeof(vxlan_info));
+ mrl_get_vxlan_info(&vxlan_info,i);
+ mrl_send_to_gdev(thread_seq,&vxlan_info,ip_pkt,ip_len);
+ }
}
void ht_nominee_iterate_cb(const uchar *key, uint size, void *data, void *user)
@@ -286,15 +370,14 @@ void ht_nominee_iterate_cb(const uchar *key, uint size, void *data, void *user)
{
if(MESA_htable_search_cb(mrl_instance.ht_candidate, key, size, NULL,NULL, NULL) == NULL)
{
- detect_ip_addr((const char *)key);
- }
+ mrl_detect_action((const char *)key);
+ }
}
}
void mrl_detect_init()
{
+ printf("mrl detect init\n");
MESA_htable_iterate(mrl_instance.ht_nominee, ht_nominee_iterate_cb, NULL);
}
-
-
diff --git a/src/mrl_packet.o b/src/mrl_packet.o
new file mode 100644
index 0000000..64dd8c0
--- /dev/null
+++ b/src/mrl_packet.o
Binary files differ
diff --git a/src/mrl_redis.c b/src/mrl_redis.c
index 1446e3d..81b343f 100644
--- a/src/mrl_redis.c
+++ b/src/mrl_redis.c
@@ -1,18 +1,16 @@
#include <assert.h>
#include<stdio.h>
-#include "mrl_redis.h"
-#include "mrl_utils.h"
#include "mrl_packet.h"
-
-#define MRL_IPV4_TYPE 4
+#include "mrl_redis.h"
extern struct mrl_global_instance mrl_instance;
+extern void mrl_detect_action(const char *ip_addr);
void wrapped_Maat_set_feather_opt(Maat_feather_t feather, enum MAAT_INIT_OPT type, const void* value, int size)
{
int ret = Maat_set_feather_opt(feather, type, value, size);
- if((ret < 0))
+ if(ret < 0)
{
MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"wrapped_Maat_set_feather_opt","Maat_set_feather_opt func error!");
assert(0);
@@ -41,6 +39,7 @@ void ht_candidate_free_cb(void * data)
MESA_htable_handle mrl_htable_init(void * fn_data_free_cb)
{
+ printf("mrl htable init\n");
unsigned int opt_int;
MESA_htable_handle htable = MESA_htable_born();
assert(htable != NULL);
@@ -123,13 +122,20 @@ int Maat_plugin_table(Maat_feather_t feather,const char* table_name, Maat_start_
Maat_feather_t mrl_Maat_feather_init(const char * instance_name,const char *table_name, Maat_start_callback_t *start,Maat_update_callback_t *update,Maat_finish_callback_t *finish,void *u_para)
{
+ printf("mrl maat feather init\n");
Maat_feather_t feather;
feather = Maat_init(instance_name,mrl_instance.mrl_cfg.Maat_redis_ip,mrl_instance.mrl_cfg.Maat_redis_port,mrl_instance.mrl_cfg.Maat_stat_path);
Maat_plugin_table(feather,table_name,start,update,finish,u_para);
return feather;
}
-
+int mrl_get_candidate_location(const char *ip_addr)
+{
+ const char *mycountry="China";
+ int location = 0;
+ location = mrl_search_ip_country(mrl_instance.mrl_mmdb, ip_addr, mycountry);
+ return location;
+}
void mrl_create_candidate_item(struct mrl_candidate_item *candidate_item, struct mrl_nominee_item *nominee_item)
{
candidate_item->config_id = nominee_item->config_id;
@@ -137,8 +143,9 @@ void mrl_create_candidate_item(struct mrl_candidate_item *candidate_item, struct
candidate_item->addr_type = MRL_IPV4_TYPE ;
memcpy(candidate_item->ip_addr,nominee_item->ip_addr,strlen(nominee_item->ip_addr));
//to do how to get ip location
- candidate_item->location = 0;
- memcpy(candidate_item->mrl_ip, mrl_instance.mrl_cfg.vxlan_outer_local_ip,strlen(mrl_instance.mrl_cfg.vxlan_outer_local_ip));
+ candidate_item->location = mrl_get_candidate_location(candidate_item->ip_addr);
+ assert(candidate_item->location >= 0);
+ memcpy(candidate_item->mrl_ip, mrl_instance.mrl_cfg.mrl_ip,strlen(mrl_instance.mrl_cfg.mrl_ip));
candidate_item->is_vaild = 1;
get_cur_time(candidate_item->op_time);
}
@@ -146,6 +153,7 @@ void mrl_create_candidate_item(struct mrl_candidate_item *candidate_item, struct
void nominee_update_cb(int table_id,const char* table_line,void* u_para)
{
int ret = 0;
+ printf("this is nominee update cb\n");
struct mrl_nominee_item *nominee_item = (struct mrl_nominee_item *)calloc(1, sizeof(struct mrl_nominee_item));
sscanf(table_line,"%d\t%d\t%d\t%s\t%d\t%s",
&(nominee_item->config_id), &(nominee_item->group_id), &(nominee_item->addr_type),
@@ -155,17 +163,28 @@ void nominee_update_cb(int table_id,const char* table_line,void* u_para)
case 0:
ret = MESA_htable_del(mrl_instance.ht_nominee, (const unsigned char *)nominee_item->ip_addr, sizeof(nominee_item->ip_addr), NULL);
assert(ret >= 0);
- if(MESA_htable_search_cb(mrl_instance.ht_candidate, (const unsigned char *)&(nominee_item->ip_addr), sizeof(nominee_item->ip_addr),NULL,NULL,NULL) != NULL)
+ if(MESA_htable_search_cb(mrl_instance.ht_candidate, (const unsigned char *)nominee_item->ip_addr, sizeof(nominee_item->ip_addr),NULL,NULL,NULL) != NULL)
{
ret = MESA_htable_del(mrl_instance.ht_candidate, (const unsigned char *)nominee_item->ip_addr, sizeof(nominee_item->ip_addr), NULL);
assert(ret >= 0);
}
break;
case 1:
- ret = MESA_htable_add(mrl_instance.ht_nominee, (const unsigned char *)nominee_item->ip_addr, sizeof(nominee_item->ip_addr), nominee_item);
- assert(ret >= 0);
+ if(MESA_htable_search_cb(mrl_instance.ht_candidate, (const unsigned char *)nominee_item->ip_addr, sizeof(nominee_item->ip_addr),NULL,NULL,NULL) == NULL)
+ {
+ ret = MESA_htable_add(mrl_instance.ht_nominee, (const unsigned char *)nominee_item->ip_addr, sizeof(nominee_item->ip_addr), nominee_item);
+ if(ret < 0)
+ {
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"nominee_update_cb","MESA_htable_add func error! ret is %d",ret);
+ assert(0);
+ }
+ }
+ else
+ {
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"nominee_update_cb","the nominee item is duplicated in nominee htable.");
+ }
//todo active detect
- detect_ip_addr(nominee_item->ip_addr);
+ mrl_detect_action(nominee_item->ip_addr);
break;
default:
assert(0);
@@ -178,6 +197,7 @@ void nominee_update_cb(int table_id,const char* table_line,void* u_para)
void candidate_update_cb(int table_id,const char* table_line,void* u_para)
{
int ret = 0;
+ printf("this is candidate update cb\n");
struct mrl_candidate_item *candidate_item = (struct mrl_candidate_item *)calloc(1, sizeof(struct mrl_candidate_item));
sscanf(table_line,"%d\t%d\t%d\t%s\t%d\t%s\t%d\t%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%s",
&(candidate_item->config_id), &(candidate_item->group_id),&(candidate_item->addr_type),
@@ -188,8 +208,20 @@ void candidate_update_cb(int table_id,const char* table_line,void* u_para)
candidate_item->vxlan_info.vxlan_outer_gdev_ip,candidate_item->vxlan_info.vxlan_outer_local_mac,
candidate_item->vxlan_info.vxlan_outer_gdev_mac,candidate_item->vxlan_info.vxlan_inner_smac,
candidate_item->vxlan_info.vxlan_inner_dmac,&(candidate_item->is_vaild), candidate_item->op_time);
- ret = MESA_htable_add(mrl_instance.ht_candidate, (const unsigned char *)(candidate_item->ip_addr), sizeof(candidate_item->ip_addr), candidate_item);
- assert(ret >= 0);
+ if(MESA_htable_search_cb(mrl_instance.ht_candidate, (const unsigned char *)candidate_item->ip_addr, sizeof(candidate_item->ip_addr),NULL,NULL,NULL) == NULL)
+ {
+ ret = MESA_htable_add(mrl_instance.ht_candidate, (const unsigned char *)(candidate_item->ip_addr), sizeof(candidate_item->ip_addr), candidate_item);
+ if(ret < 0)
+ {
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"candidate_update_cb","MESA_htable_add func error! ret is %d",ret);
+ assert(0);
+ }
+ }
+ else
+ {
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"candidate_update_cb","the candidate item is duplicated in candidate htable.");
+ }
+
}
long ht_search_cb(void *data, const uchar *key, uint size, void *user_arg)
@@ -205,20 +237,8 @@ long ht_search_cb(void *data, const uchar *key, uint size, void *user_arg)
}
-void mrl_get_candidate_vxlan_info(struct streaminfo *mystream, struct mrl_vxlan_info *vxlan)
+void mrl_get_vxlan_info(struct mrl_vxlan_info *vxlan, unsigned int index)
{
- int gdev_ip = 0;
- //get_rawpkt_opt_from_streaminfo(mystream, RAW_PKT_GET_GDEV_IP, &(gdev_ip));
- inet_ntop(AF_INET, &gdev_ip, vxlan->vxlan_outer_gdev_ip, MRL_STR_IP_LEN);
- unsigned int index = 0;
- for(; index < mrl_instance.mrl_cfg.vxlan_gdev_num; index++)
- {
- if(memcmp(vxlan->vxlan_outer_gdev_ip,mrl_instance.mrl_cfg.vxlan_outer_gdev_ip[index],strlen(vxlan->vxlan_outer_gdev_ip)) == 0)
- {
- break;
- }
- }
- assert(index < mrl_instance.mrl_cfg.vxlan_gdev_num);//������ھ�˵�������ݰ���GDEV��������̽���GDEV�У�����
memcpy(vxlan->vxlan_inner_smac, mrl_instance.mrl_cfg.vxlan_inner_smac[index],strlen(mrl_instance.mrl_cfg.vxlan_inner_smac[index]));
memcpy(vxlan->vxlan_inner_dmac, mrl_instance.mrl_cfg.vxlan_inner_dmac[index], strlen(mrl_instance.mrl_cfg.vxlan_inner_dmac[index]));
vxlan->vxlan_encap_type = atoi(mrl_instance.mrl_cfg.vxlan_encap_type[index]);
@@ -230,9 +250,16 @@ void mrl_get_candidate_vxlan_info(struct streaminfo *mystream, struct mrl_vxlan_
memcpy(vxlan->vxlan_outer_gdev_ip, mrl_instance.mrl_cfg.vxlan_outer_gdev_ip[index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_ip[index]));
memcpy(vxlan->vxlan_outer_local_mac, mrl_instance.mrl_cfg.vxlan_outer_local_mac,strlen(mrl_instance.mrl_cfg.vxlan_outer_local_mac));
memcpy(vxlan->vxlan_outer_gdev_mac, mrl_instance.mrl_cfg.vxlan_outer_gdev_mac[index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_mac[index]));
- MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_get_candidate_vxlan_info","get vxlan opt from rawpkt:"
- "inner_smac:%s, inner_dmac:%s,encap_type:%d,link_id:%d, link_dir:%d,local_port:%u,"
- "gdev_port:%u, local_ip:%s,gdev_ip:%s,local_mac:%s, gdev_mac:%s",
+ printf("get vxlan opt from rawpkt:inner_smac:%s, inner_dmac:%s,encap_type:%d,link_id:%d, link_dir:%d,local_port:%s,"
+ "gdev_port:%s, local_ip:%s,gdev_ip:%s,local_mac:%s, gdev_mac:%s\n",
+ vxlan->vxlan_inner_smac, vxlan->vxlan_inner_dmac, vxlan->vxlan_encap_type,
+ vxlan->vxlan_link_id, vxlan->vxlan_link_dir,vxlan->vxlan_outer_local_port,
+ vxlan->vxlan_outer_gdev_port,vxlan->vxlan_outer_local_ip,vxlan->vxlan_outer_gdev_ip,
+ vxlan->vxlan_outer_local_mac,vxlan->vxlan_outer_gdev_mac);
+
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_get_candidate_vxlan_info", "get vxlan opt from rawpkt:"
+ "inner_smac:%s, inner_dmac:%s,encap_type:%d,link_id:%d, link_dir:%d,local_port:%s,"
+ "gdev_port:%s, local_ip:%s,gdev_ip:%s,local_mac:%s, gdev_mac:%s",
vxlan->vxlan_inner_smac, vxlan->vxlan_inner_dmac, vxlan->vxlan_encap_type,
vxlan->vxlan_link_id, vxlan->vxlan_link_dir,vxlan->vxlan_outer_local_port,
vxlan->vxlan_outer_gdev_port,vxlan->vxlan_outer_local_ip,vxlan->vxlan_outer_gdev_ip,
@@ -243,6 +270,7 @@ void mrl_get_candidate_vxlan_info(struct streaminfo *mystream, struct mrl_vxlan_
void Maat_set_cmd_line(Maat_feather_t feather, struct mrl_candidate_item *candidate_item)
{
+ printf("start to insert candidate table\n");
const struct Maat_line_t *p_line;
struct Maat_line_t line_rule;
char table_line[512];
@@ -268,22 +296,46 @@ void Maat_set_cmd_line(Maat_feather_t feather, struct mrl_candidate_item *candid
if(ret < 0)
{
MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"Maat_set_cmd_line","Maat_cmd_set_lines func error! ret is %d",ret);
- assert(ret>0);
+ assert(0);
}
return;
}
+unsigned int get_gdev_ip_index(UINT32 gdev_ip)
+{
+ unsigned int index = 0;
+ char temp_ip[MRL_STR_IP_LEN];
+ memset(temp_ip,0,MRL_STR_IP_LEN);
+ inet_ntop(AF_INET, &gdev_ip, temp_ip, MRL_STR_IP_LEN);
+ for(; index < mrl_instance.mrl_cfg.vxlan_gdev_num; index++)
+ {
+ if(memcmp(temp_ip,mrl_instance.mrl_cfg.vxlan_outer_gdev_ip[index],strlen(temp_ip)) == 0)
+ {
+ break;
+ }
+ }
+ return index;
+}
void mrl_identify_nominee(struct streaminfo *mystream)
{
- UINT32 dip;
+ char dip[MRL_STR_IP_LEN];
+ memset(dip,0,MRL_STR_IP_LEN);
+
+ uint32_t gdev_ip;
+ unsigned int index = 0;
struct mrl_candidate_item candidate_item;
memset(&candidate_item ,0,sizeof(struct mrl_candidate_item));
- dip = ntohl(mystream->addr.tuple4_v4->daddr);
- if(MESA_htable_search_cb(mrl_instance.ht_nominee, (const unsigned char *)&(dip), sizeof(dip),ht_search_cb,(void *)&candidate_item,NULL) != NULL)
+ inet_ntop(AF_INET, &(mystream->addr.tuple4_v4->daddr), dip, MRL_STR_IP_LEN);
+ if(MESA_htable_search_cb(mrl_instance.ht_nominee, (const unsigned char *)dip, MRL_STR_IP_LEN,ht_search_cb,(void *)&candidate_item,NULL) != NULL)
{
- mrl_get_candidate_vxlan_info(mystream,&(candidate_item.vxlan_info));
+ get_rawpkt_opt_from_streaminfo(mystream, RAW_PKT_GET_GDEV_IP, &(gdev_ip));
+ printf("cur gdev ip is %d\n",gdev_ip);
+ index = get_gdev_ip_index(gdev_ip);
+ printf("cur gdev info index is %d\n",index);
+ assert(index < mrl_instance.mrl_cfg.vxlan_gdev_num);//������ھ�˵�������ݰ���GDEV��������̽���GDEV�У�����
+ mrl_get_vxlan_info(&(candidate_item.vxlan_info),index);
MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_identify_nominee","get candidate item:"
"config_id:%d,group_id:%d,addr_type:%d,ip_addr:%s,location:%d,mrl_ip:%s,is_vaild:%d,op_time:%s",
candidate_item.config_id, candidate_item.group_id,candidate_item.addr_type, candidate_item.ip_addr,
@@ -292,11 +344,9 @@ void mrl_identify_nominee(struct streaminfo *mystream)
}
}
-
-
-
void Maat_set_nominee_cmd_line(Maat_feather_t feather, struct mrl_nominee_item *nominee_item)
{
+ printf("start to insert %s to nominee table\n",nominee_item->ip_addr);
const struct Maat_line_t *p_line;
struct Maat_line_t line_rule;
char table_line[512];
diff --git a/src/mrl_redis.o b/src/mrl_redis.o
new file mode 100644
index 0000000..a5987ea
--- /dev/null
+++ b/src/mrl_redis.o
Binary files differ
diff --git a/src/mrl_utils.c b/src/mrl_utils.c
index 46d135a..95d6eb2 100644
--- a/src/mrl_utils.c
+++ b/src/mrl_utils.c
@@ -1,11 +1,14 @@
#include<string.h>
#include<stdio.h>
#include<assert.h>
-#include <ctype.h>
+#include<ctype.h>
#include<time.h>
+#include<errno.h>
#include "mrl_utils.h"
#include "mrl_main.h"
+extern struct mrl_global_instance mrl_instance;
+
/* ascii�ַ�ת16���� */
char mrl_ascii_to_hex(char ascii)
{
@@ -59,7 +62,7 @@ char mrl_ascii_to_hex(char ascii)
0: ����
-1:����
*/
-int mrl_mac_pton(const char *str, int delim, char *mac)
+int mrl_mac_pton(const char *str, int delim, uint8_t *mac)
{
#define MAC_STR_LEN_DELIM (17) /* length of "11:22:33:44:55:66" */
#define MAC_STR_LEN_NODELIM (12) /* length of "112233445566" */
@@ -71,7 +74,7 @@ int mrl_mac_pton(const char *str, int delim, char *mac)
{
if(strlen(str) != MAC_STR_LEN_DELIM)
{
- printf("MAC string length error!\n");
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_mac_pton","MAC string length error!");
assert(0);
return -1;
}
@@ -80,7 +83,7 @@ int mrl_mac_pton(const char *str, int delim, char *mac)
{
if(strlen(str) != MAC_STR_LEN_NODELIM)
{
- printf("MAC string length error!\n");
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_mac_pton","MAC string length error!");
assert(0);
return -1;
}
@@ -92,7 +95,7 @@ int mrl_mac_pton(const char *str, int delim, char *mac)
mac[i] = 0; /* �����㣬��ֵ��䶼�ǻ���� */
if(isxdigit(*s)==0)
{
- printf("MAC string type error!\n");
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_mac_pton","MAC string type error!");
assert(0);
return -1;
}
@@ -101,7 +104,7 @@ int mrl_mac_pton(const char *str, int delim, char *mac)
if(isxdigit(*s)==0)
{
- printf("MAC string type error!\n");
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_mac_pton","MAC string type error!");
assert(0);
return -1;
}
@@ -110,7 +113,7 @@ int mrl_mac_pton(const char *str, int delim, char *mac)
if((delim != -1) && i<5 && (*s++ != (char)delim))
{
- printf("MAC string type error!\n");
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_mac_pton","MAC string type error!");
assert(0);
return -1;
}
@@ -147,6 +150,80 @@ void get_cur_time(char *date)
struct tm *lt;
time(&t);
lt = localtime(&t);
- snprintf(date, MRL_DATE_LEN,"%d/%d/%d %d:%d:%d",lt->tm_year+1900, lt->tm_mon, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);
+ snprintf(date, MRL_DATE_LEN,"%d/%d/%d/%d:%d:%d",lt->tm_year+1900, lt->tm_mon, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);
+}
+
+unsigned short mrl_get_checksum(unsigned short * buffer, size_t len)
+{
+ unsigned int sum = 0;
+
+ while (len > 1) {
+ sum += *buffer++;
+ len -= sizeof(unsigned short);
+ }
+
+ if (len) {
+ sum += *(unsigned char *)buffer;
+ }
+
+ while (sum >> 16) {
+ sum = (sum >> 16) + (sum & 0xffff);
+ }
+
+ return (unsigned short)(~sum);
+}
+
+void mrl_mmdb_init(const char *path)
+{
+ printf("mrl mmdb init\n");
+ int status =MMDB_open(path,MMDB_MODE_MMAP,&(mrl_instance.mrl_mmdb));
+ if(status != MMDB_SUCCESS)
+ {
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_mmdb_init","Can't open %s - %s!",path,MMDB_strerror(status));
+ if(status == MMDB_IO_ERROR)
+ {
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_mmdb_init","IO error: %s",strerror(errno));
+ }
+ assert(0);
+ }
+}
+
+int mrl_search_ip_country(MMDB_s mmdb, const char *ip_address, const char *mycountry)
+{
+ int gai_error, mmdb_error;
+ MMDB_lookup_result_s result = MMDB_lookup_string(&mmdb, ip_address, &gai_error, &mmdb_error);
+ if (0 != gai_error)
+ {
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_mmdb_search","Error from getaddrinfo for %s - %s!",ip_address,gai_strerror(gai_error));
+ assert(0);
+
+ }
+ if (MMDB_SUCCESS != mmdb_error)
+ {
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_mmdb_search","Got an error from libmaxminddb: %s!",MMDB_strerror(mmdb_error));
+ assert(0);
+ }
+ MMDB_entry_data_s entry_data;
+ if (result.found_entry)
+ {
+ int status = MMDB_get_value(&result.entry, &entry_data, "COUNTRY", NULL);
+ if (MMDB_SUCCESS != status)
+ {
+ MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"mrl_mmdb_search","Got an error looking up the entry data - %s!",MMDB_strerror(status));
+ assert(0);
+ }
+ if (entry_data.has_data)
+ {
+ if(memcmp(mycountry, entry_data.utf8_string, entry_data.data_size) == 0)
+ {
+ return 0;
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ }
+ return -1;
}
diff --git a/src/mrl_utils.o b/src/mrl_utils.o
new file mode 100644
index 0000000..83236e2
--- /dev/null
+++ b/src/mrl_utils.o
Binary files differ