diff options
| author | lijie <[email protected]> | 2018-11-12 20:38:54 +0800 |
|---|---|---|
| committer | lijie <[email protected]> | 2018-11-12 20:38:54 +0800 |
| commit | 845ec90149a3099ebf4888a747dff572a46f82f0 (patch) | |
| tree | 1a7a72b6fdc5070ec7509923e6d9e440fc5cda35 | |
| parent | 417434fbc0bde8352a17555c1964851ac3b10b9a (diff) | |
修改编译遇到的问题,主动构造candidate,写入redis
| -rw-r--r-- | include/mrl_base.h | 5 | ||||
| -rw-r--r-- | include/mrl_main.h | 79 | ||||
| -rw-r--r-- | include/mrl_packet.h | 14 | ||||
| -rw-r--r-- | include/mrl_redis.h (renamed from include/mr_redis.h) | 23 | ||||
| -rw-r--r-- | src/Makefile | 2 | ||||
| -rw-r--r-- | src/mrl_main.c | 112 | ||||
| -rw-r--r-- | src/mrl_packet.c | 127 | ||||
| -rw-r--r-- | src/mrl_redis.c | 267 |
8 files changed, 365 insertions, 264 deletions
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 <arpa/inet.h>
+#include <sys/types.h>
+
+
+#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/mr_redis.h b/include/mrl_redis.h index 63883d7..bdf35f9 100644 --- a/include/mr_redis.h +++ b/include/mrl_redis.h @@ -1,3 +1,12 @@ +#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;
@@ -23,9 +32,9 @@ struct mrl_vxlan_info{ 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_encap_type;
int vxlan_link_id;
- unsigned char vxlan_link_dir;
+ int vxlan_link_dir;
char vxlan_inner_smac[MRL_STR_MAC_LEN];
char vxlan_inner_dmac[MRL_STR_MAC_LEN];
};
@@ -40,10 +49,18 @@ struct mrl_candidate_item{ struct mrl_vxlan_info vxlan_info;
};
-MESA_htable_handle mrl_htable_init();
+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 <pthread.h>
#include <string.h>
#include <assert.h>
-#include <arpa/inet.h>
-#include <sys/types.h>
-
-#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 <arpa/inet.h>
+#include <sys/types.h>
+#include <assert.h>
+#include<unistd.h>
+
+#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 <assert.h>
+#include<stdio.h>
+
+#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);
+ }
}
-
|
