From 845ec90149a3099ebf4888a747dff572a46f82f0 Mon Sep 17 00:00:00 2001 From: lijie Date: Mon, 12 Nov 2018 20:38:54 +0800 Subject: 修改编译遇到的问题,主动构造candidate,写入redis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/mr_redis.h | 49 ---------- include/mrl_base.h | 5 + include/mrl_main.h | 79 +++++++++++++++ include/mrl_packet.h | 14 +++ include/mrl_redis.h | 66 +++++++++++++ src/Makefile | 2 +- src/mrl_main.c | 112 ++++++--------------- src/mrl_packet.c | 127 ++++++++++++------------ src/mrl_redis.c | 267 +++++++++++++++++++++++++++++---------------------- 9 files changed, 411 insertions(+), 310 deletions(-) delete mode 100644 include/mr_redis.h create mode 100644 include/mrl_main.h create mode 100644 include/mrl_redis.h diff --git a/include/mr_redis.h b/include/mr_redis.h deleted file mode 100644 index 63883d7..0000000 --- a/include/mr_redis.h +++ /dev/null @@ -1,49 +0,0 @@ -struct mrl_nominee_item{ - int region_id; - int group_id; - int addr_type; - char src_ip[MRL_STR_IP_LEN]; - char mask_src_ip[MRL_STR_IP_LEN]; - char dport[MRL_STR_PORT_LEN]; - char mask_dport[MRL_STR_PORT_LEN]; - int protocol; - int direction; - int is_vaild; - int action; - int service; - char date[DATE_LEN]; - int type; - int strategy_group_id; -}; - -struct mrl_vxlan_info{ - char vxlan_outer_local_mac[MRL_STR_MAC_LEN];//յݰı豸MACַ - char vxlan_outer_gdev_mac[MRL_STR_MAC_LEN];//յݰĴ豸MACַ - char vxlan_outer_local_ip[MRL_STR_IP_LEN]; - char vxlan_outer_gdev_ip[MRL_STR_IP_LEN];//豸IP - char vxlan_outer_gdev_port[MRL_STR_PORT_LEN]; - char vxlan_outer_local_port[MRL_STR_PORT_LEN]; - unsigned char vxlan_encap_type; - int vxlan_link_id; - unsigned char vxlan_link_dir; - char vxlan_inner_smac[MRL_STR_MAC_LEN]; - char vxlan_inner_dmac[MRL_STR_MAC_LEN]; -}; -struct mrl_candidate_item{ - int candidate_id; - int addr_type; - char client_ip[MRL_STR_IP_LEN];//ͻIP - int type; - int location; - int group_id; - char mrl_ip[MRL_STR_IP_LEN]; - struct mrl_vxlan_info vxlan_info; -}; - -MESA_htable_handle mrl_htable_init(); -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); - - - diff --git a/include/mrl_base.h b/include/mrl_base.h index d7a848b..ab34663 100644 --- a/include/mrl_base.h +++ b/include/mrl_base.h @@ -1,3 +1,8 @@ +#ifndef __MRL_BASE_H_ +#define __MRL_BASE_H_ + unsigned int mrl_split_str(char *str, const char *delim, char **dest); +int mrl_mac_pton(const char *str, int delim, char *mac); +#endif diff --git a/include/mrl_main.h b/include/mrl_main.h new file mode 100644 index 0000000..d6f029a --- /dev/null +++ b/include/mrl_main.h @@ -0,0 +1,79 @@ +#ifndef __MRL_MAIN_H_ +#define __MRL_MAIN_H_ +#include +#include + + +#include "stream_inc/stream_rawpkt.h" +#include "MESA_prof_load.h" +#include "MESA_handle_logger.h" +#include "MESA_htable.h" +#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 DATE_LEN 50 + +#define MRL_MAX_PATH 50 + +struct mrl_global_cfg +{ + //log info + char mrl_log_path[MRL_MAX_PATH]; + int mrl_log_level; + + //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 + + //maat info + char Maat_table_path[MRL_MAX_PATH]; + char Maat_redis_ip[MRL_STR_IP_LEN]; + unsigned short 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; + + /*vxlan info*/ + unsigned int vxlan_gdev_num; + char **vxlan_outer_gdev_mac; + char vxlan_outer_local_mac[MRL_STR_MAC_LEN]; + char **vxlan_outer_gdev_ip; + char vxlan_outer_local_ip[MRL_STR_IP_LEN]; + char **vxlan_outer_gdev_port; + char xvlan_outer_local_port[MRL_STR_PORT_LEN]; + char **vxlan_encap_type; + 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]; +}; + +struct mrl_global_instance +{ + void *mrl_log_handle; + struct mrl_global_cfg mrl_cfg; + + Maat_feather_t nominee_feather; + Maat_feather_t candidate_feather; + + MESA_htable_handle ht_nominee; + MESA_htable_handle ht_candidate; + + int *mrl_snd_fd; + int mrl_rcv_fd; + struct sockaddr_in mgw_addr; +}; +#endif diff --git a/include/mrl_packet.h b/include/mrl_packet.h index 47224f7..4378c80 100644 --- a/include/mrl_packet.h +++ b/include/mrl_packet.h @@ -1,2 +1,16 @@ +#ifndef __MRL_PACKET_H_ +#define __MRL_PACKET_H_ + +#include "stream.h" +#include "mrl_redis.h" + void mrl_socket_init(); +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); + + +#endif + diff --git a/include/mrl_redis.h b/include/mrl_redis.h new file mode 100644 index 0000000..bdf35f9 --- /dev/null +++ b/include/mrl_redis.h @@ -0,0 +1,66 @@ +#ifndef __MRL_REDIS_H_ +#define __MRL_REDIS_H_ + +#include "mrl_main.h" + +#define IR_NOMINEE_IP_TABLE_NAME "IR_NOMINEE_IP" +#define IR_CANDIDATE_IP_TABLE_NAME "IR_CANDINATE_IP" +#define REDIS_CANDIATE_KEY_NAME "IR_CANDIDATE_ID" + +struct mrl_nominee_item{ + int region_id; + int group_id; + int addr_type; + char src_ip[MRL_STR_IP_LEN]; + char mask_src_ip[MRL_STR_IP_LEN]; + char dport[MRL_STR_PORT_LEN]; + char mask_dport[MRL_STR_PORT_LEN]; + int protocol; + int direction; + int is_vaild; + int action; + int service; + char date[DATE_LEN]; + int type; + int strategy_group_id; +}; + +struct mrl_vxlan_info{ + char vxlan_outer_local_mac[MRL_STR_MAC_LEN];//յݰı豸MACַ + char vxlan_outer_gdev_mac[MRL_STR_MAC_LEN];//յݰĴ豸MACַ + char vxlan_outer_local_ip[MRL_STR_IP_LEN]; + char vxlan_outer_gdev_ip[MRL_STR_IP_LEN];//豸IP + char vxlan_outer_gdev_port[MRL_STR_PORT_LEN]; + char vxlan_outer_local_port[MRL_STR_PORT_LEN]; + int vxlan_encap_type; + int vxlan_link_id; + int vxlan_link_dir; + char vxlan_inner_smac[MRL_STR_MAC_LEN]; + char vxlan_inner_dmac[MRL_STR_MAC_LEN]; +}; +struct mrl_candidate_item{ + int candidate_id; + int addr_type; + char client_ip[MRL_STR_IP_LEN];//ͻIP + int type; + int location; + int group_id; + char mrl_ip[MRL_STR_IP_LEN]; + struct mrl_vxlan_info vxlan_info; +}; + +MESA_htable_handle mrl_htable_init(void * fn_data_free_cb); +void ht_candidate_free_cb(void * data); +void ht_nominee_free_cb(void * data); +void Maat_set_cmd_line(Maat_feather_t feather, struct mrl_candidate_item *candidate_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); + +#endif + + diff --git a/src/Makefile b/src/Makefile index 6a6a5ba..ac5d78f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -18,7 +18,7 @@ LIBS += -lMESA_prof_load -lMESA_handle_logger -lpthread -lmaatframe -lMESA_htabl TARGET = mrl -OBJS = mrl_main.o mrl_base.o +OBJS = mrl_main.o mrl_base.o mrl_packet.o mrl_redis.o .PHONY: all clean install diff --git a/src/mrl_main.c b/src/mrl_main.c index 3a0fe9b..6c16982 100644 --- a/src/mrl_main.c +++ b/src/mrl_main.c @@ -3,104 +3,23 @@ #include #include #include -#include -#include - -#include "stream_inc/stream_rawpkt.h" -#include "MESA_prof_load.h" -#include "MESA_handle_logger.h" -#include "MESA_htable.h" -#include "Maat_rule.h" -#include "Maat_command.h" +#include "mrl_main.h" #include "mrl_base.h" #include "mrl_redis.h" -#include "mrl_socket.h" +#include "mrl_packet.h" -#define MRL_MAC_LEN 6 -#define MRL_BUFF_LEN 3000 -#define MRL_MAX_PATH 50 #define MRL_MAX_STRING 50 -#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_IPV4_TYPE 4 - -#define DATE_LEN 50 - #define RLOG_LV_DEBUG 10 #define RLOG_LV_INFO 20 #define RLOG_LV_FATAL 30 #define CMD_LINE_NUM 1 - -#define PORT_MODE (1<<10) -1 -#define PORT_MASK ((1<<15) -1)^((1<<6) -1) - -struct mrl_global_cfg -{ - //log info - char mrl_log_path[MRL_MAX_PATH]; - int mrl_log_level; - - //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 - - //maat info - char Maat_table_path[MRL_MAX_PATH]; - char Maat_redis_ip[MRL_STR_IP_LEN]; - unsigned short 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; - - /*vxlan info*/ - unsigned int vxlan_gdev_num; - char **vxlan_outer_gdev_mac; - char vxlan_outer_local_mac[MRL_STR_MAC_LEN]; - char **vxlan_outer_gdev_ip; - char vxlan_outer_local_ip[MRL_STR_IP_LEN]; - char **vxlan_outer_gdev_port; - char xvlan_outer_local_port[MRL_STR_PORT_LEN]; - char **vxlan_encap_type; - 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]; -}; - -struct mrl_global_instance -{ - void *mrl_log_handle; - struct mrl_global_cfg mrl_cfg; - - Maat_feather_t nominee_feather; - Maat_feather_t candidate_feather; - - MESA_htable_handle ht_nominee; - MESA_htable_handle ht_candidate; - - int *mrl_snd_fd; - int mrl_rcv_fd; - struct sockaddr_in mgw_addr; -}; - struct mrl_global_instance mrl_instance; void mrl_cfg_init(const char *profile) @@ -261,8 +180,8 @@ extern "C" int mrl_init(void) } return 1; - mrl_instance.ht_nominee = mrl_htable_init(); - mrl_instance.ht_candidate = mrl_htable_init(); + mrl_instance.ht_nominee = mrl_htable_init((void *)ht_nominee_free_cb); + mrl_instance.ht_candidate = mrl_htable_init((void *)ht_candidate_free_cb); mrl_instance.nominee_feather = mrl_Maat_feather_init("mrl_nominee",IR_NOMINEE_IP_TABLE_NAME,NULL,nominee_update_cb,NULL,NULL); @@ -285,6 +204,28 @@ extern "C" int mrl_init(void) int main() { mrl_init(); + int index = 0; + struct mrl_candidate_item candidate_item; + char src_ip[]="192.168.11.23"; + candidate_item.addr_type = 4 ; + memcpy(candidate_item.client_ip,src_ip,strlen(src_ip)); + candidate_item.type = 0; + //to do how to get ip location + candidate_item.location = 0; + candidate_item.group_id = 1; + 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; } @@ -294,6 +235,7 @@ extern "C" void mrl_destroy(void) MESA_destroy_runtime_log_handle(instance.logger); Maat_burn_feather(instance.maat_father); free(mrl_instance.mrl_cfg); + mrl_socket_close(); } extern "C" char mrl_tcpall_entry(struct streaminfo *a_tcp,void **pme, int thread_seq, void *raw_packet) diff --git a/src/mrl_packet.c b/src/mrl_packet.c index 8d1aa2a..ac8cc7b 100644 --- a/src/mrl_packet.c +++ b/src/mrl_packet.c @@ -1,14 +1,35 @@ +#include +#include +#include +#include + +#include "stream.h" +#include "stream_inc/stream_control.h" + +#include "mrl_packet.h" +#include "mrl_main.h" +#include "mrl_base.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; + void mrl_socket_init() { //init send fd int i; int thread_num = 0; int len = sizeof(thread_num); - sapp_get_platform_opt(SPO_THREAD_COUNT,(void *) &thread_num, &len); - mrl_instance.mrl_rcv_fd = (int *) malloc (sizeof(int)*thread_num); + thread_num = 5; + //sapp_get_platform_opt(SPO_THREAD_COUNT,(void *) &thread_num, &len); + mrl_instance.mrl_snd_fd = (int *) malloc (sizeof(int)*thread_num); for(i = 0; i< thread_num;i++) { - mrl_instance.mrl_rcv_fd = socket(AF_INET, SOCK_DGRAM, 0); + mrl_instance.mrl_snd_fd[i] = socket(AF_INET, SOCK_DGRAM, 0); } //init destnation sock addr @@ -27,6 +48,21 @@ void mrl_socket_init() } +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); + for(i = 0; i< thread_num;i++) + { + close(mrl_instance.mrl_snd_fd[i]); + } + + close(mrl_instance.mrl_rcv_fd); +} + ssize_t mrl_sock_send(int fd, const char *pkt, ssize_t pkt_len, struct sockaddr_in *dest) { ssize_t send_len = 0; @@ -48,7 +84,6 @@ void mrl_send_to_gdev(int thread_seq, struct mrl_vxlan_info * vxlan_info, const { SAPP_TLV_T option[32]; int option_num = 0; - int vxlan_link_id = 1; char temp_mac[MRL_MAC_LEN]; unsigned int temp_ip; @@ -106,25 +141,25 @@ void mrl_send_to_gdev(int thread_seq, struct mrl_vxlan_info * vxlan_info, const option[option_num].type = SAPP_SEND_OPT_VXLAN_LINK_ID; option[option_num].length = 4; - option[option_num].int_value = vxlan_info.vxlan_link_id; + option[option_num].int_value = vxlan_info->vxlan_link_id; option_num++;/////// option[option_num].type = SAPP_SEND_OPT_VXLAN_LINK_ENCAP_TYPE; option[option_num].length = 1; - option[option_num].char_value = vxlan_info.vxlan_encap_type; + option[option_num].char_value = vxlan_info->vxlan_encap_type; option_num++;/////// option[option_num].type = SAPP_SEND_OPT_VXLAN_LINK_DIR; option[option_num].length = 1; - option[option_num].char_value = vxlan_info.vxlan_link_dir; + option[option_num].char_value = vxlan_info->vxlan_link_dir; option_num++;/////// option[option_num].type = SAPP_SEND_OPT_INNER_LINK_ENCAP_TYPE; option[option_num].length = 1; - option[option_num].char_value = TUNNAT_TUNNEL_TYPE_ETHER; + option[option_num].char_value = vxlan_info->vxlan_encap_type; option_num++;/////// @@ -144,47 +179,12 @@ void mrl_send_to_gdev(int thread_seq, struct mrl_vxlan_info * vxlan_info, const option_num++;/////// - MESA_sendpacket_iplayer_options(thread_seq, + /*MESA_sendpacket_iplayer_options(thread_seq, payload, payload_len, - vxlan_info.vxlan_link_dir, + vxlan_info->vxlan_link_dir, option, - option_num); -} - -void mrl_get_candidate_vxlan_info(struct streaminfo *mystream, struct mrl_vxlan_info *vxlan) -{ - 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); - int index = 0; - for(; index < mrl_instance.mrl_cfg.gdev_num; index++) - { - if(memcmp(vxlan->vxlan_outer_gdev_ip,mrl_instance.mrl_cfg.gdev_ip[index],strlen(vxlan->vxlan_outer_gdev_ip)) == 0) - { - break; - } - } - assert(index < mrl_instance.mrl_cfg.gdev_num);//ھ˵ݰGDEV̽GDEVУ - memcpy(vxlan->vxlan_inner_smac, mrl_instance.mrl_cfg.vxlan_inner_smacs[index],strlen(mrl_instance.mrl_cfg.vxlan_inner_smacs[index])); - memcpy(vxlan->vxlan_inner_dmac, mrl_instance.mrl_cfg.vxlan_inner_dmacs[index], strlen(mrl_instance.mrl_cfg.vxlan_inner_dmacs[index])); - vxlan->vxlan_encap_type = mrl_instance.mrl_cfg.vxlan_encap_types[index]; - vxlan->vxlan_link_id = mrl_instance.mrl_cfg.vxlan_link_ids[index]; - vxlan->vxlan_link_dir = mrl_instance.mrl_cfg.vxlan_link_dirs[index]; - vxlan->vxlan_outer_local_port = mrl_instance.mrl_cfg.xvlan_outer_locals_port[index]; - vxlan->vxlan_outer_gdev_port = mrl_instance.mrl_cfg.vxlan_outer_gdevs_port[index]; - memcpy(vxlan->vxlan_outer_local_ip, mrl_instance.mrl_cfg.vxlan_outer_locals_ip[index],strlen(mrl_instance.mrl_cfg.vxlan_outer_locals_ip[index])); - memcpy(vxlan->vxlan_outer_gdev_ip, mrl_instance.mrl_cfg.vxlan_outer_gdevs_ip[index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdevs_ip[index])); - memcpy(vxlan->vxlan_outer_local_mac, mrl_instance.mrl_cfg.vxlan_outer_locals_mac[index],strlen(mrl_instance.mrl_cfg.vxlan_outer_locals_mac[index])); - memcpy(vxlan->vxlan_outer_gdev_mac, mrl_instance.mrl_cfg.vxlan_outer_gdevs_mac[index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdevs_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", - 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); - + option_num);*/ } @@ -207,6 +207,14 @@ bool mrl_pkt_signature_identify(struct streaminfo *mystream) } } +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)); + assert(send_len == pkt_len); +} void *mrl_recv_mgw_action(void *arg) { @@ -214,21 +222,18 @@ void *mrl_recv_mgw_action(void *arg) char rcv_buff[MRL_BUFF_LEN]; ssize_t recv_len = 0; int thread_seq = 0; - int temp_len = sizeof(thread_seq); - sapp_get_platform_opt(SPO_REQUEST_SEND_THREAD_ID, &thread_seq, &temp_len); - recv_len = mrl_sock_recv(mrl_instance.mgw_rcv_fd,rcv_buff, MRL_BUFF_LEN); - struct mrl_vxlan_info *vxlan_info = (struct mrl_vxlan_info *)rcv_buff; - size_t vxlan_len = sizeof(struct mrl_vxlan_info); - mrl_send_to_gdev(thread_seq,vxlan_info,rcv_buff + vxlan_len, recv_len - vxlan_len); -} - -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)); - assert(send_len == pkt_len); + int temp_len = 0; + while(1) + { + recv_len = mrl_sock_recv(mrl_instance.mrl_rcv_fd,rcv_buff, MRL_BUFF_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); + mrl_send_to_gdev(thread_seq,vxlan_info,rcv_buff + vxlan_len, recv_len - vxlan_len); + } + return NULL; } diff --git a/src/mrl_redis.c b/src/mrl_redis.c index a0cbb84..c1e8d8f 100644 --- a/src/mrl_redis.c +++ b/src/mrl_redis.c @@ -1,50 +1,43 @@ -#define IR_NOMINEE_IP_TABLE_NAME "IR_NOMINEE_IP" -#define IR_CANDIDATE_IP_TABLE_NAME "IR_CANDINATE_IP" -#define REDIS_CANDIATE_KEY_NAME "IR_CANDIDATE_ID" -struct mrl_nominee_item{ - int region_id; - int group_id; - int addr_type; - char src_ip[MRL_STR_IP_LEN]; - char mask_src_ip[MRL_STR_IP_LEN]; - char dport[MRL_STR_PORT_LEN]; - char mask_dport[MRL_STR_PORT_LEN]; - int protocol; - int direction; - int is_vaild; - int action; - int service; - char date[DATE_LEN]; - int type; - int strategy_group_id; -}; - -struct mrl_vxlan_info{ - char vxlan_outer_local_mac[MRL_STR_MAC_LEN];//յݰı豸MACַ - char vxlan_outer_gdev_mac[MRL_STR_MAC_LEN];//յݰĴ豸MACַ - char vxlan_outer_local_ip[MRL_STR_IP_LEN]; - char vxlan_outer_gdev_ip[MRL_STR_IP_LEN];//豸IP - char vxlan_outer_gdev_port[MRL_STR_PORT_LEN]; - char vxlan_outer_local_port[MRL_STR_PORT_LEN]; - unsigned char vxlan_encap_type; - int vxlan_link_id; - unsigned char vxlan_link_dir; - char vxlan_inner_smac[MRL_STR_MAC_LEN]; - char vxlan_inner_dmac[MRL_STR_MAC_LEN]; -}; - -struct mrl_candidate_item{ - int candidate_id; - int addr_type; - char client_ip[MRL_STR_IP_LEN];//ͻIP - int type; - int location; - int group_id; - char mrl_ip[MRL_STR_IP_LEN]; - struct mrl_vxlan_info vxlan_info; -}; - -MESA_htable_handle mrl_htable_init() +#include +#include + +#include "mrl_redis.h" + +#define MRL_IPV4_TYPE 4 + +extern struct mrl_global_instance mrl_instance; + +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)) + { + 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); + } +} + +void ht_nominee_free_cb(void * data) +{ + struct mrl_nominee_item *nominee_item = (struct mrl_nominee_item *)data; + if(nominee_item != NULL) + { + free(nominee_item); + nominee_item = NULL; + } +} + +void ht_candidate_free_cb(void * data) +{ + struct mrl_candidate_item *candidate_item = (struct mrl_candidate_item *)data; + if(candidate_item != NULL) + { + free(candidate_item); + candidate_item = NULL; + } +} + +MESA_htable_handle mrl_htable_init(void * fn_data_free_cb) { unsigned int opt_int; MESA_htable_handle htable = MESA_htable_born(); @@ -65,15 +58,17 @@ MESA_htable_handle mrl_htable_init() opt_int = 0; MESA_htable_set_opt(htable, MHO_SCREEN_PRINT_CTRL, &opt_int, sizeof(int)); - opt_int = mrl_instance.ht_slots; + opt_int = mrl_instance.mrl_cfg.ht_slots; MESA_htable_set_opt(htable, MHO_HASH_SLOT_SIZE, &opt_int, sizeof(int)); - opt_int = mrl_instance.ht_max_sessions + 1; + opt_int = mrl_instance.mrl_cfg.ht_max_element_num + 1; MESA_htable_set_opt(htable, MHO_HASH_MAX_ELEMENT_NUM, &opt_int, sizeof(int)); - opt_int = mrl_instance.ht_mutex_num; + opt_int = mrl_instance.mrl_cfg.ht_mutex_num; MESA_htable_set_opt(htable, MHO_MUTEX_NUM, &opt_int, sizeof(int)); + MESA_htable_set_opt(htable, MHO_CBFUN_DATA_FREE, fn_data_free_cb, sizeof(fn_data_free_cb)); + int ret = MESA_htable_mature(htable); if (ret < 0) { @@ -85,35 +80,28 @@ MESA_htable_handle mrl_htable_init() Maat_feather_t Maat_init(const char * instance_name, const char * redis_ip, const short redis_port, const char *stat_path) { - - // init Maat - - Maat_feather_t Maat_feather = Maat_feather(mrl_instance.mrl_cfg.Maat_max_threads, mrl_instance.mrl_cfg.Maat_table_path, mrl_instance.mrl_log_handle); - if(Maat_feather == NULL) - { - MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"Maat_init","Maat_feather func error!"); - assert(0); - } - wrapped_Maat_set_feather_opt(Maat_feather, MAAT_OPT_INSTANCE_NAME, instance_name, strlen(instance_name)+1); - wrapped_Maat_set_feather_opt(Maat_feather, MAAT_OPT_REDIS_IP, redis_ip, strlen(redis_ip)+1); - wrapped_Maat_set_feather_opt(Maat_feather, MAAT_OPT_REDIS_PORT, &(redis_port), sizeof(redis_port)); - wrapped_Maat_set_feather_opt(Maat_feather, MAAT_OPT_STAT_FILE_PATH, stat_path, strlen(stat_path)+1); - wrapped_Maat_set_feather_opt(Maat_feather, MAAT_OPT_STAT_ON, NULL, 0); - wrapped_Maat_set_feather_opt(Maat_feather, MAAT_OPT_PERF_ON, NULL, 0); - int ret = Maat_initiate_feather(Maat_feather); - if(unlikely(ret< 0)) + // init Maat + Maat_feather_t feather = Maat_feather(mrl_instance.mrl_cfg.Maat_max_threads, mrl_instance.mrl_cfg.Maat_table_path, mrl_instance.mrl_log_handle); + wrapped_Maat_set_feather_opt(feather, MAAT_OPT_INSTANCE_NAME, instance_name, strlen(instance_name)+1); + wrapped_Maat_set_feather_opt(feather, MAAT_OPT_REDIS_IP, redis_ip, strlen(redis_ip)+1); + wrapped_Maat_set_feather_opt(feather, MAAT_OPT_REDIS_PORT, &(redis_port), sizeof(redis_port)); + wrapped_Maat_set_feather_opt(feather, MAAT_OPT_STAT_FILE_PATH, stat_path, strlen(stat_path)+1); + wrapped_Maat_set_feather_opt(feather, MAAT_OPT_STAT_ON, NULL, 0); + wrapped_Maat_set_feather_opt(feather, MAAT_OPT_PERF_ON, NULL, 0); + int ret = Maat_initiate_feather(feather); + if(ret< 0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"Maat_init","Maat_initiate_feather func error!"); assert(0); } - return Maat_feather; + return feather; } int Maat_plugin_table(Maat_feather_t feather,const char* table_name, Maat_start_callback_t *start,Maat_update_callback_t *update,Maat_finish_callback_t *finish, void *u_para) { int table_id=0,ret=0; table_id=Maat_table_register(feather,table_name); - if(unlikely(table_id==-1)) + if(table_id==-1) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"Maat_plugin_table","Maat_table_register func error,feather is %d and table name is %s!",feather,table_name); assert(0); @@ -121,7 +109,7 @@ int Maat_plugin_table(Maat_feather_t feather,const char* table_name, Maat_start_ else { ret=Maat_table_callback_register(feather, table_id, start, update,finish,u_para); - if(unlikely(ret<0)) + if(ret<0) { MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_FATAL,"Maat_plugin_table","Maat_table_callback_register func error,ret is %d!",ret); assert(0); @@ -140,19 +128,48 @@ Maat_feather_t mrl_Maat_feather_init(const char * instance_name,const char *tabl } +void mrl_create_candidate_item(struct mrl_candidate_item *candidate_item, struct mrl_nominee_item *nominee_item) +{ + candidate_item->candidate_id = (int)Maat_cmd_incrby(mrl_instance.candidate_feather,REDIS_CANDIATE_KEY_NAME, 1);; + candidate_item->addr_type = MRL_IPV4_TYPE ; + memcpy(candidate_item->client_ip,nominee_item->src_ip,strlen(nominee_item->src_ip)); + candidate_item->type = nominee_item->type; + //to do how to get ip location + candidate_item->location = 0; + candidate_item->group_id = nominee_item->group_id; + memcpy(candidate_item->mrl_ip, mrl_instance.mrl_cfg.vxlan_outer_local_ip,strlen(mrl_instance.mrl_cfg.vxlan_outer_local_ip)); +} + void nominee_update_cb(int table_id,const char* table_line,void* u_para) { - + int ret = 0; 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%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%s\t%d\t%d", - nominee_item->region_id, nominee_item->group_id, nominee_item->addr_type, + &(nominee_item->region_id), &(nominee_item->group_id), &(nominee_item->addr_type), nominee_item->src_ip, nominee_item->mask_src_ip, nominee_item->dport, - nominee_item->mask_dport, nominee_item->protocol, nominee_item->direction, - nominee_item->is_vaild, nominee_item->action, nominee_item->service, - nominee_item->date, nominee_item->type, nominee_item->strategy_group_id); + nominee_item->mask_dport, &(nominee_item->protocol), &(nominee_item->direction), + &(nominee_item->is_vaild), &(nominee_item->action), &(nominee_item->service), + nominee_item->date, &(nominee_item->type), &(nominee_item->strategy_group_id)); + switch(nominee_item->is_vaild) + { + case 0: + ret = MESA_htable_del(mrl_instance.ht_nominee, (const unsigned char *)nominee_item->src_ip, sizeof(nominee_item->src_ip), NULL); + assert(ret >= 0); + if(MESA_htable_search_cb(mrl_instance.ht_candidate, (const unsigned char *)&(nominee_item->src_ip), sizeof(nominee_item->src_ip),NULL,NULL,NULL) != NULL) + { + ret = MESA_htable_del(mrl_instance.ht_candidate, (const unsigned char *)nominee_item->src_ip, sizeof(nominee_item->src_ip), NULL); + assert(ret >= 0); + } + break; + case 1: + ret = MESA_htable_add(mrl_instance.ht_nominee, (const unsigned char *)nominee_item->src_ip, sizeof(nominee_item->src_ip), nominee_item); + assert(ret >= 0); + break; + default: + assert(0); + break; + } - int ret =MESA_htable_add(mrl_instance.ht_nominee, (const unsigned char *)nominee_item->src_ip, sizeof(nominee_item->src_ip), nominee_item); - assert(ret >= 0); } @@ -160,41 +177,70 @@ void candidate_update_cb(int table_id,const char* table_line,void* u_para) { struct mrl_candidate_item *candidate_item = (struct mrl_candidate_item *)calloc(1, sizeof(struct mrl_candidate_item)); sscanf(table_line,"%d\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%d\t%d\t%d\t%s\t%s", - candidate_item->candidate_id, candidate_item->addr_type, candidate_item->client_ip, - candidate_item->type, candidate_item->location, candidate_item->group_id, + &(candidate_item->candidate_id), &(candidate_item->addr_type), candidate_item->client_ip, + &(candidate_item->type), &(candidate_item->location), &(candidate_item->group_id), candidate_item->mrl_ip,candidate_item->vxlan_info.vxlan_outer_local_mac, candidate_item->vxlan_info.vxlan_outer_gdev_mac,candidate_item->vxlan_info.vxlan_outer_local_ip, candidate_item->vxlan_info.vxlan_outer_gdev_ip,candidate_item->vxlan_info.vxlan_outer_local_port, - candidate_item->vxlan_info.vxlan_outer_gdev_port,candidate_item->vxlan_info.vxlan_encap_type, - candidate_item->vxlan_info.vxlan_link_id,candidate_item->vxlan_info.vxlan_link_dir, + candidate_item->vxlan_info.vxlan_outer_gdev_port,&(candidate_item->vxlan_info.vxlan_encap_type), + &(candidate_item->vxlan_info.vxlan_link_id),&(candidate_item->vxlan_info.vxlan_link_dir), candidate_item->vxlan_info.vxlan_inner_smac,candidate_item->vxlan_info.vxlan_inner_dmac); - - int ret = MESA_htable_add(mrl_instance.ht_candidate, (const unsigned char *)candidate_item->client_ip, sizeof(candidate_item->client_ip), candidate_item); + int ret = MESA_htable_add(mrl_instance.ht_candidate, (const unsigned char *)(candidate_item->client_ip), sizeof(candidate_item->client_ip), candidate_item); assert(ret >= 0); } long ht_search_cb(void *data, const uchar *key, uint size, void *user_arg) { struct mrl_nominee_item *nominee_item = (struct mrl_nominee_item *)data; - struct streaminfo *mystrem = (struct streaminfo *)user_arg; + struct mrl_candidate_item *candidate_item = (struct mrl_candidate_item *)user_arg; + if(nominee_item != NULL)//ûö˿ڣ { - mrl_create_candidate_item(mystrem,nominee_item); + mrl_create_candidate_item(candidate_item,nominee_item); } return 1; } -void mrl_identify_nominee(struct streaminfo *mystrem) + +void mrl_get_candidate_vxlan_info(struct streaminfo *mystream, struct mrl_vxlan_info *vxlan) { - UINT32 dip; - bool ret = false; - dip = ntohl(mystrem->addr.tuple4_v4->daddr); - MESA_htable_search_cb(mrl_instance.ht_nominee, (const unsigned char *)&(dip), sizeof(dip),ht_search_cb,(void *)mystrem,NULL); + 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]); + vxlan->vxlan_link_id = atoi(mrl_instance.mrl_cfg.vxlan_link_id[index]); + vxlan->vxlan_link_dir = atoi(mrl_instance.mrl_cfg.vxlan_link_dir[index]); + memcpy(vxlan->vxlan_outer_local_port, mrl_instance.mrl_cfg.xvlan_outer_local_port,strlen(mrl_instance.mrl_cfg.xvlan_outer_local_port)); + memcpy(vxlan->vxlan_outer_gdev_port , mrl_instance.mrl_cfg.vxlan_outer_gdev_port[index],strlen(mrl_instance.mrl_cfg.vxlan_outer_gdev_port[index])); + memcpy(vxlan->vxlan_outer_local_ip, mrl_instance.mrl_cfg.vxlan_outer_local_ip,strlen(mrl_instance.mrl_cfg.vxlan_outer_local_ip)); + 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", + 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); + } void Maat_set_cmd_line(Maat_feather_t feather, struct mrl_candidate_item *candidate_item) { + const struct Maat_line_t *p_line; struct Maat_line_t line_rule; char table_line[128]; int ret=0,i=0; @@ -213,35 +259,28 @@ void Maat_set_cmd_line(Maat_feather_t feather, struct mrl_candidate_item *candid candidate_item->vxlan_info.vxlan_inner_smac,candidate_item->vxlan_info.vxlan_inner_dmac); line_rule.table_line=table_line; line_rule.expire_after=0; - ret=Maat_cmd_set_lines(feather, line_rule, 1, MAAT_OP_ADD); + p_line = &line_rule; + ret=Maat_cmd_set_lines(feather, &p_line, 1, MAAT_OP_ADD); assert(ret>0); return; } -void mrl_create_candidate_item(struct streaminfo *mystream, struct mrl_nominee_item *nominee_item) + +void mrl_identify_nominee(struct streaminfo *mystream) { - int table_id,ret; - struct mrl_candidate_item candidate_ip_item; - memset(&candidate_ip_item ,0,sizeof(struct mrl_candidate_item)); - candidate_ip_item.candidate_id = (int)Maat_cmd_incrby(mrl_instance.candiate_feather,REDIS_CANDIATE_KEY_NAME, 1);; - candidate_ip_item.addr_type = MRL_IPV4_TYPE ; - memcpy(candidate_ip_item.client_ip,nominee_item->src_ip,strlen(nominee_item->src_ip)); - candidate_ip_item.type = nominee_item->type; - //to do how to get ip location - candidate_ip_item.location = 0; - - candidate_ip_item.group_id = nominee_item->group_id; - memcpy(candidate_ip_item.mrl_ip, mrl_instance.mrl_cfg.local_ip,strlen(mrl_instance.mrl_cfg.local_ip)); - mrl_get_candidate_vxlan_info(mystream,&(candidate_ip_item.vxlan)); - - MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_create_candidate_item","get candidate item: - candidate_id:%d,addr_type:%d,client_ip:%s,type:%d, location:%d, - group_id:%d,mrl_ip:%s", - candidate_ip_item.candidate_id, candidate_ip_item.addr_type, candidate_ip_item.client_ip, candidate_ip_item.type, - candidate_ip_item.location, candidate_ip_item.group_id, candidate_ip_item.mrl_ip); - Maat_set_cmd_line(mrl_instance.candiate_feather,&mrl_candidate_item); - + UINT32 dip; + 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) + { + mrl_get_candidate_vxlan_info(mystream,&(candidate_item.vxlan_info)); + MESA_handle_runtime_log(mrl_instance.mrl_log_handle, RLOG_LV_DEBUG,"mrl_identify_nominee","get candidate item:" + "candidate_id:%d,addr_type:%d,client_ip:%s,type:%d, location:%d,group_id:%d,mrl_ip:%s", + candidate_item.candidate_id, candidate_item.addr_type, candidate_item.client_ip, + candidate_item.type,candidate_item.location, candidate_item.group_id, candidate_item.mrl_ip); + Maat_set_cmd_line(mrl_instance.candidate_feather,&candidate_item); + } } - -- cgit v1.2.3