diff options
Diffstat (limited to 'src/tsg_send_raw_packet.cpp')
| -rw-r--r-- | src/tsg_send_raw_packet.cpp | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/tsg_send_raw_packet.cpp b/src/tsg_send_raw_packet.cpp new file mode 100644 index 0000000..352e5e0 --- /dev/null +++ b/src/tsg_send_raw_packet.cpp @@ -0,0 +1,107 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include <MESA/MESA_prof_load.h> +#include <MESA/MESA_handle_logger.h> + +#include "tsg_rule.h" +#include "tsg_entry.h" + + +static int send_raw_packet(struct traffic_mirror *ttm,char * pkt_ptr,int pkt_len,int *vlan_array,int vlan_num,int thread_seq) +{ + int ret=tsg_traffic_mirror_send_burst(ttm, (char *)pkt_ptr, pkt_len, vlan_array, vlan_num, thread_seq); + if(ret==TRRAFFIC_MIRROR_SEND_SUCCESS) + { + FS_operate(g_tsg_para.fs2_handle, g_tsg_para.fs2_field_id[TSG_FS2_MIRRORED_PKT_SUCCESS], 0, FS_OP_ADD, 1); + FS_operate(g_tsg_para.fs2_handle, g_tsg_para.fs2_field_id[TSG_FS2_MIRRORED_BYTE_SUCCESS], 0, FS_OP_ADD, pkt_len); + } + else + { + FS_operate(g_tsg_para.fs2_handle, g_tsg_para.fs2_field_id[TSG_FS2_MIRRORED_PKT_FAILED], 0, FS_OP_ADD, 1); + FS_operate(g_tsg_para.fs2_handle, g_tsg_para.fs2_field_id[TSG_FS2_MIRRORED_BYTE_FAILED], 0, FS_OP_ADD, pkt_len); + + return -1; + } + + return 0; +} + +int tsg_send_raw_packet(const struct streaminfo *a_stream, int *vlan_id, int vlan_id_num, int thread_seq) +{ + int ret=0; + void *p_eth_rawpkt=NULL; + int eth_rawpkt_len=0; + raw_ipfrag_list_t *frag_pkt=NULL; + + if(g_tsg_para.mirror_switch==0) + { + return 0; + } + + ret=get_rawpkt_opt_from_streaminfo(a_stream, RAW_PKT_GET_DATA, &p_eth_rawpkt); + switch(0) + { + case 0: + ret=get_rawpkt_opt_from_streaminfo(a_stream, RAW_PKT_GET_TOT_LEN, ð_rawpkt_len); + if(ret<0) + { + break; + } + + send_raw_packet(g_tsg_para.mirror_handle, (char *)p_eth_rawpkt, eth_rawpkt_len, vlan_id, vlan_id_num, thread_seq); + break; + case 1: + frag_pkt=(raw_ipfrag_list_t *)p_eth_rawpkt; + while(frag_pkt) + { + send_raw_packet(g_tsg_para.mirror_handle, (char *)(frag_pkt->frag_packet), frag_pkt->pkt_len, vlan_id, vlan_id_num, thread_seq); + frag_pkt = frag_pkt->next; + } + break; + default: + break; + } + + return 0; +} + +int tsg_notify_hited_monitor_result(const struct streaminfo *a_stream, struct Maat_rule_t *result, int result_num, int thread_seq) +{ + if(g_tsg_para.mirror_switch==0) + { + return 0; + } + + int vlan_id_num=0; + int vlan_id[MAX_RESULT_NUM]={0}; + struct tcpall_context *context=NULL; + + vlan_id_num=tsg_get_vlan_id_by_monitor_rule(g_tsg_maat_feather, result, result_num, vlan_id, MAX_RESULT_NUM); + if(vlan_id_num<=0) + { + return 0; + } + + set_vlan_id_to_project(a_stream, context, vlan_id, vlan_id_num, thread_seq); + + return 1; +} + +int tsg_send_raw_packet_init(const char* conffile, void *logger) +{ + MESA_load_profile_short_def(conffile, "TRAFFIC_MIRROR", "TRAFFIC_MIRROR_ENABLE", &g_tsg_para.mirror_switch, 0); + if(g_tsg_para.mirror_switch==0) + { + return 0; + } + + g_tsg_para.mirror_handle=tsg_traffic_mirror_init(conffile, g_tsg_para.logger); + if(g_tsg_para.mirror_handle==NULL) + { + return -1; + } + + return 0; +} |
