summaryrefslogtreecommitdiff
path: root/src/tsg_send_raw_packet.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tsg_send_raw_packet.cpp')
-rw-r--r--src/tsg_send_raw_packet.cpp107
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, &eth_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;
+}